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;