feat: complete Phase 1 foundation scaffold
Some checks failed
CI / Lint (push) Has been cancelled
CI / TypeCheck (push) Has been cancelled
CI / Test (push) Has been cancelled
Deploy / Docker Build & Push (map[context:. dockerfile:apps/api/Dockerfile name:api]) (push) Has been cancelled
Deploy / Docker Build & Push (map[context:. dockerfile:apps/cms/Dockerfile name:cms]) (push) Has been cancelled
Deploy / Docker Build & Push (map[context:. dockerfile:apps/web/Dockerfile name:web]) (push) Has been cancelled
CI / Build (push) Has been cancelled
Deploy / Deploy (push) Has been cancelled

- Monorepo: Turborepo + pnpm workspaces with 7 apps/packages
- Backend: NestJS scaffold with 9 modules (auth, tenant, curriculum, simulation, portfolio, ai-coach, analytics, classroom, gamification)
- Frontend: React 18 + Vite + TailwindCSS + shadcn/ui with 10 pages, 14 UI primitives, 3 Zustand stores
- Database: Prisma schema with 19 models, 13 enums, seed script, multi-tenant ready
- Docker: Dev, production, and Portainer Compose files with Traefik reverse proxy
- Configuration: .env.example (47 vars), Zod validation, frontend-safe env exposure
- i18n: English + Greek locale files (10 files), ICU MessageFormat, react-i18next
- Shared packages: @investplay/types, @investplay/ui, @investplay/i18n, @investplay/utils
- CI/CD: GitHub Actions (lint, typecheck, test, build, deploy, PR checks)
- Documentation: CONTEXT.md, ARCHITECTURE.md (10 Mermaid diagrams), API.md, LOCALIZATION.md, DEVELOPMENT-ROADMAP.md
- Infrastructure: Dockerfiles (dev + prod), nginx configs, backup/healthcheck scripts
- Security: JWT auth guards, role-based access, rate limiting, Helmet, CORS, PII sanitization
This commit is contained in:
Lefteris Notas
2026-06-12 19:32:57 +03:00
parent fa71c60cfc
commit e75f913f1c
226 changed files with 17547 additions and 0 deletions

View File

@@ -0,0 +1,23 @@
{
"name": "@investplay/i18n",
"version": "0.1.0",
"private": true,
"description": "InvestPlay internationalization package",
"main": "./src/index.ts",
"types": "./src/index.ts",
"scripts": {
"lint": "eslint \"src/**/*.ts\" --fix",
"typecheck": "tsc --noEmit",
"clean": "rimraf .turbo"
},
"dependencies": {
"i18next": "^24.2.0",
"react-i18next": "^15.4.0",
"intl-messageformat": "^10.7.0"
},
"devDependencies": {
"typescript": "^5.8.0",
"eslint": "^8.57.0",
"rimraf": "^6.0.0"
}
}

View File

@@ -0,0 +1,53 @@
import i18next, { type InitOptions } from "i18next";
import { initReactI18next } from "react-i18next";
import enCommon from "./locales/en/common.json" with { type: "json" };
import enFinance from "./locales/en/finance.json" with { type: "json" };
import enGamification from "./locales/en/gamification.json" with { type: "json" };
import enClassroom from "./locales/en/classroom.json" with { type: "json" };
import enAiCoach from "./locales/en/ai-coach.json" with { type: "json" };
import elCommon from "./locales/el/common.json" with { type: "json" };
import elFinance from "./locales/el/finance.json" with { type: "json" };
import elGamification from "./locales/el/gamification.json" with { type: "json" };
import elClassroom from "./locales/el/classroom.json" with { type: "json" };
import elAiCoach from "./locales/el/ai-coach.json" with { type: "json" };
const resources = {
en: {
common: enCommon,
finance: enFinance,
gamification: enGamification,
classroom: enClassroom,
aiCoach: enAiCoach,
},
el: {
common: elCommon,
finance: elFinance,
gamification: elGamification,
classroom: elClassroom,
aiCoach: elAiCoach,
},
} as const;
export type LocaleResource = typeof resources;
const defaultOptions: InitOptions = {
resources,
fallbackLng: "en",
defaultNS: "common",
ns: ["common", "finance", "gamification", "classroom", "aiCoach"],
interpolation: {
escapeValue: false,
},
returnNull: false,
returnEmptyString: false,
};
export function initI18n(options?: Partial<InitOptions>): typeof i18next {
const instance = i18next.createInstance();
instance.use(initReactI18next);
instance.init({ ...defaultOptions, ...options });
return instance;
}
export { useTranslation } from "react-i18next";
export type { LocaleResource };

