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
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:
34
packages/i18n/src/locales/en/ai-coach.json
Normal file
34
packages/i18n/src/locales/en/ai-coach.json
Normal 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"
|
||||
}
|
||||
}
|
||||
66
packages/i18n/src/locales/en/classroom.json
Normal file
66
packages/i18n/src/locales/en/classroom.json
Normal 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"
|
||||
}
|
||||
}
|
||||
}
|
||||
103
packages/i18n/src/locales/en/common.json
Normal file
103
packages/i18n/src/locales/en/common.json
Normal 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": "Ελληνικά"
|
||||
}
|
||||
}
|
||||
105
packages/i18n/src/locales/en/finance.json
Normal file
105
packages/i18n/src/locales/en/finance.json
Normal 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"
|
||||
}
|
||||
}
|
||||
62
packages/i18n/src/locales/en/gamification.json
Normal file
62
packages/i18n/src/locales/en/gamification.json
Normal 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"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user