diff --git a/classquiz/oauth/custom.py b/classquiz/oauth/custom.py
index 5d09d6b..2b2f568 100644
--- a/classquiz/oauth/custom.py
+++ b/classquiz/oauth/custom.py
@@ -47,29 +47,17 @@ class OpenIDResponse(BaseModel):
@router.get("/login")
async def openid_login(req: Request):
- if (
- settings.custom_openid_provider.client_id is None
- or settings.custom_openid_provider.client_secret is None
- ):
- raise HTTPException(
- status_code=501, detail="Custom-OAuth-Login isn't available on this server"
- )
+ if settings.custom_openid_provider.client_id is None or settings.custom_openid_provider.client_secret is None:
+ raise HTTPException(status_code=501, detail="Custom-OAuth-Login isn't available on this server")
oauth = init_oauth()
- return await oauth.custom.authorize_redirect(
- req, f"{settings.root_address}/api/v1/users/oauth/custom/auth"
- )
+ return await oauth.custom.authorize_redirect(req, f"{settings.root_address}/api/v1/users/oauth/custom/auth")
@router.get("/auth")
async def auth(request: Request, response: Response):
- if (
- settings.custom_openid_provider.client_id is None
- or settings.custom_openid_provider.client_secret is None
- ):
- raise HTTPException(
- status_code=501, detail="Custom-OAuth-Login isn't available on this server"
- )
+ if settings.custom_openid_provider.client_id is None or settings.custom_openid_provider.client_secret is None:
+ raise HTTPException(status_code=501, detail="Custom-OAuth-Login isn't available on this server")
access_token = request.cookies.get("access_token")
rememberme_token = request.cookies.get("rememberme_token")
if access_token is not None:
@@ -80,9 +68,7 @@ async def auth(request: Request, response: Response):
except HTTPException:
pass
if rememberme_token is not None:
- return await rememberme_check(
- rememberme_token=rememberme_token, response=response
- )
+ return await rememberme_check(rememberme_token=rememberme_token, response=response)
oauth = init_oauth()
user_data = await oauth.custom.authorize_access_token(request)
diff --git a/classquiz/oauth/github.py b/classquiz/oauth/github.py
index ac15cd1..1382c47 100644
--- a/classquiz/oauth/github.py
+++ b/classquiz/oauth/github.py
@@ -76,21 +76,15 @@ class GitHubOauthResponse(BaseModel):
@router.get("/login")
async def github_login(req: Request):
if settings.github_client_id is None or settings.github_client_secret is None:
- raise HTTPException(
- status_code=501, detail="GitHub-Login isn't available on this server"
- )
+ raise HTTPException(status_code=501, detail="GitHub-Login isn't available on this server")
oauth = init_oauth()
- return await oauth.github.authorize_redirect(
- req, f"{settings.root_address}/api/v1/users/oauth/github/auth"
- )
+ return await oauth.github.authorize_redirect(req, f"{settings.root_address}/api/v1/users/oauth/github/auth")
@router.get("/auth")
async def auth(request: Request, response: Response):
if settings.github_client_id is None or settings.github_client_secret is None:
- raise HTTPException(
- status_code=501, detail="GitHub-Login isn't available on this server"
- )
+ raise HTTPException(status_code=501, detail="GitHub-Login isn't available on this server")
access_token = request.cookies.get("access_token")
rememberme_token = request.cookies.get("rememberme_token")
if access_token is not None:
@@ -101,9 +95,7 @@ async def auth(request: Request, response: Response):
except HTTPException:
pass
if rememberme_token is not None:
- return await rememberme_check(
- rememberme_token=rememberme_token, response=response
- )
+ return await rememberme_check(rememberme_token=rememberme_token, response=response)
oauth = init_oauth()
try:
token = await oauth.github.authorize_access_token(request)
diff --git a/classquiz/oauth/google.py b/classquiz/oauth/google.py
index bd141e7..300aa63 100644
--- a/classquiz/oauth/google.py
+++ b/classquiz/oauth/google.py
@@ -51,22 +51,16 @@ class OauthGoogleResponse(BaseModel):
@router.get("/login")
async def google_login(req: Request):
if settings.google_client_secret is None or settings.google_client_id is None:
- raise HTTPException(
- status_code=501, detail="Google-Login isn't available on this server"
- )
+ raise HTTPException(status_code=501, detail="Google-Login isn't available on this server")
oauth = init_oauth()
- return await oauth.google.authorize_redirect(
- req, f"{settings.root_address}/api/v1/users/oauth/google/auth"
- )
+ return await oauth.google.authorize_redirect(req, f"{settings.root_address}/api/v1/users/oauth/google/auth")
@router.get("/auth")
async def auth(request: Request, response: Response):
if settings.google_client_secret is None or settings.google_client_id is None:
- raise HTTPException(
- status_code=501, detail="Google-Login isn't available on this server"
- )
+ raise HTTPException(status_code=501, detail="Google-Login isn't available on this server")
access_token = request.cookies.get("access_token")
rememberme_token = request.cookies.get("rememberme_token")
if access_token is not None:
@@ -77,9 +71,7 @@ async def auth(request: Request, response: Response):
except HTTPException:
pass
if rememberme_token is not None:
- return await rememberme_check(
- rememberme_token=rememberme_token, response=response
- )
+ return await rememberme_check(rememberme_token=rememberme_token, response=response)
oauth = init_oauth()
user_data = await oauth.google.authorize_access_token(request)
diff --git a/frontend/src/lib/i18n/locales/ca.json b/frontend/src/lib/i18n/locales/ca.json
index cd49fc9..389d102 100644
--- a/frontend/src/lib/i18n/locales/ca.json
+++ b/frontend/src/lib/i18n/locales/ca.json
@@ -191,7 +191,7 @@
"play_quiz": "2. Resol el qüestionari",
"see_all_quizzes": "Mostra tots els teus qüestionaris",
"completely_free": "Completament gratuït",
- "completely_free_content": "",
+ "completely_free_content": "ClassQuiz és completament gratuït (per a l'usuari), sense cap pla de pagament o redireccions molestes a pàgines d'actualitzacions. Les donacions són molt apreciades.",
"user_friendly_content": "ClassQuiz pretén ser senzill, per tal de poder ser emprat per tothom.",
"no_tracking_content": "Altres aplicacions registren el que feu i envien aquesta informació a terceres parts. ClassQuiz no ho fa.",
"multilingual_content": "",
diff --git a/frontend/src/lib/i18n/locales/es.json b/frontend/src/lib/i18n/locales/es.json
index 5d51cc3..96b5d27 100644
--- a/frontend/src/lib/i18n/locales/es.json
+++ b/frontend/src/lib/i18n/locales/es.json
@@ -160,7 +160,7 @@
"backup_code": "Código de la copia de seguridad",
"totp": "contraseña de un solo uso (Totp)",
"text": "Texto",
- "order": "Ordenar",
+ "order": "Pedido",
"results": "Resultados",
"note": "Nota",
"player_plural": "Jugadores",
@@ -173,7 +173,7 @@
"finish": "Finalizar",
"normal": "Normal",
"selected": "Seleccionado",
- "select": "Seleccionar",
+ "select": "Selección",
"quiz": "Cuestionario",
"quiztivity": "Quiztivity",
"next": "Siguiente",
@@ -288,7 +288,7 @@
"order_description": "Las respuestas se pueden poner en el orden correcto",
"text_description": "Los jugadores pueden introducir texto",
"range_description": "Se puede seleccionar un intervalo de números con un control deslizante",
- "check_choice_description": "Todas las respuestas correctas deben seleccionarse para obtener puntos",
+ "check_choice_description": "Hay que elegir todas las respuestas correctas para sumar puntos",
"need_more_help": "¿Necesitas más ayuda?",
"enter_answer": "Escribe una respuesta",
"visit_docs": "Visita los documentos.",
@@ -362,7 +362,7 @@
"player_count": "Número de jugadores",
"no_results_so_far": "No hay resultados guardados hasta ahora...",
"general_overview": {
- "sentence": "El cuestionario \"{{title}}\", el cual tuvo {{date}} jugadores, tenía {{player_count}} jugadores con una puntuación media de {{average_score}}."
+ "sentence": "La prueba \"{{title}}\", el cual tuvo jugadores en {{date}} tenía {{player_count}} jugadores con una puntuación media de {{average_score}}."
}
},
"result_page": {
@@ -406,7 +406,7 @@
"enable_totp": "Activar TOTP"
},
"view_quiz_page": {
- "made_by": "Hecho por",
+ "made_by": "Realizado por Anonimous",
"view_on_kahoot": "Ver en el original"
},
"start_game": {
diff --git a/frontend/src/lib/i18n/locales/he.json b/frontend/src/lib/i18n/locales/he.json
index b3c77be..a4c320e 100644
--- a/frontend/src/lib/i18n/locales/he.json
+++ b/frontend/src/lib/i18n/locales/he.json
@@ -1,36 +1,192 @@
{
"index_page": {
- "get_ranking_and_winners": "צפו בניקוד וראו מי זכה",
- "completely_free": "לגמרי ללא עלות",
- "create_a_quiz_from_scratch": "צור חידון מאפס בעזרת העורך וכלול תמונות ועוד",
- "see_how_many_true_and_false": "צפו בכמה צדקו או טעו",
- "see_all_quizzes": "צפו בכל החידונים שלכם",
+ "get_ranking_and_winners": "צפייה בניקוד והצגת הזוכה",
+ "completely_free": "לגמרי בחינם",
+ "create_a_quiz_from_scratch": "אפשר ליצור חידון מאפס בעזרת העורך ולכלול תמונות ועוד",
+ "see_how_many_true_and_false": "לראות כמה צדקו או טעו",
+ "see_all_quizzes": "צפייה בכל החידונים שיצרת",
"meta": {
- "description": "ClassQuiz היא אפליקציית חידון ללמידה אינטראקטיבית עבור תלמידים, בקוד פתוח וחינמית לשימוש",
+ "description": "ClassQuiz היא יישום ליצירת חידונים ללמידה אינטראקטיבית לתלמידים, הזמין בקוד פתוח ובאופן חופשי",
"title": "בית"
},
- "stats": "כבר יש {{user_count}} משתמשים ו-{{quiz_count}} חידונים ב-ClassQuiz.",
- "see_what_true_and_false": "צפו במה היה נכון או לא נכון",
- "teachers_site": "אתר המורה",
- "students_site": "אתר התלמיד",
+ "stats": "כבר יש {{user_count}} משתמשים ו־{{quiz_count}} חידונים ב־ClassQuiz.",
+ "see_what_true_and_false": "לראות היכן צדקנו או טעינו",
+ "teachers_site": "אתר למורים",
+ "students_site": "אתר לתלמידים",
"no_tracking": "ללא מעקב",
- "self_hostable": "ניתן לאחסון מקומי",
+ "self_hostable": "ניתן לאירוח מקומי",
"german_server": "שרת גרמני",
"user_friendly": "ידידותי למשתמש",
"quiz_results_downloadable": "תוצאות החידון ניתנות להורדה",
"multilingual": "רב לשוני",
"dark_mode": "מצב כהה",
- "get_a_quiz": "1. קבל חידון",
- "play_quiz": "2. שחקו את החידון",
- "select_answer": "בחר את התשובה",
- "choose_answer_wisely": "בחר את התשובה בחכמה",
+ "get_a_quiz": "1. השגת חידון",
+ "play_quiz": "2. הפעלת החידון",
+ "select_answer": "בחירת התשובה",
+ "choose_answer_wisely": "יש לבחור את התשובה בתבונה",
"view_results": "צפייה בתוצאות",
- "check_if_chosen_wisely": "בדקו, אם בחרת בחוכמה",
+ "check_if_chosen_wisely": "אפשר לבדוק אם בחרת תשובה בתבונה",
"list_winners": "רשימת הזוכים",
"why_classquiz": "למה ClassQuiz?",
- "no_tracking_content": "אחרים עוקבים אחריך ושולחים את המידע הזה לצד שלישי, אבל ClassQuiz לא.",
- "slogan": "פלטפורמת חידון בקוד פתוח!",
- "create_or_import": "צור או יבא",
- "find_or_explore": "מצא (או גלה) חידונים שנוצרו או יובאו על ידי אנשים אחרים"
+ "no_tracking_content": "אתרים אחרים עוקבים אחריך ושולחים את המידע הזה לצד שלישי, אבל ClassQuiz לא.",
+ "slogan": "פלטפורמת הקוד הפתוח ליצירת חידונים!",
+ "create_or_import": "יצירה או ייבוא",
+ "find_or_explore": "אפשר למצוא (או לגלות) חידונים שנוצרו או יובאו על ידי אנשים אחרים",
+ "no_player_limit": "אין מגבלה על כמות השחקנים",
+ "no_player_limit_content": "ל־ClassQuiz אין מגבלה מלאכותית על כמות השחקנים. תיאורטית, יותר מאלף שחקנים יכולים להשתתף באותו החידון, אבל בפועל נבדקה כמות של עד 300 שחקנים לחידון.",
+ "import_quiz_from_kahoot_and_edit": "אפשר לייבא חידוני Kahoot! ולערוך אותם ב־ClassQuiz"
+ },
+ "overview_page": {
+ "created_at": "מועד יצירה",
+ "question_count": "כמות שאלות",
+ "no_quizzes": "יש ללחוץ על הכפתור „יצירה” או לייבא חידון כדי להתחיל."
+ },
+ "edit_page": {
+ "success_update_title": "החידון התעדכן."
+ },
+ "create_page": {
+ "success": {
+ "title": "החידון נוצר."
+ }
+ },
+ "register_page": {
+ "greeting": "נעים להכיר!",
+ "create_account": "יצירת חשבון",
+ "forgot_password?": "שכחת את הסיסמה?",
+ "already_have_account?": "כבר יש לך חשבון?"
+ },
+ "login_page": {
+ "welcome_back": "ברוך שובך.",
+ "login_or_create_account": "התחברות או יצירת חשבון",
+ "already_have_account": "אין לך חשבון?",
+ "email_or_username": "דוא״ל או שם משתמש",
+ "modal": {
+ "success": {
+ "success_check_mail": "התחברת. נא לבדוק את תיבת הדואר הנכנס.",
+ "success": "התחברת.",
+ "description": {
+ "success": "התחברת."
+ }
+ },
+ "error": {
+ "wrong_creds": "כתובת דוא״ל או סיסמה שגויות.",
+ "unexpected": "שגיאה לא צפויה!"
+ }
+ },
+ "use_backup_code": "שימוש בקוד גיבוי"
+ },
+ "words": {
+ "question": "שאלה",
+ "answer": "תשובה",
+ "stats": "סטטיסטיקה",
+ "features": "תכונות",
+ "login": "התחברות",
+ "email": "כתובת דוא״ל",
+ "username": "שם משתמש",
+ "password": "סיסמה",
+ "play": "הפעלה",
+ "edit": "עריכה",
+ "delete": "מחיקה",
+ "public": "ציבורי",
+ "start": "התחלה",
+ "create": "יצירה",
+ "import": "ייבוא",
+ "logout": "התנתקות",
+ "title": "כותרת",
+ "url": "כתובת",
+ "submit": "שליחה",
+ "connect": "התחברות",
+ "kick": "סילוק",
+ "register": "הרשמה",
+ "docs": "תיעוד",
+ "close": "סגירה",
+ "save": "שמירה",
+ "description": "תיאור",
+ "image": "תמונה",
+ "settings": "הגדרות",
+ "repeat_password": "חזרה על הסיסמה",
+ "overview": "סקירה כוללת",
+ "report": "דיווח",
+ "explore": "היחשפות",
+ "search": "חיפוש",
+ "screenshot": "צילום מסך",
+ "screenshot_plural": "צילומי מסך",
+ "browser": "דפדפן",
+ "view": "תצוגה",
+ "view_plural": "תצוגות",
+ "result": "תוצאה",
+ "result_plural": "תוצאות",
+ "count": "כמות",
+ "range": "טווח",
+ "multiple_choice": "בחירה מרובה",
+ "private": "פרטי",
+ "question_plural": "שאלות",
+ "find": "איתור",
+ "error": "שגיאה",
+ "download": "הורדה",
+ "continue": "המשך",
+ "backup_code": "קוד גיבוי",
+ "text": "טקסט",
+ "order": "סדר",
+ "note": "הערה",
+ "player_plural": "שחקנים",
+ "results": "תוצאות",
+ "unknown": "לא ידוע",
+ "never": "אף פעם",
+ "update": "עדכון",
+ "score": "ניקוד",
+ "slide": "שקופית",
+ "name": "שם",
+ "point": "נקודה",
+ "point_plural": "נקודות",
+ "back": "חזרה",
+ "finish": "סיום",
+ "select": "בחירה",
+ "quiz": "חידון",
+ "video": "סרטון",
+ "library": "ספרייה",
+ "progress": "התקדמות",
+ "speed": "מהירות",
+ "upload": "העלאה",
+ "files_library": "ספריית קבצים",
+ "answer_plural": "תשובות",
+ "yes": "כן",
+ "no": "לא",
+ "analytics": "ניתוח נתונים",
+ "rating": "דירוג",
+ "like": "לייק",
+ "like_plural": "לייקים",
+ "play_plural": "הפעלות",
+ "info": "מידע",
+ "player": "שחקן"
+ },
+ "editor": {
+ "time_in_seconds": "זמן בשניות",
+ "add_new_answer": "הוספת תשובה חדשה",
+ "add_new_question": "הוספת שאלה חדשה",
+ "delete_question": "מחיקת שאלה",
+ "delete_answer": "מחיקת תשובה",
+ "no_title": "אין כותרת...",
+ "empty": "ריק...",
+ "bg_image": "תמונת רקע",
+ "slide": {
+ "text": "טקסט",
+ "rectangle": "מלבן",
+ "rectangle_description": "פשוט מלבן"
+ },
+ "visit_docs": "נא לעיין בתיעוד.",
+ "advanced_settings": "הגדרות מתקדמות"
+ },
+ "import_page": {
+ "a_kahoot_quiz": "חידון Kahoot!",
+ "url_should_look_like_this": "הכתובת צריכה להיראות כך: https://create.kahoot.it/details/...",
+ "classquiz_quiz": "חידון ClassQuiz"
+ },
+ "admin_page": {
+ "start_game": "התחלת המשחק",
+ "time_left": "זמן נותר",
+ "get_results": "קבלת התוצאות",
+ "get_final_results": "קבלת התוצאות הסופיות",
+ "show_next_question": "הצגת השאלה הבאה"
}
}
diff --git a/frontend/src/lib/i18n/locales/ta.json b/frontend/src/lib/i18n/locales/ta.json
index 75ceecc..1ea2800 100644
--- a/frontend/src/lib/i18n/locales/ta.json
+++ b/frontend/src/lib/i18n/locales/ta.json
@@ -46,7 +46,7 @@
"how_does_classquiz_work": "கிளாச் க்விச் கூட எவ்வாறு செயல்படுகிறது?",
"no_player_limit": "வீரர் வரம்பு இல்லை",
"no_player_limit_content": "ClassQuiz க்கு செயற்கை வீரர் வரம்பு இல்லை. கோட்பாட்டில், 1000+ வீரர்கள் ஒரே நொடி வினாவை விளையாட முடியும், ஆனால் இது ஒரு நொடி வினா வரை 300 வீரர்களுடன் சோதிக்கப்படுகிறது.",
- "import_quiz_from_kahoot_and_edit": "ஏற்றுமதி"
+ "import_quiz_from_kahoot_and_edit": "கஊட்டிலிருந்து நொடி வினாவை இறக்குமதி செய்! வகுப்பு வினாடிவினாவில் அவற்றைத் திருத்தவும்"
},
"play_page": {
"join_description": "{{pin} at இல் சேரவும், {{url}}} ஐ உள்ளிடவும்.",
@@ -247,7 +247,9 @@
"visit_docs": "டாக்சைப் பார்வையிடவும்.",
"enter_answer": "ஒரு பதிலை உள்ளிடவும்",
"enable_reorder": "மறுதொடக்கம் பயன்முறையை இயக்கவும்",
- "disable_reorder": "மறுதொடக்கம் பயன்முறையை முடக்கு"
+ "disable_reorder": "மறுதொடக்கம் பயன்முறையை முடக்கு",
+ "advanced_settings": "மேம்பட்ட அமைப்புகள்",
+ "hide_question_results": "கேள்வி முடிவுகளை மறைக்கவா?"
},
"import_page": {
"need_help": "உதவி தேவையா?",
@@ -314,7 +316,8 @@
"search_for_own_quizzes": "உங்கள் சொந்த நொடி வினாக்களைத் தேடுங்கள்",
"views_n_plays": "காட்சிகள் மற்றும் நாடகங்கள்",
"info_analytics": "\"நாடகங்கள்\" நொடி வினா எவ்வளவு அடிக்கடி தொடங்கப்பட்டது என்பதை மட்டுமே காட்டுகிறது (நீங்கள் சேர்த்துள்ளீர்கள்), அதேசமயம் \"காட்சிகள்\" \"பார்வை\"-பக்கம் எவ்வளவு அடிக்கடி பார்வையிடப்பட்டது என்பதை கணக்கிடுகிறது, எனவே இது போட்களையும் கணக்கிடுகிறது (அதற்காக மன்னிக்கவும்).",
- "commandpalette_notice": "கட்டளைத் தட்டுகளைத் திறக்க ctr + k அல்லது மேவு + k ஐ அழுத்தவும்"
+ "commandpalette_notice": "கட்டளைத் தட்டுகளைத் திறக்க ctr + k அல்லது மேவு + k ஐ அழுத்தவும்",
+ "create_quiz": "புதிய நொடி வினாவை உருவாக்கவும்"
},
"footer": {
"self_ads": "{{mawoka_link} by மற்றும் {{others_link} of உதவியுடன் தயாரிக்கப்பட்டது.",
@@ -370,7 +373,8 @@
"correct_answer": "{{count}} சரியான பதில்",
"correct_answer_plural": "{{count}} சரியான பதில்கள்",
"time_taken": "எடுக்கப்பட்ட நேரம்",
- "player_score": "பிளேயர் ச்கோர்"
+ "player_score": "பிளேயர் ச்கோர்",
+ "player_correct_questions": "சரியான பதில்கள்"
},
"controllers": {
"add_new_controller": "புதிய கட்டுப்படுத்தியைச் சேர்க்கவும்",
diff --git a/frontend/src/lib/i18n/locales/zh_Hans.json b/frontend/src/lib/i18n/locales/zh_Hans.json
index 935fe9a..abdd493 100644
--- a/frontend/src/lib/i18n/locales/zh_Hans.json
+++ b/frontend/src/lib/i18n/locales/zh_Hans.json
@@ -40,7 +40,7 @@
"multilingual_content": "",
"dark_mode": "暗黑模式",
"why_classquiz": "为什么选择ClassQuiz?",
- "community_driven": "",
+ "community_driven": "社区驱动",
"play_quiz": "2. 开始测验",
"see_all_quizzes": "查看您的所有测验",
"download_quizzes_content": ""
@@ -233,7 +233,7 @@
},
"overview_page": {
"question_count": "",
- "created_at": "",
+ "created_at": "创建于",
"no_quizzes": ""
},
"settings_page": {
@@ -382,15 +382,15 @@
"login_page": {
"use_backup_code": "",
"email_or_username": "",
- "already_have_account": "",
+ "already_have_account": "没有账号吗?",
"modal": {
"error": {
"description": {
"unexpected": "",
- "wrong_creds": ""
+ "wrong_creds": "请确保你的密码和电子邮件地址是正确的。"
},
- "wrong_creds": "",
- "unexpected": ""
+ "wrong_creds": "电子邮件地址或密码错误。",
+ "unexpected": "发生了未预料的错误!"
},
"success": {
"success": "",
@@ -401,8 +401,8 @@
"success_check_mail": ""
}
},
- "login_or_create_account": "",
- "welcome_back": ""
+ "login_or_create_account": "登录或创建账户",
+ "welcome_back": "欢迎回来。"
},
"password_reset_page": {
"reset_password": ""
diff --git a/frontend/src/lib/quiz_types.ts b/frontend/src/lib/quiz_types.ts
index 2d66073..6aadc17 100644
--- a/frontend/src/lib/quiz_types.ts
+++ b/frontend/src/lib/quiz_types.ts
@@ -65,12 +65,7 @@ export interface Question {
}
export type Answers =
- | Answer[]
- | RangeQuizAnswer
- | VotingAnswer[]
- | string
- | TextQuizAnswer[]
- | OrderQuizAnswer[];
+ Answer[] | RangeQuizAnswer | VotingAnswer[] | string | TextQuizAnswer[] | OrderQuizAnswer[];
export interface Answer {
right: boolean;