View File

@@ -0,0 +1,34 @@
{
"chat": {
"placeholder": "Ρωτήστε με οτιδήποτε για τα οικονομικά...",
"greeting": "Γεια σας! Είμαι ο AI Coach σας. Μπορώ να σας βοηθήσω να κατανοήσετε οικονομικές έννοιες, να αναλύσετε το χαρτοφυλάκιό σας και να σας καθοδηγήσω σε προσομοιώσεις. Τι θα θέλατε να μάθετε σήμερα;",
"quotaExhausted": "Φτάσατε στο ημερήσιο όριο μηνυμάτων για τον AI Coach. Αναβαθμίστε το πρόγραμμά σας ή δοκιμάστε ξανά αύριο.",
"thinking": "Σκέφτομαι...",
"errorFallback": "Αντιμετωπίζω δυσκολία στην επεξεργασία του αιτήματός σας. Παρακαλώ δοκιμάστε ξανά.",
"send": "Αποστολή",
"clear": "Εκκαθάριση συνομιλίας",
"close": "Κλείσιμο συνομιλίας",
"minimize": "Ελαχιστοποίηση"
},
"context": {
"lesson": "Αυτή τη στιγμή βρίσκεστε στο μάθημα \"{{lesson}}\". Θα προσαρμόσω τις απαντήσεις μου για να σας βοηθήσω με αυτό το θέμα.",
"simulation": "Βλέπω ότι εκτελείτε μια προσομοίωση {{simulation}}. Επιτρέψτε μου να σας βοηθήσω να λάβετε τεκμηριωμένες αποφάσεις.",
"portfolio": "Ορίστε μια γρήγορη ανάλυση της τρέχουσας κατανομής του χαρτοφυλακίου σας."
},
"limits": {
"dailyMessages": "Ημερήσια μηνύματα: {{used}} / {{limit}}",
"tokenUsage": "Tokens που χρησιμοποιήθηκαν: {{used}} / {{limit}}",
"upgrade": "Χρειάζεστε περισσότερα; Επικοινωνήστε με τον διαχειριστή σας."
},
"topics": {
"basics": "Οικονομικά Βασικά",
"investing": "Επενδύσεις",
"budgeting": "Προϋπολογισμός",
"debt": "Διαχείριση Χρέους",
"retirement": "Συνταξιοδοτικός Προγραμματισμός",
"taxes": "Φόροι",
"insurance": "Ασφάλειες",
"realEstate": "Ακίνητα",
"crypto": "Κρυπτονομίσματα"
}
}

View File

