From d669afc3426ccbb45dddcf981d00dab768c03b4e Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 5 May 2026 20:18:42 +0000 Subject: [PATCH 1/3] feat(i18n): add infrastructure for nb/en/fa internationalisation - Install i18next + react-i18next - Create translation JSON files for Norwegian (nb), English (en), and Persian/Farsi (fa) - Create app/src/lib/i18n.js with locale init, localStorage persistence (wl-lang), and RTL dir switching for Persian - Wire i18n init as first import in main.jsx Part of issue #128. Component wiring and RTL CSS remain in next steps. https://claude.ai/code/session_016RYEVLPLXgCaaPciBc3RYt --- app/package-lock.json | 138 +++++--- app/package.json | 4 +- app/public/locales/en/translation.json | 383 ++++++++++++++++++++++ app/public/locales/fa/translation.json | 381 ++++++++++++++++++++++ app/public/locales/nb/translation.json | 421 +++++++++++++++++++++++++ app/src/lib/i18n.js | 25 ++ app/src/main.jsx | 1 + 7 files changed, 1301 insertions(+), 52 deletions(-) create mode 100644 app/public/locales/en/translation.json create mode 100644 app/public/locales/fa/translation.json create mode 100644 app/public/locales/nb/translation.json create mode 100644 app/src/lib/i18n.js diff --git a/app/package-lock.json b/app/package-lock.json index 409a2f0..a16abef 100644 --- a/app/package-lock.json +++ b/app/package-lock.json @@ -1,19 +1,21 @@ { "name": "app", - "version": "0.0.0", + "version": "1.1.0-rc.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "app", - "version": "0.0.0", + "version": "1.1.0-rc.1", "dependencies": { "@carbon/icons-react": "^11.79.0", "@carbon/react": "^1.106.0", "@supabase/supabase-js": "^2.104.1", "date-fns": "^4.1.0", + "i18next": "^26.0.8", "react": "^19.2.5", - "react-dom": "^19.2.5" + "react-dom": "^19.2.5", + "react-i18next": "^17.0.6" }, "devDependencies": { "@eslint/js": "^10.0.1", @@ -1066,9 +1068,6 @@ "cpu": [ "arm" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1090,9 +1089,6 @@ "cpu": [ "arm" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -1114,9 +1110,6 @@ "cpu": [ "arm64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1138,9 +1131,6 @@ "cpu": [ "arm64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -1162,9 +1152,6 @@ "cpu": [ "x64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1186,9 +1173,6 @@ "cpu": [ "x64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -1359,9 +1343,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1379,9 +1360,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -1399,9 +1377,6 @@ "ppc64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1419,9 +1394,6 @@ "s390x" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1439,9 +1411,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1459,9 +1428,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -2682,6 +2648,43 @@ "dev": true, "license": "MIT" }, + "node_modules/html-parse-stringify": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz", + "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==", + "license": "MIT", + "dependencies": { + "void-elements": "3.1.0" + } + }, + "node_modules/i18next": { + "version": "26.0.8", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-26.0.8.tgz", + "integrity": "sha512-BRzLom0mhDhV9v0QhgUUHWQJuwFmnr1194xEcNLYD6ym8y8s542n4jXUvRLnhNTbh9PmpU6kGZamyuGHQMsGjw==", + "funding": [ + { + "type": "individual", + "url": "https://www.locize.com/i18next" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + }, + { + "type": "individual", + "url": "https://www.locize.com" + } + ], + "license": "MIT", + "peerDependencies": { + "typescript": "^5 || ^6" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/iceberg-js": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/iceberg-js/-/iceberg-js-0.8.1.tgz", @@ -3022,9 +3025,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -3046,9 +3046,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -3070,9 +3067,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -3094,9 +3088,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -3515,6 +3506,33 @@ "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", "license": "MIT" }, + "node_modules/react-i18next": { + "version": "17.0.6", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-17.0.6.tgz", + "integrity": "sha512-WzJ6SMKF+GTD7JZZqxSR1AKKmXjaSu39sClUrNlwxS4Tl7a99O+ltFy6yhPMO+wgZuxpQjJ2PZkfrQKmAqrLhw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2", + "html-parse-stringify": "^3.0.1", + "use-sync-external-store": "^1.6.0" + }, + "peerDependencies": { + "i18next": ">= 26.0.1", + "react": ">= 16.8.0", + "typescript": "^5 || ^6" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, "node_modules/react-is": { "version": "19.2.5", "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.5.tgz", @@ -3811,6 +3829,15 @@ "punycode": "^2.1.0" } }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/vite": { "version": "8.0.10", "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.10.tgz", @@ -3979,6 +4006,15 @@ } } }, + "node_modules/void-elements": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", + "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/app/package.json b/app/package.json index a11f289..7c881d2 100644 --- a/app/package.json +++ b/app/package.json @@ -20,8 +20,10 @@ "@carbon/react": "^1.106.0", "@supabase/supabase-js": "^2.104.1", "date-fns": "^4.1.0", + "i18next": "^26.0.8", "react": "^19.2.5", - "react-dom": "^19.2.5" + "react-dom": "^19.2.5", + "react-i18next": "^17.0.6" }, "devDependencies": { "@eslint/js": "^10.0.1", diff --git a/app/public/locales/en/translation.json b/app/public/locales/en/translation.json new file mode 100644 index 0000000..e220bb7 --- /dev/null +++ b/app/public/locales/en/translation.json @@ -0,0 +1,383 @@ +{ + "common": { + "save": "Save", + "cancel": "Cancel", + "back": "Back", + "loading": "Loading…", + "error": "Error", + "delete": "Delete", + "edit": "Edit", + "close": "Close", + "saving": "Saving…", + "saved": "Saved", + "primary": "Primary", + "secondary": "Secondary", + "exercises": "Exercises", + "sets": "sets", + "reps": "reps", + "session": "session", + "sessions": "sessions", + "noResults": "No results.", + "resetFilter": "Reset filter", + "none": "none", + "front": "Front", + "back_view": "Back", + "saveFailed": "Saving failed. Try again.", + "add": "Add" + }, + "muscles": { + "chest": "Chest", + "shoulders_front": "Front shoulders", + "shoulders_side": "Side shoulders", + "biceps": "Biceps", + "forearms": "Forearms", + "abs": "Abs", + "obliques": "Obliques", + "quads": "Quads", + "calves": "Calves", + "traps": "Traps", + "rear_delts": "Rear delts", + "lats": "Lats", + "triceps": "Triceps", + "lower_back": "Lower back", + "glutes": "Glutes", + "hamstrings": "Hamstrings", + "calves_back": "Calves (rear)" + }, + "bodymap": { + "front": "front", + "back": "back", + "mapLabel": "Muscle map, {{view}}", + "freqMapLabel": "Training frequency map, {{view}}", + "primaryLabel": "Primary", + "secondaryLabel": "Secondary", + "totalLabel": "Total", + "notTrained": "Not trained", + "ariaPrimary_one": "{{muscle}} – primary: {{count}} session", + "ariaPrimary_other": "{{muscle}} – primary: {{count}} sessions", + "ariaSecondary_one": "{{muscle}} – secondary: {{count}} session", + "ariaSecondary_other": "{{muscle}} – secondary: {{count}} sessions", + "ariaNotTrained": "{{muscle}} – not trained" + }, + "nav": { + "logSession": "Log session", + "history": "Training history", + "report": "Period report", + "library": "Library", + "planner": "Plan week", + "settings": "Settings" + }, + "login": { + "subtitle": "Sign in to continue", + "emailLabel": "Email address", + "emailPlaceholder": "your@email.com", + "sendLink": "Send login link", + "sending": "Sending…", + "checkEmail": "Check your email", + "sentTo": "We sent a login link to", + "failed": "Login failed:" + }, + "home": { + "logNew": "Log new session", + "todaySession": "TODAY'S SESSION", + "lastSession": "LAST SESSION", + "seeAll": "SEE ALL →", + "loading": "Loading last session…", + "noSessions": "No sessions logged yet. Log your first session!", + "ownTraining": "Personal training", + "train": "Train.", + "today": "Today.", + "weekStrip": { + "mon": "M", + "tue": "T", + "wed": "W", + "thu": "T", + "fri": "F", + "sat": "S", + "sun": "S" + } + }, + "muscleMap": { + "sectionLabel": "LOG SESSION", + "stepSnap": "Snap", + "stepConfirm": "Confirm", + "stepResult": "Result", + "heroLine1": "Take a photo of", + "heroLine2": "the board.", + "imageCount_one": "{{count}} photo", + "imageCount_other": "{{count}} photos", + "selected": "selected", + "dropzoneLabel": "Upload training photo", + "dropzoneClick": "Tap to choose photo", + "dropzoneDrag": "or drag and drop · JPEG, PNG, WebP", + "useTemplate": "Template", + "manualEntry": "Enter manually", + "tipsHeading": "Tips", + "tipsBody": "Good lighting and the full board in frame gives the best results. Multiple images supported.", + "analyzeBtn": "Analyze image", + "analyzing": "Reading training program and identifying exercises…", + "foundExercises_one": "{{count}} exercise found.", + "foundExercises_other": "{{count}} exercises found.", + "today": "Today", + "otherDay": "Other day", + "dateLabel": "Date", + "datePlaceholder": "dd/mm/yyyy", + "selectGymSession": "Which class was this?", + "selectGymOptional": "Select class (optional)", + "conflictTitle": "Existing session:", + "conflictBody": "This class already has a saved session ({{date}}). Saving will replace it.", + "musclesViaClaude": "Muscles recognized by Claude", + "musclesViaDB": "Muscles recognized via database", + "musclesUnknown": "Muscles not recognized", + "addManual": "Add exercise manually", + "saveAndShow": "Save and show result", + "hitMuscles1": "You hit", + "hitMuscles2": "muscles.", + "kpiMuscles": "Muscles", + "kpiTime": "Time", + "trainedMuscles": "Trained muscles", + "exercisesThisSession": "Exercises this session", + "nextStep": "Next step", + "nextStepBody": "See which muscles you neglect over time.", + "analyzePeriod": "Analyze the period", + "getRecommendations": "What should I train next time?", + "loadingRecs": "Getting recommendations…", + "recommendedExercises": "Recommended exercises", + "noRecs": "No recommendations available.", + "logNew": "Log new session", + "removeImage": "Remove image {{n}}", + "imageAlt": "Training photo {{n}}", + "addMoreImages": "Add more images", + "savingError": "Saving failed", + "progressLabel": "Progress", + "primaryTag": "Primary", + "secondaryTag": "Secondary" + }, + "history": { + "sectionLabel": "HISTORY", + "noSessions": "No sessions saved yet.", + "prevMonth": "Previous month", + "nextMonth": "Next month", + "hoverHint": "Hover over the body for details", + "muscleGroups": "Muscle groups", + "primaryCount": "Primary ({{count}})", + "secondaryCount": "Secondary ({{count}})", + "reanalyze": "Re-analyze", + "analyzing": "Analyzing…", + "editSession": "Edit session", + "ownTraining": "Personal training", + "exerciseCount_one": "{{count}} exercise", + "exerciseCount_other": "{{count}} exercises", + "sessionCount_one": "{{count}} session", + "sessionCount_other": "{{count}} sessions", + "filterWithDate": "{{count}} of {{total}} {{sessionLabel}} on {{date}}", + "filteredMonth": "{{count}} {{sessionLabel}} in {{month}} with these filters", + "monthCount": "{{count}} {{sessionLabel}} in {{month}}.", + "volumeLegendMin": "VOLUME 1", + "volumeLegendMax": "5+", + "days": { + "mon": "Mo", + "tue": "Tu", + "wed": "We", + "thu": "Th", + "fri": "Fr", + "sat": "Sa", + "sun": "Su" + }, + "heroMotivation": { + "1": "great start!", + "5": "five. solid.", + "10": "double digits!", + "20": "twenty. this is a habit.", + "23": "Jordan number.", + "25": "quarter century!", + "30": "thirty. legendary.", + "32": "Rocky mode.", + "40": "FORTY. Arnold approves.", + "42": "the answer to everything.", + "50": "FIFTY. seriously.", + "over50": "over 50. call the doctor." + }, + "heroMotivationFallback": "{{count}} sessions this month." + }, + "bibliotek": { + "sectionLabel": "LIBRARY", + "heading": "Your building blocks.", + "tabExercises": "Exercises", + "tabTemplates": "Templates", + "newExercise": "New exercise", + "shortcuts": "SHORTCUTS", + "searchPlaceholder": "Search exercise…", + "loadingExercises": "Loading exercises…", + "noExercises": "No exercises added yet.", + "noSearchResults": "No exercises match the search.", + "noMuscles": "No muscles", + "newTemplate": "New template", + "templateNameLabel": "Template name", + "templateNamePlaceholder": "e.g. CrossFit - Anna - Monday", + "createTemplate": "Create and add exercises", + "creating": "Creating…", + "loadingTemplates": "Loading templates…", + "noTemplates": "No templates created yet.", + "deleteExerciseTitle": "Delete exercise", + "deleteTemplateTitle": "Delete template", + "deleteConfirm": "Are you sure you want to delete \"{{name}}\"? This cannot be undone.", + "usedInTemplates_one": "The exercise is used in the template", + "usedInTemplates_other": "The exercise is used in the templates", + "exerciseRemovedWarning": "and will be removed from it.", + "exerciseCount": "{{count}} EX" + }, + "planlegger": { + "heading": "Plan the week", + "prevWeek": "Previous week", + "nextWeek": "Next week", + "projectedCoverage": "Projected coverage", + "weekSummary_one": "{{count}} session · {{muscleCount}} muscle groups", + "weekSummary_other": "{{count}} sessions · {{muscleCount}} muscle groups", + "weekPlan": "Weekly plan", + "addSession": "Add session", + "removeTemplate": "Remove {{name}}", + "gapsCard_one": "{{count}} muscle group not covered this week", + "gapsCard_other": "{{count}} muscle groups not covered this week", + "templatesCovering": "Templates covering these:", + "confirmDelete": "Remove the entire week plan?", + "removeWeek": "Remove week", + "savePlan": "Save plan", + "selectTemplate": "Select template", + "noTemplates": "No templates created yet.", + "loadingPlan": "Loading plan…", + "removing": "Removing…", + "remove": "Remove", + "exerciseCount_one": "{{count}} exercise", + "exerciseCount_other": "{{count}} exercises", + "days": { + "1": "MON", + "2": "TUE", + "3": "WED", + "4": "THU", + "5": "FRI", + "6": "SAT", + "7": "SUN" + } + }, + "settings": { + "heading": "Settings", + "appearance": "Appearance", + "darkTheme": "Dark theme", + "darkThemeOff": "Off", + "darkThemeOn": "On", + "account": "Account", + "signOut": "Sign out", + "about": "About the app", + "changelog": "Show changelog", + "contact": "Contact", + "contactBody": "Have feedback or found a bug? Feel free to reach out.", + "sendEmail": "Send email", + "reportGithub": "Report bug on GitHub", + "language": "Language", + "languageNorwegian": "Norsk", + "languageEnglish": "English", + "languagePersian": "فارسی" + }, + "report": { + "heroMuscles_one": "{{count}} muscle", + "heroMuscles_other": "{{count}} muscles", + "heroNeverTrained": "never trained.", + "kpiSessions": "Sessions", + "kpiMuscles": "Muscles", + "kpiAvgPerWeek": "Avg/week", + "hoverHint": "Hover over or focus a muscle for details", + "primarySessions": "PRIMARY SESSIONS", + "lastDate": "LAST", + "legendPrimary": "Primary", + "legendSecondary": "Secondary", + "gapHeading": "NOT HIT", + "frequencyTable": "Muscle frequency", + "colMuscle": "MUSCLE", + "colSession": "SESSION", + "colSets": "SETS", + "getRecommendation": "Get recommendation", + "loadingRecs": "Getting recommendations…", + "analyzingData": "Analyzing training data…", + "recommendedExercises": "Recommended exercises", + "noRecs": "No recommendations available.", + "noSessions": "No sessions found for selected filter.", + "saveRecError": "Could not save exercise. Try again.", + "fetchRecError": "Could not fetch recommendations. Try again.", + "toCta": "Add these to your program →", + "period": "PERIOD", + "activeDays": "ACTIVE DAYS", + "days": { + "mon": "Mon", + "tue": "Tue", + "wed": "Wed", + "thu": "Thu", + "fri": "Fri", + "sat": "Sat", + "sun": "Sun" + }, + "periods": { + "7": "7 days", + "30": "30 days", + "90": "90 days" + } + }, + "exerciseRow": { + "namePlaceholder": "Click to enter exercise…", + "nameRequired": "Required", + "nameAriaLabel": "Exercise name", + "setsLabel": "Sets for {{name}}", + "repsLabel": "Reps for {{name}}", + "deleteExercise": "Delete exercise", + "invalidNumber": "Invalid number – enter 1 to 99" + }, + "exerciseForm": { + "nameLabel": "Name", + "namePlaceholder": "e.g. Squat", + "defaultSets": "Default sets", + "defaultReps": "Default reps", + "saveExercise": "Save exercise" + }, + "libraryPicker": { + "searchLabel": "Search exercise library", + "searchPlaceholder": "Type to filter…", + "noResults": "No results.", + "close": "Close" + }, + "bodyPanel": { + "front": "Front", + "back": "Back" + }, + "musclePicker": { + "frontLabel": "Front muscles", + "backLabel": "Back muscles", + "primaryCount": "Primary ({{count}})", + "secondaryCount": "Secondary ({{count}})", + "helpText": "Click muscle: off → primary → secondary → off. Arrow keys navigate, space/enter selects.", + "stateNotSelected": "not selected", + "statePrimary": "primary", + "stateSecondary": "secondary" + }, + "templatePicker": { + "title": "Select template", + "description": "Select a template to start a session with pre-filled exercises.", + "loading": "Loading templates…", + "noTemplates": "No templates created yet.", + "goToLibrary": "Go to library", + "lastUsed": "Last used {{date}}", + "exerciseCount_one": "{{count}} exercise", + "exerciseCount_other": "{{count}} exercises" + }, + "templateEditor": { + "titleEdit": "Edit template", + "titleUse": "Use template", + "clickToRename": "Click to rename", + "primaryCount": "Primary ({{count}})", + "secondaryCount": "Secondary ({{count}})", + "fromLibrary": "From library", + "manual": "Manually", + "saveChanges": "Save template changes", + "useSession": "Use session", + "saveTemplate": "Save template" + } +} diff --git a/app/public/locales/fa/translation.json b/app/public/locales/fa/translation.json new file mode 100644 index 0000000..4f25034 --- /dev/null +++ b/app/public/locales/fa/translation.json @@ -0,0 +1,381 @@ +{ + "common": { + "save": "ذخیره", + "cancel": "لغو", + "back": "بازگشت", + "loading": "در حال بارگذاری…", + "error": "خطا", + "delete": "حذف", + "edit": "ویرایش", + "close": "بستن", + "saving": "در حال ذخیره…", + "saved": "ذخیره شد", + "primary": "اولیه", + "secondary": "ثانویه", + "exercises": "تمرین‌ها", + "sets": "ست", + "reps": "تکرار", + "session": "جلسه", + "sessions": "جلسات", + "noResults": "نتیجه‌ای یافت نشد.", + "resetFilter": "پاک کردن فیلتر", + "none": "هیچ", + "front": "جلو", + "back_view": "پشت", + "saveFailed": "ذخیره ناموفق بود. دوباره امتحان کنید.", + "add": "افزودن" + }, + "muscles": { + "chest": "سینه", + "shoulders_front": "شانه جلویی", + "shoulders_side": "شانه کناری", + "biceps": "دوسر بازو", + "forearms": "ساعد", + "abs": "شکم", + "obliques": "پهلو", + "quads": "چهارسر ران", + "calves": "ساق پا", + "traps": "ذوزنقه", + "rear_delts": "شانه پشتی", + "lats": "پشتی بزرگ", + "triceps": "سه‌سر بازو", + "lower_back": "کمر پایینی", + "glutes": "سرینی", + "hamstrings": "همسترینگ", + "calves_back": "ساق پا (پشت)" + }, + "bodymap": { + "front": "جلو", + "back": "پشت", + "mapLabel": "نقشه عضلات، {{view}}", + "freqMapLabel": "نقشه فرکانس تمرین، {{view}}", + "primaryLabel": "اولیه", + "secondaryLabel": "ثانویه", + "totalLabel": "مجموع", + "notTrained": "تمرین نشده", + "ariaPrimary_one": "{{muscle}} – اولیه: {{count}} جلسه", + "ariaPrimary_other": "{{muscle}} – اولیه: {{count}} جلسه", + "ariaSecondary_one": "{{muscle}} – ثانویه: {{count}} جلسه", + "ariaSecondary_other": "{{muscle}} – ثانویه: {{count}} جلسه", + "ariaNotTrained": "{{muscle}} – تمرین نشده" + }, + "nav": { + "logSession": "ثبت جلسه", + "history": "تاریخچه تمرین", + "report": "گزارش دوره", + "library": "کتابخانه", + "planner": "برنامه‌ریزی هفته", + "settings": "تنظیمات" + }, + "login": { + "subtitle": "برای ادامه وارد شوید", + "emailLabel": "آدرس ایمیل", + "emailPlaceholder": "ایمیل@مثال.com", + "sendLink": "ارسال لینک ورود", + "sending": "در حال ارسال…", + "checkEmail": "ایمیل خود را بررسی کنید", + "sentTo": "لینک ورود به این آدرس ارسال شد:", + "failed": "ورود ناموفق:" + }, + "home": { + "logNew": "ثبت جلسه جدید", + "todaySession": "جلسه امروز", + "lastSession": "آخرین جلسه", + "seeAll": "مشاهده همه →", + "loading": "در حال بارگذاری آخرین جلسه…", + "noSessions": "هنوز جلسه‌ای ثبت نشده. اولین جلسه خود را ثبت کنید!", + "ownTraining": "تمرین شخصی", + "train": "تمرین کن.", + "today": "امروز.", + "weekStrip": { + "mon": "د", + "tue": "س", + "wed": "چ", + "thu": "پ", + "fri": "ج", + "sat": "ش", + "sun": "ی" + } + }, + "muscleMap": { + "sectionLabel": "ثبت جلسه", + "stepSnap": "عکس", + "stepConfirm": "تأیید", + "stepResult": "نتیجه", + "heroLine1": "از تخته", + "heroLine2": "عکس بگیر.", + "imageCount_one": "{{count}} تصویر", + "imageCount_other": "{{count}} تصویر", + "selected": "انتخاب شده", + "dropzoneLabel": "آپلود تصویر تمرین", + "dropzoneClick": "برای انتخاب تصویر ضربه بزنید", + "dropzoneDrag": "یا بکشید و رها کنید · JPEG، PNG، WebP", + "useTemplate": "قالب", + "manualEntry": "ورود دستی", + "tipsHeading": "راهنما", + "tipsBody": "نور مناسب و نمایش کامل تخته در تصویر بهترین نتیجه را می‌دهد. چند تصویر پشتیبانی می‌شود.", + "analyzeBtn": "تحلیل تصویر", + "analyzing": "در حال خواندن برنامه تمرینی و شناسایی تمرین‌ها…", + "foundExercises_one": "{{count}} تمرین یافت شد.", + "foundExercises_other": "{{count}} تمرین یافت شد.", + "today": "امروز", + "otherDay": "روز دیگر", + "dateLabel": "تاریخ", + "datePlaceholder": "روز/ماه/سال", + "selectGymSession": "این کدام کلاس بود؟", + "selectGymOptional": "انتخاب کلاس (اختیاری)", + "conflictTitle": "جلسه موجود:", + "conflictBody": "این کلاس از قبل یک جلسه ذخیره شده دارد ({{date}}). ذخیره جدید جایگزین آن می‌شود.", + "musclesViaClaude": "عضلات شناسایی شده توسط Claude", + "musclesViaDB": "عضلات شناسایی شده از پایگاه داده", + "musclesUnknown": "عضلات شناسایی نشده", + "addManual": "افزودن تمرین به صورت دستی", + "saveAndShow": "ذخیره و نمایش نتیجه", + "hitMuscles1": "شما", + "hitMuscles2": "عضله تمرین دادید.", + "kpiMuscles": "عضلات", + "kpiTime": "زمان", + "trainedMuscles": "عضلات تمرین‌شده", + "exercisesThisSession": "تمرین‌های این جلسه", + "nextStep": "مرحله بعد", + "nextStepBody": "ببینید با گذر زمان کدام عضلات را فراموش می‌کنید.", + "analyzePeriod": "تحلیل دوره", + "getRecommendations": "دفعه بعد چه چیزی تمرین کنم؟", + "loadingRecs": "در حال دریافت پیشنهادها…", + "recommendedExercises": "تمرین‌های پیشنهادی", + "noRecs": "پیشنهادی موجود نیست.", + "logNew": "ثبت جلسه جدید", + "removeImage": "حذف تصویر {{n}}", + "imageAlt": "تصویر تمرین {{n}}", + "addMoreImages": "افزودن تصاویر بیشتر", + "savingError": "ذخیره ناموفق بود", + "progressLabel": "پیشرفت", + "primaryTag": "اولیه", + "secondaryTag": "ثانویه" + }, + "history": { + "sectionLabel": "تاریخچه", + "noSessions": "هنوز جلسه‌ای ذخیره نشده.", + "prevMonth": "ماه قبل", + "nextMonth": "ماه بعد", + "hoverHint": "برای جزئیات، نشانگر را روی بدن ببرید", + "muscleGroups": "گروه‌های عضلانی", + "primaryCount": "اولیه ({{count}})", + "secondaryCount": "ثانویه ({{count}})", + "reanalyze": "تحلیل مجدد", + "analyzing": "در حال تحلیل…", + "editSession": "ویرایش جلسه", + "ownTraining": "تمرین شخصی", + "exerciseCount_one": "{{count}} تمرین", + "exerciseCount_other": "{{count}} تمرین", + "sessionCount_one": "{{count}} جلسه", + "sessionCount_other": "{{count}} جلسه", + "filterWithDate": "{{count}} از {{total}} {{sessionLabel}} در {{date}}", + "filteredMonth": "{{count}} {{sessionLabel}} در {{month}} با این فیلترها", + "monthCount": "{{count}} {{sessionLabel}} در {{month}}.", + "volumeLegendMin": "حجم ۱", + "volumeLegendMax": "۵+", + "days": { + "mon": "د", + "tue": "س", + "wed": "چ", + "thu": "پ", + "fri": "ج", + "sat": "ش", + "sun": "ی" + }, + "heroMotivation": { + "1": "شروع عالی!", + "5": "پنج تا. محکم.", + "10": "دو رقمی!", + "20": "بیست. این یه عادت شده.", + "25": "ربع قرن!", + "30": "سی تا. افسانه‌ای.", + "40": "چهل. آرنولد تأیید می‌کنه.", + "42": "جواب همه چیز.", + "50": "پنجاه. جدی؟", + "over50": "بیشتر از ۵۰. با دکتر مشورت کن." + }, + "heroMotivationFallback": "{{count}} جلسه این ماه." + }, + "bibliotek": { + "sectionLabel": "کتابخانه", + "heading": "بلوک‌های سازنده شما.", + "tabExercises": "تمرین‌ها", + "tabTemplates": "قالب‌ها", + "newExercise": "تمرین جدید", + "shortcuts": "میانبرها", + "searchPlaceholder": "جستجوی تمرین…", + "loadingExercises": "در حال بارگذاری تمرین‌ها…", + "noExercises": "هنوز تمرینی اضافه نشده.", + "noSearchResults": "هیچ تمرینی با این جستجو مطابقت ندارد.", + "noMuscles": "بدون عضله", + "newTemplate": "قالب جدید", + "templateNameLabel": "نام قالب", + "templateNamePlaceholder": "مثلاً: کراسفیت - شنبه", + "createTemplate": "ایجاد و افزودن تمرین‌ها", + "creating": "در حال ایجاد…", + "loadingTemplates": "در حال بارگذاری قالب‌ها…", + "noTemplates": "هنوز قالبی ایجاد نشده.", + "deleteExerciseTitle": "حذف تمرین", + "deleteTemplateTitle": "حذف قالب", + "deleteConfirm": "آیا مطمئن هستید که می‌خواهید «{{name}}» را حذف کنید؟ این عمل قابل بازگشت نیست.", + "usedInTemplates_one": "این تمرین در قالب استفاده شده", + "usedInTemplates_other": "این تمرین در قالب‌ها استفاده شده", + "exerciseRemovedWarning": "و از آن حذف خواهد شد.", + "exerciseCount": "{{count}} تمرین" + }, + "planlegger": { + "heading": "برنامه‌ریزی هفته", + "prevWeek": "هفته قبل", + "nextWeek": "هفته بعد", + "projectedCoverage": "پوشش پیش‌بینی‌شده", + "weekSummary_one": "{{count}} جلسه · {{muscleCount}} گروه عضلانی", + "weekSummary_other": "{{count}} جلسه · {{muscleCount}} گروه عضلانی", + "weekPlan": "برنامه هفتگی", + "addSession": "افزودن جلسه", + "removeTemplate": "حذف {{name}}", + "gapsCard_one": "{{count}} گروه عضلانی این هفته پوشش داده نشده", + "gapsCard_other": "{{count}} گروه عضلانی این هفته پوشش داده نشده", + "templatesCovering": "قالب‌هایی که این عضلات را پوشش می‌دهند:", + "confirmDelete": "کل برنامه هفتگی حذف شود؟", + "removeWeek": "حذف هفته", + "savePlan": "ذخیره برنامه", + "selectTemplate": "انتخاب قالب", + "noTemplates": "هنوز قالبی ایجاد نشده.", + "loadingPlan": "در حال بارگذاری برنامه…", + "removing": "در حال حذف…", + "remove": "حذف", + "exerciseCount_one": "{{count}} تمرین", + "exerciseCount_other": "{{count}} تمرین", + "days": { + "1": "دوش", + "2": "سه‌ش", + "3": "چهار", + "4": "پنج", + "5": "جمعه", + "6": "شنبه", + "7": "یکشنبه" + } + }, + "settings": { + "heading": "تنظیمات", + "appearance": "ظاهر", + "darkTheme": "تم تاریک", + "darkThemeOff": "خاموش", + "darkThemeOn": "روشن", + "account": "حساب کاربری", + "signOut": "خروج", + "about": "درباره برنامه", + "changelog": "نمایش تاریخچه تغییرات", + "contact": "تماس", + "contactBody": "بازخورد دارید یا باگی پیدا کردید؟ با ما در تماس باشید.", + "sendEmail": "ارسال ایمیل", + "reportGithub": "گزارش باگ در GitHub", + "language": "زبان", + "languageNorwegian": "Norsk", + "languageEnglish": "English", + "languagePersian": "فارسی" + }, + "report": { + "heroMuscles_one": "{{count}} عضله", + "heroMuscles_other": "{{count}} عضله", + "heroNeverTrained": "هرگز تمرین نشده.", + "kpiSessions": "جلسات", + "kpiMuscles": "عضلات", + "kpiAvgPerWeek": "میانگین/هفته", + "hoverHint": "برای جزئیات، نشانگر را روی عضله ببرید یا روی آن فوکوس کنید", + "primarySessions": "جلسات اولیه", + "lastDate": "آخرین", + "legendPrimary": "اولیه", + "legendSecondary": "ثانویه", + "gapHeading": "تمرین نشده", + "frequencyTable": "فرکانس عضلات", + "colMuscle": "عضله", + "colSession": "جلسه", + "colSets": "ست", + "getRecommendation": "دریافت پیشنهاد", + "loadingRecs": "در حال دریافت پیشنهادها…", + "analyzingData": "در حال تحلیل داده‌های تمرینی…", + "recommendedExercises": "تمرین‌های پیشنهادی", + "noRecs": "پیشنهادی موجود نیست.", + "noSessions": "جلسه‌ای برای فیلتر انتخاب‌شده یافت نشد.", + "saveRecError": "ذخیره تمرین ناموفق بود. دوباره امتحان کنید.", + "fetchRecError": "دریافت پیشنهادها ناموفق بود. دوباره امتحان کنید.", + "toCta": "این‌ها را به برنامه‌ات اضافه کن →", + "period": "دوره", + "activeDays": "روزهای فعال", + "days": { + "mon": "دوش", + "tue": "سه‌ش", + "wed": "چهار", + "thu": "پنج", + "fri": "جمعه", + "sat": "شنبه", + "sun": "یکشنبه" + }, + "periods": { + "7": "۷ روز", + "30": "۳۰ روز", + "90": "۹۰ روز" + } + }, + "exerciseRow": { + "namePlaceholder": "برای نوشتن تمرین کلیک کنید…", + "nameRequired": "الزامی", + "nameAriaLabel": "نام تمرین", + "setsLabel": "ست برای {{name}}", + "repsLabel": "تکرار برای {{name}}", + "deleteExercise": "حذف تمرین", + "invalidNumber": "عدد نامعتبر – عددی بین ۱ تا ۹۹ وارد کنید" + }, + "exerciseForm": { + "nameLabel": "نام", + "namePlaceholder": "مثلاً اسکوات", + "defaultSets": "ست پیش‌فرض", + "defaultReps": "تکرار پیش‌فرض", + "saveExercise": "ذخیره تمرین" + }, + "libraryPicker": { + "searchLabel": "جستجو در کتابخانه تمرین‌ها", + "searchPlaceholder": "برای فیلتر تایپ کنید…", + "noResults": "نتیجه‌ای یافت نشد.", + "close": "بستن" + }, + "bodyPanel": { + "front": "جلو", + "back": "پشت" + }, + "musclePicker": { + "frontLabel": "عضلات جلو", + "backLabel": "عضلات پشت", + "primaryCount": "اولیه ({{count}})", + "secondaryCount": "ثانویه ({{count}})", + "helpText": "روی عضله کلیک کنید: خاموش ← اولیه ← ثانویه ← خاموش. کلیدهای جهت برای ناوبری، فاصله/اینتر برای انتخاب.", + "stateNotSelected": "انتخاب نشده", + "statePrimary": "اولیه", + "stateSecondary": "ثانویه" + }, + "templatePicker": { + "title": "انتخاب قالب", + "description": "یک قالب انتخاب کنید تا جلسه را با تمرین‌های از پیش تعریف‌شده شروع کنید.", + "loading": "در حال بارگذاری قالب‌ها…", + "noTemplates": "هنوز قالبی ایجاد نشده.", + "goToLibrary": "رفتن به کتابخانه", + "lastUsed": "آخرین استفاده: {{date}}", + "exerciseCount_one": "{{count}} تمرین", + "exerciseCount_other": "{{count}} تمرین" + }, + "templateEditor": { + "titleEdit": "ویرایش قالب", + "titleUse": "استفاده از قالب", + "clickToRename": "برای تغییر نام کلیک کنید", + "primaryCount": "اولیه ({{count}})", + "secondaryCount": "ثانویه ({{count}})", + "fromLibrary": "از کتابخانه", + "manual": "دستی", + "saveChanges": "ذخیره تغییرات قالب", + "useSession": "شروع جلسه", + "saveTemplate": "ذخیره قالب" + } +} diff --git a/app/public/locales/nb/translation.json b/app/public/locales/nb/translation.json new file mode 100644 index 0000000..aaa6d58 --- /dev/null +++ b/app/public/locales/nb/translation.json @@ -0,0 +1,421 @@ +{ + "common": { + "save": "Lagre", + "cancel": "Avbryt", + "back": "Tilbake", + "loading": "Laster…", + "error": "Feil", + "delete": "Slett", + "edit": "Rediger", + "close": "Lukk", + "saving": "Lagrer…", + "saved": "Lagret", + "primary": "Primær", + "secondary": "Sekundær", + "exercises": "Øvelser", + "sets": "sett", + "reps": "reps", + "session": "økt", + "sessions": "økter", + "noResults": "Ingen treff.", + "resetFilter": "Nullstill filter", + "none": "ingen", + "front": "Front", + "back_view": "Bak", + "saveFailed": "Lagring feilet. Prøv igjen.", + "add": "Legg til" + }, + "muscles": { + "chest": "Bryst", + "shoulders_front": "Fremre skuldre", + "shoulders_side": "Laterale skuldre", + "biceps": "Biceps", + "forearms": "Underarmer", + "abs": "Mage", + "obliques": "Oblique", + "quads": "Quadriceps", + "calves": "Legg", + "traps": "Trapezius", + "rear_delts": "Bakre skuldre", + "lats": "Latissimus", + "triceps": "Triceps", + "lower_back": "Korsrygg", + "glutes": "Sete", + "hamstrings": "Hamstrings", + "calves_back": "Legg (bak)" + }, + "bodymap": { + "front": "fremside", + "back": "bakside", + "mapLabel": "Muskelkart, {{view}}", + "freqMapLabel": "Treningsfrekvenskart, {{view}}", + "primaryLabel": "Primær", + "secondaryLabel": "Sekundær", + "totalLabel": "Totalt", + "notTrained": "Ikke trent", + "ariaPrimary_one": "{{muscle}} – primær: {{count}} økt", + "ariaPrimary_other": "{{muscle}} – primær: {{count}} økter", + "ariaSecondary_one": "{{muscle}} – sekundær: {{count}} økt", + "ariaSecondary_other": "{{muscle}} – sekundær: {{count}} økter", + "ariaNotTrained": "{{muscle}} – ikke trent" + }, + "nav": { + "logSession": "Logg økt", + "history": "Treningshistorikk", + "report": "Perioderapport", + "library": "Bibliotek", + "planner": "Planlegg uke", + "settings": "Innstillinger" + }, + "login": { + "subtitle": "Logg inn for å fortsette", + "emailLabel": "E-postadresse", + "emailPlaceholder": "din@epost.no", + "sendLink": "Send innloggingslenke", + "sending": "Sender…", + "checkEmail": "Sjekk e-posten din", + "sentTo": "Vi sendte en innloggingslenke til", + "failed": "Innlogging feilet:" + }, + "home": { + "logNew": "Logg ny økt", + "todaySession": "DAGENS ØKT", + "lastSession": "SISTE ØKT", + "seeAll": "SE ALLE →", + "loading": "Laster siste økt…", + "noSessions": "Ingen økter logget ennå. Logg din første økt!", + "ownTraining": "Egentrening", + "train": "Tren.", + "today": "I dag.", + "weekStrip": { + "mon": "M", + "tue": "T", + "wed": "O", + "thu": "T", + "fri": "F", + "sat": "L", + "sun": "S" + } + }, + "muscleMap": { + "sectionLabel": "LOGG ØKT", + "stepSnap": "Knips", + "stepConfirm": "Bekreft", + "stepResult": "Resultat", + "heroLine1": "Ta bilde av", + "heroLine2": "tavla.", + "imageCount_one": "{{count}} bilde", + "imageCount_other": "{{count}} bilder", + "selected": "valgt", + "dropzoneLabel": "Last opp treningsbilde", + "dropzoneClick": "Trykk for å velge bilde", + "dropzoneDrag": "eller dra og slipp · JPEG, PNG, WebP", + "useTemplate": "Mal", + "manualEntry": "Legg inn manuelt", + "tipsHeading": "Tips", + "tipsBody": "God belysning og hele tavla i bildet gir best resultat. Flere bilder støttes.", + "analyzeBtn": "Analyser bilde", + "analyzing": "Leser treningsprogram og identifiserer øvelser…", + "foundExercises_one": "{{count}} øvelse funnet.", + "foundExercises_other": "{{count}} øvelser funnet.", + "today": "I dag", + "otherDay": "Annen dag", + "dateLabel": "Dato", + "datePlaceholder": "dd/mm/åååå", + "selectGymSession": "Hvilken time var dette?", + "selectGymOptional": "Velg gymtime (valgfritt)", + "conflictTitle": "Eksisterende økt:", + "conflictBody": "Denne gymtimen har allerede en lagret økt ({{date}}). Lagring erstatter den.", + "musclesViaClaude": "Muskler gjenkjent av Claude", + "musclesViaDB": "Muskler gjenkjent via database", + "musclesUnknown": "Muskler ikke gjenkjent", + "addManual": "Legg til øvelse manuelt", + "saveAndShow": "Lagre og se resultat", + "hitMuscles1": "Du traff", + "hitMuscles2": "muskler.", + "kpiMuscles": "Muskler", + "kpiTime": "Tid", + "trainedMuscles": "Trente muskler", + "exercisesThisSession": "Øvelser denne økten", + "nextStep": "Neste steg", + "nextStepBody": "Se hvilke muskler du glemmer over tid.", + "analyzePeriod": "Analyser perioden", + "getRecommendations": "Hva bør jeg trene neste gang?", + "loadingRecs": "Henter anbefalinger…", + "recommendedExercises": "Anbefalte øvelser", + "noRecs": "Ingen anbefalinger tilgjengelig.", + "logNew": "Logg ny økt", + "removeImage": "Fjern bilde {{n}}", + "imageAlt": "Treningsbilde {{n}}", + "addMoreImages": "Legg til flere bilder", + "savingError": "Lagring feilet", + "progressLabel": "Fremgang", + "primaryTag": "Primær", + "secondaryTag": "Sekundær" + }, + "history": { + "sectionLabel": "HISTORIKK", + "noSessions": "Ingen økter lagret ennå.", + "prevMonth": "Forrige måned", + "nextMonth": "Neste måned", + "hoverHint": "Hold musepeker over kroppen for detaljer", + "muscleGroups": "Muskelgrupper", + "primaryCount": "Primær ({{count}})", + "secondaryCount": "Sekundær ({{count}})", + "reanalyze": "Re-analyser", + "analyzing": "Analyserer…", + "editSession": "Rediger økt", + "ownTraining": "Egentrening", + "exerciseCount_one": "{{count}} øvelse", + "exerciseCount_other": "{{count}} øvelser", + "sessionCount_one": "{{count}} økt", + "sessionCount_other": "{{count}} økter", + "filterWithDate": "{{count}} av {{total}} {{sessionLabel}} den {{date}}", + "filteredMonth": "{{count}} {{sessionLabel}} i {{month}} med disse filtrene", + "monthCount": "{{count}} {{sessionLabel}} i {{month}}.", + "volumeLegendMin": "VOLUM 1", + "volumeLegendMax": "5+", + "days": { + "mon": "ma", + "tue": "ti", + "wed": "on", + "thu": "to", + "fri": "fr", + "sat": "lø", + "sun": "sø" + }, + "heroMotivation": { + "1": "god start!", + "2": "to for to!", + "3": "tre på rad!", + "4": "fire! fint.", + "5": "fem. solid.", + "6": "seks. i rute.", + "7": "syv. nesten daglig.", + "8": "åtte. kroppen takker.", + "9": "ni. ett til!", + "10": "tosifret!", + "11": "elleve. du mener det.", + "12": "tolv. tre per uke.", + "13": "tretten. heldig kropp.", + "14": "fjorten. halvveis til 28.", + "15": "femten. meget bra.", + "16": "seksten. du er maskinen.", + "17": "sytten. ett per muskel!", + "18": "atten. kortet tjener inn.", + "19": "nitten. ett til!", + "20": "tjue. dette er en vane.", + "21": "tjueen. vanedannende.", + "22": "tjueto. ingen stopper deg.", + "23": "Jordan-nummer.", + "24": "tjuefire. Kobe-territorium.", + "25": "kvartmål!", + "26": "tjueseks. halvveis til 52.", + "27": "tjuesyv. over Kobe.", + "28": "tjueåtte. én per dag?", + "29": "tjueni. nesten 30!", + "30": "tredve. legendarisk.", + "31": "trettieen. hver dag.", + "32": "Rocky-modus.", + "33": "trettire. halvtredjes.", + "34": "trettfire. dedikert.", + "35": "trettiofem. femgangen!", + "36": "seksgangen squared.", + "37": "trettisyv. dette er deg.", + "38": "trettåtte. bevisst.", + "39": "trettini. nesten firti!", + "40": "FIRTI. Arnold nikker.", + "41": "over 40. egen klasse.", + "42": "svaret på alt.", + "43": "førtitre. hvem gjør det?", + "44": "førtfire. dobbel innsats.", + "45": "førtiofem. fire-og-halv timer.", + "46": "ikke normalt. kompliment.", + "47": "førtisyv. legen er stolt.", + "48": "én og en halv per dag.", + "49": "ett til: femti-klubben!", + "50": "FEMTI. ikke virkelig.", + "over50": "over 50. ring legen." + } + }, + "bibliotek": { + "sectionLabel": "BIBLIOTEK", + "heading": "Dine byggklosser.", + "tabExercises": "Øvelser", + "tabTemplates": "Maler", + "newExercise": "Ny øvelse", + "shortcuts": "SNARVEIER", + "searchPlaceholder": "Søk øvelse…", + "loadingExercises": "Laster øvelser…", + "noExercises": "Ingen øvelser lagt til ennå.", + "noSearchResults": "Ingen øvelser matcher søket.", + "noMuscles": "Ingen muskler", + "newTemplate": "Ny mal", + "templateNameLabel": "Navn på mal", + "templateNamePlaceholder": "f.eks. CrossFit - Anna - mandag", + "createTemplate": "Opprett og legg til øvelser", + "creating": "Oppretter…", + "loadingTemplates": "Laster maler…", + "noTemplates": "Ingen maler opprettet ennå.", + "deleteExerciseTitle": "Slett øvelse", + "deleteTemplateTitle": "Slett mal", + "deleteConfirm": "Er du sikker på at du vil slette «{{name}}»? Dette kan ikke angres.", + "usedInTemplates_one": "Øvelsen brukes i malen", + "usedInTemplates_other": "Øvelsen brukes i malene", + "exerciseRemovedWarning": "og vil bli fjernet derfra.", + "exerciseCount": "{{count}} ØV" + }, + "planlegger": { + "heading": "Planlegg uken", + "prevWeek": "Forrige uke", + "nextWeek": "Neste uke", + "projectedCoverage": "Projisert dekning", + "weekSummary_one": "{{count}} økt · {{muscleCount}} muskelgrupper", + "weekSummary_other": "{{count}} økter · {{muscleCount}} muskelgrupper", + "weekPlan": "Ukesplan", + "addSession": "Legg til økt", + "removeTemplate": "Fjern {{name}}", + "gapsCard_one": "{{count}} muskelgruppe er ikke dekket denne uken", + "gapsCard_other": "{{count}} muskelgrupper er ikke dekket denne uken", + "templatesCovering": "Maler som dekker disse:", + "confirmDelete": "Fjerne hele ukeplanen?", + "removeWeek": "Fjern uke", + "savePlan": "Lagre plan", + "selectTemplate": "Velg mal", + "noTemplates": "Ingen maler opprettet ennå.", + "loadingPlan": "Laster plan…", + "removing": "Fjerner…", + "remove": "Fjern", + "exerciseCount_one": "{{count}} øvelse", + "exerciseCount_other": "{{count}} øvelser", + "days": { + "1": "MAN", + "2": "TIR", + "3": "ONS", + "4": "TOR", + "5": "FRE", + "6": "LØR", + "7": "SØN" + } + }, + "settings": { + "heading": "Innstillinger", + "appearance": "Utseende", + "darkTheme": "Mørkt tema", + "darkThemeOff": "Av", + "darkThemeOn": "På", + "account": "Konto", + "signOut": "Logg ut", + "about": "Om appen", + "changelog": "Vis endringslogg", + "contact": "Kontakt", + "contactBody": "Har du tilbakemeldinger eller fant en feil? Ta gjerne kontakt.", + "sendEmail": "Send e-post", + "reportGithub": "Rapporter feil på GitHub", + "language": "Språk", + "languageNorwegian": "Norsk", + "languageEnglish": "English", + "languagePersian": "فارسی" + }, + "report": { + "heroMuscles_one": "{{count}} muskel", + "heroMuscles_other": "{{count}} muskler", + "heroNeverTrained": "aldri trent.", + "kpiSessions": "Økter", + "kpiMuscles": "Muskler", + "kpiAvgPerWeek": "Snitt/uke", + "hoverHint": "Hold musepeker over eller fokuser muskel for detaljer", + "primarySessions": "PRIMÆRØKTER", + "lastDate": "SIST", + "legendPrimary": "Primær", + "legendSecondary": "Sekundær", + "gapHeading": "IKKE TRUFFET", + "frequencyTable": "Muskelfrekvens", + "colMuscle": "MUSKEL", + "colSession": "ØKT", + "colSets": "SETT", + "getRecommendation": "Få anbefaling", + "loadingRecs": "Henter anbefalinger…", + "analyzingData": "Analyserer treningsdata…", + "recommendedExercises": "Anbefalte øvelser", + "noRecs": "Ingen anbefalinger tilgjengelig.", + "noSessions": "Ingen økter funnet for valgte filter.", + "saveRecError": "Kunne ikke lagre øvelsen. Prøv igjen.", + "fetchRecError": "Kunne ikke hente anbefalinger. Prøv igjen.", + "toCta": "Disse bør du legge inn i programmet →", + "period": "PERIODE", + "activeDays": "AKTIVE DAGER", + "days": { + "mon": "Man", + "tue": "Tir", + "wed": "Ons", + "thu": "Tor", + "fri": "Fre", + "sat": "Lør", + "sun": "Søn" + }, + "periods": { + "7": "7 dager", + "30": "30 dager", + "90": "90 dager" + } + }, + "exerciseRow": { + "namePlaceholder": "Klikk for å skrive øvelse…", + "nameRequired": "Påkrevd", + "nameAriaLabel": "Øvelsenavn", + "setsLabel": "Sett for {{name}}", + "repsLabel": "Reps for {{name}}", + "deleteExercise": "Slett øvelse", + "invalidNumber": "Ugyldig antall – skriv inn 1 til 99" + }, + "exerciseForm": { + "nameLabel": "Navn", + "namePlaceholder": "f.eks. Knebøy", + "defaultSets": "Standard sett", + "defaultReps": "Standard reps", + "saveExercise": "Lagre øvelse" + }, + "libraryPicker": { + "searchLabel": "Søk i øvelsesbiblioteket", + "searchPlaceholder": "Skriv for å filtrere…", + "noResults": "Ingen treff.", + "close": "Lukk" + }, + "bodyPanel": { + "front": "Front", + "back": "Bak" + }, + "musclePicker": { + "frontLabel": "Frontside muskler", + "backLabel": "Bakside muskler", + "primaryCount": "Primær ({{count}})", + "secondaryCount": "Sekundær ({{count}})", + "helpText": "Klikk muskel: av → primær → sekundær → av. Piltaster navigerer, mellomrom/enter velger.", + "stateNotSelected": "ikke valgt", + "statePrimary": "primær", + "stateSecondary": "sekundær" + }, + "templatePicker": { + "title": "Velg mal", + "description": "Velg en mal for å starte en økt med forhåndsutfylte øvelser.", + "loading": "Laster maler…", + "noTemplates": "Ingen maler opprettet ennå.", + "goToLibrary": "Gå til biblioteket", + "lastUsed": "Sist brukt {{date}}", + "exerciseCount_one": "{{count}} øvelse", + "exerciseCount_other": "{{count}} øvelser" + }, + "templateEditor": { + "titleEdit": "Rediger mal", + "titleUse": "Bruk mal", + "clickToRename": "Klikk for å endre navn", + "primaryCount": "Primær ({{count}})", + "secondaryCount": "Sekundær ({{count}})", + "fromLibrary": "Fra biblioteket", + "manual": "Manuelt", + "saveChanges": "Lagre endringer i malen", + "useSession": "Bruk økt", + "saveTemplate": "Lagre mal" + } +} diff --git a/app/src/lib/i18n.js b/app/src/lib/i18n.js new file mode 100644 index 0000000..8c9684a --- /dev/null +++ b/app/src/lib/i18n.js @@ -0,0 +1,25 @@ +import i18n from 'i18next' +import { initReactI18next } from 'react-i18next' +import nb from '../../public/locales/nb/translation.json' +import en from '../../public/locales/en/translation.json' +import fa from '../../public/locales/fa/translation.json' + +const lng = localStorage.getItem('wl-lang') || 'nb' +document.documentElement.dir = lng === 'fa' ? 'rtl' : 'ltr' + +i18n.use(initReactI18next).init({ + resources: { + nb: { translation: nb }, + en: { translation: en }, + fa: { translation: fa }, + }, + lng, + fallbackLng: 'nb', + interpolation: { escapeValue: false }, +}) + +i18n.on('languageChanged', (l) => { + document.documentElement.dir = l === 'fa' ? 'rtl' : 'ltr' +}) + +export default i18n diff --git a/app/src/main.jsx b/app/src/main.jsx index b947025..4dcd26a 100644 --- a/app/src/main.jsx +++ b/app/src/main.jsx @@ -1,3 +1,4 @@ +import './lib/i18n.js'; import './styles/carbon.scss'; import './styles/carbon-tokens.css'; import './styles/app.css'; From ed51b3d162c02375d8aa2d8a528d93072eda240d Mon Sep 17 00:00:00 2001 From: Christopher Rotnes Date: Tue, 5 May 2026 22:45:37 +0200 Subject: [PATCH 2/3] feat(i18n): wire useTranslation into all 15 components + font + RTL MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Phases 2-7 of issue #128: - Vazirmatn font (Regular/SemiBold/Bold woff2) bundled locally for Persian/RTL - @font-face + --fa-font CSS var added to carbon-tokens.css - [dir="rtl"] font override + SectionLabel switched to borderInlineStart in app.css/PageShell - Settings.jsx: live RadioButtonGroup (nb/en/fa) replacing the "Kommer snart" placeholder - bodymap.jsx: muscle labels and tooltip strings run through useTranslation - prompts.js: buildRecommendPrompt + buildPeriodRecommendPrompt accept lang param; tip field now follows user language - All 15 component files (PageShell, BodyPanel, ExerciseRow, ExerciseForm, LibraryPicker, MusclePicker, Login, TemplatePicker, TemplateSessionEditor, Bibliotek, Home, Planlegger, History, MuscleMap, Report) wired with useTranslation — hardcoded Norwegian replaced with t() - MuscleMap and Report pass i18n.language to prompt builders Co-Authored-By: Claude Sonnet 4.6 --- app/public/fonts/Vazirmatn-Bold.woff2 | Bin 0 -> 51020 bytes app/public/fonts/Vazirmatn-Regular.woff2 | Bin 0 -> 50684 bytes app/public/fonts/Vazirmatn-SemiBold.woff2 | Bin 0 -> 51032 bytes app/src/components/Bibliotek.jsx | 86 ++++++----- app/src/components/BodyPanel.jsx | 4 +- app/src/components/ExerciseForm.jsx | 14 +- app/src/components/ExerciseRow.jsx | 18 ++- app/src/components/History.jsx | 152 +++++++------------ app/src/components/Home.jsx | 36 ++--- app/src/components/LibraryPicker.jsx | 10 +- app/src/components/Login.jsx | 19 ++- app/src/components/MuscleMap.jsx | 141 ++++++++--------- app/src/components/MusclePicker.jsx | 20 ++- app/src/components/PageShell.jsx | 23 +-- app/src/components/Planlegger.jsx | 74 +++++---- app/src/components/Report.jsx | 122 +++++++-------- app/src/components/Settings.jsx | 59 ++++--- app/src/components/TemplatePicker.jsx | 18 ++- app/src/components/TemplateSessionEditor.jsx | 26 ++-- app/src/lib/bodymap.jsx | 31 ++-- app/src/lib/prompts.js | 22 ++- app/src/styles/app.css | 6 + app/src/styles/carbon-tokens.css | 7 + 23 files changed, 459 insertions(+), 429 deletions(-) create mode 100644 app/public/fonts/Vazirmatn-Bold.woff2 create mode 100644 app/public/fonts/Vazirmatn-Regular.woff2 create mode 100644 app/public/fonts/Vazirmatn-SemiBold.woff2 diff --git a/app/public/fonts/Vazirmatn-Bold.woff2 b/app/public/fonts/Vazirmatn-Bold.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..65b427f86eba2cfa45900de247bc7cf3294cd1e5 GIT binary patch literal 51020 zcmV)9K*hgzPew8T0RR910LM%K4*&oF0po}O0LJV9Appey00000000000000000000 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 literal 0 HcmV?d00001 diff --git a/app/public/fonts/Vazirmatn-Regular.woff2 b/app/public/fonts/Vazirmatn-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..c9824c872b3b4f2eb13a102748f8ef1a6ef97da0 GIT binary patch literal 50684 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 JuV;L@umFHJgLMD^ literal 0 HcmV?d00001 diff --git a/app/public/fonts/Vazirmatn-SemiBold.woff2 b/app/public/fonts/Vazirmatn-SemiBold.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..53016415ab9f67a8deac98dfe4c9cd2e40d922a0 GIT binary patch literal 51032 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 literal 0 HcmV?d00001 diff --git a/app/src/components/Bibliotek.jsx b/app/src/components/Bibliotek.jsx index 1a7b433..be941e2 100644 --- a/app/src/components/Bibliotek.jsx +++ b/app/src/components/Bibliotek.jsx @@ -4,6 +4,7 @@ import { TextInput, Modal, } from "@carbon/react"; import { Add, TrashCan, Edit as EditIcon, ChevronRight, Search } from "@carbon/icons-react"; +import { useTranslation } from "react-i18next"; import PageShell, { SectionLabel, PageHeading, AccentChip } from "./PageShell"; import { fetchLibraryExercises, saveLibraryExercise, updateLibraryExercise, deleteLibraryExercise, @@ -14,14 +15,15 @@ import { logDevError } from "../lib/utils"; import ExerciseForm from "./ExerciseForm"; export default function Bibliotek({ onEditTemplate, initialTab = 0 }) { + const { t } = useTranslation(); const [tabIndex, setTabIndex] = useState(initialTab); const [exSearch, setExSearch] = useState(""); const [debouncedSearch, setDebouncedSearch] = useState(""); useEffect(() => { - const t = setTimeout(() => setDebouncedSearch(exSearch), 200); - return () => clearTimeout(t); + const timer = setTimeout(() => setDebouncedSearch(exSearch), 200); + return () => clearTimeout(timer); }, [exSearch]); const [exercises, setExercises] = useState([]); @@ -84,7 +86,7 @@ export default function Bibliotek({ onEditTemplate, initialTab = 0 }) { const handleDeleteExercise = async (id) => { const ex = exercises.find(e => e.id === id); const affectedTemplates = await fetchTemplateNamesUsingExercise(id).catch(() => []); - setConfirmDelete({ type: "exercise", id, name: ex?.name || "øvelsen", affectedTemplates }); + setConfirmDelete({ type: "exercise", id, name: ex?.name || "", affectedTemplates }); }; const handleSaveNewTemplate = async () => { @@ -103,7 +105,7 @@ export default function Bibliotek({ onEditTemplate, initialTab = 0 }) { const handleDeleteTemplate = (id) => { const tpl = templates.find(t => t.id === id); - setConfirmDelete({ type: "template", id, name: tpl?.name || "malen" }); + setConfirmDelete({ type: "template", id, name: tpl?.name || "" }); }; const executeDelete = async () => { @@ -126,15 +128,15 @@ export default function Bibliotek({ onEditTemplate, initialTab = 0 }) { }; const tabLabels = [ - `Øvelser${!exLoading ? ` (${exercises.length})` : ""}`, - `Maler${!tplLoading ? ` (${templates.length})` : ""}`, + `${t("bibliotek.tabExercises")}${!exLoading ? ` (${exercises.length})` : ""}`, + `${t("bibliotek.tabTemplates")}${!tplLoading ? ` (${templates.length})` : ""}`, ]; return (

