@rapidd/core 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/.dockerignore +71 -0
  2. package/.env.example +70 -0
  3. package/.gitignore +11 -0
  4. package/LICENSE +15 -0
  5. package/README.md +231 -0
  6. package/bin/cli.js +145 -0
  7. package/config/app.json +166 -0
  8. package/config/rate-limit.json +12 -0
  9. package/dist/main.js +26 -0
  10. package/dockerfile +57 -0
  11. package/locales/ar_SA.json +179 -0
  12. package/locales/de_DE.json +179 -0
  13. package/locales/en_US.json +180 -0
  14. package/locales/es_ES.json +179 -0
  15. package/locales/fr_FR.json +179 -0
  16. package/locales/it_IT.json +179 -0
  17. package/locales/ja_JP.json +179 -0
  18. package/locales/pt_BR.json +179 -0
  19. package/locales/ru_RU.json +179 -0
  20. package/locales/tr_TR.json +179 -0
  21. package/main.ts +25 -0
  22. package/package.json +126 -0
  23. package/prisma/schema.prisma +9 -0
  24. package/prisma.config.ts +12 -0
  25. package/public/static/favicon.ico +0 -0
  26. package/public/static/image/logo.png +0 -0
  27. package/routes/api/v1/index.ts +113 -0
  28. package/src/app.ts +197 -0
  29. package/src/auth/Auth.ts +446 -0
  30. package/src/auth/stores/ISessionStore.ts +19 -0
  31. package/src/auth/stores/MemoryStore.ts +70 -0
  32. package/src/auth/stores/RedisStore.ts +92 -0
  33. package/src/auth/stores/index.ts +149 -0
  34. package/src/config/acl.ts +9 -0
  35. package/src/config/rls.ts +38 -0
  36. package/src/core/dmmf.ts +226 -0
  37. package/src/core/env.ts +183 -0
  38. package/src/core/errors.ts +87 -0
  39. package/src/core/i18n.ts +144 -0
  40. package/src/core/middleware.ts +123 -0
  41. package/src/core/prisma.ts +236 -0
  42. package/src/index.ts +112 -0
  43. package/src/middleware/model.ts +61 -0
  44. package/src/orm/Model.ts +881 -0
  45. package/src/orm/QueryBuilder.ts +2078 -0
  46. package/src/plugins/auth.ts +162 -0
  47. package/src/plugins/language.ts +79 -0
  48. package/src/plugins/rateLimit.ts +210 -0
  49. package/src/plugins/response.ts +80 -0
  50. package/src/plugins/rls.ts +51 -0
  51. package/src/plugins/security.ts +23 -0
  52. package/src/plugins/upload.ts +299 -0
  53. package/src/types.ts +308 -0
  54. package/src/utils/ApiClient.ts +526 -0
  55. package/src/utils/Mailer.ts +348 -0
  56. package/src/utils/index.ts +25 -0
  57. package/templates/email/example.ejs +17 -0
  58. package/templates/layouts/email.ejs +35 -0
  59. package/tsconfig.json +33 -0