@@ -0,0 +1,66 @@
{
"dashboard": {
"title": "Πίνακας Ελέγχου Τάξης",
"overview": "Επισκόπηση",
"totalStudents": "Σύνολο Μαθητών",
"averageScore": "Μέση Βαθμολογία",
"completionRate": "Ποσοστό Ολοκλήρωσης",
"reports": "Αναφορές",
"recentActivity": "Πρόσφατη Δραστηριότητα",
"noActivity": "Καμία πρόσφατη δραστηριότητα"
},
"assignments": {
"title": "Εργασίες",
"create": "Δημιουργία Εργασίας",
"edit": "Επεξεργασία Εργασίας",
"delete": "Διαγραφή Εργασίας",
"dueDate": "Ημερομηνία Παράδοσης",
"requiredScore": "Απαιτούμενη Βαθμολογία",
"maxAttempts": "Μέγιστες Προσπάθειες",
"submissions": "Υποβολές",
"noAssignments": "Δεν έχουν δημιουργηθεί εργασίες ακόμα",
"status": {
"open": "Ανοικτή",
"closed": "Κλειστή",
"draft": "Πρόχειρο"
}
},
"cohorts": {
"title": "Τμήματα",
"create": "Δημιουργία Τμήματος",
"join": "Εγγραφή σε Τάξη",
"inviteCode": "Κωδικός Πρόσκλησης",
"students": "Μαθητές",
"noCohorts": "Δεν υπάρχουν τμήματα ακόμα",
"emptyClass": "Δεν υπάρχουν μαθητές σε αυτή την τάξη ακόμα"
},
"reports": {
"title": "Αναφορές",
"generate": "Δημιουργία Αναφοράς",
"export": "Εξαγωγή",
"compositeScore": "Σύνθετη Βαθμολογία",
"roi": "Απόδοση Επένδυσης",
"riskManagement": "Διαχείριση Κινδύνου",
"esgAlignment": "ESG Συμμόρφωση",
"quizScore": "Βαθμολογία Κουίζ",
"lessonCompletion": "Ολοκλήρωση Μαθημάτων",
"studentProgress": "Πρόοδος Μαθητή",
"classAverage": "Μέσος Όρος Τάξης"
},
"teacher": {
"actions": {
"createAssignment": "Νέα Εργασία",
"viewSubmissions": "Προβολή Υποβολών",
"gradeAssignment": "Βαθμολόγηση Εργασίας",
"manageStudents": "Διαχείριση Μαθητών",
"sendAnnouncement": "Αποστολή Ανακοίνωσης",
"viewReports": "Προβολή Αναφορών"
},
"announcement": {
"title": "Ανακοίνωση",
"placeholder": "Γράψτε μια ανακοίνωση για την τάξη σας...",
"send": "Αποστολή Ανακοίνωσης",
"sent": "Η ανακοίνωση στάλθηκε με επιτυχία"
}
}
}

View File

@@ -0,0 +1,103 @@
{
"nav": {
"dashboard": "Πίνακας Ελέγχου",
"learn": "Μάθηση",
"play": "Παιχνίδι",
"practice": "Εξάσκηση",
"teach": "Διδασκαλία",
"classroom": "Τάξη",
"leaderboard": "Βαθμολογία",
"profile": "Προφίλ",
"settings": "Ρυθμίσεις",
"admin": "Διαχείριση"
},
"actions": {
"next": "Επόμενο",
"back": "Πίσω",
"submit": "Υποβολή",
"cancel": "Ακύρωση",
"save": "Αποθήκευση",
"delete": "Διαγραφή",
"edit": "Επεξεργασία",
"view": "Προβολή",
"confirm": "Επιβεβαίωση",
"retry": "Δοκιμή ξανά",
"close": "Κλείσιμο",
"continue": "Συνέχεια",
"start": "Έναρξη",
"finish": "Ολοκλήρωση",
"skip": "Παράλειψη",
"search": "Αναζήτηση",
"filter": "Φίλτρο",
"sort": "Ταξινόμηση",
"refresh": "Ανανέωση",
"download": "Λήψη",
"upload": "Μεταφόρτωση",
"share": "Κοινοποίηση",
"copy": "Αντιγραφή",
"undo": "Αναίρεση",
"redo": "Επανάληψη"
},
"errors": {
"generic": "Κάτι πήγε στραβά. Παρακαλώ δοκιμάστε ξανά.",
"network": "Σφάλμα δικτύου. Ελέγξτε τη σύνδεσή σας.",
"unauthorized": "Πρέπει να συνδεθείτε για να δείτε αυτή τη σελίδα.",
"forbidden": "Δεν έχετε άδεια να εκτελέσετε αυτή την ενέργεια.",
"notFound": "Η σελίδα που ζητήσατε δεν υπάρχει.",
"validation": "Ελέγξτε τα στοιχεία σας και δοκιμάστε ξανά.",
"timeout": "Το αίτημα έληξε. Παρακαλώ δοκιμάστε ξανά.",
"serverError": "Σφάλμα διακομιστή. Η ομάδα μας έχει ειδοποιηθεί.",
"rateLimited": "Πάρα πολλά αιτήματα. Παρακαλώ περιμένετε λίγο.",
"sessionExpired": "Η συνεδρία σας έληξε. Παρακαλώ συνδεθείτε ξανά."
},
"auth": {
"login": "Σύνδεση",
"register": "Δημιουργία Λογαριασμού",
"logout": "Αποσύνδεση",
"forgotPassword": "Ξεχάσατε τον Κωδικό;",
"resetPassword": "Επαναφορά Κωδικού",
"changePassword": "Αλλαγή Κωδικού",
"email": "Διεύθυνση email",
"password": "Κωδικός",
"confirmPassword": "Επιβεβαίωση κωδικού",
"rememberMe": "Να με θυμάσαι",
"noAccount": "Δεν έχετε λογαριασμό;",
"hasAccount": "Έχετε ήδη λογαριασμό;",
"signUp": "Εγγραφή",
"signIn": "Σύνδεση",
"welcomeBack": "Καλώς ήρθατε πίσω",
"createAccount": "Δημιουργήστε τον λογαριασμό σας",
"termsAgree": "Συμφωνώ με τους Όρους Χρήσης και την Πολιτική Απορρήτου"
},
"empty": {
"noData": "Δεν υπάρχουν διαθέσιμα δεδομένα",
"noResults": "Δεν βρέθηκαν αποτελέσματα",
"comingSoon": "Σύντομα διαθέσιμο",
"noLessons": "Δεν υπάρχουν μαθήματα ακόμα",
"noSimulations": "Δεν υπάρχουν διαθέσιμες προσομοιώσεις",
"noAssignments": "Δεν υπάρχουν εργασίες ακόμα",
"noStudents": "Δεν είναι εγγεγραμμένοι μαθητές",
"noMessages": "Δεν υπάρχουν μηνύματα ακόμα"
},
"time": {
"today": "Σήμερα",
"yesterday": "Χθες",
"thisWeek": "Αυτή την εβδομάδα",
"thisMonth": "Αυτό τον μήνα",
"minutes": "{{count}} λεπτό",
"minutes_plural": "{{count}} λεπτά",
"hours": "{{count}} ώρα",
"hours_plural": "{{count}} ώρες",
"days": "{{count}} ημέρα",
"days_plural": "{{count}} ημέρες"
},
"theme": {
"light": "Φωτεινό",
"dark": "Σκοτεινό",
"system": "Συστήματος"
},
"language": {
"en": "English",
"el": "Ελληνικά"
}
}