- BIBLIOTEK - Dine byggklosser. + {t("bibliotek.sectionLabel")} + {t("bibliotek.heading")} {/* Pill tab strip */}
{tabLabels.map((label, i) => ( )} - {/* Snarvei carousel — template shortcuts */} + {/* Shortcut carousel — template shortcuts */} {!tplLoading && templates.length > 0 && (

- SNARVEIER + {t("bibliotek.shortcuts")}

{templates.map(tpl => { @@ -211,7 +213,7 @@ export default function Bibliotek({ onEditTemplate, initialTab = 0 }) { {tpl.name}
- {exCount} ØV + {t("bibliotek.exerciseCount", { count: exCount })}
); @@ -228,7 +230,7 @@ export default function Bibliotek({ onEditTemplate, initialTab = 0 }) { type="search" id="exercise-search" name="exercise-search" - placeholder="Søk øvelse…" + placeholder={t("bibliotek.searchPlaceholder")} value={exSearch} onChange={e => setExSearch(e.target.value)} style={{ @@ -254,10 +256,10 @@ export default function Bibliotek({ onEditTemplate, initialTab = 0 }) { )} {exLoading ? ( - + ) : filteredExercises.length === 0 && !showNewEx ? (

- {exSearch.trim() ? "Ingen øvelser matcher søket." : "Ingen øvelser lagt til ennå."} + {exSearch.trim() ? t("bibliotek.noSearchResults") : t("bibliotek.noExercises")}

) : (
@@ -274,7 +276,7 @@ export default function Bibliotek({ onEditTemplate, initialTab = 0 }) {
{(ex.primary_muscles || []).slice(0, 4).map(id => ( - {MUSCLES[id]?.label || id} + {t(`muscles.${id}`, { defaultValue: MUSCLES[id]?.label || id })} ))} {(ex.secondary_muscles || []).slice(0, 3).map(id => ( - {MUSCLES[id]?.label || id} + {t(`muscles.${id}`, { defaultValue: MUSCLES[id]?.label || id })} ))} {!(ex.primary_muscles?.length) && !(ex.secondary_muscles?.length) && ( - Ingen muskler + {t("bibliotek.noMuscles")} )}
@@ -309,9 +311,9 @@ export default function Bibliotek({ onEditTemplate, initialTab = 0 }) { {ex.default_sets}×{ex.default_reps} )} -
)} @@ -322,16 +324,16 @@ export default function Bibliotek({ onEditTemplate, initialTab = 0 }) {
)} - {/* ── MALER ── */} + {/* ── TEMPLATES ── */} {tabIndex === 1 && (
{tplError && ( - + )} {!showNewTpl && ( )} @@ -339,29 +341,29 @@ export default function Bibliotek({ onEditTemplate, initialTab = 0 }) {
setNewTplName(e.target.value)} - placeholder="f.eks. CrossFit - Anna - mandag" + placeholder={t("bibliotek.templateNamePlaceholder")} onKeyDown={(e) => e.key === "Enter" && handleSaveNewTemplate()} style={{ marginBottom: 12 }} />
)} {tplLoading ? ( - + ) : templates.length === 0 && !showNewTpl ? (

- Ingen maler opprettet ennå. + {t("bibliotek.noTemplates")}

) : (
@@ -392,14 +394,14 @@ export default function Bibliotek({ onEditTemplate, initialTab = 0 }) { {tpl.name}
- {exCount} ØV · {muscleCount} MUSKLER{usedAt ? ` · SIST ${usedAt}` : ""} + {t("bibliotek.exerciseCount", { count: exCount })} · {muscleCount} MUS{usedAt ? ` · ${usedAt}` : ""}
); @@ -413,18 +415,18 @@ export default function Bibliotek({ onEditTemplate, initialTab = 0 }) { setConfirmDelete(null)} onRequestSubmit={executeDelete} > -

Er du sikker på at du vil slette «{confirmDelete?.name}»? Dette kan ikke angres.

+

{t("bibliotek.deleteConfirm", { name: confirmDelete?.name })}

{confirmDelete?.affectedTemplates?.length > 0 && (

- Øvelsen brukes i {confirmDelete.affectedTemplates.length === 1 ? "malen" : "malene"}{" "} - {confirmDelete.affectedTemplates.join(", ")} og vil bli fjernet derfra. + {t("bibliotek.usedInTemplates", { count: confirmDelete.affectedTemplates.length })}{" "} + {confirmDelete.affectedTemplates.join(", ")} {t("bibliotek.exerciseRemovedWarning")}

)}
diff --git a/app/src/components/BodyPanel.jsx b/app/src/components/BodyPanel.jsx index adffad0..23c84c4 100644 --- a/app/src/components/BodyPanel.jsx +++ b/app/src/components/BodyPanel.jsx @@ -1,10 +1,12 @@ import { useState } from "react"; import { Button } from "@carbon/react"; +import { useTranslation } from "react-i18next"; import { BodySVG, useIsMobile } from "../lib/bodymap.jsx"; // Renders a front+back body map pair: side-by-side on desktop, toggled on mobile. // Manages its own mobile view state so parents don't need to. export default function BodyPanel({ primary, secondary, muscleMap, marginBottom = 16, onHover, hovered }) { + const { t } = useTranslation(); const isMobile = useIsMobile(); const [mobileView, setMobileView] = useState("front"); @@ -15,7 +17,7 @@ export default function BodyPanel({ primary, secondary, muscleMap, marginBottom {["front", "back"].map(v => ( ))}
diff --git a/app/src/components/ExerciseForm.jsx b/app/src/components/ExerciseForm.jsx index d11e06f..871f36b 100644 --- a/app/src/components/ExerciseForm.jsx +++ b/app/src/components/ExerciseForm.jsx @@ -1,5 +1,6 @@ import { useState } from "react"; import { Button, TextInput } from "@carbon/react"; +import { useTranslation } from "react-i18next"; import MusclePicker from "./MusclePicker"; // Form for creating or editing a library exercise. @@ -9,6 +10,7 @@ import MusclePicker from "./MusclePicker"; // onCancel() // saving — boolean, disables the save button while in flight export default function ExerciseForm({ initial, onSave, onCancel, saving }) { + const { t } = useTranslation(); const [name, setName] = useState(initial?.name || ""); const [primary, setPrimary] = useState(initial?.primary_muscles || []); const [secondary, setSecondary] = useState(initial?.secondary_muscles || []); @@ -19,16 +21,16 @@ export default function ExerciseForm({ initial, onSave, onCancel, saving }) {
setName(e.target.value)} - placeholder="f.eks. Knebøy" + placeholder={t("exerciseForm.namePlaceholder")} style={{ marginBottom: 12 }} />
setDefaultSets(e.target.value)} placeholder="–" @@ -36,7 +38,7 @@ export default function ExerciseForm({ initial, onSave, onCancel, saving }) { /> setDefaultReps(e.target.value)} placeholder="–" @@ -50,7 +52,7 @@ export default function ExerciseForm({ initial, onSave, onCancel, saving }) { instanceId={initial?.id || "new"} />
- +
diff --git a/app/src/components/ExerciseRow.jsx b/app/src/components/ExerciseRow.jsx index fda50aa..a9f53d2 100644 --- a/app/src/components/ExerciseRow.jsx +++ b/app/src/components/ExerciseRow.jsx @@ -1,6 +1,7 @@ import { useState } from "react"; import { Checkbox, Button } from "@carbon/react"; import { TrashCan } from "@carbon/icons-react"; +import { useTranslation } from "react-i18next"; import { isInvalidNum } from "../lib/utils"; export default function ExerciseRow({ @@ -11,6 +12,7 @@ export default function ExerciseRow({ validateNumbers = false, autoFocusName = false, }) { + const { t } = useTranslation(); const [editingName, setEditingName] = useState(autoFocusName); const bg = layer === "layer-02" ? "var(--cds-layer-02)" : "var(--cds-layer-01)"; @@ -46,7 +48,7 @@ export default function ExerciseRow({ autoFocus id={`ex-name-${exercise.id}`} name={`ex-name-${exercise.id}`} - aria-label="Øvelsenavn" + aria-label={t("exerciseRow.nameAriaLabel")} value={exercise.name} onChange={(e) => onChange({ name: e.target.value, standardName: e.target.value })} onBlur={() => setEditingName(false)} @@ -71,9 +73,9 @@ export default function ExerciseRow({ {exercise.name?.trim() ? ( exercise.name ) : nameInvalid ? ( - Påkrevd + {t("exerciseRow.nameRequired")} ) : ( - Klikk for å skrive øvelse… + {t("exerciseRow.namePlaceholder")} )}
)} @@ -92,7 +94,9 @@ export default function ExerciseRow({ placeholder="–" id={`ex-${field}-${exercise.id}`} name={`ex-${field}-${exercise.id}`} - aria-label={field === "sets" ? `Sett for ${exercise.name || "øvelse"}` : `Reps for ${exercise.name || "øvelse"}`} + aria-label={field === "sets" + ? t("exerciseRow.setsLabel", { name: exercise.name || t("common.exercises") }) + : t("exerciseRow.repsLabel", { name: exercise.name || t("common.exercises") })} aria-invalid={isFieldInvalid || undefined} aria-describedby={isFieldInvalid ? errorId : undefined} value={exercise[field] || ""} @@ -110,14 +114,14 @@ export default function ExerciseRow({ }} /> - {field === "sets" ? "sett" : "reps"} + {field === "sets" ? t("common.sets") : t("common.reps")} {isFieldInvalid && ( - Ugyldig antall – skriv inn 1 til 99 + {t("exerciseRow.invalidNumber")} )} @@ -129,7 +133,7 @@ export default function ExerciseRow({ kind="ghost" hasIconOnly renderIcon={TrashCan} - iconDescription="Slett øvelse" + iconDescription={t("exerciseRow.deleteExercise")} size="sm" onClick={(e) => { e.stopPropagation(); onDelete(); }} /> diff --git a/app/src/components/History.jsx b/app/src/components/History.jsx index 3dd3e7e..f04d61b 100644 --- a/app/src/components/History.jsx +++ b/app/src/components/History.jsx @@ -13,11 +13,10 @@ import { Camera, Add, Edit as EditIcon, Renew, ChevronDown, ChevronLeft, Chevron import ExerciseRowWithAutocomplete from "./ExerciseRowWithAutocomplete"; import BodyPanel from "./BodyPanel"; import PageShell, { SectionLabel, PageHeading } from "./PageShell"; +import { useTranslation } from "react-i18next"; const MUSCLE_FILTER_ITEMS = Object.entries(MUSCLES).map(([id, { label }]) => ({ id, label })); -const DAY_HEADERS = ["ma", "ti", "on", "to", "fr", "lø", "sø"]; - function calHeatColor(count) { if (!count) return "var(--surface-card)"; if (count <= 1) return "var(--heat-1)"; @@ -28,6 +27,16 @@ function calHeatColor(count) { } function MonthGrid({ year, month, sessionCountMap, onDayClick, selectedDate, today }) { + const { t } = useTranslation(); + const DAY_HEADERS = [ + t("history.days.mon"), + t("history.days.tue"), + t("history.days.wed"), + t("history.days.thu"), + t("history.days.fri"), + t("history.days.sat"), + t("history.days.sun"), + ]; const todayStr = format(today, "yyyy-MM-dd"); const selectedStr = selectedDate ? format(selectedDate, "yyyy-MM-dd") : null; const firstDOW = (new Date(year, month, 1).getDay() + 6) % 7; @@ -83,7 +92,7 @@ function MonthGrid({ year, month, sessionCountMap, onDayClick, selectedDate, tod return ( ); })} @@ -501,7 +457,7 @@ export default function History({ initialDate }) { onClick={() => setMuscleFilter([])} style={{ background: "none", border: "none", padding: "0 16px", cursor: "pointer", fontSize: 11, color: "var(--accent)", fontFamily: "var(--cds-font-mono)", letterSpacing: "0.06em", opacity: muscleFilter.length > 0 ? 1 : 0, pointerEvents: muscleFilter.length > 0 ? "auto" : "none" }} > - Nullstill filter + {t("common.resetFilter")} @@ -512,11 +468,11 @@ export default function History({ initialDate }) { ) : (
-
- VOLUM 1 + {t("history.volumeLegendMin")} {["--heat-1","--heat-2","--heat-3","--heat-4","--heat-5"].map(v => (
))} - 5+ + {t("history.volumeLegendMax")}
)} @@ -562,15 +518,15 @@ export default function History({ initialDate }) { const musIds = sessionMuscleIdMap.get(session.id) ?? new Set(); const isFilterMatch = muscleFilter.length > 0 && muscleFilter.some(id => musIds.has(id)); const matchedLabels = isFilterMatch - ? muscleFilter.filter(id => musIds.has(id)).map(id => MUSCLES[id]?.label || id) + ? muscleFilter.filter(id => musIds.has(id)).map(id => t(`muscles.${id}`, { defaultValue: MUSCLES[id]?.label || id })) : []; - const topMuscles = extractMuscles(session).primary.slice(0, 2).map(id => MUSCLES[id]?.label || id); + const topMuscles = extractMuscles(session).primary.slice(0, 2).map(id => t(`muscles.${id}`, { defaultValue: MUSCLES[id]?.label || id })); const sessionTime = session.gym_calendar?.start_time ? new Date(session.gym_calendar.start_time).toLocaleTimeString("no-NO", { hour: "2-digit", minute: "2-digit" }) : new Date(session.created_at).toLocaleTimeString("no-NO", { hour: "2-digit", minute: "2-digit" }); const sessionTitle = session.gym_calendar ? `${sessionTime} – ${session.gym_calendar.name}` - : `${sessionTime} – Egentrening`; + : `${sessionTime} – ${t("history.ownTraining")}`; return (
0 && !isFilterMatch ? 0.45 : 1 }}> @@ -582,7 +538,7 @@ export default function History({ initialDate }) { width: "100%", display: "flex", alignItems: "center", gap: 8, background: "var(--surface-card)", border: "1px solid var(--border-subtle-wl)", - borderLeft: isFilterMatch ? "3px solid var(--accent)" : "3px solid var(--border-subtle-wl)", + borderInlineStart: isFilterMatch ? "3px solid var(--accent)" : "3px solid var(--border-subtle-wl)", borderBottom: isExpanded ? "none" : "1px solid var(--border-subtle-wl)", padding: "10px 14px", cursor: "pointer", textAlign: "left", }} @@ -592,7 +548,7 @@ export default function History({ initialDate }) {
- {exCount} øvelser + {t("history.exerciseCount", { count: exCount })} {isFilterMatch ? matchedLabels.map(label => {label}) @@ -603,7 +559,7 @@ export default function History({ initialDate }) { {isExpanded && ( -
+
{/* Gym class tag (read) or selector (edit) */} {isEditing ? ( @@ -654,9 +610,9 @@ export default function History({ initialDate }) {
{hoveredMuscle ? ( -
+
- {MUSCLES[hoveredMuscle]?.label} + {t(`muscles.${hoveredMuscle}`, { defaultValue: MUSCLES[hoveredMuscle]?.label })}
@@ -664,7 +620,7 @@ export default function History({ initialDate }) { {(sessionMuscleMap[hoveredMuscle] || []).length} - {(sessionMuscleMap[hoveredMuscle] || []).length === 1 ? "ØVELSE" : "ØVELSER"} + {t("common.exercises")}
@@ -674,20 +630,20 @@ export default function History({ initialDate }) {
) : (
- Hold musepeker over kroppen for detaljer + {t("history.hoverHint")}
)}
- Primær ({sessionMuscles.primary.length}) - Sekundær ({sessionMuscles.secondary.length}) + {t("history.primaryCount", { count: sessionMuscles.primary.length })} + {t("history.secondaryCount", { count: sessionMuscles.secondary.length })}
{/* Exercise list */}

- Øvelser + {t("common.exercises")}

{isEditing ? ( @@ -719,12 +675,12 @@ export default function History({ initialDate }) { }} style={{ width: "100%" }} > - Legg til øvelse manuelt + {t("muscleMap.addManual")} ) : ( (session.session_exercises || []).map(ex => { - const muscleLabels = (ex.muscle_activations || []).map(ma => MUSCLES[ma.muscle_id]?.label || ma.muscle_id).join(", "); + const muscleLabels = (ex.muscle_activations || []).map(ma => t(`muscles.${ma.muscle_id}`, { defaultValue: MUSCLES[ma.muscle_id]?.label || ma.muscle_id })).join(", "); return (
@@ -747,7 +703,7 @@ export default function History({ initialDate }) { {!isEditing && (

- Muskelgrupper + {t("history.muscleGroups")}

{sessionMuscles.primary.map(id => { const exNames = (sessionMuscleMap[id] || []).join(", "); @@ -756,10 +712,10 @@ export default function History({ initialDate }) {
{exNames ? ( - {MUSCLES[id]?.label || id} - ) : MUSCLES[id]?.label || id} + {t(`muscles.${id}`, { defaultValue: MUSCLES[id]?.label || id })} + ) : t(`muscles.${id}`, { defaultValue: MUSCLES[id]?.label || id })} - Primær + {t("common.primary")}
); })} @@ -770,10 +726,10 @@ export default function History({ initialDate }) {
{exNames ? ( - {MUSCLES[id]?.label || id} - ) : MUSCLES[id]?.label || id} + {t(`muscles.${id}`, { defaultValue: MUSCLES[id]?.label || id })} + ) : t(`muscles.${id}`, { defaultValue: MUSCLES[id]?.label || id })} - Sekundær + {t("common.secondary")}
); })} @@ -784,25 +740,25 @@ export default function History({ initialDate }) { {isEditing && ( <> {analyzeError && ( - + )} {editError && ( - + )} { if (e.target.files[0]) reanalyze(e.target.files[0]); e.target.value = ""; }} />
- +
@@ -811,7 +767,7 @@ export default function History({ initialDate }) { {/* Read mode: edit button (hidden when any session is in edit mode) */} {!editMode && ( )}
@@ -824,7 +780,7 @@ export default function History({ initialDate }) { {!loading && sessions.length === 0 && (

- Ingen økter lagret ennå. + {t("history.noSessions")}

)} diff --git a/app/src/components/Home.jsx b/app/src/components/Home.jsx index 43f4231..b4ea94c 100644 --- a/app/src/components/Home.jsx +++ b/app/src/components/Home.jsx @@ -3,13 +3,14 @@ import { format, parseISO, startOfISOWeek, addDays, getISOWeek } from "date-fns" import { nb } from "date-fns/locale"; import { InlineLoading } from "@carbon/react"; import { ArrowRight } from "@carbon/icons-react"; +import { useTranslation } from "react-i18next"; import { BodySVG } from "../lib/bodymap.jsx"; import { fetchLastSession, fetchThisWeekSessions } from "../lib/db"; import { extractMuscles, logDevError } from "../lib/utils"; import PageShell, { SectionLabel, AccentChip } from "./PageShell"; import { useNav } from "../lib/NavContext"; -const DAY_LABELS = ["M", "T", "O", "T", "F", "L", "S"]; +const WEEK_DAY_KEYS = ["mon", "tue", "wed", "thu", "fri", "sat", "sun"]; function formatSessionDate(isoDate) { const raw = format(parseISO(isoDate), "EEEE d. MMMM", { locale: nb }); @@ -33,6 +34,7 @@ function countUniqueMuscles(sessions) { } export default function Home({ onShowHistoryWithDate }) { + const { t } = useTranslation(); const { onShowLogger } = useNav(); const [lastSession, setLastSession] = useState(undefined); const [weekSessions, setWeekSessions] = useState(undefined); @@ -60,8 +62,8 @@ export default function Home({ onShowHistoryWithDate }) { } useEffect(() => { - fetchLastSession().then(setLastSession).catch(() => setLastSession(null)); // home renders empty state on failure - fetchThisWeekSessions().then(setWeekSessions).catch(() => setWeekSessions([])); // home renders empty state on failure + fetchLastSession().then(setLastSession).catch(() => setLastSession(null)); + fetchThisWeekSessions().then(setWeekSessions).catch(() => setWeekSessions([])); }, []); useEffect(() => { @@ -76,12 +78,12 @@ export default function Home({ onShowHistoryWithDate }) { const isToday = lastSession?.session_date === format(today, "yyyy-MM-dd"); const weekStart = startOfISOWeek(today); - const weekDays = DAY_LABELS.map((label, i) => { + const weekDays = WEEK_DAY_KEYS.map((key, i) => { const date = format(addDays(weekStart, i), "yyyy-MM-dd"); const sessions = weekSessions?.filter(s => s.session_date === date) ?? []; const count = sessions.reduce((sum, s) => sum + (s.session_exercises?.length ?? 0), 0); const names = sessions.map(s => s.gym_calendar?.name).filter(Boolean); - return { label, date, count, names }; + return { label: t(`home.weekStrip.${key}`), date, count, names }; }); const maxWeekCount = Math.max(...weekDays.map(d => d.count), 1); @@ -102,8 +104,8 @@ export default function Home({ onShowHistoryWithDate }) { {formatTodayEyebrow(today)}
-
Tren.
-
I dag.
+
{t("home.train")}
+
{t("home.today")}
@@ -138,7 +140,7 @@ export default function Home({ onShowHistoryWithDate }) {
0 ? "button" : undefined} tabIndex={count > 0 ? 0 : -1} - aria-label={count > 0 ? `${label}: ${count} ${count === 1 ? "øvelse" : "øvelser"}` : undefined} + aria-label={count > 0 ? `${label}: ${t("templatePicker.exerciseCount", { count })}` : undefined} onClick={count > 0 ? () => onShowHistoryWithDate(date) : undefined} onKeyDown={count > 0 ? e => { if (e.key === "Enter" || e.key === " ") { e.preventDefault(); onShowHistoryWithDate(date); } } : undefined} onMouseEnter={count > 0 ? e => { @@ -195,7 +197,7 @@ export default function Home({ onShowHistoryWithDate }) {
{weekSessions !== undefined && (
- {`${weekSessionCount} ØKTE${weekSessionCount !== 1 ? "R" : ""} · ${weekMuscleCount} MUSKELGRUPPE${weekMuscleCount !== 1 ? "R" : ""}`} + {t("planlegger.weekSummary", { count: weekSessionCount, muscleCount: weekMuscleCount }).toUpperCase()}
)}
@@ -203,19 +205,19 @@ export default function Home({ onShowHistoryWithDate }) { {/* Last session */}
- {isToday ? "DAGENS ØKT" : "SISTE ØKT"} + {isToday ? t("home.todaySession") : t("home.lastSession")}
{lastSession === undefined && (
- +
)} @@ -228,7 +230,7 @@ export default function Home({ onShowHistoryWithDate }) { padding: 24, textAlign: "center", color: "var(--cds-text-secondary)", fontSize: 14, }}> - Ingen økter logget ennå. Logg din første økt! + {t("home.noSessions")}
)} @@ -258,12 +260,12 @@ export default function Home({ onShowHistoryWithDate }) {
) : (
- Egentrening + {t("home.ownTraining")}
)}
- {exCount} øvelser - {muscleCount} muskler + {t("history.exerciseCount", { count: exCount })} + {t("history.exerciseCount", { count: muscleCount })}
diff --git a/app/src/components/LibraryPicker.jsx b/app/src/components/LibraryPicker.jsx index 4cd2548..98bf4b2 100644 --- a/app/src/components/LibraryPicker.jsx +++ b/app/src/components/LibraryPicker.jsx @@ -1,5 +1,6 @@ import { useState } from "react"; import { Button, TextInput } from "@carbon/react"; +import { useTranslation } from "react-i18next"; // Searchable picker that shows library exercises and lets the user add one to a list. // Props: @@ -7,6 +8,7 @@ import { Button, TextInput } from "@carbon/react"; // onAdd(exercise) — called when user clicks an exercise // onClose() — called when user dismisses the picker export default function LibraryPicker({ libraryExercises, onAdd, onClose }) { + const { t } = useTranslation(); const [query, setQuery] = useState(""); const filtered = query.trim() ? libraryExercises.filter(e => e.name.toLowerCase().includes(query.toLowerCase())) @@ -21,16 +23,16 @@ export default function LibraryPicker({ libraryExercises, onAdd, onClose }) { }}> setQuery(e.target.value)} - placeholder="Skriv for å filtrere…" + placeholder={t("libraryPicker.searchPlaceholder")} style={{ marginBottom: 8 }} autoFocus />
{filtered.length === 0 ? ( -

Ingen treff.

+

{t("libraryPicker.noResults")}

) : ( filtered.map(ex => ( +
); } diff --git a/app/src/components/Login.jsx b/app/src/components/Login.jsx index e7854ad..e05ea9e 100644 --- a/app/src/components/Login.jsx +++ b/app/src/components/Login.jsx @@ -1,8 +1,10 @@ import { useState } from "react"; +import { useTranslation } from "react-i18next"; import { supabase } from "../lib/supabase"; import { Button, TextInput, InlineNotification } from "@carbon/react"; import { Email } from "@carbon/icons-react"; +// Daily quotes stay in Norwegian regardless of language setting. function getDailyQuote() { const now = new Date(); const mmdd = String(now.getMonth() + 1).padStart(2, "0") + "-" + String(now.getDate()).padStart(2, "0"); @@ -26,6 +28,7 @@ function getDailyQuote() { } export default function Login() { + const { t } = useTranslation(); const [email, setEmail] = useState(""); const [loading, setLoading] = useState(false); const [sent, setSent] = useState(false); @@ -67,7 +70,7 @@ export default function Login() { Workout Lens
- Logg inn for å fortsette + {t("login.subtitle")}
{getDailyQuote()} @@ -84,9 +87,9 @@ export default function Login() { gap: 12, }}> -
Sjekk e-posten din
+
{t("login.checkEmail")}
- Vi sendte en innloggingslenke til {email} + {t("login.sentTo")} {email}
) : ( @@ -94,8 +97,8 @@ export default function Login() { setEmail(e.target.value)} required @@ -103,10 +106,10 @@ export default function Login() { {error && ( )} )} diff --git a/app/src/components/MuscleMap.jsx b/app/src/components/MuscleMap.jsx index b410251..e1f08b7 100644 --- a/app/src/components/MuscleMap.jsx +++ b/app/src/components/MuscleMap.jsx @@ -14,18 +14,14 @@ import ExerciseRowWithAutocomplete from "./ExerciseRowWithAutocomplete"; import BodyPanel from "./BodyPanel"; import PageShell, { SectionLabel, AccentChip, StickyCta } from "./PageShell"; import { useNav } from "../lib/NavContext"; +import { useTranslation } from "react-i18next"; +import i18n from "../lib/i18n"; const localDateStr = () => { const d = new Date(); return `${d.getFullYear()}-${String(d.getMonth()+1).padStart(2,"0")}-${String(d.getDate()).padStart(2,"0")}`; }; -const STEP_DEFS = [ - { num: "01", label: "Knips" }, - { num: "02", label: "Bekreft" }, - { num: "03", label: "Resultat" }, -]; - const MAX_FILE_SIZE_MB = 5; const MAX_FILE_SIZE_BYTES = MAX_FILE_SIZE_MB * 1024 * 1024; @@ -111,6 +107,7 @@ export function reducer(state, action) { // ── MAIN COMPONENT ──────────────────────────────────────────────────── export default function MuscleMap({ templatePreload, onTemplatePreloadConsumed }) { + const { t } = useTranslation(); const { onShowHome, onShowTemplatePicker, onShowReportWithPrefill } = useNav(); const [state, dispatch] = useReducer(reducer, initialState); const { step, images, exercises, muscles, error, dragging, editingId, @@ -122,6 +119,12 @@ export default function MuscleMap({ templatePreload, onTemplatePreloadConsumed } const [newExerciseIds, setNewExerciseIds] = useState(() => new Set()); const [useTodayDate, setUseTodayDate] = useState(true); + const STEP_DEFS = [ + { num: "01", label: t("muscleMap.stepSnap") }, + { num: "02", label: t("muscleMap.stepConfirm") }, + { num: "03", label: t("muscleMap.stepResult") }, + ]; + useEffect(() => { fetchLibraryExercises().then(setLibraryExercises).catch(() => {}); }, []); @@ -226,7 +229,7 @@ export default function MuscleMap({ templatePreload, onTemplatePreloadConsumed } const res = await callClaude({ model: CLAUDE_MODEL_TEXT, max_tokens: 1000, - messages: [{ role: "user", content: buildRecommendPrompt(trained, untrained) }] + messages: [{ role: "user", content: buildRecommendPrompt(trained, untrained, i18n.language) }] }); let data; try { data = await res.json(); } catch { throw new Error(`Serverfeil (${res.status}): Ugyldig svar fra server`); } @@ -255,11 +258,11 @@ export default function MuscleMap({ templatePreload, onTemplatePreloadConsumed }
- LOGG ØKT + {t("muscleMap.sectionLabel")}
{/* Top-border stepper */} -
+
{STEP_DEFS.map((s, idx) => { const isActive = stepIndex === idx; const isComplete = stepIndex > idx; @@ -287,19 +290,19 @@ export default function MuscleMap({ templatePreload, onTemplatePreloadConsumed } {/* Hero */}
-
Ta bilde av
-
tavla.
+
{t("muscleMap.heroLine1")}
+
{t("muscleMap.heroLine2")}

- {images.length > 0 ? `${images.length} bilde${images.length !== 1 ? "r" : ""} valgt` : ""} + {images.length > 0 ? t("muscleMap.imageCount", { count: images.length }) : ""}

{/* Dropzone */} {images.length === 0 ? (
{ e.preventDefault(); dispatch({ type: "SET_DRAGGING", dragging: true }); }} onDragLeave={() => dispatch({ type: "SET_DRAGGING", dragging: false })} onDrop={(e) => { e.preventDefault(); dispatch({ type: "SET_DRAGGING", dragging: false }); handleFiles(e.dataTransfer.files); }} @@ -328,14 +331,14 @@ export default function MuscleMap({ templatePreload, onTemplatePreloadConsumed } }}>
-

Trykk for å velge bilde

-

eller dra og slipp · JPEG, PNG, WebP

+

{t("muscleMap.dropzoneClick")}

+

{t("muscleMap.dropzoneDrag")}

) : (
{ e.preventDefault(); dispatch({ type: "SET_DRAGGING", dragging: true }); }} onDragLeave={() => dispatch({ type: "SET_DRAGGING", dragging: false })} onDrop={(e) => { e.preventDefault(); dispatch({ type: "SET_DRAGGING", dragging: false }); handleFiles(e.dataTransfer.files); }} @@ -344,9 +347,9 @@ export default function MuscleMap({ templatePreload, onTemplatePreloadConsumed }
{images.map((img, idx) => (
- {`Treningsbilde + {t("muscleMap.imageAlt",
@@ -395,7 +398,7 @@ export default function MuscleMap({ templatePreload, onTemplatePreloadConsumed } cursor: "pointer", }} > - Mal + {t("muscleMap.useTemplate")}
{/* Tips callout */}
-

Tips

-

God belysning og hele tavla i bildet gir best resultat. Flere bilder støttes.

+

{t("muscleMap.tipsHeading")}

+

{t("muscleMap.tipsBody")}

{sizeError && ( - + )}
{error && ( - + )}
@@ -446,7 +449,7 @@ export default function MuscleMap({ templatePreload, onTemplatePreloadConsumed } fontFamily: "var(--cds-font-sans)", fontSize: 14, cursor: "pointer", }} > - Avbryt + {t("common.cancel")}
@@ -474,7 +477,7 @@ export default function MuscleMap({ templatePreload, onTemplatePreloadConsumed } {step === "analyzing" && (
@@ -490,7 +493,7 @@ export default function MuscleMap({ templatePreload, onTemplatePreloadConsumed } {exercises.length} - øvelser funnet. + {t("muscleMap.foundExercises", { count: exercises.length })}
{/* Tilbake */} @@ -502,7 +505,7 @@ export default function MuscleMap({ templatePreload, onTemplatePreloadConsumed } display: "flex", alignItems: "center", gap: 4, }} > - Tilbake + {t("common.back")} {/* I dag / Annen dag segmented pill */} @@ -518,7 +521,7 @@ export default function MuscleMap({ templatePreload, onTemplatePreloadConsumed } transition: "background 120ms ease", }} > - I dag + {t("muscleMap.today")}
@@ -550,19 +553,19 @@ export default function MuscleMap({ templatePreload, onTemplatePreloadConsumed } }} style={{ marginBottom: 16 }} > - + )} {gymSessions.length > 0 && (