@@ -0,0 +1,166 @@
1
+ {
2
+ "services": {
3
+ "InternalAPI": {
4
+ "hostname": "api.internal.example.com",
5
+ "path": "/v1",
6
+ "secure": true,
7
+ "authorization": {
8
+ "type": "basic",
9
+ "username": "service-account",
10
+ "password": "secret"
11
+ },
12
+ "headers": {
13
+ "Accept": "application/json",
14
+ "X-Service-Name": "rapidd"
15
+ },
16
+ "endpoints": {
17
+ "getUser": {
18
+ "path": "/users/{{id}}",
19
+ "method": "GET"
20
+ },
21
+ "createUser": {
22
+ "path": "/users",
23
+ "method": "POST"
24
+ },
25
+ "updateUser": {
26
+ "path": "/users/{{id}}",
27
+ "method": "PUT"
28
+ },
29
+ "deleteUser": {
30
+ "path": "/users/{{id}}",
31
+ "method": "DELETE"
32
+ }
33
+ }
34
+ },
35
+ "PartnerAPI": {
36
+ "hostname": "partner.example.com",
37
+ "path": "/api",
38
+ "secure": true,
39
+ "authorization": {
40
+ "type": "bearer",
41
+ "token": "your-static-bearer-token"
42
+ },
43
+ "endpoints": {
44
+ "listProducts": {
45
+ "path": "/products",
46
+ "method": "GET",
47
+ "queries": {
48
+ "format": "json"
49
+ }
50
+ },
51
+ "getProduct": {
52
+ "path": "/products/{{productId}}",
53
+ "method": "GET"
54
+ }
55
+ }
56
+ },
57
+ "WeatherService": {
58
+ "hostname": "api.weather.example.com",
59
+ "secure": true,
60
+ "authorization": {
61
+ "type": "api-key",
62
+ "key": "your-api-key",
63
+ "key-header": "X-API-Key"
64
+ },
65
+ "queries": {
66
+ "units": "metric"
67
+ },
68
+ "endpoints": {
69
+ "current": {
70
+ "path": "/current",
71
+ "method": "GET"
72
+ },
73
+ "forecast": {
74
+ "path": "/forecast/{{city}}",
75
+ "method": "GET",
76
+ "queries": {
77
+ "days": "7"
78
+ }
79
+ }
80
+ }
81
+ },
82
+ "CloudStorage": {
83
+ "hostname": "storage.example.com",
84
+ "path": "/v2",
85
+ "secure": true,
86
+ "authorization": {
87
+ "type": "oauth2",
88
+ "hostname": "auth.example.com",
89
+ "token_path": "/oauth/token",
90
+ "client_id": "your-client-id",
91
+ "client_secret": "your-client-secret",
92
+ "grant_type": "client_credentials",
93
+ "scope": "storage.read storage.write"
94
+ },
95
+ "endpoints": {
96
+ "listBuckets": {
97
+ "path": "/buckets",
98
+ "method": "GET"
99
+ },
100
+ "getObject": {
101
+ "path": "/buckets/{{bucket}}/objects/{{key}}",
102
+ "method": "GET"
103
+ },
104
+ "uploadObject": {
105
+ "path": "/buckets/{{bucket}}/objects",
106
+ "method": "POST",
107
+ "headers": {
108
+ "Content-Type": "application/octet-stream"
109
+ }
110
+ },
111
+ "deleteObject": {
112
+ "path": "/buckets/{{bucket}}/objects/{{key}}",
113
+ "method": "DELETE"
114
+ }
115
+ }
116
+ },
117
+ "CustomAuthAPI": {
118
+ "hostname": "api.custom.example.com",
119
+ "secure": true,
120
+ "authorization": {
121
+ "type": "api-key",
122
+ "key": "your-secret-key",
123
+ "key-header": "X-Custom-Auth",
124
+ "auth-header": "X-Custom-Auth"
125
+ },
126
+ "endpoints": {
127
+ "healthcheck": {
128
+ "path": "/health",
129
+ "method": "GET"
130
+ }
131
+ }
132
+ }
133
+ },
134
+ "emails": {
135
+ "default": {
136
+ "host": "smtp.example.com",
137
+ "port": 587,
138
+ "secure": false,
139
+ "user": "noreply@example.com",
140
+ "password": "your-smtp-password",
141
+ "from": "\"My App\" <noreply@example.com>",
142
+ "name": "My App"
143
+ },
144
+ "support": {
145
+ "host": "smtp.example.com",
146
+ "port": 465,
147
+ "secure": true,
148
+ "user": "support@example.com",
149
+ "password": "your-smtp-password",
150
+ "from": "\"Support Team\" <support@example.com>",
151
+ "name": "Support Team"
152
+ }
153
+ },
154
+ "languages": [
155
+ "en_US",
156
+ "es_ES",
157
+ "fr_FR",
158
+ "it_IT",
159
+ "ar_SA",
160
+ "pt_BR",
161
+ "ru_RU",
162
+ "de_DE",
163
+ "ja_JP",
164
+ "tr_TR"
165
+ ]
166
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "/api/v1/login": {
3
+ "maxRequests": 10,
4
+ "windowMs": 900000,
5
+ "ignoreSuccessfulRequests": true
6
+ },
7
+ "/api": {
8
+ "maxRequests": 1000,
9
+ "windowMs": 60000,
10
+ "ignoreSuccessfulRequests": true
11
+ }
12
+ }
package/dist/main.js ADDED
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.start = start;
4
+ require("dotenv/config");
5
+ const env_1 = require("./src/core/env");
6
+ const app_1 = require("./src/app");
7
+ /**
8
+ * Application entry point
9
+ * Builds Fastify app and starts server
10
+ */
11
+ async function start() {
12
+ const port = (0, env_1.getEnv)('PORT');
13
+ const host = (0, env_1.getEnv)('HOST');
14
+ try {
15
+ const app = await (0, app_1.buildApp)();
16
+ await app.listen({ port, host });
17
+ console.log(`[Rapidd] Server running at http://${host}:${port}`);
18
+ console.log(`[Rapidd] Environment: ${(0, env_1.getEnv)('NODE_ENV')}`);
19
+ }
20
+ catch (err) {
21
+ console.error('[Startup Error]', err.message);
22
+ process.exit(1);
23
+ }
24
+ }
25
+ start();
26
+ //# sourceMappingURL=main.js.map
package/dockerfile ADDED
@@ -0,0 +1,57 @@
1
+ # Stage 1: Install all dependencies and build TypeScript
2
+ FROM node:current-alpine AS builder
3
+
4
+ WORKDIR /app
5
+
6
+ COPY package.json package-lock.json ./
7
+ RUN npm ci --no-audit --no-fund
8
+
9
+ COPY tsconfig.json ./
10
+ COPY main.ts ./
11
+ COPY src ./src
12
+ COPY routes ./routes
13
+
14
+ RUN npx tsc
15
+
16
+ # Stage 2: Production dependencies + Prisma client
17
+ FROM node:current-alpine AS deps
18
+
19
+ WORKDIR /app
20
+
21
+ COPY package.json package-lock.json ./
22
+ RUN npm ci --omit=dev --no-audit --no-fund && npm cache clean --force
23
+
24
+ COPY prisma ./prisma
25
+ RUN npx prisma generate --generator client
26
+
27
+ # Stage 3: Runtime
28
+ FROM node:24-alpine
29
+
30
+ WORKDIR /app
31
+
32
+ RUN addgroup -g 1001 -S nodejs && \
33
+ adduser -S rapidd -u 1001
34
+
35
+ # Production node_modules with Prisma client
36
+ COPY --from=deps --chown=rapidd:nodejs /app/node_modules ./node_modules
37
+ COPY --from=deps --chown=rapidd:nodejs /app/package.json ./package.json
38
+
39
+ # Prisma schema + generated client
40
+ COPY --from=deps --chown=rapidd:nodejs /app/prisma ./prisma
41
+
42
+ # Compiled TypeScript output
43
+ COPY --from=builder --chown=rapidd:nodejs /app/dist ./dist
44
+
45
+ # Runtime assets
46
+ COPY --chown=rapidd:nodejs config ./config
47
+ COPY --chown=rapidd:nodejs locales ./locales
48
+ COPY --chown=rapidd:nodejs templates ./templates
49
+ COPY --chown=rapidd:nodejs public ./public
50
+
51
+ RUN apk update && apk upgrade --no-cache && rm -rf /var/cache/apk/*
52
+
53
+ USER rapidd
54
+
55
+ EXPOSE 3000
56
+
57
+ ENTRYPOINT ["node", "dist/main.js"]
@@ -0,0 +1,179 @@
1
+ {
2
+ "save": "حفظ",
3
+ "edit": "تعديل",
4
+ "cancel": "إلغاء",
5
+ "close": "إغلاق",
6
+ "done": "تم",
7
+ "yes": "نعم",
8
+ "no": "لا",
9
+ "next": "التالي",
10
+ "error": "خطأ",
11
+ "download": "تنزيل",
12
+ "submit": "إرسال",
13
+ "clear": "مسح",
14
+ "searchClear": "مسح البحث",
15
+ "search": "بحث",
16
+ "actions": "الإجراءات",
17
+ "signIn": "تسجيل الدخول",
18
+ "signUp": "إنشاء حساب",
19
+ "signOut": "تسجيل الخروج",
20
+ "Remove": "إزالة",
21
+ "removeUser": "إزالة المستخدم",
22
+ "sortBy": "ترتيب حسب",
23
+ "name": "الاسم",
24
+ "firstName": "الاسم الأول",
25
+ "lastName": "اسم العائلة",
26
+ "email": "البريد الإلكتروني",
27
+ "password": "كلمة المرور",
28
+ "passwordRepeat": "تكرار كلمة المرور",
29
+ "account": "الحساب",
30
+ "role": "الدور",
31
+ "status": "الحالة",
32
+ "reason": "السبب",
33
+ "lastUpdateDate": "تاريخ آخر تحديث",
34
+ "sortByFieldAscending": "{field} تصاعدي",
35
+ "sortByFieldDescending": "{field} تنازلي",
36
+ "couldNotLoadDataMsg": "تعذر تحميل البيانات: الحالة \"{data}\"",
37
+ "FAQ": "الأسئلة الشائعة",
38
+ "frequentlyAskedQuestions": "الأسئلة المتكررة",
39
+ "settings": "الإعدادات",
40
+ "eventsRewards": "الفعاليات والمكافآت",
41
+ "hostname": "اسم المضيف",
42
+ "version": "الإصدار",
43
+ "profile": "الملف الشخصي",
44
+ "security": "الأمان والوصول",
45
+ "changePassword": "تغيير كلمة المرور",
46
+ "securitySettings": "إعدادات الأمان",
47
+ "requestData": "طلب البيانات",
48
+ "deleteProfile": "حذف الحساب",
49
+ "username": "اسم المستخدم",
50
+ "loginMethod": "طريقة تسجيل الدخول",
51
+ "delete": "حذف",
52
+ "currentPassword": "كلمة المرور الحالية",
53
+ "newPassword": "كلمة المرور الجديدة",
54
+ "signUp_haveAnAccount": "هل لديك حساب بالفعل؟",
55
+ "slots_not_available": "لا توجد مواعيد متاحة",
56
+ "footer_contact_us": "اتصل بنا",
57
+ "footer_contact_us_url": "url",
58
+ "privacy_policy": "سياسة الخصوصية",
59
+ "footer_legal_notice_url": "url",
60
+ "footer_company_details": "المعلومات القانونية",
61
+ "footer_company_details_url": "url",
62
+ "under_construction_notice": "هذا الموقع قيد الإنشاء حالياً",
63
+ "signInFailStackLocked_message": "تم قفل حسابك بعد 5 محاولات فاشلة. يرجى إعادة تعيين كلمة المرور!",
64
+ "signOut_message": "تم تسجيل الخروج بنجاح",
65
+ "signOutForce_message": "تم تسجيل خروجك",
66
+ "signOutNotLatest_message": "تم تسجيل خروجك تلقائياً لأنه تم اكتشاف جلسة أحدث.",
67
+ "code_of_conduct": "قواعد السلوك",
68
+ "student": "طالب",
69
+ "teacher": "معلم",
70
+ "emailVerified": "تم التحقق من البريد الإلكتروني",
71
+ "emailAlreadyVerified": "تم التحقق من البريد الإلكتروني مسبقاً",
72
+ "redirectNotice": "سيتم توجيهك خلال 5 ثوانٍ أو <a href=\"{uri}\">انقر هنا</a>",
73
+ "mailNotShowingProperly": "لا يظهر البريد الإلكتروني بشكل صحيح؟",
74
+ "viewInBrowser": "عرض في المتصفح",
75
+ "welcomeMail": "مرحباً بك في rapidd",
76
+ "resetPassordMail": "إعادة تعيين كلمة مرور rapidd",
77
+ "appointmentScheduled": "تم جدولة الموعد",
78
+ "appointmentChanged": "تم تعديل الموعد",
79
+ "appointmentCancelled": "تم إلغاء الموعد",
80
+ "appointmentRejected": "تم رفض الموعد",
81
+ "salutationMail": "مرحباً {first_name}،",
82
+ "briefWelcomeTextMail": "تم إنشاء حساب لك على منصة rapidd. يرجى تأكيد عنوان بريدك الإلكتروني بالنقر على <b>{{confirmMail}}</b>.",
83
+ "yourUsername": "اسم المستخدم الخاص بك هو <b>{username}</b>",
84
+ "yourPassword": "كلمة المرور الأولية<span style=\"display: inline-block;margin: 0 .8em;padding: .4em .8em;border: 3px dashed #fecb5a;border-radius: .8em;\"><b>{password}</b></span>",
85
+ "changePasswordAfterLogin": "يرجى تغيير كلمة المرور بعد تسجيل الدخول الأول.",
86
+ "passwordResetTextMail": "لقد طلبت إعادة تعيين كلمة مرور حساب rapidd الخاص بك. انقر على <b>{{confirmResetPassword}}</b> لإعادة تعيينها. تجاهل هذه الرسالة إذا لم تقم بهذا الطلب.",
87
+ "studentAppointmentTextMail": "تم جدولة موعد للمادة <b>{subject}</b>.<br><br>{{studentAppointmentInfoMail}}<br><br>{{studentAppointmentRejectInfoMail}}<br><br>",
88
+ "studentAppointmentUpdateTextMail": "تم تحديث موعدك للمادة <b>{subject}</b>.<br><br>{{studentAppointmentInfoMail}}<br><br>{{studentAppointmentRejectInfoMail}}<br><br>",
89
+ "studentAppointmentCancelledTextMail": "تم إلغاء موعدك للمادة <b>{subject}</b>.<br><br>{{studentAppointmentInfoMail}}<br><br>",
90
+ "studentAppointmentInfoMail": "{{teacher}}: <b>{teacher}</b><br>التاريخ: <b>{date}</b><br>الوقت: <b>{time}</b><br>المدة: <b>{duration}</b><br>الموقع / الرابط: <b>{location_url}</b>",
91
+ "studentAppointmentRejectInfoMail": "<i>يمكنك إلغاء الموعد حتى 24 ساعة قبل موعده.</i>",
92
+ "teacherAppointmentCancelledTextMail": "تم إلغاء موعدك للمادة <b>{subject}</b>.<br><br>{{teacherAppointmentInfoMail}}<br><br>",
93
+ "teacherAppointmentRejectedTextMail": "رفض طالبك {{student}} الموعد للمادة <b>{subject}</b>.<br><br>{{teacherAppointmentInfoMail}}<br><br>",
94
+ "teacherAppointmentInfoMail": "{{student}}: <b>{student}</b><br>التاريخ: <b>{date}</b><br>الوقت: <b>{time}</b><br>المدة: <b>{duration}</b><br>الموقع / الرابط: <b>{location_url}</b>",
95
+ "confirmMail": "تأكيد البريد الإلكتروني",
96
+ "confirmResetPassword": "إعادة تعيين كلمة المرور",
97
+ "viewAppointment": "عرض الموعد",
98
+ "footerText": "هدفنا هو مساعدة الجميع على تحقيق إمكاناتهم.",
99
+ "footerCopyright": "© {year}، rapidd GmbH. جميع الحقوق محفوظة.",
100
+ "insufficient_permissions": "صلاحيات غير كافية",
101
+ "rate_limit_exceeded": "تم تجاوز حد الطلبات",
102
+ "record_not_found": "السجل غير موجود",
103
+ "no_permission": "لا توجد صلاحية",
104
+ "invalid_sort_field": "المعامل sortBy '{sortBy}' ليس حقلاً صالحاً في {modelName}",
105
+ "invalid_filter_field": "حقل التصفية غير صالح: {field}",
106
+ "relation_not_exist": "العلاقة '{relation}' غير موجودة في {modelName}",
107
+ "between_requires_two_values": "يتطلب معامل between قيمتين مفصولتين بفاصلة منقوطة",
108
+ "invalid_date_range": "تاريخ غير صالح في النطاق: {start} أو {end}",
109
+ "invalid_date_format": "تنسيق تاريخ غير صالح في الفلتر: {value}. خطأ: {error}",
110
+ "invalid_limit": "حد غير صالح",
111
+ "sortby_must_be_string": "يجب أن يكون sortBy نصاً. تم تقديم '{type}'",
112
+ "sortorder_invalid": "يمكن أن يكون sortOrder فقط 'asc' أو 'desc'. تم تقديم '{value}'",
113
+ "unexpected_key": "المفتاح '{key}' غير متوقع",
114
+ "string_expected": "متوقع نص، تم تقديم {type}",
115
+ "auth_credentials_missing": "بيانات اعتماد المصادقة مفقودة",
116
+ "account_suspended": "تم تعليق حسابك",
117
+ "email_not_verified": "لم يتم التحقق من عنوان البريد الإلكتروني بعد",
118
+ "auth_failed_invalid_credentials": "فشلت المصادقة: بيانات اعتماد غير صالحة",
119
+ "user_not_found": "المستخدم غير موجود",
120
+ "no_active_session": "لا توجد جلسة نشطة",
121
+ "email_not_string": "'email' في الجسم ليس من نوع 'string'. تم تقديم '{type}'",
122
+ "password_change_failed": "تعذر تغيير كلمة المرور",
123
+ "token_invalid": "الرمز غير صالح",
124
+ "password_not_string": "password في الجسم ليس من نوع 'string'. تم تقديم '{type}'",
125
+ "token_not_string": "token في الجسم ليس من نوع 'string'. تم تقديم '{type}'",
126
+ "file_type_not_allowed": "نوع الملف {mimetype} غير مسموح به",
127
+ "file_extension_not_allowed": "امتداد الملف {extension} غير مسموح به لنوع MIME {mimetype}",
128
+ "invalid_file_name": "اسم ملف غير صالح",
129
+ "file_size_exceeds_limit": "حجم الملف يتجاوز الحد الأقصى {limit}MB",
130
+ "cors_blocked": "محظور بواسطة سياسة CORS: {origin}",
131
+ "activation_link_expired": "انتهت صلاحية رابط التفعيل",
132
+ "password_reset_email_sent": "تم إرسال بريد إعادة تعيين كلمة المرور",
133
+ "password_changed_successfully": "تم تغيير كلمة المرور بنجاح",
134
+ "username_password_invalid": "اسم المستخدم أو كلمة المرور غير صحيحة",
135
+ "activation_mail_sent": "تم إرسال بريد التفعيل",
136
+ "session_terminated": "تم إنهاء رمز الجلسة",
137
+ "no_valid_session": "لا توجد جلسة صالحة",
138
+ "object_deleted_successfully": "تم حذف {modelName} بنجاح",
139
+ "auth_required": "المصادقة مطلوبة",
140
+ "auth_required_message": "يجب عليك تسجيل الدخول للوصول إلى هذا المورد",
141
+ "forbidden": "محظور",
142
+ "forbidden_role_message": "يتطلب هذا المورد أحد الأدوار التالية: {roles}",
143
+ "email_verification_required": "التحقق من البريد الإلكتروني مطلوب",
144
+ "email_verification_required_message": "يرجى التحقق من عنوان بريدك الإلكتروني قبل الوصول إلى هذا المورد",
145
+ "company_account_required": "حساب الشركة مطلوب",
146
+ "company_verification_required": "التحقق من الشركة مطلوب",
147
+ "company_verification_required_message": "يجب التحقق من شركتك بواسطة مسؤول قبل الوصول إلى هذا المورد",
148
+ "missing_required_fields": "الحقول المطلوبة مفقودة",
149
+ "required_fields": "الحقول المطلوبة: {fields}",
150
+ "invalid_role": "دور غير صالح",
151
+ "invalid_role_message": "يجب أن يكون الدور إما STUDENT أو COMPANY",
152
+ "email_already_registered": "البريد الإلكتروني مسجل بالفعل",
153
+ "email_already_registered_message": "يوجد بالفعل مستخدم بعنوان البريد الإلكتروني هذا",
154
+ "registration_failed": "فشل التسجيل",
155
+ "invalid_credentials": "بيانات اعتماد غير صالحة",
156
+ "invalid_credentials_message": "البريد الإلكتروني أو كلمة المرور غير صحيحة",
157
+ "invalid_login_method": "طريقة تسجيل دخول غير صالحة",
158
+ "invalid_login_method_message": "يرجى تسجيل الدخول باستخدام {provider}",
159
+ "login_failed": "فشل تسجيل الدخول",
160
+ "refresh_token_required": "رمز التحديث مطلوب",
161
+ "invalid_refresh_token": "رمز تحديث غير صالح",
162
+ "session_expired_or_invalid": "انتهت صلاحية الجلسة أو غير صالحة",
163
+ "token_refresh_failed": "فشل تحديث الرمز",
164
+ "logged_out_successfully": "تم تسجيل الخروج بنجاح",
165
+ "logout_failed": "فشل تسجيل الخروج",
166
+ "not_authenticated": "غير مصادق",
167
+ "missing_required_field": "حقل مطلوب مفقود",
168
+ "field_required": "{field} مطلوب",
169
+ "invalid_token": "رمز {provider} غير صالح",
170
+ "invalid_token_message": "{message}",
171
+ "role_required_for_new_users": "الدور مطلوب للمستخدمين الجدد",
172
+ "role_required_for_new_users_message": "يرجى تحديد ما إذا كنت STUDENT أو COMPANY",
173
+ "google_auth_failed": "فشلت مصادقة Google",
174
+ "facebook_auth_failed": "فشلت مصادقة Facebook",
175
+ "token_missing_email": "الرمز لا يحتوي على معلومات البريد الإلكتروني",
176
+ "oauth_config_missing": "يجب تكوين معرف التطبيق والسر الخاص بـ {provider} في متغيرات البيئة",
177
+ "token_app_mismatch": "الرمز لا ينتمي إلى هذا التطبيق",
178
+ "oauth_email_permission_missing": "مستخدم {provider} لم يمنح إذن البريد الإلكتروني"
179
+ }
@@ -0,0 +1,179 @@
1
+ {
2
+ "save": "Speichern",
3
+ "edit": "Bearbeiten",
4
+ "cancel": "Abbrechen",
5
+ "close": "Schließen",
6
+ "done": "Fertig",
7
+ "yes": "Ja",
8
+ "no": "Nein",
9
+ "next": "Weiter",
10
+ "error": "Fehler",
11
+ "download": "Herunterladen",
12
+ "submit": "Abschicken",
13
+ "clear": "Löschen",
14
+ "searchClear": "Suche löschen",
15
+ "search": "Suchen",
16
+ "actions": "Aktionen",
17
+ "signIn": "Anmelden",
18
+ "signUp": "Registrieren",
19
+ "signOut": "Abmelden",
20
+ "Remove": "Löschen",
21
+ "removeUser": "Benutzer entfernen",
22
+ "sortBy": "Sortieren nach",
23
+ "name": "Name",
24
+ "firstName": "Vorname",
25
+ "lastName": "Nachname",
26
+ "email": "E-Mail",
27
+ "password": "Kennwort",
28
+ "passwordRepeat": "Kennwort wiederholen",
29
+ "account": "Account",
30
+ "role": "Rolle",
31
+ "status": "Status",
32
+ "reason": "Grund",
33
+ "lastUpdateDate": "Zuletzt aktualisiert am",
34
+ "sortByFieldAscending": "{field} aufsteigend",
35
+ "sortByFieldDescending": "{field} absteigend",
36
+ "couldNotLoadDataMsg": "Daten konnten nicht geladen werden: Status \"{data}\"",
37
+ "FAQ": "FAQ",
38
+ "frequentlyAskedQuestions": "Häufig gestellte Fragen",
39
+ "settings": "Einstellungen",
40
+ "eventsRewards": "Events & Belohnungen",
41
+ "hostname": "Hostname",
42
+ "version": "Version",
43
+ "profile": "Profil",
44
+ "security": "Zugangsdaten & Sicherheit",
45
+ "changePassword": "Kennwort ändern",
46
+ "securitySettings": "Sicherheitseinstellungen",
47
+ "requestData": "Datenauszug anfordern",
48
+ "deleteProfile": "Konto löschen",
49
+ "username": "Benutzername",
50
+ "loginMethod": "Anmeldemethode",
51
+ "delete": "Löschen",
52
+ "currentPassword": "Aktuelles Kennwort",
53
+ "newPassword": "Neues Kennwort",
54
+ "signUp_haveAnAccount": "Du hast bereits einen Account?",
55
+ "slots_not_available": "Keine Slot informationen verfügbar",
56
+ "footer_contact_us": "Kontakt",
57
+ "footer_contact_us_url": "url",
58
+ "privacy_policy": "Datenschutz",
59
+ "footer_legal_notice_url": "url",
60
+ "footer_company_details": "Impressum",
61
+ "footer_company_details_url": "url",
62
+ "under_construction_notice": "Diese Website befindet sich derzeit im Aufbau",
63
+ "signInFailStackLocked_message": "Ihr Konto wurde gesperrt, da 5 mal hintereinander ein falsches Passwort verwendet wurde. Bitte setzen Sie ihr Passwort zurück!",
64
+ "signOut_message": "Sie sind nun abgemeldet",
65
+ "signOutForce_message": "Sie wurden abgemeldet",
66
+ "signOutNotLatest_message": "Sie wurden automatisch abgemeldet, da mit Ihrem Konto eine neuere Sitzung vorliegt.",
67
+ "code_of_conduct": "Verhaltenskodex",
68
+ "student": "Schüler",
69
+ "teacher": "Nachhilfelehrer",
70
+ "emailVerified": "Email wurde bestätigt",
71
+ "emailAlreadyVerified": "Email bereits bestätigt",
72
+ "redirectNotice": "Du wirst in 5 Sekunden weiteregeleitet oder klicke <a href=\"{uri}\">hier</a>",
73
+ "mailNotShowingProperly": "Email nicht korrekt angezeigt?",
74
+ "viewInBrowser": "Im Browser ansehen",
75
+ "welcomeMail": "Willkommen bei rapidd",
76
+ "resetPassordMail": "Dein Passwort bei rapidd zurücksetzen",
77
+ "appointmentScheduled": "Zuweisung Unterrichtstermin",
78
+ "appointmentChanged": "Unterrichtstermin wurde geändert",
79
+ "appointmentCancelled": "Unterrichtstermin wurde abgesagt",
80
+ "appointmentRejected": "Unterrichtstermin wurde abgelehnt",
81
+ "salutationMail": "Hallo {first_name},",
82
+ "briefWelcomeTextMail": "dir wurde ein Zugang bei rapidd angelegt. Bitte bestätige deine E-Mail Adresse in dem du auf <b>{{confirmMail}}</b> klickst.",
83
+ "yourUsername": "Dein Nutzername lautet <b>{username}</b>",
84
+ "yourPassword": "Dein initiales Passwort<span style=\"display: inline-block;margin: 0 .8em;padding: .4em .8em;border: 3px dashed #fecb5a;border-radius: .8em;\"><b>{password}</b></span>",
85
+ "changePasswordAfterLogin": "Bitte ändere Dein Passwort nach du dich das erste Mal angemeldet hast.",
86
+ "passwordResetTextMail": "du hast das Zurücksetzen deines rapidd Passworts angefragt. Bitte klick unten auf <b>{{confirmResetPassword}}</b> um dein Passwort zurückzusetzen. Falls du dies nicht angefragt hast, kannst du diese Email ignorieren.",
87
+ "studentAppointmentTextMail": "dir wurde ein Termin für das Fach <b>{subject}</b> zugewiesen.<br><br>{{studentAppointmentInfoMail}}<br><br>{{studentAppointmentRejectInfoMail}}<br><br>",
88
+ "studentAppointmentUpdateTextMail": "dein Termin für das Fach <b>{subject}</b> wurde geändert.<br><br>{{studentAppointmentInfoMail}}<br><br>{{studentAppointmentRejectInfoMail}}<br><br>",
89
+ "studentAppointmentCancelledTextMail": "dein Termin für das Fach <b>{subject}</b> wurde abgesagt.<br><br>{{studentAppointmentInfoMail}}<br><br>",
90
+ "studentAppointmentInfoMail": "{{teacher}}: <b>{teacher}</b><br>Datum: <b>{date}</b><br>Uhrzeit: <b>{time}</b><br>Dauer: <b>{duration}</b><br>Ort/Online link: <b>{location_url}</b>",
91
+ "studentAppointmentRejectInfoMail": "<i>Du kannst diesen Termin nur bis zu 24 Stunden vor Unterrichtsbeginn ablehnen.</i>",
92
+ "teacherAppointmentCancelledTextMail": "Ihr Termin für das Fach <b>{subject}</b> wurde storniert.<br><br>{{teacherAppointmentInfoMail}}<br><br>",
93
+ "teacherAppointmentRejectedTextMail": "Ihr {{student}} hat Ihr Termin für das Fach <b>{subject}</b> abgelehnt.<br><br>{{teacherAppointmentInfoMail}}<br><br>",
94
+ "teacherAppointmentInfoMail": "{{student}}: <b>{student}</b><br>Datum: <b>{date}</b><br>Uhrzeit: <b>{time}</b><br>Dauer: <b>{duration}</b><br>Ort/Online link: <b>{location_url}</b>",
95
+ "confirmMail": "Email bestätigen",
96
+ "confirmResetPassword": "Passwort zurücksetzen",
97
+ "viewAppointment": "Termin anzeigen",
98
+ "footerText": "Unser Ziel ist es, jedem Menschen die Möglichkeit zu geben, sein Potential zu entfalten.",
99
+ "footerCopyright": "© {year}, rapidd GmbH Alle Rechte vorbehalten.",
100
+ "insufficient_permissions": "Unzureichende Berechtigungen",
101
+ "rate_limit_exceeded": "Ratenlimit überschritten",
102
+ "record_not_found": "Datensatz nicht gefunden",
103
+ "no_permission": "Keine Berechtigung",
104
+ "invalid_sort_field": "Parameter sortBy '{sortBy}' ist kein gültiges Feld von {modelName}",
105
+ "invalid_filter_field": "Ungültiges Filterfeld: {field}",
106
+ "relation_not_exist": "Relation '{relation}' existiert nicht in {modelName}",
107
+ "between_requires_two_values": "Between-Operator erfordert zwei durch Semikolon getrennte Werte",
108
+ "invalid_date_range": "Ungültiges Datum im Bereich: {start} oder {end}",
109
+ "invalid_date_format": "Ungültiges Datumsformat im Filter: {value}. Fehler: {error}",
110
+ "invalid_limit": "Ungültiges Limit",
111
+ "sortby_must_be_string": "sortBy muss ein String sein. '{type}' angegeben",
112
+ "sortorder_invalid": "sortOrder kann nur 'asc' oder 'desc' sein. '{value}' angegeben",
113
+ "unexpected_key": "Gegebener Schlüssel '{key}' wird nicht erwartet",
114
+ "string_expected": "String erwartet, {type} angegeben",
115
+ "auth_credentials_missing": "Authentifizierungsdaten fehlen",
116
+ "account_suspended": "Ihr Konto wurde gesperrt",
117
+ "email_not_verified": "E-Mail-Adresse wurde noch nicht verifiziert",
118
+ "auth_failed_invalid_credentials": "Authentifizierung fehlgeschlagen: ungültige Anmeldedaten",
119
+ "user_not_found": "Benutzer nicht gefunden",
120
+ "no_active_session": "Keine aktive Sitzung",
121
+ "email_not_string": "'email' im Body ist nicht vom Typ 'string'. '{type}' angegeben",
122
+ "password_change_failed": "Passwort konnte nicht geändert werden",
123
+ "token_invalid": "Token ist ungültig",
124
+ "password_not_string": "password im Body ist nicht vom Typ 'string'. '{type}' angegeben",
125
+ "token_not_string": "token im Body ist nicht vom Typ 'string'. '{type}' angegeben",
126
+ "file_type_not_allowed": "Dateityp {mimetype} nicht erlaubt",
127
+ "file_extension_not_allowed": "Dateierweiterung {extension} nicht erlaubt für MIME-Typ {mimetype}",
128
+ "invalid_file_name": "Ungültiger Dateiname",
129
+ "file_size_exceeds_limit": "Dateigröße überschreitet Limit von {limit}MB",
130
+ "cors_blocked": "Blockiert durch CORS-Richtlinie: {origin}",
131
+ "activation_link_expired": "Aktivierungslink abgelaufen",
132
+ "password_reset_email_sent": "E-Mail zum Zurücksetzen des Passworts wurde gesendet",
133
+ "password_changed_successfully": "Passwort wurde erfolgreich geändert",
134
+ "username_password_invalid": "Benutzername oder Passwort ist ungültig",
135
+ "activation_mail_sent": "Aktivierungs-E-Mail wurde gesendet",
136
+ "session_terminated": "Sitzungstoken wurde beendet",
137
+ "no_valid_session": "Keine gültige Sitzung",
138
+ "object_deleted_successfully": "{modelName} erfolgreich gelöscht",
139
+ "auth_required": "Authentifizierung erforderlich",
140
+ "auth_required_message": "Sie müssen angemeldet sein, um auf diese Ressource zuzugreifen",
141
+ "forbidden": "Zugriff verweigert",
142
+ "forbidden_role_message": "Diese Ressource erfordert eine der folgenden Rollen: {roles}",
143
+ "email_verification_required": "E-Mail-Verifizierung erforderlich",
144
+ "email_verification_required_message": "Bitte verifizieren Sie Ihre E-Mail-Adresse, bevor Sie auf diese Ressource zugreifen",
145
+ "company_account_required": "Unternehmenskonto erforderlich",
146
+ "company_verification_required": "Unternehmensverifizierung erforderlich",
147
+ "company_verification_required_message": "Ihr Unternehmen muss von einem Administrator verifiziert werden, bevor Sie auf diese Ressource zugreifen können",
148
+ "missing_required_fields": "Erforderliche Felder fehlen",
149
+ "required_fields": "Erforderliche Felder: {fields}",
150
+ "invalid_role": "Ungültige Rolle",
151
+ "invalid_role_message": "Die Rolle muss entweder STUDENT oder COMPANY sein",
152
+ "email_already_registered": "E-Mail bereits registriert",
153
+ "email_already_registered_message": "Ein Benutzer mit dieser E-Mail-Adresse existiert bereits",
154
+ "registration_failed": "Registrierung fehlgeschlagen",
155
+ "invalid_credentials": "Ungültige Anmeldedaten",
156
+ "invalid_credentials_message": "E-Mail oder Passwort ist falsch",
157
+ "invalid_login_method": "Ungültige Anmeldemethode",
158
+ "invalid_login_method_message": "Bitte melden Sie sich mit {provider} an",
159
+ "login_failed": "Anmeldung fehlgeschlagen",
160
+ "refresh_token_required": "Aktualisierungstoken erforderlich",
161
+ "invalid_refresh_token": "Ungültiges Aktualisierungstoken",
162
+ "session_expired_or_invalid": "Sitzung abgelaufen oder ungültig",
163
+ "token_refresh_failed": "Token-Aktualisierung fehlgeschlagen",
164
+ "logged_out_successfully": "Erfolgreich abgemeldet",
165
+ "logout_failed": "Abmeldung fehlgeschlagen",
166
+ "not_authenticated": "Nicht authentifiziert",
167
+ "missing_required_field": "Erforderliches Feld fehlt",
168
+ "field_required": "{field} ist erforderlich",
169
+ "invalid_token": "Ungültiges {provider}-Token",
170
+ "invalid_token_message": "{message}",
171
+ "role_required_for_new_users": "Rolle für neue Benutzer erforderlich",
172
+ "role_required_for_new_users_message": "Bitte geben Sie an, ob Sie ein STUDENT oder COMPANY sind",
173
+ "google_auth_failed": "Google-Authentifizierung fehlgeschlagen",
174
+ "facebook_auth_failed": "Facebook-Authentifizierung fehlgeschlagen",
175
+ "token_missing_email": "Token enthält keine E-Mail-Informationen",
176
+ "oauth_config_missing": "{provider} App-ID und Secret müssen in Umgebungsvariablen konfiguriert werden",
177
+ "token_app_mismatch": "Token gehört nicht zu dieser Anwendung",
178
+ "oauth_email_permission_missing": "{provider}-Benutzer hat keine E-Mail-Berechtigung erteilt"
179
+ }