View File

@@ -0,0 +1,105 @@
{
"assetClasses": {
"stocks": "Μετοχές",
"bonds": "Ομόλογα",
"etfs": "ETF",
"mutualFunds": "Αμοιβαία Κεφάλαια",
"crypto": "Κρυπτονομίσματα",
"realEstate": "Ακίνητα",
"commodities": "Εμπορεύματα",
"cash": "Μετρητά",
"derivatives": "Παράγωγα",
"forex": "Συνάλλαγμα"
},
"investmentTypes": {
"growth": "Επένδυση Ανάπτυξης",
"value": "Επένδυση Αξίας",
"dividend": "Επένδυση Μερισμάτων",
"index": "Επένδυση Δείκτη",
"esg": "ESG Επένδυση",
"dayTrading": "Ημερήσια Διαπραγμάτευση",
"swing": "Swing Trading",
"dca": "Μέσος Όρος Κόστους"
},
"banking": {
"savingsAccount": "Λογαριασμός Ταμιευτηρίου",
"checkingAccount": "Τρεχούμενος Λογαριασμός",
"fixedDeposit": "Προθεσμιακή Κατάθεση",
"interestRate": "Επιτόκιο",
"apr": "Επιτόκιο (APR)",
"apy": "Ετήσια Απόδοση (APY)",
"compoundInterest": "Ανατοκισμός",
"principal": "Κεφάλαιο",
"maturity": "Λήξη"
},
"budgeting": {
"income": "Εισόδημα",
"expenses": "Έξοδα",
"savings": "Αποταμίευση",
"investments": "Επενδύσεις",
"needs": "Ανάγκες",
"wants": "Επιθυμίες",
"emergencyFund": "Ταμείο Έκτακτης Ανάγκης",
"trackExpenses": "Παρακολούθηση Εξόδων",
"setBudget": "Ορισμός Προϋπολογισμού",
"reviewSpending": "Ανασκόπηση Δαπανών"
},
"debt": {
"creditCard": "Πιστωτική Κάρτα",
"studentLoan": "Φοιτητικό Δάνειο",
"mortgage": "Στεγαστικό Δάνειο",
"personalLoan": "Προσωπικό Δάνειο",
"interestRate": "Επιτόκιο",
"minimumPayment": "Ελάχιστη Πληρωμή",
"balance": "Υπόλοιπο",
"debtFree": "Χωρίς Χρέη",
"consolidation": "Συγχώνευση Χρεών",
"snowball": "Μέθοδος Χιονόμπαλας",
"avalanche": "Μέθοδος Χιονοστιβάδας"
},
"inflation": {
"inflationRate": "Ποσοστό Πληθωρισμού",
"purchasingPower": "Αγοραστική Δύναμη",
"cpi": "Δείκτης Τιμών Καταναλωτή",
"realReturn": "Πραγματική Απόδοση",
"nominalReturn": "Ονομαστική Απόδοση",
"hedge": "Αντιστάθμιση Πληθωρισμού"
},
"risk": {
"low": "Χαμηλού Κινδύνου",
"medium": "Μέτριου Κινδύνου",
"high": "Υψηλού Κινδύνου",
"volatility": "Μεταβλητότητα",
"diversification": "Διαφοροποίηση",
"correlation": "Συσχέτιση",
"beta": "Beta",
"alpha": "Alpha",
"sharpeRatio": "Δείκτης Sharpe",
"maxDrawdown": "Μέγιστη Υποχώρηση",
"riskTolerance": "Ανοχή Κινδύνου"
},
"portfolio": {
"allocation": "Κατανομή Περιουσιακών Στοιχείων",
"rebalance": "Εξισορρόπηση",
"performance": "Απόδοση",
"returns": "Αποδόσεις",
"gain": "Κέρδος",
"loss": "Ζημία",
"totalValue": "Συνολική Αξία",
"profitLoss": "Κέρδη / Ζημίες",
"roe": "Απόδοση Επένδυσης",
"annualizedReturn": "Ετήσια Απόδοση"
},
"market": {
"bullMarket": "Αγορά Ανοδική (Bull Market)",
"bearMarket": "Πτωτική Αγορά (Bear Market)",
"correction": "Διόρθωση",
"crash": "Κατάρρευση Αγοράς",
"recession": "Ύφεση",
"recovery": "Ανάκαμψη",
"volatility": "Μεταβλητότητα Αγοράς",
"liquidity": "Ρευστότητα",
"spread": "Διαφορά Αγοράς-Πώλησης",
"volume": "Όγκος Συναλλαγών"
}
}

View File

@@ -0,0 +1,62 @@
{
"xp": {
"label": "ΠΠ",
"earned": "Κερδίσατε {{count}} ΠΠ",
"needed": "{{count}} ΠΠ για το επόμενο επίπεδο",
"reason": {
"lessonCompleted": "Ολοκλήρωση μαθήματος",
"quizPassed": "Επιτυχία κουίζ",
"streakMaintained": "Διατήρηση σερί",
"challengeCompleted": "Ολοκλήρωση πρόκλησης",
"simulationCompleted": "Ολοκλήρωση προσομοίωσης",
"diversification": "Διαφοροποίηση χαρτοφυλακίου",
"riskManagement": "Σωστή διαχείριση κινδύνου",
"hypeAvoided": "Αποφυγή διαφημιστικής εκστρατείας",
"debtPaidOff": "Εξόφληση χρέους"
}
},
"level": {
"label": "Επίπεδο",
"current": "Επίπεδο {{level}}",
"progress": "Επίπεδο {{current}} — {{progress}}% για το Επίπεδο {{next}}"
},
"badges": {
"title": "Σήματα",
"unlocked": "Ξεκλείδωμα Σήματος!",
"locked": "Κλειδωμένο",
"progress": "{{count}} από {{total}} σήματα",
"categories": {
"milestone": "Ορόσημα",
"skill": "Δεξιότητες",
"behavior": "Συμπεριφορές",
"special": "Ειδικά"
}
},
"achievements": {
"title": "Επιτεύγματα",
"recent": "Πρόσφατα Επιτεύγματα",
"all": "Όλα τα Επιτεύγματα",
"empty": "Ολοκληρώστε μαθήματα για να κερδίσετε επιτεύγματα"
},
"streaks": {
"label": "Σερί",
"current": "Σερί {{count}} ημερών",
"longest": "Μεγαλύτερο: {{count}} ημέρες",
"days": "{{count}} ημέρα",
"days_plural": "{{count}} ημέρες",
"maintain": "Ολοκληρώστε ένα μάθημα σήμερα για να διατηρήσετε το σερί σας!",
"lost": "Το σερί χάθηκε. Ξεκινήστε ξανά αύριο!"
},
"leaderboard": {
"title": "Βαθμολογία",
"rank": "Θέση",
"player": "Παίκτης",
"xp": "ΠΠ",
"level": "Επίπεδο",
"badges": "Σήματα",
"yourRank": "Η Θέση σας",
"empty": "Δεν υπάρχουν ακόμα κατατάξεις. Ξεκινήστε να μαθαίνετε!",
"classroom": "Βαθμολογία Τάξης",
"global": "Γενική Βαθμολογία"
}
}

View File

@@ -0,0 +1,34 @@
{
"chat": {
"placeholder": "Ask me anything about finance...",
"greeting": "Hi! I'm your AI Coach. I can help you understand financial concepts, analyze your portfolio, and guide you through simulations. What would you like to learn today?",
"quotaExhausted": "You've reached your daily limit for AI Coach messages. Upgrade your plan or try again tomorrow.",
"thinking": "Thinking...",
"errorFallback": "I'm having trouble processing your request. Please try again.",
"send": "Send",
"clear": "Clear chat",
"close": "Close chat",
"minimize": "Minimize"
},
"context": {
"lesson": "You are currently on lesson \"{{lesson}}\". I'll tailor my responses to help you with this topic.",
"simulation": "I can see you're running a {{simulation}} simulation. Let me help you make informed decisions.",
"portfolio": "Here's a quick analysis of your current portfolio allocation."
},
"limits": {
"dailyMessages": "Daily messages: {{used}} / {{limit}}",
"tokenUsage": "Tokens used: {{used}} / {{limit}}",
"upgrade": "Need more? Contact your administrator."
},
"topics": {
"basics": "Financial Basics",
"investing": "Investing",
"budgeting": "Budgeting",
"debt": "Debt Management",
"retirement": "Retirement Planning",
"taxes": "Taxes",
"insurance": "Insurance",
"realEstate": "Real Estate",
"crypto": "Cryptocurrency"
}
}

View File

@@ -0,0 +1,66 @@
{
"dashboard": {
"title": "Classroom Dashboard",
"overview": "Overview",
"totalStudents": "Total Students",
"averageScore": "Average Score",
"completionRate": "Completion Rate",
"reports": "Reports",
"recentActivity": "Recent Activity",
"noActivity": "No recent activity"
},
"assignments": {
"title": "Assignments",
"create": "Create Assignment",
"edit": "Edit Assignment",
"delete": "Delete Assignment",
"dueDate": "Due Date",
"requiredScore": "Required Score",
"maxAttempts": "Max Attempts",
"submissions": "Submissions",
"noAssignments": "No assignments created yet",
"status": {
"open": "Open",
"closed": "Closed",
"draft": "Draft"
}
},
"cohorts": {
"title": "Cohorts",
"create": "Create Cohort",
"join": "Join Class",
"inviteCode": "Invite Code",
"students": "Students",
"noCohorts": "No cohorts yet",
"emptyClass": "No students in this class yet"
},
"reports": {
"title": "Reports",
"generate": "Generate Report",
"export": "Export",
"compositeScore": "Composite Score",
"roi": "ROI",
"riskManagement": "Risk Management",
"esgAlignment": "ESG Alignment",
"quizScore": "Quiz Score",
"lessonCompletion": "Lesson Completion",
"studentProgress": "Student Progress",
"classAverage": "Class Average"
},
"teacher": {
"actions": {
"createAssignment": "New Assignment",
"viewSubmissions": "View Submissions",
"gradeAssignment": "Grade Assignment",
"manageStudents": "Manage Students",
"sendAnnouncement": "Send Announcement",
"viewReports": "View Reports"
},
"announcement": {
"title": "Announcement",
"placeholder": "Write an announcement to your class...",
"send": "Send Announcement",
"sent": "Announcement sent successfully"
}
}
}

View File

@@ -0,0 +1,103 @@
{
"nav": {
"dashboard": "Dashboard",
"learn": "Learn",
"play": "Play",
"practice": "Practice",
"teach": "Teach",
"classroom": "Classroom",
"leaderboard": "Leaderboard",
"profile": "Profile",
"settings": "Settings",
"admin": "Admin"
},
"actions": {
"next": "Next",
"back": "Back",
"submit": "Submit",
"cancel": "Cancel",
"save": "Save",
"delete": "Delete",
"edit": "Edit",
"view": "View",
"confirm": "Confirm",
"retry": "Retry",
"close": "Close",
"continue": "Continue",
"start": "Start",
"finish": "Finish",
"skip": "Skip",
"search": "Search",
"filter": "Filter",
"sort": "Sort",
"refresh": "Refresh",
"download": "Download",
"upload": "Upload",
"share": "Share",
"copy": "Copy",
"undo": "Undo",
"redo": "Redo"
},
"errors": {
"generic": "Something went wrong. Please try again.",
"network": "Network error. Please check your connection.",
"unauthorized": "You need to sign in to access this page.",
"forbidden": "You do not have permission to perform this action.",
"notFound": "The page you are looking for does not exist.",
"validation": "Please check your input and try again.",
"timeout": "The request timed out. Please try again.",
"serverError": "Server error. Our team has been notified.",
"rateLimited": "Too many requests. Please wait a moment.",
"sessionExpired": "Your session has expired. Please sign in again."
},
"auth": {
"login": "Sign In",
"register": "Create Account",
"logout": "Sign Out",
"forgotPassword": "Forgot Password?",
"resetPassword": "Reset Password",
"changePassword": "Change Password",
"email": "Email address",
"password": "Password",
"confirmPassword": "Confirm password",
"rememberMe": "Remember me",
"noAccount": "Don't have an account?",
"hasAccount": "Already have an account?",
"signUp": "Sign Up",
"signIn": "Sign In",
"welcomeBack": "Welcome back",
"createAccount": "Create your account",
"termsAgree": "I agree to the Terms of Service and Privacy Policy"
},
"empty": {
"noData": "No data available",
"noResults": "No results found",
"comingSoon": "Coming soon",
"noLessons": "No lessons available yet",
"noSimulations": "No simulations available",
"noAssignments": "No assignments yet",
"noStudents": "No students enrolled",
"noMessages": "No messages yet"
},
"time": {
"today": "Today",
"yesterday": "Yesterday",
"thisWeek": "This week",
"thisMonth": "This month",
"minutes": "{{count}} min",
"minutes_plural": "{{count}} mins",
"hours": "{{count}} hour",
"hours_plural": "{{count}} hours",
"days": "{{count}} day",
"days_plural": "{{count}} days"
},
"theme": {
"light": "Light",
"dark": "Dark",
"system": "System"
},
"language": {
"en": "English",
"el": "Ελληνικά"
}
}

View File

@@ -0,0 +1,105 @@
{
"assetClasses": {
"stocks": "Stocks",
"bonds": "Bonds",
"etfs": "ETFs",
"mutualFunds": "Mutual Funds",
"crypto": "Cryptocurrency",
"realEstate": "Real Estate",
"commodities": "Commodities",
"cash": "Cash",
"derivatives": "Derivatives",
"forex": "Foreign Exchange"
},
"investmentTypes": {
"growth": "Growth Investing",
"value": "Value Investing",
"dividend": "Dividend Investing",
"index": "Index Investing",
"esg": "ESG Investing",
"dayTrading": "Day Trading",
"swing": "Swing Trading",
"dca": "Dollar-Cost Averaging"
},
"banking": {
"savingsAccount": "Savings Account",
"checkingAccount": "Checking Account",
"fixedDeposit": "Fixed Deposit",
"interestRate": "Interest Rate",
"apr": "APR",
"apy": "APY",
"compoundInterest": "Compound Interest",
"principal": "Principal",
"maturity": "Maturity"
},
"budgeting": {
"income": "Income",
"expenses": "Expenses",
"savings": "Savings",
"investments": "Investments",
"needs": "Needs",
"wants": "Wants",
"emergencyFund": "Emergency Fund",
"trackExpenses": "Track Expenses",
"setBudget": "Set Budget",
"reviewSpending": "Review Spending"
},
"debt": {
"creditCard": "Credit Card",
"studentLoan": "Student Loan",
"mortgage": "Mortgage",
"personalLoan": "Personal Loan",
"interestRate": "Interest Rate",
"minimumPayment": "Minimum Payment",
"balance": "Balance",
"debtFree": "Debt Free",
"consolidation": "Debt Consolidation",
"snowball": "Debt Snowball",
"avalanche": "Debt Avalanche"
},
"inflation": {
"inflationRate": "Inflation Rate",
"purchasingPower": "Purchasing Power",
"cpi": "Consumer Price Index",
"realReturn": "Real Return",
"nominalReturn": "Nominal Return",
"hedge": "Inflation Hedge"
},
"risk": {
"low": "Low Risk",
"medium": "Medium Risk",
"high": "High Risk",
"volatility": "Volatility",
"diversification": "Diversification",
"correlation": "Correlation",
"beta": "Beta",
"alpha": "Alpha",
"sharpeRatio": "Sharpe Ratio",
"maxDrawdown": "Max Drawdown",
"riskTolerance": "Risk Tolerance"
},
"portfolio": {
"allocation": "Asset Allocation",
"rebalance": "Rebalance",
"performance": "Performance",
"returns": "Returns",
"gain": "Gain",
"loss": "Loss",
"totalValue": "Total Value",
"profitLoss": "Profit / Loss",
"roe": "Return on Investment",
"annualizedReturn": "Annualized Return"
},
"market": {
"bullMarket": "Bull Market",
"bearMarket": "Bear Market",
"correction": "Correction",
"crash": "Market Crash",
"recession": "Recession",
"recovery": "Recovery",
"volatility": "Market Volatility",
"liquidity": "Liquidity",
"spread": "Bid-Ask Spread",
"volume": "Trading Volume"
}
}

View File

@@ -0,0 +1,62 @@
{
"xp": {
"label": "XP",
"earned": "{{count}} XP earned",
"needed": "{{count}} XP to next level",
"reason": {
"lessonCompleted": "Lesson completed",
"quizPassed": "Quiz passed",
"streakMaintained": "Streak maintained",
"challengeCompleted": "Challenge completed",
"simulationCompleted": "Simulation completed",
"diversification": "Portfolio diversified",
"riskManagement": "Good risk management",
"hypeAvoided": "Avoided market hype",
"debtPaidOff": "Debt paid off"
}
},
"level": {
"label": "Level",
"current": "Level {{level}}",
"progress": "Level {{current}} — {{progress}}% to Level {{next}}"
},
"badges": {
"title": "Badges",
"unlocked": "Badge Unlocked!",
"locked": "Locked",
"progress": "{{count}} of {{total}} badges",
"categories": {
"milestone": "Milestones",
"skill": "Skills",
"behavior": "Behaviors",
"special": "Special"
}
},
"achievements": {
"title": "Achievements",
"recent": "Recent Achievements",
"all": "All Achievements",
"empty": "Complete lessons to earn achievements"
},
"streaks": {
"label": "Streak",
"current": "{{count}}-day streak",
"longest": "Longest: {{count}} days",
"days": "{{count}} day",
"days_plural": "{{count}} days",
"maintain": "Complete a lesson today to keep your streak!",
"lost": "Streak lost. Start again tomorrow!"
},
"leaderboard": {
"title": "Leaderboard",
"rank": "Rank",
"player": "Player",
"xp": "XP",
"level": "Level",
"badges": "Badges",
"yourRank": "Your Rank",
"empty": "No rankings yet. Start learning!",
"classroom": "Classroom Leaderboard",
"global": "Global Leaderboard"
}
}

View File

@@ -0,0 +1,12 @@
{
"extends": "../../tsconfig.base.json",
"compilerOptions": {
"outDir": "./dist",
"rootDir": "./src",
"resolveJsonModule": true,
"module": "NodeNext",
"moduleResolution": "NodeNext"
},
"include": ["src/**/*.ts", "src/**/*.json"],
"exclude": ["node_modules", "dist", ".turbo"]
}