diff --git a/locale/ar/LC_MESSAGES/django.po b/locale/ar/LC_MESSAGES/django.po
index e55af33069..50f320186b 100644
--- a/locale/ar/LC_MESSAGES/django.po
+++ b/locale/ar/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: dmoj\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-24 19:15+0000\n"
-"PO-Revision-Date: 2021-04-25 00:08\n"
+"POT-Creation-Date: 2021-06-17 01:38+0000\n"
+"PO-Revision-Date: 2021-07-07 00:27\n"
"Last-Translator: \n"
"Language-Team: Arabic, Saudi Arabia\n"
"Language: ar_SA\n"
@@ -17,75 +17,75 @@ msgstr ""
"X-Crowdin-File: django.po\n"
"X-Crowdin-File-ID: 10\n"
-#: dmoj/settings.py:364
+#: dmoj/settings.py:365
msgid "Catalan"
msgstr ""
-#: dmoj/settings.py:365
+#: dmoj/settings.py:366
msgid "German"
msgstr "الألمانية"
-#: dmoj/settings.py:366
+#: dmoj/settings.py:367
msgid "English"
msgstr "الانجليزية"
-#: dmoj/settings.py:367
+#: dmoj/settings.py:368
msgid "Spanish"
msgstr "الإسبانية"
-#: dmoj/settings.py:368
+#: dmoj/settings.py:369
msgid "French"
msgstr "الفرنسية"
-#: dmoj/settings.py:369
+#: dmoj/settings.py:370
msgid "Croatian"
msgstr "الكرواتية"
-#: dmoj/settings.py:370
+#: dmoj/settings.py:371
msgid "Hungarian"
msgstr "الهنغارية"
-#: dmoj/settings.py:371
+#: dmoj/settings.py:372
msgid "Japanese"
msgstr "يابانية"
-#: dmoj/settings.py:372
+#: dmoj/settings.py:373
msgid "Korean"
msgstr "الكورية"
-#: dmoj/settings.py:373
+#: dmoj/settings.py:374
msgid "Brazilian Portuguese"
msgstr ""
-#: dmoj/settings.py:374
+#: dmoj/settings.py:375
msgid "Romanian"
msgstr ""
-#: dmoj/settings.py:375
+#: dmoj/settings.py:376
msgid "Russian"
msgstr ""
-#: dmoj/settings.py:376
+#: dmoj/settings.py:377
msgid "Serbian (Latin)"
msgstr ""
-#: dmoj/settings.py:377
+#: dmoj/settings.py:378
msgid "Turkish"
msgstr ""
-#: dmoj/settings.py:378
+#: dmoj/settings.py:379
msgid "Vietnamese"
msgstr ""
-#: dmoj/settings.py:379
+#: dmoj/settings.py:380
msgid "Simplified Chinese"
msgstr ""
-#: dmoj/settings.py:380
+#: dmoj/settings.py:381
msgid "Traditional Chinese"
msgstr ""
-#: dmoj/urls.py:103 templates/base.html:190
+#: dmoj/urls.py:104 templates/base.html:190
msgid "Home"
msgstr ""
@@ -123,46 +123,46 @@ msgstr ""
msgid "Associated page"
msgstr ""
-#: judge/admin/contest.py:31
+#: judge/admin/contest.py:32
msgid "Included contests"
msgstr ""
-#: judge/admin/contest.py:65 templates/contest/contest.html:83
+#: judge/admin/contest.py:66 templates/contest/contest.html:83
#: templates/contest/moss.html:43 templates/problem/list.html:204
#: templates/problem/list.html:219 templates/user/user-problems.html:58
#: templates/user/user-problems.html:100
msgid "Problem"
msgstr ""
-#: judge/admin/contest.py:114
+#: judge/admin/contest.py:117
msgid "Settings"
msgstr ""
-#: judge/admin/contest.py:116
+#: judge/admin/contest.py:120
msgid "Scheduling"
msgstr ""
-#: judge/admin/contest.py:117
+#: judge/admin/contest.py:121
msgid "Details"
msgstr ""
-#: judge/admin/contest.py:118
+#: judge/admin/contest.py:122
msgid "Format"
msgstr ""
-#: judge/admin/contest.py:119 templates/contest/ranking-table.html:5
+#: judge/admin/contest.py:123 templates/contest/ranking-table.html:5
msgid "Rating"
msgstr ""
-#: judge/admin/contest.py:120
+#: judge/admin/contest.py:124
msgid "Access"
msgstr ""
-#: judge/admin/contest.py:122 judge/admin/problem.py:134
+#: judge/admin/contest.py:126 judge/admin/problem.py:135
msgid "Justice"
msgstr ""
-#: judge/admin/contest.py:211
+#: judge/admin/contest.py:215
#, python-format
msgid "%d contest successfully marked as visible."
msgid_plural "%d contests successfully marked as visible."
@@ -173,11 +173,11 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-#: judge/admin/contest.py:214
+#: judge/admin/contest.py:218
msgid "Mark contests as visible"
msgstr ""
-#: judge/admin/contest.py:220
+#: judge/admin/contest.py:224
#, python-format
msgid "%d contest successfully marked as hidden."
msgid_plural "%d contests successfully marked as hidden."
@@ -188,11 +188,11 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-#: judge/admin/contest.py:223
+#: judge/admin/contest.py:227
msgid "Mark contests as hidden"
msgstr ""
-#: judge/admin/contest.py:229
+#: judge/admin/contest.py:233
#, python-format
msgid "%d contest successfully locked."
msgid_plural "%d contests successfully locked."
@@ -203,11 +203,11 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-#: judge/admin/contest.py:232
+#: judge/admin/contest.py:236
msgid "Lock contest submissions"
msgstr ""
-#: judge/admin/contest.py:238
+#: judge/admin/contest.py:242
#, python-format
msgid "%d contest successfully unlocked."
msgid_plural "%d contests successfully unlocked."
@@ -218,11 +218,11 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-#: judge/admin/contest.py:241
+#: judge/admin/contest.py:245
msgid "Unlock contest submissions"
msgstr ""
-#: judge/admin/contest.py:262 judge/admin/submission.py:170
+#: judge/admin/contest.py:266 judge/admin/submission.py:170
#, python-format
msgid "%d submission was successfully scheduled for rejudging."
msgid_plural "%d submissions were successfully scheduled for rejudging."
@@ -233,7 +233,7 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-#: judge/admin/contest.py:337
+#: judge/admin/contest.py:341
#, python-format
msgid "%d participation recalculated."
msgid_plural "%d participations recalculated."
@@ -244,15 +244,15 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-#: judge/admin/contest.py:340
+#: judge/admin/contest.py:344
msgid "Recalculate results"
msgstr ""
-#: judge/admin/contest.py:344 judge/admin/organization.py:63
+#: judge/admin/contest.py:348 judge/admin/organization.py:63
msgid "username"
msgstr ""
-#: judge/admin/contest.py:349 templates/base.html:258
+#: judge/admin/contest.py:353 templates/base.html:258
msgid "virtual"
msgstr ""
@@ -268,9 +268,9 @@ msgstr ""
msgid "Summary"
msgstr ""
-#: judge/admin/interface.py:113 judge/models/contest.py:383
-#: judge/models/contest.py:509 judge/models/profile.py:244
-#: judge/models/profile.py:268
+#: judge/admin/interface.py:113 judge/models/contest.py:419
+#: judge/models/contest.py:546 judge/models/profile.py:261
+#: judge/models/profile.py:292
msgid "user"
msgstr ""
@@ -278,8 +278,8 @@ msgstr ""
msgid "object"
msgstr ""
-#: judge/admin/organization.py:32 judge/admin/problem.py:181
-#: judge/admin/profile.py:82
+#: judge/admin/organization.py:32 judge/admin/problem.py:182
+#: judge/admin/profile.py:92
msgid "View on site"
msgstr ""
@@ -287,40 +287,40 @@ msgstr ""
msgid "Describe the changes you made (optional)"
msgstr ""
-#: judge/admin/problem.py:129
+#: judge/admin/problem.py:130
msgid "Social Media"
msgstr ""
-#: judge/admin/problem.py:130
+#: judge/admin/problem.py:131
msgid "Taxonomy"
msgstr ""
-#: judge/admin/problem.py:131 templates/contest/contest.html:84
+#: judge/admin/problem.py:132 templates/contest/contest.html:84
#: templates/problem/data.html:385 templates/problem/list.html:209
#: templates/problem/list.html:230 templates/user/base-users-table.html:10
#: templates/user/user-problems.html:60
msgid "Points"
msgstr ""
-#: judge/admin/problem.py:132
+#: judge/admin/problem.py:133
msgid "Limits"
msgstr ""
-#: judge/admin/problem.py:133 judge/admin/submission.py:238
-#: templates/stats/base.html:14 templates/submission/list.html:320
-#: templates/user/edit-profile.html:292
+#: judge/admin/problem.py:134 judge/admin/submission.py:238
+#: templates/stats/base.html:14 templates/submission/list.html:319
+#: templates/user/edit-profile.html:296
msgid "Language"
msgstr ""
-#: judge/admin/problem.py:135
+#: judge/admin/problem.py:136
msgid "History"
msgstr ""
-#: judge/admin/problem.py:178
+#: judge/admin/problem.py:179
msgid "Authors"
msgstr ""
-#: judge/admin/problem.py:191
+#: judge/admin/problem.py:192
#, python-format
msgid "%d problem's publish date successfully updated."
msgid_plural "%d problems' publish date successfully updated."
@@ -331,11 +331,11 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-#: judge/admin/problem.py:195
+#: judge/admin/problem.py:196
msgid "Set publish date to now"
msgstr ""
-#: judge/admin/problem.py:201
+#: judge/admin/problem.py:202
#, python-format
msgid "%d problem successfully marked as public."
msgid_plural "%d problems successfully marked as public."
@@ -346,11 +346,11 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-#: judge/admin/problem.py:205
+#: judge/admin/problem.py:206
msgid "Mark problems as public"
msgstr ""
-#: judge/admin/problem.py:211
+#: judge/admin/problem.py:212
#, python-format
msgid "%d problem successfully marked as private."
msgid_plural "%d problems successfully marked as private."
@@ -361,7 +361,7 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-#: judge/admin/problem.py:215
+#: judge/admin/problem.py:216
msgid "Mark problems as private"
msgstr ""
@@ -369,28 +369,28 @@ msgstr ""
msgid "timezone"
msgstr ""
-#: judge/admin/profile.py:88 judge/admin/submission.py:217
+#: judge/admin/profile.py:98 judge/admin/submission.py:217
#: templates/organization/requests/log.html:9
#: templates/organization/requests/pending.html:12
#: templates/ticket/list.html:261
msgid "User"
msgstr ""
-#: judge/admin/profile.py:93 templates/registration/registration_form.html:143
+#: judge/admin/profile.py:103 templates/registration/registration_form.html:143
msgid "Email"
msgstr ""
-#: judge/admin/profile.py:98 judge/views/register.py:29
+#: judge/admin/profile.py:108 judge/views/register.py:28
#: templates/registration/registration_form.html:171
-#: templates/user/edit-profile.html:288
+#: templates/user/edit-profile.html:292
msgid "Timezone"
msgstr ""
-#: judge/admin/profile.py:103
+#: judge/admin/profile.py:113
msgid "date joined"
msgstr ""
-#: judge/admin/profile.py:110
+#: judge/admin/profile.py:120
#, python-format
msgid "%d user have scores recalculated."
msgid_plural "%d users have scores recalculated."
@@ -401,7 +401,7 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-#: judge/admin/profile.py:113
+#: judge/admin/profile.py:123
msgid "Recalculate scores"
msgstr ""
@@ -558,115 +558,116 @@ msgstr ""
msgid "IOI (pre-2016)"
msgstr ""
-#: judge/forms.py:26
-msgid "Two-factor authentication tokens must be 6 decimal digits."
+#: judge/forms.py:27
+#, python-brace-format
+msgid "Two-factor authentication tokens must be {TOTP_CODE_LENGTH} decimal digits."
msgstr ""
-#: judge/forms.py:29
+#: judge/forms.py:30
msgid "Invalid two-factor authentication token."
msgstr ""
-#: judge/forms.py:32
+#: judge/forms.py:33
msgid "Scratch codes must be 16 base32 characters."
msgstr ""
-#: judge/forms.py:34
+#: judge/forms.py:35 judge/forms.py:264
msgid "Invalid scratch code."
msgstr ""
-#: judge/forms.py:45
+#: judge/forms.py:46
msgid "Subscribe to contest updates"
msgstr ""
-#: judge/forms.py:46
+#: judge/forms.py:47
msgid "Enable experimental features"
msgstr ""
-#: judge/forms.py:71
+#: judge/forms.py:72
msgid "You must solve at least one problem before you can update your profile."
msgstr ""
-#: judge/forms.py:80 judge/views/organization.py:127
+#: judge/forms.py:81 judge/views/organization.py:126
#, python-brace-format
msgid "You may not be part of more than {count} public organizations."
msgstr ""
-#: judge/forms.py:96
+#: judge/forms.py:97
msgid "Download comments?"
msgstr ""
-#: judge/forms.py:97
+#: judge/forms.py:98
msgid "Download submissions?"
msgstr ""
-#: judge/forms.py:98
+#: judge/forms.py:99
msgid "Filter by problem code glob:"
msgstr ""
-#: judge/forms.py:102
+#: judge/forms.py:103
msgid "Leave empty to include all submissions"
msgstr ""
-#: judge/forms.py:105 templates/problem/manage_submission.html:142
+#: judge/forms.py:106 templates/problem/manage_submission.html:142
msgid "Filter by result:"
msgstr ""
-#: judge/forms.py:111
+#: judge/forms.py:112
msgid "Please select at least one thing to download."
msgstr ""
-#: judge/forms.py:137
+#: judge/forms.py:138
msgid "Any judge"
msgstr ""
-#: judge/forms.py:167 judge/views/register.py:26
+#: judge/forms.py:159 judge/views/register.py:25
#: templates/registration/registration_form.html:137
#: templates/user/base-users-table.html:5
msgid "Username"
msgstr ""
-#: judge/forms.py:168 templates/registration/registration_form.html:149
+#: judge/forms.py:160 templates/registration/registration_form.html:149
#: templates/registration/registration_form.html:163
msgid "Password"
msgstr ""
-#: judge/forms.py:201
+#: judge/forms.py:192
msgid "Invalid code length."
msgstr ""
-#: judge/forms.py:219
+#: judge/forms.py:223
msgid "Invalid WebAuthn response."
msgstr ""
-#: judge/forms.py:222
+#: judge/forms.py:226
msgid "No WebAuthn challenge issued."
msgstr ""
-#: judge/forms.py:228
+#: judge/forms.py:232
msgid "Invalid WebAuthn credential ID."
msgstr ""
-#: judge/forms.py:257
+#: judge/forms.py:262
msgid "Invalid two-factor authentication token or scratch code."
msgstr ""
-#: judge/forms.py:259
+#: judge/forms.py:266
msgid "Must specify either totp_token or webauthn_response."
msgstr ""
-#: judge/forms.py:263 judge/models/problem.py:105
+#: judge/forms.py:270 judge/models/problem.py:119
msgid "Problem code must be ^[a-z0-9]+$"
msgstr ""
-#: judge/forms.py:268
+#: judge/forms.py:275
msgid "Problem with code already exists."
msgstr ""
-#: judge/forms.py:273 judge/models/contest.py:66
+#: judge/forms.py:280 judge/models/contest.py:66
msgid "Contest id must be ^[a-z0-9]+$"
msgstr ""
-#: judge/forms.py:278
+#: judge/forms.py:285
msgid "Contest with key already exists."
msgstr ""
@@ -746,7 +747,7 @@ msgid "comments"
msgstr ""
#: judge/models/comment.py:89 judge/models/comment.py:141
-#: judge/models/problem.py:484
+#: judge/models/problem.py:511
#, python-format
msgid "Editorial for %s"
msgstr ""
@@ -787,7 +788,7 @@ msgstr ""
msgid "contest tag"
msgstr ""
-#: judge/models/contest.py:53 judge/models/contest.py:117
+#: judge/models/contest.py:53 judge/models/contest.py:126
msgid "contest tags"
msgstr ""
@@ -812,410 +813,426 @@ msgid "contest name"
msgstr ""
#: judge/models/contest.py:68
-msgid "These people will be able to edit the contest."
+msgid "These users will be able to edit the contest."
msgstr ""
-#: judge/models/contest.py:70 judge/models/runtime.py:136
+#: judge/models/contest.py:70
+msgid "These users will be able to edit the contest, but will not be listed as authors."
+msgstr ""
+
+#: judge/models/contest.py:73
+msgid "These users will be able to view the contest, but not edit it."
+msgstr ""
+
+#: judge/models/contest.py:76 judge/models/runtime.py:136
msgid "description"
msgstr ""
-#: judge/models/contest.py:71 judge/models/problem.py:431
+#: judge/models/contest.py:77 judge/models/problem.py:458
#: judge/models/runtime.py:138
msgid "problems"
msgstr ""
-#: judge/models/contest.py:72 judge/models/contest.py:384
+#: judge/models/contest.py:78 judge/models/contest.py:420
msgid "start time"
msgstr ""
-#: judge/models/contest.py:73
+#: judge/models/contest.py:79
msgid "end time"
msgstr ""
-#: judge/models/contest.py:74 judge/models/problem.py:126
-#: judge/models/problem.py:455
+#: judge/models/contest.py:80 judge/models/problem.py:140
+#: judge/models/problem.py:482
msgid "time limit"
msgstr ""
-#: judge/models/contest.py:75 judge/models/problem.py:144
+#: judge/models/contest.py:81 judge/models/problem.py:158
msgid "publicly visible"
msgstr ""
-#: judge/models/contest.py:76
+#: judge/models/contest.py:82
msgid "Should be set even for organization-private contests, where it determines whether the contest is visible to members of the specified organizations."
msgstr ""
-#: judge/models/contest.py:79
+#: judge/models/contest.py:85
msgid "contest rated"
msgstr ""
-#: judge/models/contest.py:79
+#: judge/models/contest.py:85
msgid "Whether this contest can be rated."
msgstr ""
-#: judge/models/contest.py:81
+#: judge/models/contest.py:87
msgid "view contest scoreboard"
msgstr ""
-#: judge/models/contest.py:83
+#: judge/models/contest.py:89
msgid "These users will be able to view the scoreboard."
msgstr ""
-#: judge/models/contest.py:84
+#: judge/models/contest.py:90
msgid "scoreboard visibility"
msgstr ""
-#: judge/models/contest.py:85
+#: judge/models/contest.py:91
msgid "Scoreboard visibility through the duration of the contest"
msgstr ""
-#: judge/models/contest.py:87
+#: judge/models/contest.py:93
msgid "no comments"
msgstr ""
-#: judge/models/contest.py:88
+#: judge/models/contest.py:94
msgid "Use clarification system instead of comments."
msgstr ""
-#: judge/models/contest.py:90
+#: judge/models/contest.py:96
msgid "Rating floor for contest"
msgstr ""
-#: judge/models/contest.py:92
+#: judge/models/contest.py:98
msgid "Rating ceiling for contest"
msgstr ""
-#: judge/models/contest.py:94
+#: judge/models/contest.py:100
msgid "rate all"
msgstr ""
-#: judge/models/contest.py:94
+#: judge/models/contest.py:100
msgid "Rate all users who joined."
msgstr ""
-#: judge/models/contest.py:95
+#: judge/models/contest.py:101
msgid "exclude from ratings"
msgstr ""
-#: judge/models/contest.py:97
+#: judge/models/contest.py:103
msgid "private to specific users"
msgstr ""
-#: judge/models/contest.py:98
+#: judge/models/contest.py:104
msgid "private contestants"
msgstr ""
-#: judge/models/contest.py:99
+#: judge/models/contest.py:105
msgid "If private, only these users may see the contest"
msgstr ""
-#: judge/models/contest.py:101
+#: judge/models/contest.py:107
msgid "hide problem tags"
msgstr ""
-#: judge/models/contest.py:102
+#: judge/models/contest.py:108
msgid "Whether problem tags should be hidden by default."
msgstr ""
-#: judge/models/contest.py:104
+#: judge/models/contest.py:110
+msgid "hide problem authors"
+msgstr ""
+
+#: judge/models/contest.py:111
+msgid "Whether problem authors should be hidden by default."
+msgstr ""
+
+#: judge/models/contest.py:113
msgid "run pretests only"
msgstr ""
-#: judge/models/contest.py:105
+#: judge/models/contest.py:114
msgid "Whether judges should grade pretests only, versus all testcases. Commonly set during a contest, then unset prior to rejudging user submissions when the contest ends."
msgstr ""
-#: judge/models/contest.py:109 judge/models/problem.py:166
+#: judge/models/contest.py:118 judge/models/problem.py:183
msgid "private to organizations"
msgstr ""
-#: judge/models/contest.py:110 judge/models/problem.py:164
-#: judge/models/profile.py:83
+#: judge/models/contest.py:119 judge/models/problem.py:181
+#: judge/models/profile.py:86
msgid "organizations"
msgstr ""
-#: judge/models/contest.py:111
+#: judge/models/contest.py:120
msgid "If private, only these organizations may see the contest"
msgstr ""
-#: judge/models/contest.py:112 judge/models/problem.py:153
+#: judge/models/contest.py:121 judge/models/problem.py:167
msgid "OpenGraph image"
msgstr ""
-#: judge/models/contest.py:113 judge/models/profile.py:54
+#: judge/models/contest.py:122 judge/models/profile.py:57
msgid "Logo override image"
msgstr ""
-#: judge/models/contest.py:115
+#: judge/models/contest.py:124
msgid "This image will replace the default site logo for users inside the contest."
msgstr ""
-#: judge/models/contest.py:118
+#: judge/models/contest.py:127
msgid "the amount of live participants"
msgstr ""
-#: judge/models/contest.py:119
+#: judge/models/contest.py:128
msgid "contest summary"
msgstr ""
-#: judge/models/contest.py:120 judge/models/problem.py:155
+#: judge/models/contest.py:129 judge/models/problem.py:169
msgid "Plain-text, shown in meta description tag, e.g. for social media."
msgstr ""
-#: judge/models/contest.py:121 judge/models/profile.py:53
+#: judge/models/contest.py:130 judge/models/profile.py:56
msgid "access code"
msgstr ""
-#: judge/models/contest.py:122
+#: judge/models/contest.py:131
msgid "An optional code to prompt contestants before they are allowed to join the contest. Leave it blank to disable."
msgstr ""
-#: judge/models/contest.py:124 judge/models/problem.py:149
+#: judge/models/contest.py:133 judge/models/problem.py:163
msgid "personae non gratae"
msgstr ""
-#: judge/models/contest.py:125
+#: judge/models/contest.py:134
msgid "Bans the selected users from joining this contest."
msgstr ""
-#: judge/models/contest.py:126
+#: judge/models/contest.py:135
msgid "contest format"
msgstr ""
-#: judge/models/contest.py:127
+#: judge/models/contest.py:136
msgid "The contest format module to use."
msgstr ""
-#: judge/models/contest.py:128
+#: judge/models/contest.py:137
msgid "contest format configuration"
msgstr ""
-#: judge/models/contest.py:129
+#: judge/models/contest.py:138
msgid "A JSON object to serve as the configuration for the chosen contest format module. Leave empty to use None. Exact format depends on the contest format selected."
msgstr ""
-#: judge/models/contest.py:136
+#: judge/models/contest.py:145
msgid "contest lock"
msgstr ""
-#: judge/models/contest.py:137
-msgid "Prevent submissions from this contest from being rejudged."
+#: judge/models/contest.py:146
+msgid "Prevent submissions from this contest from being rejudged after this date."
msgstr ""
-#: judge/models/contest.py:138
+#: judge/models/contest.py:148
msgid "precision points"
msgstr ""
-#: judge/models/contest.py:140
+#: judge/models/contest.py:150
msgid "Number of digits to round points to."
msgstr ""
-#: judge/models/contest.py:362
+#: judge/models/contest.py:398
msgid "See private contests"
msgstr ""
-#: judge/models/contest.py:363
+#: judge/models/contest.py:399
msgid "Edit own contests"
msgstr ""
-#: judge/models/contest.py:364
+#: judge/models/contest.py:400
msgid "Edit all contests"
msgstr ""
-#: judge/models/contest.py:365
+#: judge/models/contest.py:401
msgid "Clone contest"
msgstr ""
-#: judge/models/contest.py:366 templates/contest/moss.html:74
+#: judge/models/contest.py:402 templates/contest/moss.html:74
msgid "MOSS contest"
msgstr ""
-#: judge/models/contest.py:367
+#: judge/models/contest.py:403
msgid "Rate contests"
msgstr ""
-#: judge/models/contest.py:368
+#: judge/models/contest.py:404
msgid "Contest access codes"
msgstr ""
-#: judge/models/contest.py:369
+#: judge/models/contest.py:405
msgid "Create private contests"
msgstr ""
-#: judge/models/contest.py:370
+#: judge/models/contest.py:406
msgid "Change contest visibility"
msgstr ""
-#: judge/models/contest.py:371
+#: judge/models/contest.py:407
msgid "Edit contest problem label script"
msgstr ""
-#: judge/models/contest.py:372
+#: judge/models/contest.py:408
msgid "Change lock status of contest"
msgstr ""
-#: judge/models/contest.py:374 judge/models/contest.py:472
-#: judge/models/contest.py:510 judge/models/contest.py:532
-#: judge/models/submission.py:84
+#: judge/models/contest.py:410 judge/models/contest.py:508
+#: judge/models/contest.py:547 judge/models/contest.py:569
+#: judge/models/submission.py:85
msgid "contest"
msgstr ""
-#: judge/models/contest.py:375
+#: judge/models/contest.py:411
msgid "contests"
msgstr ""
-#: judge/models/contest.py:382
+#: judge/models/contest.py:418
msgid "associated contest"
msgstr ""
-#: judge/models/contest.py:385
+#: judge/models/contest.py:421
msgid "score"
msgstr ""
-#: judge/models/contest.py:386
+#: judge/models/contest.py:422
msgid "cumulative time"
msgstr ""
-#: judge/models/contest.py:387
+#: judge/models/contest.py:423
msgid "is disqualified"
msgstr ""
-#: judge/models/contest.py:388
+#: judge/models/contest.py:424
msgid "Whether this participation is disqualified."
msgstr ""
-#: judge/models/contest.py:389
+#: judge/models/contest.py:425
msgid "tie-breaking field"
msgstr ""
-#: judge/models/contest.py:390
+#: judge/models/contest.py:426
msgid "virtual participation id"
msgstr ""
-#: judge/models/contest.py:391
+#: judge/models/contest.py:427
msgid "0 means non-virtual, otherwise the n-th virtual participation."
msgstr ""
-#: judge/models/contest.py:392
+#: judge/models/contest.py:428
msgid "contest format specific data"
msgstr ""
-#: judge/models/contest.py:458
+#: judge/models/contest.py:494
#, python-format
msgid "%s spectating in %s"
msgstr ""
-#: judge/models/contest.py:460
+#: judge/models/contest.py:496
#, python-format
msgid "%s in %s, v%d"
msgstr ""
-#: judge/models/contest.py:461
+#: judge/models/contest.py:497
#, python-format
msgid "%s in %s"
msgstr ""
-#: judge/models/contest.py:464
+#: judge/models/contest.py:500
msgid "contest participation"
msgstr ""
-#: judge/models/contest.py:465
+#: judge/models/contest.py:501
msgid "contest participations"
msgstr ""
-#: judge/models/contest.py:471 judge/models/contest.py:494
-#: judge/models/contest.py:533 judge/models/problem.py:430
-#: judge/models/problem.py:435 judge/models/problem.py:453
+#: judge/models/contest.py:507 judge/models/contest.py:531
+#: judge/models/contest.py:570 judge/models/problem.py:457
+#: judge/models/problem.py:462 judge/models/problem.py:480
#: judge/models/problem_data.py:35
msgid "problem"
msgstr ""
-#: judge/models/contest.py:473 judge/models/contest.py:498
-#: judge/models/problem.py:137
+#: judge/models/contest.py:509 judge/models/contest.py:535
+#: judge/models/problem.py:151
msgid "points"
msgstr ""
-#: judge/models/contest.py:474
+#: judge/models/contest.py:510
msgid "partial"
msgstr ""
-#: judge/models/contest.py:475 judge/models/contest.py:499
+#: judge/models/contest.py:511 judge/models/contest.py:536
msgid "is pretested"
msgstr ""
-#: judge/models/contest.py:476 judge/models/interface.py:43
+#: judge/models/contest.py:512 judge/models/interface.py:43
msgid "order"
msgstr ""
-#: judge/models/contest.py:477
+#: judge/models/contest.py:513
msgid "output prefix length override"
msgstr ""
-#: judge/models/contest.py:479
+#: judge/models/contest.py:515
msgid "Maximum number of submissions for this problem, or leave blank for no limit."
msgstr ""
-#: judge/models/contest.py:482
+#: judge/models/contest.py:518
msgid "Why include a problem you can't submit to?"
msgstr ""
-#: judge/models/contest.py:487
+#: judge/models/contest.py:523
msgid "contest problem"
msgstr ""
-#: judge/models/contest.py:488
+#: judge/models/contest.py:524
msgid "contest problems"
msgstr ""
-#: judge/models/contest.py:492 judge/models/submission.py:207
+#: judge/models/contest.py:529 judge/models/submission.py:218
msgid "submission"
msgstr ""
-#: judge/models/contest.py:496 judge/models/contest.py:511
+#: judge/models/contest.py:533 judge/models/contest.py:548
msgid "participation"
msgstr ""
-#: judge/models/contest.py:500
+#: judge/models/contest.py:537
msgid "Whether this submission was ran only on pretests."
msgstr ""
-#: judge/models/contest.py:504
+#: judge/models/contest.py:541
msgid "contest submission"
msgstr ""
-#: judge/models/contest.py:505
+#: judge/models/contest.py:542
msgid "contest submissions"
msgstr ""
-#: judge/models/contest.py:513
+#: judge/models/contest.py:550
msgid "rank"
msgstr ""
-#: judge/models/contest.py:514
+#: judge/models/contest.py:551
msgid "rating"
msgstr ""
-#: judge/models/contest.py:515
+#: judge/models/contest.py:552
msgid "volatility"
msgstr ""
-#: judge/models/contest.py:516
+#: judge/models/contest.py:553
msgid "last rated"
msgstr ""
-#: judge/models/contest.py:520
+#: judge/models/contest.py:557
msgid "contest rating"
msgstr ""
-#: judge/models/contest.py:521
+#: judge/models/contest.py:558
msgid "contest ratings"
msgstr ""
-#: judge/models/contest.py:540
+#: judge/models/contest.py:577
msgid "contest moss result"
msgstr ""
-#: judge/models/contest.py:541
+#: judge/models/contest.py:578
msgid "contest moss results"
msgstr ""
@@ -1255,7 +1272,7 @@ msgstr ""
msgid "post title"
msgstr ""
-#: judge/models/interface.py:67 judge/models/problem.py:473
+#: judge/models/interface.py:67 judge/models/problem.py:500
msgid "authors"
msgstr ""
@@ -1263,7 +1280,7 @@ msgstr ""
msgid "slug"
msgstr ""
-#: judge/models/interface.py:69 judge/models/problem.py:471
+#: judge/models/interface.py:69 judge/models/problem.py:498
msgid "public visibility"
msgstr ""
@@ -1299,34 +1316,6 @@ msgstr ""
msgid "blog posts"
msgstr ""
-#: judge/models/message.py:11
-msgid "message title"
-msgstr ""
-
-#: judge/models/message.py:12 judge/models/ticket.py:30
-msgid "message body"
-msgstr ""
-
-#: judge/models/message.py:13
-msgid "sender"
-msgstr ""
-
-#: judge/models/message.py:14
-msgid "target"
-msgstr ""
-
-#: judge/models/message.py:15
-msgid "message timestamp"
-msgstr ""
-
-#: judge/models/message.py:16
-msgid "read"
-msgstr ""
-
-#: judge/models/message.py:20
-msgid "messages in the thread"
-msgstr ""
-
#: judge/models/problem.py:30
#, python-format
msgid "Disallowed characters: %(value)s"
@@ -1344,7 +1333,7 @@ msgstr ""
msgid "problem type"
msgstr ""
-#: judge/models/problem.py:44 judge/models/problem.py:121
+#: judge/models/problem.py:44 judge/models/problem.py:135
msgid "problem types"
msgstr ""
@@ -1356,7 +1345,7 @@ msgstr ""
msgid "problem group name"
msgstr ""
-#: judge/models/problem.py:56 judge/models/problem.py:124
+#: judge/models/problem.py:56 judge/models/problem.py:138
msgid "problem group"
msgstr ""
@@ -1376,7 +1365,7 @@ msgstr ""
msgid "full name"
msgstr ""
-#: judge/models/problem.py:65 judge/models/profile.py:41
+#: judge/models/problem.py:65 judge/models/profile.py:44
#: judge/models/runtime.py:24
msgid "short name"
msgstr ""
@@ -1405,232 +1394,252 @@ msgstr ""
msgid "licenses"
msgstr ""
-#: judge/models/problem.py:104
+#: judge/models/problem.py:112
+msgid "Follow global setting"
+msgstr ""
+
+#: judge/models/problem.py:113
+msgid "Always visible"
+msgstr ""
+
+#: judge/models/problem.py:114
+msgid "Visible if problem solved"
+msgstr ""
+
+#: judge/models/problem.py:115
+msgid "Only own submissions"
+msgstr ""
+
+#: judge/models/problem.py:118
msgid "problem code"
msgstr ""
-#: judge/models/problem.py:106
+#: judge/models/problem.py:120
msgid "A short, unique code for the problem, used in the url after /problem/"
msgstr ""
-#: judge/models/problem.py:108
+#: judge/models/problem.py:122
msgid "problem name"
msgstr ""
-#: judge/models/problem.py:109
+#: judge/models/problem.py:123
msgid "The full name of the problem, as shown in the problem list."
msgstr ""
-#: judge/models/problem.py:111
+#: judge/models/problem.py:125
msgid "problem body"
msgstr ""
-#: judge/models/problem.py:112
+#: judge/models/problem.py:126
msgid "creators"
msgstr ""
-#: judge/models/problem.py:113
+#: judge/models/problem.py:127
msgid "These users will be able to edit the problem, and be listed as authors."
msgstr ""
-#: judge/models/problem.py:115
+#: judge/models/problem.py:129
msgid "curators"
msgstr ""
-#: judge/models/problem.py:116
+#: judge/models/problem.py:130
msgid "These users will be able to edit the problem, but not be listed as authors."
msgstr ""
-#: judge/models/problem.py:118
+#: judge/models/problem.py:132
msgid "testers"
msgstr ""
-#: judge/models/problem.py:120
+#: judge/models/problem.py:134
msgid "These users will be able to view the private problem, but not edit it."
msgstr ""
-#: judge/models/problem.py:122
+#: judge/models/problem.py:136
msgid "The type of problem, as shown on the problem's page."
msgstr ""
-#: judge/models/problem.py:125
+#: judge/models/problem.py:139
msgid "The group of problem, shown under Category in the problem list."
msgstr ""
-#: judge/models/problem.py:127
+#: judge/models/problem.py:141
msgid "The time limit for this problem, in seconds. Fractional seconds (e.g. 1.5) are supported."
msgstr ""
-#: judge/models/problem.py:131 judge/models/problem.py:458
+#: judge/models/problem.py:145 judge/models/problem.py:485
msgid "memory limit"
msgstr ""
-#: judge/models/problem.py:132
+#: judge/models/problem.py:146
msgid "The memory limit for this problem, in kilobytes (e.g. 64mb = 65536 kilobytes)."
msgstr ""
-#: judge/models/problem.py:138
+#: judge/models/problem.py:152
msgid "Points awarded for problem completion. Points are displayed with a 'p' suffix if partial."
msgstr ""
-#: judge/models/problem.py:141
+#: judge/models/problem.py:155
msgid "allows partial points"
msgstr ""
-#: judge/models/problem.py:142
+#: judge/models/problem.py:156
msgid "allowed languages"
msgstr ""
-#: judge/models/problem.py:143
+#: judge/models/problem.py:157
msgid "List of allowed submission languages."
msgstr ""
-#: judge/models/problem.py:145
+#: judge/models/problem.py:159
msgid "manually managed"
msgstr ""
-#: judge/models/problem.py:146
+#: judge/models/problem.py:160
msgid "Whether judges should be allowed to manage data or not."
msgstr ""
-#: judge/models/problem.py:147
+#: judge/models/problem.py:161
msgid "date of publishing"
msgstr ""
-#: judge/models/problem.py:148
+#: judge/models/problem.py:162
msgid "Doesn't have magic ability to auto-publish due to backward compatibility"
msgstr ""
-#: judge/models/problem.py:150
+#: judge/models/problem.py:164
msgid "Bans the selected users from submitting to this problem."
msgstr ""
-#: judge/models/problem.py:152
+#: judge/models/problem.py:166
msgid "The license under which this problem is published."
msgstr ""
-#: judge/models/problem.py:154
+#: judge/models/problem.py:168
msgid "problem summary"
msgstr ""
-#: judge/models/problem.py:156
+#: judge/models/problem.py:170
msgid "number of users"
msgstr ""
-#: judge/models/problem.py:157
+#: judge/models/problem.py:171
msgid "The number of users who solved the problem."
msgstr ""
-#: judge/models/problem.py:158
+#: judge/models/problem.py:172
msgid "solve rate"
msgstr ""
-#: judge/models/problem.py:159
+#: judge/models/problem.py:173
msgid "allow full markdown access"
msgstr ""
-#: judge/models/problem.py:165
+#: judge/models/problem.py:174
+msgid "submission source visibility"
+msgstr ""
+
+#: judge/models/problem.py:182
msgid "If private, only these organizations may see the problem."
msgstr ""
-#: judge/models/problem.py:420
+#: judge/models/problem.py:447
msgid "See hidden problems"
msgstr ""
-#: judge/models/problem.py:421
+#: judge/models/problem.py:448
msgid "Edit own problems"
msgstr ""
-#: judge/models/problem.py:422
+#: judge/models/problem.py:449
msgid "Edit all problems"
msgstr ""
-#: judge/models/problem.py:423
+#: judge/models/problem.py:450
msgid "Edit all public problems"
msgstr ""
-#: judge/models/problem.py:424
+#: judge/models/problem.py:451
msgid "Edit problems with full markup"
msgstr ""
-#: judge/models/problem.py:425 templates/problem/problem.html:161
+#: judge/models/problem.py:452 templates/problem/problem.html:161
msgid "Clone problem"
msgstr ""
-#: judge/models/problem.py:426
+#: judge/models/problem.py:453
msgid "Change is_public field"
msgstr ""
-#: judge/models/problem.py:427
+#: judge/models/problem.py:454
msgid "Change is_manually_managed field"
msgstr ""
-#: judge/models/problem.py:428
+#: judge/models/problem.py:455
msgid "See organization-private problems"
msgstr ""
-#: judge/models/problem.py:436 judge/models/problem.py:454
+#: judge/models/problem.py:463 judge/models/problem.py:481
#: judge/models/runtime.py:111
msgid "language"
msgstr ""
-#: judge/models/problem.py:437
+#: judge/models/problem.py:464
msgid "translated name"
msgstr ""
-#: judge/models/problem.py:438
+#: judge/models/problem.py:465
msgid "translated description"
msgstr ""
-#: judge/models/problem.py:442
+#: judge/models/problem.py:469
msgid "problem translation"
msgstr ""
-#: judge/models/problem.py:443
+#: judge/models/problem.py:470
msgid "problem translations"
msgstr ""
-#: judge/models/problem.py:447
+#: judge/models/problem.py:474
msgid "clarified problem"
msgstr ""
-#: judge/models/problem.py:448
+#: judge/models/problem.py:475
msgid "clarification body"
msgstr ""
-#: judge/models/problem.py:449
+#: judge/models/problem.py:476
msgid "clarification timestamp"
msgstr ""
-#: judge/models/problem.py:464
+#: judge/models/problem.py:491
msgid "language-specific resource limit"
msgstr ""
-#: judge/models/problem.py:465
+#: judge/models/problem.py:492
msgid "language-specific resource limits"
msgstr ""
-#: judge/models/problem.py:469
+#: judge/models/problem.py:496
msgid "associated problem"
msgstr ""
-#: judge/models/problem.py:472
+#: judge/models/problem.py:499
msgid "publish date"
msgstr ""
-#: judge/models/problem.py:474
+#: judge/models/problem.py:501
msgid "editorial content"
msgstr ""
-#: judge/models/problem.py:497
+#: judge/models/problem.py:524
msgid "See hidden solutions"
msgstr ""
-#: judge/models/problem.py:499
+#: judge/models/problem.py:526
msgid "solution"
msgstr ""
-#: judge/models/problem.py:500
+#: judge/models/problem.py:527
msgid "solutions"
msgstr ""
@@ -1742,112 +1751,112 @@ msgstr ""
msgid "case is pretest?"
msgstr ""
-#: judge/models/profile.py:38
+#: judge/models/profile.py:41
msgid "organization title"
msgstr ""
-#: judge/models/profile.py:39
+#: judge/models/profile.py:42
msgid "organization slug"
msgstr ""
-#: judge/models/profile.py:40
+#: judge/models/profile.py:43
msgid "Organization name shown in URL"
msgstr ""
-#: judge/models/profile.py:42
+#: judge/models/profile.py:45
msgid "Displayed beside user name during contests"
msgstr ""
-#: judge/models/profile.py:43
+#: judge/models/profile.py:46
msgid "organization description"
msgstr ""
-#: judge/models/profile.py:44
+#: judge/models/profile.py:47
msgid "administrators"
msgstr ""
-#: judge/models/profile.py:45
+#: judge/models/profile.py:48
msgid "Those who can edit this organization"
msgstr ""
-#: judge/models/profile.py:46
+#: judge/models/profile.py:49
msgid "creation date"
msgstr ""
-#: judge/models/profile.py:47
+#: judge/models/profile.py:50
msgid "is open organization?"
msgstr ""
-#: judge/models/profile.py:48
+#: judge/models/profile.py:51
msgid "Allow joining organization"
msgstr ""
-#: judge/models/profile.py:49
+#: judge/models/profile.py:52
msgid "maximum size"
msgstr ""
-#: judge/models/profile.py:50
+#: judge/models/profile.py:53
msgid "Maximum amount of users in this organization, only applicable to private organizations"
msgstr ""
-#: judge/models/profile.py:52
+#: judge/models/profile.py:55
msgid "Student access code"
msgstr ""
-#: judge/models/profile.py:56
+#: judge/models/profile.py:59
msgid "This image will replace the default site logo for users viewing the organization."
msgstr ""
-#: judge/models/profile.py:79
+#: judge/models/profile.py:82
msgid "Administer organizations"
msgstr ""
-#: judge/models/profile.py:80
+#: judge/models/profile.py:83
msgid "Edit all organizations"
msgstr ""
-#: judge/models/profile.py:82 judge/models/profile.py:99
-#: judge/models/profile.py:269
+#: judge/models/profile.py:85 judge/models/profile.py:102
+#: judge/models/profile.py:293
msgid "organization"
msgstr ""
-#: judge/models/profile.py:87
+#: judge/models/profile.py:90
msgid "user associated"
msgstr ""
-#: judge/models/profile.py:88
+#: judge/models/profile.py:91
msgid "self-description"
msgstr ""
-#: judge/models/profile.py:89
+#: judge/models/profile.py:92
msgid "location"
msgstr ""
-#: judge/models/profile.py:91
+#: judge/models/profile.py:94
msgid "preferred language"
msgstr ""
-#: judge/models/profile.py:97
+#: judge/models/profile.py:100
msgid "last access time"
msgstr ""
-#: judge/models/profile.py:98
+#: judge/models/profile.py:101
msgid "last IP"
msgstr ""
-#: judge/models/profile.py:101
+#: judge/models/profile.py:104
msgid "display rank"
msgstr ""
-#: judge/models/profile.py:103
+#: judge/models/profile.py:106
msgid "Normal User"
msgstr ""
-#: judge/models/profile.py:104
+#: judge/models/profile.py:107
msgid "Problem Setter"
msgstr ""
-#: judge/models/profile.py:105 templates/base.html:220
+#: judge/models/profile.py:108 templates/base.html:220
#: templates/comments/list.html:99 templates/contest/contest-list-tabs.html:24
#: templates/contest/ranking-table.html:49
#: templates/problem/problem-list-tabs.html:6
@@ -1856,155 +1865,167 @@ msgstr ""
msgid "Admin"
msgstr ""
-#: judge/models/profile.py:106
+#: judge/models/profile.py:109
msgid "comment mute"
msgstr ""
-#: judge/models/profile.py:106
+#: judge/models/profile.py:109
msgid "Some users are at their best when silent."
msgstr ""
-#: judge/models/profile.py:108
+#: judge/models/profile.py:111
msgid "unlisted user"
msgstr ""
-#: judge/models/profile.py:108
+#: judge/models/profile.py:111
msgid "User will not be ranked."
msgstr ""
-#: judge/models/profile.py:111
+#: judge/models/profile.py:114
msgid "user script"
msgstr ""
-#: judge/models/profile.py:112
+#: judge/models/profile.py:115
msgid "User-defined JavaScript for site customization."
msgstr ""
-#: judge/models/profile.py:113
+#: judge/models/profile.py:116
msgid "current contest"
msgstr ""
-#: judge/models/profile.py:115
+#: judge/models/profile.py:118
msgid "math engine"
msgstr ""
-#: judge/models/profile.py:117
+#: judge/models/profile.py:120
msgid "the rendering engine used to render math"
msgstr ""
-#: judge/models/profile.py:118
+#: judge/models/profile.py:121
msgid "TOTP 2FA enabled"
msgstr ""
-#: judge/models/profile.py:119
+#: judge/models/profile.py:122
msgid "check to enable TOTP-based two-factor authentication"
msgstr ""
-#: judge/models/profile.py:120
+#: judge/models/profile.py:123
msgid "WebAuthn 2FA enabled"
msgstr ""
-#: judge/models/profile.py:121
+#: judge/models/profile.py:124
msgid "check to enable WebAuthn-based two-factor authentication"
msgstr ""
-#: judge/models/profile.py:122
+#: judge/models/profile.py:125
msgid "TOTP key"
msgstr ""
-#: judge/models/profile.py:123
+#: judge/models/profile.py:126
msgid "32 character base32-encoded key for TOTP"
msgstr ""
-#: judge/models/profile.py:125
+#: judge/models/profile.py:128
msgid "TOTP key must be empty or base32"
msgstr ""
-#: judge/models/profile.py:126
+#: judge/models/profile.py:129
msgid "scratch codes"
msgstr ""
-#: judge/models/profile.py:127
+#: judge/models/profile.py:130
msgid "JSON array of 16 character base32-encoded codes for scratch codes"
msgstr ""
-#: judge/models/profile.py:131
+#: judge/models/profile.py:134
msgid "Scratch codes must be empty or a JSON array of 16-character base32 codes"
msgstr ""
-#: judge/models/profile.py:133
+#: judge/models/profile.py:136
+msgid "last TOTP timecode"
+msgstr ""
+
+#: judge/models/profile.py:137
msgid "API token"
msgstr ""
-#: judge/models/profile.py:134
+#: judge/models/profile.py:138
msgid "64 character hex-encoded API access token"
msgstr ""
-#: judge/models/profile.py:136
+#: judge/models/profile.py:140
msgid "API token must be None or hexadecimal"
msgstr ""
-#: judge/models/profile.py:137
+#: judge/models/profile.py:141
msgid "internal notes"
msgstr ""
-#: judge/models/profile.py:138
+#: judge/models/profile.py:142
msgid "Notes for administrators regarding this user."
msgstr ""
-#: judge/models/profile.py:139
+#: judge/models/profile.py:143
msgid "last data download time"
msgstr ""
-#: judge/models/profile.py:236
+#: judge/models/profile.py:253
msgid "Shows in-progress development stuff"
msgstr ""
-#: judge/models/profile.py:237
+#: judge/models/profile.py:254
msgid "Edit TOTP settings"
msgstr ""
-#: judge/models/profile.py:239
+#: judge/models/profile.py:256
msgid "user profile"
msgstr ""
-#: judge/models/profile.py:240
+#: judge/models/profile.py:257
msgid "user profiles"
msgstr ""
-#: judge/models/profile.py:246
+#: judge/models/profile.py:263
msgid "device name"
msgstr ""
-#: judge/models/profile.py:247
+#: judge/models/profile.py:264
msgid "credential ID"
msgstr ""
-#: judge/models/profile.py:248
+#: judge/models/profile.py:265
msgid "public key"
msgstr ""
-#: judge/models/profile.py:249
+#: judge/models/profile.py:266
msgid "sign counter"
msgstr ""
-#: judge/models/profile.py:271
+#: judge/models/profile.py:287
+msgid "WebAuthn credential"
+msgstr ""
+
+#: judge/models/profile.py:288
+msgid "WebAuthn credentials"
+msgstr ""
+
+#: judge/models/profile.py:295
msgid "request time"
msgstr ""
-#: judge/models/profile.py:272
+#: judge/models/profile.py:296
msgid "state"
msgstr ""
-#: judge/models/profile.py:277
+#: judge/models/profile.py:301
msgid "reason"
msgstr ""
-#: judge/models/profile.py:280
+#: judge/models/profile.py:304
msgid "organization join request"
msgstr ""
-#: judge/models/profile.py:281
+#: judge/models/profile.py:305
msgid "organization join requests"
msgstr ""
@@ -2160,210 +2181,210 @@ msgstr ""
msgid "judge"
msgstr ""
-#: judge/models/submission.py:20 judge/models/submission.py:47
+#: judge/models/submission.py:21 judge/models/submission.py:48
#: judge/utils/problems.py:74
msgid "Accepted"
msgstr ""
-#: judge/models/submission.py:21 judge/models/submission.py:48
+#: judge/models/submission.py:22 judge/models/submission.py:49
msgid "Wrong Answer"
msgstr ""
-#: judge/models/submission.py:22 judge/models/submission.py:50
+#: judge/models/submission.py:23 judge/models/submission.py:51
msgid "Time Limit Exceeded"
msgstr ""
-#: judge/models/submission.py:23 judge/models/submission.py:51
+#: judge/models/submission.py:24 judge/models/submission.py:52
msgid "Memory Limit Exceeded"
msgstr ""
-#: judge/models/submission.py:24 judge/models/submission.py:52
+#: judge/models/submission.py:25 judge/models/submission.py:53
msgid "Output Limit Exceeded"
msgstr ""
-#: judge/models/submission.py:25 judge/models/submission.py:53
+#: judge/models/submission.py:26 judge/models/submission.py:54
msgid "Invalid Return"
msgstr ""
-#: judge/models/submission.py:26 judge/models/submission.py:54
+#: judge/models/submission.py:27 judge/models/submission.py:55
msgid "Runtime Error"
msgstr ""
-#: judge/models/submission.py:27 judge/models/submission.py:41
-#: judge/models/submission.py:55 judge/utils/problems.py:76
+#: judge/models/submission.py:28 judge/models/submission.py:42
+#: judge/models/submission.py:56 judge/utils/problems.py:76
msgid "Compile Error"
msgstr ""
-#: judge/models/submission.py:28 judge/models/submission.py:40
+#: judge/models/submission.py:29 judge/models/submission.py:41
msgid "Internal Error"
msgstr ""
-#: judge/models/submission.py:29
+#: judge/models/submission.py:30
msgid "Short circuit"
msgstr ""
-#: judge/models/submission.py:30 judge/models/submission.py:42
-#: judge/models/submission.py:61
+#: judge/models/submission.py:31 judge/models/submission.py:43
+#: judge/models/submission.py:62
msgid "Aborted"
msgstr ""
-#: judge/models/submission.py:36 judge/models/submission.py:57
+#: judge/models/submission.py:37 judge/models/submission.py:58
msgid "Queued"
msgstr ""
-#: judge/models/submission.py:37 judge/models/submission.py:58
+#: judge/models/submission.py:38 judge/models/submission.py:59
msgid "Processing"
msgstr ""
-#: judge/models/submission.py:38 judge/models/submission.py:59
+#: judge/models/submission.py:39 judge/models/submission.py:60
msgid "Grading"
msgstr ""
-#: judge/models/submission.py:39 judge/models/submission.py:60
+#: judge/models/submission.py:40 judge/models/submission.py:61
msgid "Completed"
msgstr ""
-#: judge/models/submission.py:56
+#: judge/models/submission.py:57
msgid "Internal Error (judging server error)"
msgstr ""
-#: judge/models/submission.py:66
+#: judge/models/submission.py:67
msgid "submission time"
msgstr ""
-#: judge/models/submission.py:67 judge/models/submission.py:227
+#: judge/models/submission.py:68 judge/models/submission.py:238
msgid "execution time"
msgstr ""
-#: judge/models/submission.py:68 judge/models/submission.py:228
+#: judge/models/submission.py:69 judge/models/submission.py:239
msgid "memory usage"
msgstr ""
-#: judge/models/submission.py:69 judge/models/submission.py:229
+#: judge/models/submission.py:70 judge/models/submission.py:240
msgid "points granted"
msgstr ""
-#: judge/models/submission.py:70
+#: judge/models/submission.py:71
msgid "submission language"
msgstr ""
-#: judge/models/submission.py:71
+#: judge/models/submission.py:72
msgid "status"
msgstr ""
-#: judge/models/submission.py:72
+#: judge/models/submission.py:73
msgid "result"
msgstr ""
-#: judge/models/submission.py:74
+#: judge/models/submission.py:75
msgid "compile errors"
msgstr ""
-#: judge/models/submission.py:76
+#: judge/models/submission.py:77
msgid "batched cases"
msgstr ""
-#: judge/models/submission.py:77
+#: judge/models/submission.py:78
msgid "test case points"
msgstr ""
-#: judge/models/submission.py:78
+#: judge/models/submission.py:79
msgid "test case total points"
msgstr ""
-#: judge/models/submission.py:79
+#: judge/models/submission.py:80
msgid "judged on"
msgstr ""
-#: judge/models/submission.py:81
+#: judge/models/submission.py:82
msgid "submission judge time"
msgstr ""
-#: judge/models/submission.py:82
-msgid "was rejudged by admin"
+#: judge/models/submission.py:83
+msgid "last rejudge date by admin"
msgstr ""
-#: judge/models/submission.py:83
+#: judge/models/submission.py:84
msgid "was ran on pretests only"
msgstr ""
-#: judge/models/submission.py:86
-msgid "lock submission"
+#: judge/models/submission.py:87
+msgid "submission lock"
msgstr ""
-#: judge/models/submission.py:199
+#: judge/models/submission.py:210
msgid "Abort any submission"
msgstr ""
-#: judge/models/submission.py:200
+#: judge/models/submission.py:211
msgid "Rejudge the submission"
msgstr ""
-#: judge/models/submission.py:201
+#: judge/models/submission.py:212
msgid "Rejudge a lot of submissions"
msgstr ""
-#: judge/models/submission.py:202
+#: judge/models/submission.py:213
msgid "Submit without limit"
msgstr ""
-#: judge/models/submission.py:203
+#: judge/models/submission.py:214
msgid "View all submission"
msgstr ""
-#: judge/models/submission.py:204
+#: judge/models/submission.py:215
msgid "Resubmit others' submission"
msgstr ""
-#: judge/models/submission.py:205
+#: judge/models/submission.py:216
msgid "Change lock status of submission"
msgstr ""
-#: judge/models/submission.py:208 templates/contest/moss.html:58
+#: judge/models/submission.py:219 templates/contest/moss.html:58
msgid "submissions"
msgstr ""
-#: judge/models/submission.py:212 judge/models/submission.py:223
+#: judge/models/submission.py:223 judge/models/submission.py:234
msgid "associated submission"
msgstr ""
-#: judge/models/submission.py:214
+#: judge/models/submission.py:225
msgid "source code"
msgstr ""
-#: judge/models/submission.py:225
+#: judge/models/submission.py:236
msgid "test case ID"
msgstr ""
-#: judge/models/submission.py:226
+#: judge/models/submission.py:237
msgid "status flag"
msgstr ""
-#: judge/models/submission.py:230
+#: judge/models/submission.py:241
msgid "points possible"
msgstr ""
-#: judge/models/submission.py:231
+#: judge/models/submission.py:242
msgid "batch number"
msgstr ""
-#: judge/models/submission.py:232
+#: judge/models/submission.py:243
msgid "judging feedback"
msgstr ""
-#: judge/models/submission.py:233
+#: judge/models/submission.py:244
msgid "extended judging feedback"
msgstr ""
-#: judge/models/submission.py:234
+#: judge/models/submission.py:245
msgid "program output"
msgstr ""
-#: judge/models/submission.py:242
+#: judge/models/submission.py:253
msgid "submission test case"
msgstr ""
-#: judge/models/submission.py:243
+#: judge/models/submission.py:254
msgid "submission test cases"
msgstr ""
@@ -2411,6 +2432,10 @@ msgstr ""
msgid "poster"
msgstr ""
+#: judge/models/ticket.py:30
+msgid "message body"
+msgstr ""
+
#: judge/models/ticket.py:31
msgid "message time"
msgstr ""
@@ -2433,19 +2458,23 @@ msgstr ""
msgid "Running MOSS"
msgstr ""
-#: judge/tasks/submission.py:43
+#: judge/tasks/submission.py:45
msgid "Modifying submissions"
msgstr ""
-#: judge/tasks/submission.py:56
+#: judge/tasks/submission.py:58
msgid "Recalculating user points"
msgstr ""
-#: judge/tasks/user.py:50
+#: judge/tasks/user.py:49
+msgid "Applying filters"
+msgstr ""
+
+#: judge/tasks/user.py:64
msgid "Preparing your submission data"
msgstr ""
-#: judge/tasks/user.py:81
+#: judge/tasks/user.py:95
msgid "Preparing your comment data"
msgstr ""
@@ -2570,7 +2599,7 @@ msgstr ""
msgid "You already voted."
msgstr ""
-#: judge/views/comment.py:129 judge/views/organization.py:298
+#: judge/views/comment.py:129 judge/views/organization.py:297
msgid "Edited from site"
msgstr ""
@@ -2578,125 +2607,130 @@ msgstr ""
msgid "Editing comment"
msgstr ""
-#: judge/views/contests.py:56 judge/views/contests.py:201
-#: judge/views/contests.py:204 judge/views/contests.py:382
+#: judge/views/contests.py:57 judge/views/contests.py:210
+#: judge/views/contests.py:213 judge/views/contests.py:395
msgid "No such contest"
msgstr ""
-#: judge/views/contests.py:57 judge/views/contests.py:202
+#: judge/views/contests.py:58 judge/views/contests.py:211
#, python-format
msgid "Could not find a contest with the key \"%s\"."
msgstr ""
-#: judge/views/contests.py:70
+#: judge/views/contests.py:71
msgid "Contests"
msgstr ""
-#: judge/views/contests.py:205
+#: judge/views/contests.py:214
msgid "Could not find such contest."
msgstr ""
-#: judge/views/contests.py:208
+#: judge/views/contests.py:217
#, python-format
msgid "Access to contest \"%s\" denied"
msgstr ""
-#: judge/views/contests.py:235
+#: judge/views/contests.py:244
msgid "Clone Contest"
msgstr ""
-#: judge/views/contests.py:301
+#: judge/views/contests.py:278
+#, python-format
+msgid "Cloned contest from %s"
+msgstr ""
+
+#: judge/views/contests.py:314
msgid "Contest not ongoing"
msgstr ""
-#: judge/views/contests.py:302
+#: judge/views/contests.py:315
#, python-format
msgid "\"%s\" is not currently ongoing."
msgstr ""
-#: judge/views/contests.py:306
+#: judge/views/contests.py:319
msgid "Already in contest"
msgstr ""
-#: judge/views/contests.py:307
+#: judge/views/contests.py:320
#, python-format
msgid "You are already in a contest: \"%s\"."
msgstr ""
-#: judge/views/contests.py:310
+#: judge/views/contests.py:323
msgid "Banned from joining"
msgstr ""
-#: judge/views/contests.py:311
+#: judge/views/contests.py:324
msgid "You have been declared persona non grata for this contest. You are permanently barred from joining this contest."
msgstr ""
-#: judge/views/contests.py:372
+#: judge/views/contests.py:385
#, python-format
msgid "Enter access code for \"%s\""
msgstr ""
-#: judge/views/contests.py:383
+#: judge/views/contests.py:396
#, python-format
msgid "You are not in contest \"%s\"."
msgstr ""
-#: judge/views/contests.py:402
+#: judge/views/contests.py:415
msgid "ContestCalendar requires integer year and month"
msgstr ""
-#: judge/views/contests.py:442
+#: judge/views/contests.py:455
#, python-format
msgid "Contests in %(month)s"
msgstr ""
-#: judge/views/contests.py:442
+#: judge/views/contests.py:455
msgid "F Y"
msgstr ""
-#: judge/views/contests.py:489
+#: judge/views/contests.py:502
#, python-format
msgid "%s Statistics"
msgstr ""
-#: judge/views/contests.py:662
+#: judge/views/contests.py:675
#, python-format
msgid "%s Rankings"
msgstr ""
-#: judge/views/contests.py:670
+#: judge/views/contests.py:683
msgid "???"
msgstr ""
-#: judge/views/contests.py:686
+#: judge/views/contests.py:699
#, python-format
msgid "Your participation in %s"
msgstr ""
-#: judge/views/contests.py:687
+#: judge/views/contests.py:700
#, python-format
msgid "%s's participation in %s"
msgstr ""
-#: judge/views/contests.py:694
+#: judge/views/contests.py:707
msgid "Live"
msgstr ""
-#: judge/views/contests.py:706 templates/contest/contest-tabs.html:13
+#: judge/views/contests.py:719 templates/contest/contest-tabs.html:13
msgid "Participation"
msgstr ""
-#: judge/views/contests.py:750
+#: judge/views/contests.py:763
#, python-format
msgid "%s MOSS Results"
msgstr ""
-#: judge/views/contests.py:777
+#: judge/views/contests.py:790
#, python-format
msgid "Running MOSS for %s..."
msgstr ""
-#: judge/views/contests.py:800
+#: judge/views/contests.py:813
#, python-format
msgid "Contest tag: %s"
msgstr ""
@@ -2725,71 +2759,71 @@ msgstr ""
msgid "Runtimes"
msgstr ""
-#: judge/views/organization.py:44 judge/views/organization.py:47
+#: judge/views/organization.py:43 judge/views/organization.py:46
msgid "No such organization"
msgstr ""
-#: judge/views/organization.py:45
+#: judge/views/organization.py:44
#, python-format
msgid "Could not find an organization with the key \"%s\"."
msgstr ""
-#: judge/views/organization.py:48
+#: judge/views/organization.py:47
msgid "Could not find such organization."
msgstr ""
-#: judge/views/organization.py:72 judge/views/register.py:34
+#: judge/views/organization.py:71 judge/views/register.py:33
#: templates/organization/list.html:15 templates/user/user-list-tabs.html:5
msgid "Organizations"
msgstr ""
-#: judge/views/organization.py:93
+#: judge/views/organization.py:92
#, python-format
msgid "%s Members"
msgstr ""
-#: judge/views/organization.py:118 judge/views/organization.py:121
-#: judge/views/organization.py:126
+#: judge/views/organization.py:117 judge/views/organization.py:120
+#: judge/views/organization.py:125
msgid "Joining organization"
msgstr ""
-#: judge/views/organization.py:118
+#: judge/views/organization.py:117
msgid "You are already in the organization."
msgstr ""
-#: judge/views/organization.py:121
+#: judge/views/organization.py:120
msgid "This organization is not open."
msgstr ""
-#: judge/views/organization.py:138
+#: judge/views/organization.py:137
msgid "Leaving organization"
msgstr ""
-#: judge/views/organization.py:138
+#: judge/views/organization.py:137
#, python-format
msgid "You are not in \"%s\"."
msgstr ""
-#: judge/views/organization.py:162
+#: judge/views/organization.py:161
#, python-format
msgid "Request to join %s"
msgstr ""
-#: judge/views/organization.py:180
+#: judge/views/organization.py:179
msgid "Join request detail"
msgstr ""
-#: judge/views/organization.py:208
+#: judge/views/organization.py:207
#, python-format
msgid "Managing join requests for %s"
msgstr ""
-#: judge/views/organization.py:239
+#: judge/views/organization.py:238
#, python-format
msgid "Your organization can only receive %d more members. You cannot approve %d users."
msgstr ""
-#: judge/views/organization.py:251
+#: judge/views/organization.py:250
#, python-format
msgid "Approved %d user."
msgid_plural "Approved %d users."
@@ -2800,7 +2834,7 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-#: judge/views/organization.py:252
+#: judge/views/organization.py:251
#, python-format
msgid "Rejected %d user."
msgid_plural "Rejected %d users."
@@ -2811,85 +2845,99 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-#: judge/views/organization.py:282
+#: judge/views/organization.py:281
#, python-format
msgid "Editing %s"
msgstr ""
-#: judge/views/organization.py:306 judge/views/organization.py:314
+#: judge/views/organization.py:305 judge/views/organization.py:313
msgid "Can't edit organization"
msgstr ""
-#: judge/views/organization.py:307
+#: judge/views/organization.py:306
msgid "You are not allowed to edit this organization."
msgstr ""
-#: judge/views/organization.py:315
+#: judge/views/organization.py:314
msgid "You are not allowed to kick people from this organization."
msgstr ""
-#: judge/views/organization.py:320 judge/views/organization.py:324
+#: judge/views/organization.py:319 judge/views/organization.py:323
msgid "Can't kick user"
msgstr ""
-#: judge/views/organization.py:321
+#: judge/views/organization.py:320
msgid "The user you are trying to kick does not exist!"
msgstr ""
-#: judge/views/organization.py:325
+#: judge/views/organization.py:324
#, python-format
msgid "The user you are trying to kick is not in organization: %s."
msgstr ""
-#: judge/views/problem.py:67
+#: judge/views/problem.py:68
msgid "No such problem"
msgstr ""
-#: judge/views/problem.py:68
+#: judge/views/problem.py:69
#, python-format
msgid "Could not find a problem with the code \"%s\"."
msgstr ""
-#: judge/views/problem.py:110
+#: judge/views/problem.py:111
#, python-brace-format
msgid "Editorial for {0}"
msgstr ""
-#: judge/views/problem.py:113
+#: judge/views/problem.py:114
#, python-brace-format
msgid "Editorial for {0}"
msgstr ""
-#: judge/views/problem.py:283 templates/contest/contest.html:79
+#: judge/views/problem.py:133
+msgid "No such editorial"
+msgstr ""
+
+#: judge/views/problem.py:134
+#, python-format
+msgid "Could not find an editorial with the code \"%s\"."
+msgstr ""
+
+#: judge/views/problem.py:289 templates/contest/contest.html:79
#: templates/user/user-tabs.html:5 templates/user/users-table.html:23
msgid "Problems"
msgstr ""
-#: judge/views/problem.py:556 judge/views/problem.py:564
+#: judge/views/problem.py:562 judge/views/problem.py:570
#, python-format
msgid "Submit to %s"
msgstr ""
-#: judge/views/problem.py:613
+#: judge/views/problem.py:619
msgid "Banned from submitting"
msgstr ""
-#: judge/views/problem.py:614
+#: judge/views/problem.py:620
msgid "You have been declared persona non grata for this problem. You are permanently barred from submitting this problem."
msgstr ""
-#: judge/views/problem.py:618
+#: judge/views/problem.py:624
msgid "Too many submissions"
msgstr ""
-#: judge/views/problem.py:619
+#: judge/views/problem.py:625
msgid "You have exceeded the submission limit for this problem."
msgstr ""
-#: judge/views/problem.py:681
+#: judge/views/problem.py:693
msgid "Clone Problem"
msgstr ""
+#: judge/views/problem.py:720
+#, python-format
+msgid "Cloned problem from %s"
+msgstr ""
+
#: judge/views/problem_data.py:37
msgid "Checker arguments must be a JSON object"
msgstr ""
@@ -2963,52 +3011,52 @@ msgstr ""
msgid "Best solutions for {0}"
msgstr ""
-#: judge/views/ranked_submission.py:80
+#: judge/views/ranked_submission.py:82
#, python-format
msgid "Best solutions for %(problem)s in %(contest)s"
msgstr ""
-#: judge/views/ranked_submission.py:83
+#: judge/views/ranked_submission.py:85
#, python-format
msgid "Best solutions for problem %(number)s in %(contest)s"
msgstr ""
-#: judge/views/ranked_submission.py:89
+#: judge/views/ranked_submission.py:91
#, python-brace-format
msgid "Best solutions for {0} in {2}"
msgstr ""
-#: judge/views/ranked_submission.py:92
+#: judge/views/ranked_submission.py:94
#, python-brace-format
msgid "Best solutions for problem {0} in {1}"
msgstr ""
-#: judge/views/register.py:27
+#: judge/views/register.py:26
msgid "A username must contain letters, numbers, or underscores"
msgstr ""
-#: judge/views/register.py:31
+#: judge/views/register.py:30
msgid "Preferred language"
msgstr ""
-#: judge/views/register.py:38
+#: judge/views/register.py:37
msgid "Subscribe to newsletter?"
msgstr ""
-#: judge/views/register.py:45
+#: judge/views/register.py:44
#, python-format
msgid "The email address \"%s\" is already taken. Only one registration is allowed per address."
msgstr ""
-#: judge/views/register.py:51
+#: judge/views/register.py:50
msgid "Your email provider is not allowed due to history of abuse. Please use a reputable email provider."
msgstr ""
-#: judge/views/register.py:57 judge/views/register.py:95
+#: judge/views/register.py:56 judge/views/register.py:94
msgid "Registration"
msgstr ""
-#: judge/views/register.py:106
+#: judge/views/register.py:105
msgid "Authentication failure"
msgstr ""
@@ -3016,7 +3064,7 @@ msgstr ""
msgid "Language statistics"
msgstr ""
-#: judge/views/status.py:24 templates/submission/list.html:311
+#: judge/views/status.py:24 templates/submission/list.html:310
msgid "Status"
msgstr ""
@@ -3024,74 +3072,74 @@ msgstr ""
msgid "Version matrix"
msgstr ""
-#: judge/views/submission.py:53 judge/views/submission.py:60
+#: judge/views/submission.py:55 judge/views/submission.py:62
#, python-format
msgid "Submission of %(problem)s by %(user)s"
msgstr ""
-#: judge/views/submission.py:203 judge/views/submission.py:204
+#: judge/views/submission.py:205 judge/views/submission.py:206
#: templates/problem/problem.html:127
msgid "All submissions"
msgstr ""
-#: judge/views/submission.py:349
+#: judge/views/submission.py:355
msgid "All my submissions"
msgstr ""
-#: judge/views/submission.py:350
+#: judge/views/submission.py:356
#, python-format
msgid "All submissions by %s"
msgstr ""
-#: judge/views/submission.py:381
+#: judge/views/submission.py:387
#, python-format
msgid "All submissions for %s"
msgstr ""
-#: judge/views/submission.py:400
+#: judge/views/submission.py:410
msgid "Must pass a problem"
msgstr ""
-#: judge/views/submission.py:439
+#: judge/views/submission.py:449
#, python-format
msgid "My submissions for %(problem)s"
msgstr ""
-#: judge/views/submission.py:440
+#: judge/views/submission.py:450
#, python-format
msgid "%(user)s's submissions for %(problem)s"
msgstr ""
-#: judge/views/submission.py:536
+#: judge/views/submission.py:546
msgid "Must pass a contest"
msgstr ""
-#: judge/views/submission.py:544
+#: judge/views/submission.py:554
#, python-format
msgid "My submissions in %(contest)s"
msgstr ""
-#: judge/views/submission.py:545
+#: judge/views/submission.py:555
#, python-format
msgid "%(user)s's submissions in %(contest)s"
msgstr ""
-#: judge/views/submission.py:559
+#: judge/views/submission.py:569
#, python-brace-format
msgid "My submissions in {0}"
msgstr ""
-#: judge/views/submission.py:561
+#: judge/views/submission.py:571
#, python-brace-format
msgid "{0}'s submissions in {2}"
msgstr ""
-#: judge/views/submission.py:585
+#: judge/views/submission.py:597
#, python-brace-format
msgid "{0}'s submissions for {2} in {4}"
msgstr ""
-#: judge/views/submission.py:590
+#: judge/views/submission.py:602
#, python-brace-format
msgid "{0}'s submissions for problem {2} in {3}"
msgstr ""
@@ -3108,40 +3156,40 @@ msgstr ""
msgid "You must solve at least one problem before you can create a ticket."
msgstr ""
-#: judge/views/ticket.py:87 judge/views/ticket.py:90
+#: judge/views/ticket.py:91 judge/views/ticket.py:94
#, python-format
msgid "New ticket for %s"
msgstr ""
-#: judge/views/ticket.py:144
+#: judge/views/ticket.py:148
#, python-format
msgid "%(title)s - Ticket %(id)d"
msgstr ""
-#: judge/views/ticket.py:249
+#: judge/views/ticket.py:253
#, python-format
msgid "Tickets - Page %(number)d of %(total)d"
msgstr ""
-#: judge/views/ticket.py:298
+#: judge/views/ticket.py:302
#, python-format
msgid "New Ticket: %s"
msgstr ""
-#: judge/views/ticket.py:299
+#: judge/views/ticket.py:303
#, python-format
msgid "#%(id)d, assigned to: %(users)s"
msgstr ""
-#: judge/views/ticket.py:301
+#: judge/views/ticket.py:305
msgid ", "
msgstr ""
-#: judge/views/ticket.py:301
+#: judge/views/ticket.py:305
msgid "no one"
msgstr ""
-#: judge/views/ticket.py:321
+#: judge/views/ticket.py:325
#, python-format
msgid "New Ticket Message For: %s"
msgstr ""
@@ -3150,87 +3198,91 @@ msgstr ""
msgid "Enable Two-factor Authentication"
msgstr ""
-#: judge/views/two_factor.py:99
+#: judge/views/two_factor.py:108
+msgid "Refresh Two-factor Authentication"
+msgstr ""
+
+#: judge/views/two_factor.py:116
msgid "Disable Two-factor Authentication"
msgstr ""
-#: judge/views/two_factor.py:148
+#: judge/views/two_factor.py:165
msgid "Invalid WebAuthn response"
msgstr ""
-#: judge/views/two_factor.py:151
+#: judge/views/two_factor.py:168
msgid "Invalid name"
msgstr ""
-#: judge/views/two_factor.py:204
+#: judge/views/two_factor.py:221
msgid "Staff may not disable 2FA"
msgstr ""
-#: judge/views/two_factor.py:216
+#: judge/views/two_factor.py:229
msgid "Perform Two-factor Authentication"
msgstr ""
-#: judge/views/user.py:79
+#: judge/views/user.py:78
msgid "No such user"
msgstr ""
-#: judge/views/user.py:79
+#: judge/views/user.py:78
#, python-format
msgid "No user handle \"%s\"."
msgstr ""
-#: judge/views/user.py:83
+#: judge/views/user.py:82
msgid "My account"
msgstr ""
-#: judge/views/user.py:84
+#: judge/views/user.py:83
#, python-format
msgid "User %s"
msgstr ""
-#: judge/views/user.py:132
+#: judge/views/user.py:131
msgid "Login"
msgstr ""
-#: judge/views/user.py:173
+#: judge/views/user.py:172
msgid "M j, Y, G:i"
msgstr ""
-#: judge/views/user.py:307
+#: judge/views/user.py:306
msgid "Preparing your data..."
msgstr ""
-#: judge/views/user.py:311 templates/user/edit-profile.html:348
+#: judge/views/user.py:310 templates/user/edit-profile.html:352
msgid "Download your data"
msgstr ""
-#: judge/views/user.py:367
+#: judge/views/user.py:366
msgid "Updated on site"
msgstr ""
-#: judge/views/user.py:400 templates/admin/auth/user/change_form.html:14
+#: judge/views/user.py:399 templates/admin/auth/user/change_form.html:14
#: templates/admin/auth/user/change_form.html:17 templates/base.html:222
#: templates/user/user-tabs.html:16
msgid "Edit profile"
msgstr ""
-#: judge/views/user.py:415
+#: judge/views/user.py:414
msgid "Generated API token for user"
msgstr ""
-#: judge/views/user.py:427
+#: judge/views/user.py:426
msgid "Removed API token for user"
msgstr ""
-#: judge/views/user.py:437
+#: judge/views/user.py:436
msgid "Generated scratch codes for user"
msgstr ""
-#: judge/views/user.py:443 templates/user/user-list-tabs.html:4
+#: judge/views/user.py:442 templates/user/user-list-tabs.html:4
msgid "Leaderboard"
msgstr ""
-#: judge/views/user.py:504
+#: judge/views/user.py:503
msgid "You have been successfully logged out."
msgstr ""
@@ -3355,11 +3407,11 @@ msgstr ""
msgid "posted on {time}"
msgstr ""
-#: templates/blog/list.html:130 templates/problem/problem.html:309
+#: templates/blog/list.html:130 templates/problem/problem.html:311
msgid "Clarifications"
msgstr ""
-#: templates/blog/list.html:146 templates/problem/problem.html:320
+#: templates/blog/list.html:146 templates/problem/problem.html:322
msgid "No clarifications have been made at this time."
msgstr ""
@@ -3552,7 +3604,7 @@ msgid "Info"
msgstr ""
#: templates/contest/contest-tabs.html:6 templates/stats/base.html:9
-#: templates/submission/list.html:337
+#: templates/submission/list.html:336
msgid "Statistics"
msgstr ""
@@ -3755,19 +3807,19 @@ msgstr ""
msgid "Disqualify"
msgstr ""
-#: templates/contest/ranking.html:169
+#: templates/contest/ranking.html:173
msgid "Are you sure you want to disqualify this participation?"
msgstr ""
-#: templates/contest/ranking.html:174
+#: templates/contest/ranking.html:178
msgid "Are you sure you want to un-disqualify this participation?"
msgstr ""
-#: templates/contest/ranking.html:246
+#: templates/contest/ranking.html:250
msgid "View user participation"
msgstr ""
-#: templates/contest/ranking.html:250
+#: templates/contest/ranking.html:254
msgid "Show organizations"
msgstr ""
@@ -4042,7 +4094,7 @@ msgstr ""
msgid "Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence."
msgstr ""
-#: templates/problem/editorial.html:27 templates/problem/problem.html:209
+#: templates/problem/editorial.html:27 templates/problem/problem.html:210
msgid "Author:"
msgid_plural "Authors:"
msgstr[0] ""
@@ -4217,7 +4269,7 @@ msgstr ""
msgid "Memory limit:"
msgstr ""
-#: templates/problem/problem.html:224
+#: templates/problem/problem.html:226
msgid "Problem type"
msgid_plural "Problem types"
msgstr[0] ""
@@ -4227,16 +4279,16 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-#: templates/problem/problem.html:237
+#: templates/problem/problem.html:239
msgid "Allowed languages"
msgstr ""
-#: templates/problem/problem.html:245
+#: templates/problem/problem.html:247
#, python-format
msgid "No %(lang)s judge online"
msgstr ""
-#: templates/problem/problem.html:256
+#: templates/problem/problem.html:258
msgid "Judge:"
msgid_plural "Judges:"
msgstr[0] ""
@@ -4246,15 +4298,15 @@ msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
-#: templates/problem/problem.html:273
+#: templates/problem/problem.html:275
msgid "none available"
msgstr ""
-#: templates/problem/problem.html:298
+#: templates/problem/problem.html:300
msgid "Request clarification"
msgstr ""
-#: templates/problem/problem.html:300
+#: templates/problem/problem.html:302
msgid "Report an issue"
msgstr ""
@@ -4299,7 +4351,7 @@ msgstr ""
msgid "Point range"
msgstr ""
-#: templates/problem/search-form.html:63 templates/submission/list.html:329
+#: templates/problem/search-form.html:63 templates/submission/list.html:328
#: templates/ticket/list.html:248
msgid "Go"
msgstr ""
@@ -4350,7 +4402,7 @@ msgid "Invalid username or password."
msgstr ""
#: templates/registration/login.html:53
-#: templates/registration/two_factor_auth.html:86
+#: templates/registration/two_factor_auth.html:92
msgid "Login!"
msgstr ""
@@ -4470,12 +4522,12 @@ msgid "Default language"
msgstr ""
#: templates/registration/registration_form.html:184
-#: templates/user/edit-profile.html:310
+#: templates/user/edit-profile.html:314
msgid "Affiliated organizations"
msgstr ""
#: templates/registration/registration_form.html:190
-#: templates/user/edit-profile.html:324
+#: templates/user/edit-profile.html:328
msgid "Notify me about upcoming contests"
msgstr ""
@@ -4491,57 +4543,93 @@ msgstr ""
msgid "Register!"
msgstr ""
-#: templates/registration/totp_disable.html:38
+#: templates/registration/totp_disable.html:31
msgid "To protect your account, you must first authenticate before you can disable Two Factor Authentication."
msgstr ""
-#: templates/registration/totp_disable.html:45
+#: templates/registration/totp_disable.html:38
msgid "Enter the 6-digit code generated by your app or one of your 16-digit scratch codes:"
msgstr ""
-#: templates/registration/totp_disable.html:48
+#: templates/registration/totp_disable.html:41
msgid "Disable Two Factor Authentication"
msgstr ""
-#: templates/registration/totp_enable.html:75
+#: templates/registration/totp_enable.html:72
msgid "Scan this code with your authenticator app:"
msgstr ""
-#: templates/registration/totp_enable.html:76
+#: templates/registration/totp_enable.html:73
msgid "QR code"
msgstr ""
-#: templates/registration/totp_enable.html:77
+#: templates/registration/totp_enable.html:74
msgid "Or enter this code manually:"
msgstr ""
-#: templates/registration/totp_enable.html:88
+#: templates/registration/totp_enable.html:85
msgid "Enter the 6-digit code generated by your app:"
msgstr ""
-#: templates/registration/totp_enable.html:91
+#: templates/registration/totp_enable.html:90
+msgid "Refresh Two Factor Authentication"
+msgstr ""
+
+#: templates/registration/totp_enable.html:92
msgid "Enable Two Factor Authentication"
msgstr ""
+#: templates/registration/totp_enable.html:98
+msgid "Below is a list of one-time use scratch codes."
+msgstr ""
+
+#: templates/registration/totp_enable.html:99
+msgid "These codes can only be used once and are for emergency use."
+msgstr ""
+
+#: templates/registration/totp_enable.html:100
+msgid "You can use these codes to login to your account or disable two-factor authentication."
+msgstr ""
+
+#: templates/registration/totp_enable.html:101
+msgid "If you ever need more scratch codes, you can regenerate them on the edit profile tab."
+msgstr ""
+
+#: templates/registration/totp_enable.html:102
+msgid "Please write these down and keep them in a secure location."
+msgstr ""
+
+#: templates/registration/totp_enable.html:103
+msgid "These codes will never be shown again after you enable two-factor authentication."
+msgstr ""
+
#: templates/registration/two_factor_auth.html:33
-#: templates/user/edit-profile.html:161
+#: templates/user/edit-profile.html:165
msgid "WebAuthn is not supported by your browser."
msgstr ""
#: templates/registration/two_factor_auth.html:54
-#: templates/user/edit-profile.html:185
+#: templates/user/edit-profile.html:189
msgid "Failed to contact server."
msgstr ""
-#: templates/registration/two_factor_auth.html:77
+#: templates/registration/two_factor_auth.html:79
msgid "Enter the 6-digit code generated by your app or one of your 16-character scratch codes:"
msgstr ""
-#: templates/registration/two_factor_auth.html:83
-msgid "Use security key"
+#: templates/registration/two_factor_auth.html:81
+msgid "Enter one of your 16-character scratch codes:"
msgstr ""
#: templates/registration/two_factor_auth.html:89
+msgid "Use security key"
+msgstr ""
+
+#: templates/registration/two_factor_auth.html:94
+msgid "Use scratch code"
+msgstr ""
+
+#: templates/registration/two_factor_auth.html:97
#, python-format
msgid "If you lost your authentication device and are unable to use your scratch codes, please contact us at %(email)s."
msgstr ""
@@ -4622,15 +4710,15 @@ msgstr ""
msgid "Filter by language..."
msgstr ""
-#: templates/submission/list.html:307
+#: templates/submission/list.html:306
msgid "Filter submissions"
msgstr ""
-#: templates/submission/list.html:343
+#: templates/submission/list.html:342
msgid "Total:"
msgstr ""
-#: templates/submission/list.html:353
+#: templates/submission/list.html:352
msgid "You were disconnected. Refresh to show latest updates."
msgstr ""
@@ -4850,121 +4938,125 @@ msgstr ""
msgid "Search by handle..."
msgstr ""
-#: templates/user/edit-profile.html:109
+#: templates/user/edit-profile.html:113
msgid "Are you sure you want to generate or regenerate your API token?"
msgstr ""
-#: templates/user/edit-profile.html:110
+#: templates/user/edit-profile.html:114
msgid "This will invalidate any previous API tokens."
msgstr ""
-#: templates/user/edit-profile.html:111
+#: templates/user/edit-profile.html:115
msgid "It also allows access to your account without Two-factor Authentication."
msgstr ""
-#: templates/user/edit-profile.html:112
+#: templates/user/edit-profile.html:116
msgid "You will not be able to view your api token after you leave this page!"
msgstr ""
-#: templates/user/edit-profile.html:113 templates/user/edit-profile.html:207
+#: templates/user/edit-profile.html:117 templates/user/edit-profile.html:211
msgid "Generating..."
msgstr ""
-#: templates/user/edit-profile.html:121 templates/user/edit-profile.html:243
-#: templates/user/edit-profile.html:371 templates/user/edit-profile.html:390
+#: templates/user/edit-profile.html:125 templates/user/edit-profile.html:247
+#: templates/user/edit-profile.html:373 templates/user/edit-profile.html:395
msgid "Regenerate"
msgstr ""
-#: templates/user/edit-profile.html:127 templates/user/edit-profile.html:392
+#: templates/user/edit-profile.html:131 templates/user/edit-profile.html:397
msgid "Remove"
msgstr ""
-#: templates/user/edit-profile.html:137
+#: templates/user/edit-profile.html:141
msgid "Are you sure you want to remove your API token?"
msgstr ""
-#: templates/user/edit-profile.html:144 templates/user/edit-profile.html:375
-#: templates/user/edit-profile.html:396
+#: templates/user/edit-profile.html:148 templates/user/edit-profile.html:377
+#: templates/user/edit-profile.html:401
msgid "Generate"
msgstr ""
-#: templates/user/edit-profile.html:190
+#: templates/user/edit-profile.html:194
msgid "Are you sure you want to delete this security key?"
msgstr ""
-#: templates/user/edit-profile.html:280
+#: templates/user/edit-profile.html:284
msgid "Self-description"
msgstr ""
-#: templates/user/edit-profile.html:287
+#: templates/user/edit-profile.html:291
msgid "Select your closest major city"
msgstr ""
-#: templates/user/edit-profile.html:296
+#: templates/user/edit-profile.html:300
msgid "Editor theme"
msgstr ""
-#: templates/user/edit-profile.html:301
+#: templates/user/edit-profile.html:305
msgid "Math engine"
msgstr ""
-#: templates/user/edit-profile.html:335 templates/user/edit-profile.html:337
+#: templates/user/edit-profile.html:339 templates/user/edit-profile.html:341
msgid "Change your avatar"
msgstr ""
-#: templates/user/edit-profile.html:342
+#: templates/user/edit-profile.html:346
msgid "Change your password"
msgstr ""
-#: templates/user/edit-profile.html:356
+#: templates/user/edit-profile.html:359
msgid "Two-factor Authentication is enabled"
msgstr ""
-#: templates/user/edit-profile.html:358
-msgid "Two-factor Authentication is disabled"
+#: templates/user/edit-profile.html:362 templates/user/edit-profile.html:365
+msgid "Disable"
msgstr ""
-#: templates/user/edit-profile.html:363 templates/user/edit-profile.html:365
-msgid "Disable"
+#: templates/user/edit-profile.html:367
+msgid "Refresh"
msgstr ""
-#: templates/user/edit-profile.html:368
+#: templates/user/edit-profile.html:370
msgid "Scratch Codes:"
msgstr ""
-#: templates/user/edit-profile.html:372 templates/user/edit-profile.html:393
+#: templates/user/edit-profile.html:374 templates/user/edit-profile.html:398
msgid "Hidden"
msgstr ""
-#: templates/user/edit-profile.html:381
+#: templates/user/edit-profile.html:384
+msgid "Two-factor Authentication is disabled"
+msgstr ""
+
+#: templates/user/edit-profile.html:385
msgid "Enable"
msgstr ""
-#: templates/user/edit-profile.html:387
+#: templates/user/edit-profile.html:392
msgid "API Token"
msgstr ""
-#: templates/user/edit-profile.html:404
+#: templates/user/edit-profile.html:409
msgid "Security keys"
msgstr ""
-#: templates/user/edit-profile.html:414
+#: templates/user/edit-profile.html:419
msgid "Delete"
msgstr ""
-#: templates/user/edit-profile.html:421
+#: templates/user/edit-profile.html:426
msgid "Enter a name for this key"
msgstr ""
-#: templates/user/edit-profile.html:422
+#: templates/user/edit-profile.html:427
msgid "Add"
msgstr ""
-#: templates/user/edit-profile.html:430
+#: templates/user/edit-profile.html:435
msgid "User-script"
msgstr ""
-#: templates/user/edit-profile.html:434
+#: templates/user/edit-profile.html:439
msgid "Update profile"
msgstr ""
diff --git a/locale/ar/LC_MESSAGES/djangojs.po b/locale/ar/LC_MESSAGES/djangojs.po
index 6925d45a7b..23b14b3b1a 100644
--- a/locale/ar/LC_MESSAGES/djangojs.po
+++ b/locale/ar/LC_MESSAGES/djangojs.po
@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: dmoj\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-10-01 23:12+0000\n"
-"PO-Revision-Date: 2021-04-25 00:08\n"
+"PO-Revision-Date: 2021-07-07 00:27\n"
"Last-Translator: \n"
"Language-Team: Arabic, Saudi Arabia\n"
"Language: ar_SA\n"
diff --git a/locale/ca/LC_MESSAGES/django.po b/locale/ca/LC_MESSAGES/django.po
index 217ca6a981..efad070aae 100644
--- a/locale/ca/LC_MESSAGES/django.po
+++ b/locale/ca/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: dmoj\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-24 19:15+0000\n"
-"PO-Revision-Date: 2021-04-25 00:08\n"
+"POT-Creation-Date: 2021-06-17 01:38+0000\n"
+"PO-Revision-Date: 2021-07-07 00:27\n"
"Last-Translator: \n"
"Language-Team: Catalan\n"
"Language: ca_ES\n"
@@ -17,75 +17,75 @@ msgstr ""
"X-Crowdin-File: django.po\n"
"X-Crowdin-File-ID: 10\n"
-#: dmoj/settings.py:364
+#: dmoj/settings.py:365
msgid "Catalan"
msgstr ""
-#: dmoj/settings.py:365
+#: dmoj/settings.py:366
msgid "German"
msgstr "Alemany"
-#: dmoj/settings.py:366
+#: dmoj/settings.py:367
msgid "English"
msgstr "Anglès"
-#: dmoj/settings.py:367
+#: dmoj/settings.py:368
msgid "Spanish"
msgstr "Castellà"
-#: dmoj/settings.py:368
+#: dmoj/settings.py:369
msgid "French"
msgstr "Francès"
-#: dmoj/settings.py:369
+#: dmoj/settings.py:370
msgid "Croatian"
msgstr "Croat"
-#: dmoj/settings.py:370
+#: dmoj/settings.py:371
msgid "Hungarian"
msgstr "Hongarès"
-#: dmoj/settings.py:371
+#: dmoj/settings.py:372
msgid "Japanese"
msgstr "Japonès"
-#: dmoj/settings.py:372
+#: dmoj/settings.py:373
msgid "Korean"
msgstr "Coreà"
-#: dmoj/settings.py:373
+#: dmoj/settings.py:374
msgid "Brazilian Portuguese"
msgstr "Portuguès (Brasil)"
-#: dmoj/settings.py:374
+#: dmoj/settings.py:375
msgid "Romanian"
msgstr "Romanès"
-#: dmoj/settings.py:375
+#: dmoj/settings.py:376
msgid "Russian"
msgstr "Rus"
-#: dmoj/settings.py:376
+#: dmoj/settings.py:377
msgid "Serbian (Latin)"
msgstr "Serbi (llatí)"
-#: dmoj/settings.py:377
+#: dmoj/settings.py:378
msgid "Turkish"
msgstr "Turc"
-#: dmoj/settings.py:378
+#: dmoj/settings.py:379
msgid "Vietnamese"
msgstr "Vietnamita"
-#: dmoj/settings.py:379
+#: dmoj/settings.py:380
msgid "Simplified Chinese"
msgstr "Xinès simplificat"
-#: dmoj/settings.py:380
+#: dmoj/settings.py:381
msgid "Traditional Chinese"
msgstr "Xinès tradicional"
-#: dmoj/urls.py:103 templates/base.html:190
+#: dmoj/urls.py:104 templates/base.html:190
msgid "Home"
msgstr "Inici"
@@ -115,112 +115,112 @@ msgstr "Deixa d'amagar els comentaris"
msgid "Associated page"
msgstr "Pàgina associada"
-#: judge/admin/contest.py:31
+#: judge/admin/contest.py:32
msgid "Included contests"
msgstr "Concursos inclosos"
-#: judge/admin/contest.py:65 templates/contest/contest.html:83
+#: judge/admin/contest.py:66 templates/contest/contest.html:83
#: templates/contest/moss.html:43 templates/problem/list.html:204
#: templates/problem/list.html:219 templates/user/user-problems.html:58
#: templates/user/user-problems.html:100
msgid "Problem"
msgstr "Problema"
-#: judge/admin/contest.py:114
+#: judge/admin/contest.py:117
msgid "Settings"
msgstr "Ajustaments"
-#: judge/admin/contest.py:116
+#: judge/admin/contest.py:120
msgid "Scheduling"
msgstr "Planificador"
-#: judge/admin/contest.py:117
+#: judge/admin/contest.py:121
msgid "Details"
msgstr "Detalls"
-#: judge/admin/contest.py:118
+#: judge/admin/contest.py:122
msgid "Format"
msgstr "Format"
-#: judge/admin/contest.py:119 templates/contest/ranking-table.html:5
+#: judge/admin/contest.py:123 templates/contest/ranking-table.html:5
msgid "Rating"
msgstr "Puntuació"
-#: judge/admin/contest.py:120
+#: judge/admin/contest.py:124
msgid "Access"
msgstr "Accés"
-#: judge/admin/contest.py:122 judge/admin/problem.py:134
+#: judge/admin/contest.py:126 judge/admin/problem.py:135
msgid "Justice"
msgstr "Justícia"
-#: judge/admin/contest.py:211
+#: judge/admin/contest.py:215
#, python-format
msgid "%d contest successfully marked as visible."
msgid_plural "%d contests successfully marked as visible."
msgstr[0] "Concurs %d marcat com a visible amb èxit"
msgstr[1] "Concursos %d marcats com a visibles amb èxit"
-#: judge/admin/contest.py:214
+#: judge/admin/contest.py:218
msgid "Mark contests as visible"
msgstr "Fer els concursos visibles"
-#: judge/admin/contest.py:220
+#: judge/admin/contest.py:224
#, python-format
msgid "%d contest successfully marked as hidden."
msgid_plural "%d contests successfully marked as hidden."
msgstr[0] "Concurs %d marcat com a ocult amb èxit"
msgstr[1] "Concursos %d marcats com a ocults amb èxit"
-#: judge/admin/contest.py:223
+#: judge/admin/contest.py:227
msgid "Mark contests as hidden"
msgstr "Fer els concursos invisibles"
-#: judge/admin/contest.py:229
+#: judge/admin/contest.py:233
#, python-format
msgid "%d contest successfully locked."
msgid_plural "%d contests successfully locked."
msgstr[0] "Concurs %d bloquejat amb èxit"
msgstr[1] "Concursos %d bloquejats amb èxit"
-#: judge/admin/contest.py:232
+#: judge/admin/contest.py:236
msgid "Lock contest submissions"
msgstr "Bloqueja els envíaments al concurs"
-#: judge/admin/contest.py:238
+#: judge/admin/contest.py:242
#, python-format
msgid "%d contest successfully unlocked."
msgid_plural "%d contests successfully unlocked."
msgstr[0] "Concurs %d desbloquejat amb èxit"
msgstr[1] "Concursos %d desbloquejats amb èxit"
-#: judge/admin/contest.py:241
+#: judge/admin/contest.py:245
msgid "Unlock contest submissions"
msgstr "Desbloqueja els envíaments al concurs"
-#: judge/admin/contest.py:262 judge/admin/submission.py:170
+#: judge/admin/contest.py:266 judge/admin/submission.py:170
#, python-format
msgid "%d submission was successfully scheduled for rejudging."
msgid_plural "%d submissions were successfully scheduled for rejudging."
msgstr[0] "enviament %d s'ha planificat per a ser rejutjat amb èxit."
msgstr[1] "enviaments %d s'han planificat per a ser rejutjats amb èxit."
-#: judge/admin/contest.py:337
+#: judge/admin/contest.py:341
#, python-format
msgid "%d participation recalculated."
msgid_plural "%d participations recalculated."
msgstr[0] "Participació %d recalculada"
msgstr[1] "Participacions %d recalculades"
-#: judge/admin/contest.py:340
+#: judge/admin/contest.py:344
msgid "Recalculate results"
msgstr "Recalcular els resultats"
-#: judge/admin/contest.py:344 judge/admin/organization.py:63
+#: judge/admin/contest.py:348 judge/admin/organization.py:63
msgid "username"
msgstr "nom d'usuari"
-#: judge/admin/contest.py:349 templates/base.html:258
+#: judge/admin/contest.py:353 templates/base.html:258
msgid "virtual"
msgstr "Virtual"
@@ -236,9 +236,9 @@ msgstr "Contingut"
msgid "Summary"
msgstr "Resum"
-#: judge/admin/interface.py:113 judge/models/contest.py:383
-#: judge/models/contest.py:509 judge/models/profile.py:244
-#: judge/models/profile.py:268
+#: judge/admin/interface.py:113 judge/models/contest.py:419
+#: judge/models/contest.py:546 judge/models/profile.py:261
+#: judge/models/profile.py:292
msgid "user"
msgstr "usuari"
@@ -246,8 +246,8 @@ msgstr "usuari"
msgid "object"
msgstr "objecte"
-#: judge/admin/organization.py:32 judge/admin/problem.py:181
-#: judge/admin/profile.py:82
+#: judge/admin/organization.py:32 judge/admin/problem.py:182
+#: judge/admin/profile.py:92
msgid "View on site"
msgstr "Veure-ho al lloc web"
@@ -255,69 +255,69 @@ msgstr "Veure-ho al lloc web"
msgid "Describe the changes you made (optional)"
msgstr "Descriu els canvis que has fet (opcional)"
-#: judge/admin/problem.py:129
+#: judge/admin/problem.py:130
msgid "Social Media"
msgstr "Xarxes Socials"
-#: judge/admin/problem.py:130
+#: judge/admin/problem.py:131
msgid "Taxonomy"
msgstr "Taxonomia"
-#: judge/admin/problem.py:131 templates/contest/contest.html:84
+#: judge/admin/problem.py:132 templates/contest/contest.html:84
#: templates/problem/data.html:385 templates/problem/list.html:209
#: templates/problem/list.html:230 templates/user/base-users-table.html:10
#: templates/user/user-problems.html:60
msgid "Points"
msgstr "Punts"
-#: judge/admin/problem.py:132
+#: judge/admin/problem.py:133
msgid "Limits"
msgstr "Límits"
-#: judge/admin/problem.py:133 judge/admin/submission.py:238
-#: templates/stats/base.html:14 templates/submission/list.html:320
-#: templates/user/edit-profile.html:292
+#: judge/admin/problem.py:134 judge/admin/submission.py:238
+#: templates/stats/base.html:14 templates/submission/list.html:319
+#: templates/user/edit-profile.html:296
msgid "Language"
msgstr "Llenguatge"
-#: judge/admin/problem.py:135
+#: judge/admin/problem.py:136
msgid "History"
msgstr "Historial"
-#: judge/admin/problem.py:178
+#: judge/admin/problem.py:179
msgid "Authors"
msgstr "Autors/es"
-#: judge/admin/problem.py:191
+#: judge/admin/problem.py:192
#, python-format
msgid "%d problem's publish date successfully updated."
msgid_plural "%d problems' publish date successfully updated."
msgstr[0] "La data de publicació del problema %d ha estat actualitzada correctament"
msgstr[1] "La data de publicació dels problemes %d ha estat actualitzada correctament"
-#: judge/admin/problem.py:195
+#: judge/admin/problem.py:196
msgid "Set publish date to now"
msgstr "Posa la data de publicació a ara"
-#: judge/admin/problem.py:201
+#: judge/admin/problem.py:202
#, python-format
msgid "%d problem successfully marked as public."
msgid_plural "%d problems successfully marked as public."
msgstr[0] "problema %d marcat com a públic amb èxit."
msgstr[1] "problemes %d marcats com a públic amb èxit."
-#: judge/admin/problem.py:205
+#: judge/admin/problem.py:206
msgid "Mark problems as public"
msgstr "Marca els problemes com a públics"
-#: judge/admin/problem.py:211
+#: judge/admin/problem.py:212
#, python-format
msgid "%d problem successfully marked as private."
msgid_plural "%d problems successfully marked as private."
msgstr[0] "problema %d marcat com a privat amb èxit."
msgstr[1] "problemes %d marcats com a privats amb èxit."
-#: judge/admin/problem.py:215
+#: judge/admin/problem.py:216
msgid "Mark problems as private"
msgstr "Marca els problemes com a privats"
@@ -325,35 +325,35 @@ msgstr "Marca els problemes com a privats"
msgid "timezone"
msgstr "zona horària"
-#: judge/admin/profile.py:88 judge/admin/submission.py:217
+#: judge/admin/profile.py:98 judge/admin/submission.py:217
#: templates/organization/requests/log.html:9
#: templates/organization/requests/pending.html:12
#: templates/ticket/list.html:261
msgid "User"
msgstr "Usuari"
-#: judge/admin/profile.py:93 templates/registration/registration_form.html:143
+#: judge/admin/profile.py:103 templates/registration/registration_form.html:143
msgid "Email"
msgstr "Correu electrònic"
-#: judge/admin/profile.py:98 judge/views/register.py:29
+#: judge/admin/profile.py:108 judge/views/register.py:28
#: templates/registration/registration_form.html:171
-#: templates/user/edit-profile.html:288
+#: templates/user/edit-profile.html:292
msgid "Timezone"
msgstr "Zona Horària"
-#: judge/admin/profile.py:103
+#: judge/admin/profile.py:113
msgid "date joined"
msgstr "Data quan es va unir"
-#: judge/admin/profile.py:110
+#: judge/admin/profile.py:120
#, python-format
msgid "%d user have scores recalculated."
msgid_plural "%d users have scores recalculated."
msgstr[0] "s'ha recalculat la puntuació de l'usuari %d"
msgstr[1] "s'ha recalculat la puntuació dels usuaris %d"
-#: judge/admin/profile.py:113
+#: judge/admin/profile.py:123
msgid "Recalculate scores"
msgstr "Recalcular els resultats"
@@ -506,115 +506,116 @@ msgstr "IOI"
msgid "IOI (pre-2016)"
msgstr "IOI (abans del 2016)"
-#: judge/forms.py:26
-msgid "Two-factor authentication tokens must be 6 decimal digits."
-msgstr "els tokens de la l'autenticació en dos passos han de ser de 6 dígits decimals"
+#: judge/forms.py:27
+#, python-brace-format
+msgid "Two-factor authentication tokens must be {TOTP_CODE_LENGTH} decimal digits."
+msgstr ""
-#: judge/forms.py:29
+#: judge/forms.py:30
msgid "Invalid two-factor authentication token."
msgstr "token d'autenticació en dos passos invàlid."
-#: judge/forms.py:32
+#: judge/forms.py:33
msgid "Scratch codes must be 16 base32 characters."
msgstr "Els codis Scratch han de ser de 16 caràcters en base32"
-#: judge/forms.py:34
+#: judge/forms.py:35 judge/forms.py:264
msgid "Invalid scratch code."
msgstr "El codi Scratch no és vàlid"
-#: judge/forms.py:45
+#: judge/forms.py:46
msgid "Subscribe to contest updates"
msgstr "Subscriure's als canvis en els concursos"
-#: judge/forms.py:46
+#: judge/forms.py:47
msgid "Enable experimental features"
msgstr "Activa les actualitzacions experimentals"
-#: judge/forms.py:71
+#: judge/forms.py:72
msgid "You must solve at least one problem before you can update your profile."
msgstr ""
-#: judge/forms.py:80 judge/views/organization.py:127
+#: judge/forms.py:81 judge/views/organization.py:126
#, python-brace-format
msgid "You may not be part of more than {count} public organizations."
msgstr "No pots formar part de més de {count} organitzacions públiques"
-#: judge/forms.py:96
+#: judge/forms.py:97
msgid "Download comments?"
msgstr "Baixar-se els comentaris?"
-#: judge/forms.py:97
+#: judge/forms.py:98
msgid "Download submissions?"
msgstr "Descarregar enviaments?"
-#: judge/forms.py:98
+#: judge/forms.py:99
msgid "Filter by problem code glob:"
msgstr "Filtrar per el glob del codi de problema"
-#: judge/forms.py:102
+#: judge/forms.py:103
msgid "Leave empty to include all submissions"
msgstr "Deixar-ho buit per a incluir tots els enviaments"
-#: judge/forms.py:105 templates/problem/manage_submission.html:142
+#: judge/forms.py:106 templates/problem/manage_submission.html:142
msgid "Filter by result:"
msgstr "Filtra per resultats:"
-#: judge/forms.py:111
+#: judge/forms.py:112
msgid "Please select at least one thing to download."
msgstr "Siusplau, seleccioneu com a mínim una cosa a descarregar."
-#: judge/forms.py:137
+#: judge/forms.py:138
msgid "Any judge"
msgstr "Qualsevol jutge"
-#: judge/forms.py:167 judge/views/register.py:26
+#: judge/forms.py:159 judge/views/register.py:25
#: templates/registration/registration_form.html:137
#: templates/user/base-users-table.html:5
msgid "Username"
msgstr "Nom d'usuari"
-#: judge/forms.py:168 templates/registration/registration_form.html:149
+#: judge/forms.py:160 templates/registration/registration_form.html:149
#: templates/registration/registration_form.html:163
msgid "Password"
msgstr "Contrasenya"
-#: judge/forms.py:201
+#: judge/forms.py:192
msgid "Invalid code length."
msgstr "Longitud del codi invàlida"
-#: judge/forms.py:219
+#: judge/forms.py:223
msgid "Invalid WebAuthn response."
msgstr "Resposta WebAuthn invàlida"
-#: judge/forms.py:222
+#: judge/forms.py:226
msgid "No WebAuthn challenge issued."
msgstr "No hi ha hagut resposta WebAuthn"
-#: judge/forms.py:228
+#: judge/forms.py:232
msgid "Invalid WebAuthn credential ID."
msgstr "Credencial WebAuthn invàlida"
-#: judge/forms.py:257
+#: judge/forms.py:262
msgid "Invalid two-factor authentication token or scratch code."
msgstr "token d'autenticació en dos passos invàlid."
-#: judge/forms.py:259
+#: judge/forms.py:266
msgid "Must specify either totp_token or webauthn_response."
msgstr "S'ha d'especificar un totp_token o una webauthn_response."
-#: judge/forms.py:263 judge/models/problem.py:105
+#: judge/forms.py:270 judge/models/problem.py:119
msgid "Problem code must be ^[a-z0-9]+$"
msgstr "El codi del problema ha de ser ^[a-z0-9]+$"
-#: judge/forms.py:268
+#: judge/forms.py:275
msgid "Problem with code already exists."
msgstr "Ja existeix un problema amb aquest codi."
-#: judge/forms.py:273 judge/models/contest.py:66
+#: judge/forms.py:280 judge/models/contest.py:66
msgid "Contest id must be ^[a-z0-9]+$"
msgstr "la id del concurs ha de ser ^[a-z0-9]+$"
-#: judge/forms.py:278
+#: judge/forms.py:285
msgid "Contest with key already exists."
msgstr "Ja existeix un concurs amb aquesta clau."
@@ -694,7 +695,7 @@ msgid "comments"
msgstr "comentaris"
#: judge/models/comment.py:89 judge/models/comment.py:141
-#: judge/models/problem.py:484
+#: judge/models/problem.py:511
#, python-format
msgid "Editorial for %s"
msgstr "Editorial de %s"
@@ -735,7 +736,7 @@ msgstr "Descripció d'etiqueta"
msgid "contest tag"
msgstr "Etiqueta de concurs"
-#: judge/models/contest.py:53 judge/models/contest.py:117
+#: judge/models/contest.py:53 judge/models/contest.py:126
msgid "contest tags"
msgstr "Etiquetes de concurs"
@@ -760,410 +761,426 @@ msgid "contest name"
msgstr "Nom del concurs"
#: judge/models/contest.py:68
-msgid "These people will be able to edit the contest."
-msgstr "Aquestes persones podran editar el concurs"
+msgid "These users will be able to edit the contest."
+msgstr ""
-#: judge/models/contest.py:70 judge/models/runtime.py:136
+#: judge/models/contest.py:70
+msgid "These users will be able to edit the contest, but will not be listed as authors."
+msgstr ""
+
+#: judge/models/contest.py:73
+msgid "These users will be able to view the contest, but not edit it."
+msgstr ""
+
+#: judge/models/contest.py:76 judge/models/runtime.py:136
msgid "description"
msgstr "Descripció"
-#: judge/models/contest.py:71 judge/models/problem.py:431
+#: judge/models/contest.py:77 judge/models/problem.py:458
#: judge/models/runtime.py:138
msgid "problems"
msgstr "Problemes"
-#: judge/models/contest.py:72 judge/models/contest.py:384
+#: judge/models/contest.py:78 judge/models/contest.py:420
msgid "start time"
msgstr "Hora d'inici"
-#: judge/models/contest.py:73
+#: judge/models/contest.py:79
msgid "end time"
msgstr "Hora de finalització"
-#: judge/models/contest.py:74 judge/models/problem.py:126
-#: judge/models/problem.py:455
+#: judge/models/contest.py:80 judge/models/problem.py:140
+#: judge/models/problem.py:482
msgid "time limit"
msgstr "Límit de temps"
-#: judge/models/contest.py:75 judge/models/problem.py:144
+#: judge/models/contest.py:81 judge/models/problem.py:158
msgid "publicly visible"
msgstr "visible públicament"
-#: judge/models/contest.py:76
+#: judge/models/contest.py:82
msgid "Should be set even for organization-private contests, where it determines whether the contest is visible to members of the specified organizations."
msgstr "Ha de posar-se fins i tot per a concursos privats per a organitzacions, ja que determina si el concurs és visible als membres de les organitzacions específiques"
-#: judge/models/contest.py:79
+#: judge/models/contest.py:85
msgid "contest rated"
msgstr "concurs qualificat"
-#: judge/models/contest.py:79
+#: judge/models/contest.py:85
msgid "Whether this contest can be rated."
msgstr "Si aquest concurs es pot qualificar"
-#: judge/models/contest.py:81
+#: judge/models/contest.py:87
msgid "view contest scoreboard"
msgstr "veure la taula de puntuacions del concurs"
-#: judge/models/contest.py:83
+#: judge/models/contest.py:89
msgid "These users will be able to view the scoreboard."
msgstr "Aquests usuaris podran veure la taula de puntuacions"
-#: judge/models/contest.py:84
+#: judge/models/contest.py:90
msgid "scoreboard visibility"
msgstr ""
-#: judge/models/contest.py:85
+#: judge/models/contest.py:91
msgid "Scoreboard visibility through the duration of the contest"
msgstr ""
-#: judge/models/contest.py:87
+#: judge/models/contest.py:93
msgid "no comments"
msgstr "sense comentaris"
-#: judge/models/contest.py:88
+#: judge/models/contest.py:94
msgid "Use clarification system instead of comments."
msgstr "Fes servir un sistema de clarificacions en comptes de comentaris"
-#: judge/models/contest.py:90
+#: judge/models/contest.py:96
msgid "Rating floor for contest"
msgstr "Qualificació mínima per al concurs"
-#: judge/models/contest.py:92
+#: judge/models/contest.py:98
msgid "Rating ceiling for contest"
msgstr "Qualificació màxima per al concurs"
-#: judge/models/contest.py:94
+#: judge/models/contest.py:100
msgid "rate all"
msgstr "qualificar tots"
-#: judge/models/contest.py:94
+#: judge/models/contest.py:100
msgid "Rate all users who joined."
msgstr "Qualificar tots els usuaris que s'han unit"
-#: judge/models/contest.py:95
+#: judge/models/contest.py:101
msgid "exclude from ratings"
msgstr "Exclou de les qualificacions"
-#: judge/models/contest.py:97
+#: judge/models/contest.py:103
msgid "private to specific users"
msgstr "privat per a usuaris específics"
-#: judge/models/contest.py:98
+#: judge/models/contest.py:104
msgid "private contestants"
msgstr "concursants privats"
-#: judge/models/contest.py:99
+#: judge/models/contest.py:105
msgid "If private, only these users may see the contest"
msgstr "Si està en privat, només aquests usuaris podran veure el concurs"
-#: judge/models/contest.py:101
+#: judge/models/contest.py:107
msgid "hide problem tags"
msgstr "amagar etiquets dels problemes"
-#: judge/models/contest.py:102
+#: judge/models/contest.py:108
msgid "Whether problem tags should be hidden by default."
msgstr "Si les etiquetes dels problemes han d'estar amagades per defecte"
-#: judge/models/contest.py:104
+#: judge/models/contest.py:110
+msgid "hide problem authors"
+msgstr ""
+
+#: judge/models/contest.py:111
+msgid "Whether problem authors should be hidden by default."
+msgstr ""
+
+#: judge/models/contest.py:113
msgid "run pretests only"
msgstr "executa només els casos de prova preliminars"
-#: judge/models/contest.py:105
+#: judge/models/contest.py:114
msgid "Whether judges should grade pretests only, versus all testcases. Commonly set during a contest, then unset prior to rejudging user submissions when the contest ends."
msgstr "Si els jutges han de jutjar només els casos de prova preliminars o tots els casos de prova. Generalment es posa en un concurs online, i després es treu per a jutjar tots els enviaments a l'acabament del concurs"
-#: judge/models/contest.py:109 judge/models/problem.py:166
+#: judge/models/contest.py:118 judge/models/problem.py:183
msgid "private to organizations"
msgstr "privat per a organitzacions"
-#: judge/models/contest.py:110 judge/models/problem.py:164
-#: judge/models/profile.py:83
+#: judge/models/contest.py:119 judge/models/problem.py:181
+#: judge/models/profile.py:86
msgid "organizations"
msgstr "Organitzacions"
-#: judge/models/contest.py:111
+#: judge/models/contest.py:120
msgid "If private, only these organizations may see the contest"
msgstr "Si està en privat, només aquestes organitzacions podran veure el concurs"
-#: judge/models/contest.py:112 judge/models/problem.py:153
+#: judge/models/contest.py:121 judge/models/problem.py:167
msgid "OpenGraph image"
msgstr "imatge OpenGraph"
-#: judge/models/contest.py:113 judge/models/profile.py:54
+#: judge/models/contest.py:122 judge/models/profile.py:57
msgid "Logo override image"
msgstr "imatge que sobrescriu el Logo"
-#: judge/models/contest.py:115
+#: judge/models/contest.py:124
msgid "This image will replace the default site logo for users inside the contest."
msgstr "Aquesta imatge reemplaçarà el logo per defecte a tots els usuaris en el concurs"
-#: judge/models/contest.py:118
+#: judge/models/contest.py:127
msgid "the amount of live participants"
msgstr "La quantitat de participans en viu"
-#: judge/models/contest.py:119
+#: judge/models/contest.py:128
msgid "contest summary"
msgstr "Resum del concurs"
-#: judge/models/contest.py:120 judge/models/problem.py:155
+#: judge/models/contest.py:129 judge/models/problem.py:169
msgid "Plain-text, shown in meta description tag, e.g. for social media."
msgstr "Text pla, que surt en l'etiqueta de meta descripció, per exemple per Xarxes Socials"
-#: judge/models/contest.py:121 judge/models/profile.py:53
+#: judge/models/contest.py:130 judge/models/profile.py:56
msgid "access code"
msgstr "Codi d'accés"
-#: judge/models/contest.py:122
+#: judge/models/contest.py:131
msgid "An optional code to prompt contestants before they are allowed to join the contest. Leave it blank to disable."
msgstr "Un codi opcional que se li demana als concursants abans de que se'ls permeti participar. Deixa-ho buit per a desactivar-ho."
-#: judge/models/contest.py:124 judge/models/problem.py:149
+#: judge/models/contest.py:133 judge/models/problem.py:163
msgid "personae non gratae"
msgstr "Persones non grates"
-#: judge/models/contest.py:125
+#: judge/models/contest.py:134
msgid "Bans the selected users from joining this contest."
msgstr "Baneja als usuaris per a unir-se al concurs"
-#: judge/models/contest.py:126
+#: judge/models/contest.py:135
msgid "contest format"
msgstr "Format del concurs"
-#: judge/models/contest.py:127
+#: judge/models/contest.py:136
msgid "The contest format module to use."
msgstr "el Modul de format del concurs que es farà servir"
-#: judge/models/contest.py:128
+#: judge/models/contest.py:137
msgid "contest format configuration"
msgstr "Configuració del format del concurs"
-#: judge/models/contest.py:129
+#: judge/models/contest.py:138
msgid "A JSON object to serve as the configuration for the chosen contest format module. Leave empty to use None. Exact format depends on the contest format selected."
msgstr "Un objecte JSON que es fa servir com la configuració per al mòdul de format del concurs seleccionat. Deixa-ho buit per fer servir None. El format exacte depèn del format del concurs seleccionat."
-#: judge/models/contest.py:136
+#: judge/models/contest.py:145
msgid "contest lock"
msgstr "bloqueig del concurs"
-#: judge/models/contest.py:137
-msgid "Prevent submissions from this contest from being rejudged."
-msgstr "Evita que els enviaments en aquest concurs siguin rejutjats"
+#: judge/models/contest.py:146
+msgid "Prevent submissions from this contest from being rejudged after this date."
+msgstr ""
-#: judge/models/contest.py:138
+#: judge/models/contest.py:148
msgid "precision points"
msgstr ""
-#: judge/models/contest.py:140
+#: judge/models/contest.py:150
msgid "Number of digits to round points to."
msgstr ""
-#: judge/models/contest.py:362
+#: judge/models/contest.py:398
msgid "See private contests"
msgstr "Veure concursos privats"
-#: judge/models/contest.py:363
+#: judge/models/contest.py:399
msgid "Edit own contests"
msgstr "Editar els concursos propis"
-#: judge/models/contest.py:364
+#: judge/models/contest.py:400
msgid "Edit all contests"
msgstr "Editar tots els concursos"
-#: judge/models/contest.py:365
+#: judge/models/contest.py:401
msgid "Clone contest"
msgstr "Clonar concurs"
-#: judge/models/contest.py:366 templates/contest/moss.html:74
+#: judge/models/contest.py:402 templates/contest/moss.html:74
msgid "MOSS contest"
msgstr "Passar el MOSS al concurs"
-#: judge/models/contest.py:367
+#: judge/models/contest.py:403
msgid "Rate contests"
msgstr "Puntuar concursos"
-#: judge/models/contest.py:368
+#: judge/models/contest.py:404
msgid "Contest access codes"
msgstr "Codi d'accès al concurs"
-#: judge/models/contest.py:369
+#: judge/models/contest.py:405
msgid "Create private contests"
msgstr "Crear concursos privats"
-#: judge/models/contest.py:370
+#: judge/models/contest.py:406
msgid "Change contest visibility"
msgstr "Canviar la visibilitat d'un concurs"
-#: judge/models/contest.py:371
+#: judge/models/contest.py:407
msgid "Edit contest problem label script"
msgstr "Editar el script d'etiquetat del problema d'un concurs"
-#: judge/models/contest.py:372
+#: judge/models/contest.py:408
msgid "Change lock status of contest"
msgstr "Canviar el estatus de bloqueig del concurs"
-#: judge/models/contest.py:374 judge/models/contest.py:472
-#: judge/models/contest.py:510 judge/models/contest.py:532
-#: judge/models/submission.py:84
+#: judge/models/contest.py:410 judge/models/contest.py:508
+#: judge/models/contest.py:547 judge/models/contest.py:569
+#: judge/models/submission.py:85
msgid "contest"
msgstr "concurs"
-#: judge/models/contest.py:375
+#: judge/models/contest.py:411
msgid "contests"
msgstr "concursos"
-#: judge/models/contest.py:382
+#: judge/models/contest.py:418
msgid "associated contest"
msgstr "concurs associat"
-#: judge/models/contest.py:385
+#: judge/models/contest.py:421
msgid "score"
msgstr "puntuació"
-#: judge/models/contest.py:386
+#: judge/models/contest.py:422
msgid "cumulative time"
msgstr "temps acumulat"
-#: judge/models/contest.py:387
+#: judge/models/contest.py:423
msgid "is disqualified"
msgstr "està desqualificat"
-#: judge/models/contest.py:388
+#: judge/models/contest.py:424
msgid "Whether this participation is disqualified."
msgstr "Si aquest participant ha estat desqualificat."
-#: judge/models/contest.py:389
+#: judge/models/contest.py:425
msgid "tie-breaking field"
msgstr "camp de desempat"
-#: judge/models/contest.py:390
+#: judge/models/contest.py:426
msgid "virtual participation id"
msgstr "id de participació virtual"
-#: judge/models/contest.py:391
+#: judge/models/contest.py:427
msgid "0 means non-virtual, otherwise the n-th virtual participation."
msgstr "0 significa no virtual. En cas contrari la n-èssima participació virtual"
-#: judge/models/contest.py:392
+#: judge/models/contest.py:428
msgid "contest format specific data"
msgstr "dades específiques del format del concurs"
-#: judge/models/contest.py:458
+#: judge/models/contest.py:494
#, python-format
msgid "%s spectating in %s"
msgstr "%s espectant en %s"
-#: judge/models/contest.py:460
+#: judge/models/contest.py:496
#, python-format
msgid "%s in %s, v%d"
msgstr "%s en %s, v%d"
-#: judge/models/contest.py:461
+#: judge/models/contest.py:497
#, python-format
msgid "%s in %s"
msgstr "%s en %s"
-#: judge/models/contest.py:464
+#: judge/models/contest.py:500
msgid "contest participation"
msgstr "participació al concurs"
-#: judge/models/contest.py:465
+#: judge/models/contest.py:501
msgid "contest participations"
msgstr "participacions al concurs"
-#: judge/models/contest.py:471 judge/models/contest.py:494
-#: judge/models/contest.py:533 judge/models/problem.py:430
-#: judge/models/problem.py:435 judge/models/problem.py:453
+#: judge/models/contest.py:507 judge/models/contest.py:531
+#: judge/models/contest.py:570 judge/models/problem.py:457
+#: judge/models/problem.py:462 judge/models/problem.py:480
#: judge/models/problem_data.py:35
msgid "problem"
msgstr "problema"
-#: judge/models/contest.py:473 judge/models/contest.py:498
-#: judge/models/problem.py:137
+#: judge/models/contest.py:509 judge/models/contest.py:535
+#: judge/models/problem.py:151
msgid "points"
msgstr "punts"
-#: judge/models/contest.py:474
+#: judge/models/contest.py:510
msgid "partial"
msgstr "parcial"
-#: judge/models/contest.py:475 judge/models/contest.py:499
+#: judge/models/contest.py:511 judge/models/contest.py:536
msgid "is pretested"
msgstr "s'han passat els casos de prova preliminars"
-#: judge/models/contest.py:476 judge/models/interface.py:43
+#: judge/models/contest.py:512 judge/models/interface.py:43
msgid "order"
msgstr "ordre"
-#: judge/models/contest.py:477
+#: judge/models/contest.py:513
msgid "output prefix length override"
msgstr "Sobreescriptura de la longitud de prefix de sortida"
-#: judge/models/contest.py:479
+#: judge/models/contest.py:515
msgid "Maximum number of submissions for this problem, or leave blank for no limit."
msgstr "Nombre màxim d'enviaments per a aquest problema, o deixa-ho en blanc per a no posar límit."
-#: judge/models/contest.py:482
+#: judge/models/contest.py:518
msgid "Why include a problem you can't submit to?"
msgstr "Per què incloure un problema al que no pots fer enviaments?"
-#: judge/models/contest.py:487
+#: judge/models/contest.py:523
msgid "contest problem"
msgstr "problema del concurs"
-#: judge/models/contest.py:488
+#: judge/models/contest.py:524
msgid "contest problems"
msgstr "problemes del concurs"
-#: judge/models/contest.py:492 judge/models/submission.py:207
+#: judge/models/contest.py:529 judge/models/submission.py:218
msgid "submission"
msgstr "enviament"
-#: judge/models/contest.py:496 judge/models/contest.py:511
+#: judge/models/contest.py:533 judge/models/contest.py:548
msgid "participation"
msgstr "participació"
-#: judge/models/contest.py:500
+#: judge/models/contest.py:537
msgid "Whether this submission was ran only on pretests."
msgstr "Si aquest enviament ha estat provat només en casos preliminars"
-#: judge/models/contest.py:504
+#: judge/models/contest.py:541
msgid "contest submission"
msgstr "enviament de concurs"
-#: judge/models/contest.py:505
+#: judge/models/contest.py:542
msgid "contest submissions"
msgstr "enviaments de concurs"
-#: judge/models/contest.py:513
+#: judge/models/contest.py:550
msgid "rank"
msgstr "classificació"
-#: judge/models/contest.py:514
+#: judge/models/contest.py:551
msgid "rating"
msgstr "puntuació"
-#: judge/models/contest.py:515
+#: judge/models/contest.py:552
msgid "volatility"
msgstr "volatilitat"
-#: judge/models/contest.py:516
+#: judge/models/contest.py:553
msgid "last rated"
msgstr "última puntuació"
-#: judge/models/contest.py:520
+#: judge/models/contest.py:557
msgid "contest rating"
msgstr "puntuació del concurs"
-#: judge/models/contest.py:521
+#: judge/models/contest.py:558
msgid "contest ratings"
msgstr "puntuacions del concurs"
-#: judge/models/contest.py:540
+#: judge/models/contest.py:577
msgid "contest moss result"
msgstr "resultat del MOSS del concurs"
-#: judge/models/contest.py:541
+#: judge/models/contest.py:578
msgid "contest moss results"
msgstr "resultats del MOSS del concurs"
@@ -1203,7 +1220,7 @@ msgstr "Ítem pare"
msgid "post title"
msgstr "Títol de l'entrada"
-#: judge/models/interface.py:67 judge/models/problem.py:473
+#: judge/models/interface.py:67 judge/models/problem.py:500
msgid "authors"
msgstr "Autors/es"
@@ -1211,7 +1228,7 @@ msgstr "Autors/es"
msgid "slug"
msgstr "Identificador únic"
-#: judge/models/interface.py:69 judge/models/problem.py:471
+#: judge/models/interface.py:69 judge/models/problem.py:498
msgid "public visibility"
msgstr "visibilitat pública"
@@ -1247,34 +1264,6 @@ msgstr "Entrada del Blog"
msgid "blog posts"
msgstr "Entrades del Blog"
-#: judge/models/message.py:11
-msgid "message title"
-msgstr "Títol del missatge"
-
-#: judge/models/message.py:12 judge/models/ticket.py:30
-msgid "message body"
-msgstr "Cos del missatge"
-
-#: judge/models/message.py:13
-msgid "sender"
-msgstr "Remitent"
-
-#: judge/models/message.py:14
-msgid "target"
-msgstr "Objectiu"
-
-#: judge/models/message.py:15
-msgid "message timestamp"
-msgstr "Data i hora del missatge"
-
-#: judge/models/message.py:16
-msgid "read"
-msgstr "Llegeix"
-
-#: judge/models/message.py:20
-msgid "messages in the thread"
-msgstr "missatges en el fil"
-
#: judge/models/problem.py:30
#, python-format
msgid "Disallowed characters: %(value)s"
@@ -1292,7 +1281,7 @@ msgstr "nom de la categoria del problema"
msgid "problem type"
msgstr "tipus del problema"
-#: judge/models/problem.py:44 judge/models/problem.py:121
+#: judge/models/problem.py:44 judge/models/problem.py:135
msgid "problem types"
msgstr "tipus del problema"
@@ -1304,7 +1293,7 @@ msgstr "ID del grup del problema"
msgid "problem group name"
msgstr "nom del grup del problema"
-#: judge/models/problem.py:56 judge/models/problem.py:124
+#: judge/models/problem.py:56 judge/models/problem.py:138
msgid "problem group"
msgstr "grup del problema"
@@ -1324,7 +1313,7 @@ msgstr "Enllaç"
msgid "full name"
msgstr "Nom complet"
-#: judge/models/problem.py:65 judge/models/profile.py:41
+#: judge/models/problem.py:65 judge/models/profile.py:44
#: judge/models/runtime.py:24
msgid "short name"
msgstr "Nom curt"
@@ -1353,232 +1342,252 @@ msgstr "Llicècia"
msgid "licenses"
msgstr "Llicències"
-#: judge/models/problem.py:104
+#: judge/models/problem.py:112
+msgid "Follow global setting"
+msgstr ""
+
+#: judge/models/problem.py:113
+msgid "Always visible"
+msgstr ""
+
+#: judge/models/problem.py:114
+msgid "Visible if problem solved"
+msgstr ""
+
+#: judge/models/problem.py:115
+msgid "Only own submissions"
+msgstr ""
+
+#: judge/models/problem.py:118
msgid "problem code"
msgstr "Codi del problema"
-#: judge/models/problem.py:106
+#: judge/models/problem.py:120
msgid "A short, unique code for the problem, used in the url after /problem/"
msgstr "Un codi únic i curt per al problema, usat en la url després de /problem/"
-#: judge/models/problem.py:108
+#: judge/models/problem.py:122
msgid "problem name"
msgstr "Nom del problema"
-#: judge/models/problem.py:109
+#: judge/models/problem.py:123
msgid "The full name of the problem, as shown in the problem list."
msgstr "El nom complet del problema, tal i com es mostra en la llista de problemes"
-#: judge/models/problem.py:111
+#: judge/models/problem.py:125
msgid "problem body"
msgstr "Cos del problema"
-#: judge/models/problem.py:112
+#: judge/models/problem.py:126
msgid "creators"
msgstr "Creadors/es"
-#: judge/models/problem.py:113
+#: judge/models/problem.py:127
msgid "These users will be able to edit the problem, and be listed as authors."
msgstr "Aquests usuaris seran capaços d'editar el problema i seran mostrats com els seus autors"
-#: judge/models/problem.py:115
+#: judge/models/problem.py:129
msgid "curators"
msgstr "Conservadors/es"
-#: judge/models/problem.py:116
+#: judge/models/problem.py:130
msgid "These users will be able to edit the problem, but not be listed as authors."
msgstr "Aquests usuaris seran capaços d'editar el problema però no seran mostrats com els seus autors"
-#: judge/models/problem.py:118
+#: judge/models/problem.py:132
msgid "testers"
msgstr "Testers"
-#: judge/models/problem.py:120
+#: judge/models/problem.py:134
msgid "These users will be able to view the private problem, but not edit it."
msgstr "Aquests usuaris podran veure el problema privat, però no editar-lo"
-#: judge/models/problem.py:122
+#: judge/models/problem.py:136
msgid "The type of problem, as shown on the problem's page."
msgstr "El tipus del problema, tal i com es mostra en la llista de problemes"
-#: judge/models/problem.py:125
+#: judge/models/problem.py:139
msgid "The group of problem, shown under Category in the problem list."
msgstr "El grup del problema, tal i com es mostra en la llista de problemes com a Categoria"
-#: judge/models/problem.py:127
+#: judge/models/problem.py:141
msgid "The time limit for this problem, in seconds. Fractional seconds (e.g. 1.5) are supported."
msgstr "El temps límit per aquest problema, en segons. Les fraccions (1.5) estan permeses."
-#: judge/models/problem.py:131 judge/models/problem.py:458
+#: judge/models/problem.py:145 judge/models/problem.py:485
msgid "memory limit"
msgstr "Límit de memòria"
-#: judge/models/problem.py:132
+#: judge/models/problem.py:146
msgid "The memory limit for this problem, in kilobytes (e.g. 64mb = 65536 kilobytes)."
msgstr "El límit de memòria per aquest problema, en kilobytes (p.e. 64mb = 65536 kilobytes)."
-#: judge/models/problem.py:138
+#: judge/models/problem.py:152
msgid "Points awarded for problem completion. Points are displayed with a 'p' suffix if partial."
msgstr "Punts otorgats per completar el problema. Els punts es mostren amb un sufix 'p' si son parcials (és a dir, cada cas completat otorga punts tot i que no es completin tots els casos)"
-#: judge/models/problem.py:141
+#: judge/models/problem.py:155
msgid "allows partial points"
msgstr "permetre punts parcials"
-#: judge/models/problem.py:142
+#: judge/models/problem.py:156
msgid "allowed languages"
msgstr "Llenguatges permesos"
-#: judge/models/problem.py:143
+#: judge/models/problem.py:157
msgid "List of allowed submission languages."
msgstr "Llista de llenguatges d'enviament permesos"
-#: judge/models/problem.py:145
+#: judge/models/problem.py:159
msgid "manually managed"
msgstr "operat manualment"
-#: judge/models/problem.py:146
+#: judge/models/problem.py:160
msgid "Whether judges should be allowed to manage data or not."
msgstr "Si els jutges poden modificar les dades manualment o no"
-#: judge/models/problem.py:147
+#: judge/models/problem.py:161
msgid "date of publishing"
msgstr "Data de publicació"
-#: judge/models/problem.py:148
+#: judge/models/problem.py:162
msgid "Doesn't have magic ability to auto-publish due to backward compatibility"
msgstr "No té l'habilitat màgica d'autopublicar per a preservar la compatibilitat amb versions anteriors"
-#: judge/models/problem.py:150
+#: judge/models/problem.py:164
msgid "Bans the selected users from submitting to this problem."
msgstr "Baneja als usuaris seleccionats de fer enviaments per aquest problema"
-#: judge/models/problem.py:152
+#: judge/models/problem.py:166
msgid "The license under which this problem is published."
msgstr "La llicència sota la qual aquest problema ha estat publicat"
-#: judge/models/problem.py:154
+#: judge/models/problem.py:168
msgid "problem summary"
msgstr "Resum del problema"
-#: judge/models/problem.py:156
+#: judge/models/problem.py:170
msgid "number of users"
msgstr "Nombre d'usuaris"
-#: judge/models/problem.py:157
+#: judge/models/problem.py:171
msgid "The number of users who solved the problem."
msgstr "El nombre d'usuaris que ha resolt aquest problema"
-#: judge/models/problem.py:158
+#: judge/models/problem.py:172
msgid "solve rate"
msgstr "Percetatge d'usuaris que han resolt el problema"
-#: judge/models/problem.py:159
+#: judge/models/problem.py:173
msgid "allow full markdown access"
msgstr "Permet fer servir la llibreria sencera de Markdown"
-#: judge/models/problem.py:165
+#: judge/models/problem.py:174
+msgid "submission source visibility"
+msgstr ""
+
+#: judge/models/problem.py:182
msgid "If private, only these organizations may see the problem."
msgstr "Si està en privat, només aquestes organitzacions podran veure el problema"
-#: judge/models/problem.py:420
+#: judge/models/problem.py:447
msgid "See hidden problems"
msgstr "Veure problemes ocults"
-#: judge/models/problem.py:421
+#: judge/models/problem.py:448
msgid "Edit own problems"
msgstr "Editar problemes propis"
-#: judge/models/problem.py:422
+#: judge/models/problem.py:449
msgid "Edit all problems"
msgstr "Editar tots els problemes"
-#: judge/models/problem.py:423
+#: judge/models/problem.py:450
msgid "Edit all public problems"
msgstr "Editar tots els problemes públics"
-#: judge/models/problem.py:424
+#: judge/models/problem.py:451
msgid "Edit problems with full markup"
msgstr "Editar problemes amb accés total a Markup"
-#: judge/models/problem.py:425 templates/problem/problem.html:161
+#: judge/models/problem.py:452 templates/problem/problem.html:161
msgid "Clone problem"
msgstr "Clonar problema"
-#: judge/models/problem.py:426
+#: judge/models/problem.py:453
msgid "Change is_public field"
msgstr "Cambiar camp is_public "
-#: judge/models/problem.py:427
+#: judge/models/problem.py:454
msgid "Change is_manually_managed field"
msgstr "Cambiar camp is_manually_managed"
-#: judge/models/problem.py:428
+#: judge/models/problem.py:455
msgid "See organization-private problems"
msgstr "Veure els problemes privats per a organitzacions"
-#: judge/models/problem.py:436 judge/models/problem.py:454
+#: judge/models/problem.py:463 judge/models/problem.py:481
#: judge/models/runtime.py:111
msgid "language"
msgstr "Llenguatge"
-#: judge/models/problem.py:437
+#: judge/models/problem.py:464
msgid "translated name"
msgstr "Nom traduït"
-#: judge/models/problem.py:438
+#: judge/models/problem.py:465
msgid "translated description"
msgstr "Descripció traduïda"
-#: judge/models/problem.py:442
+#: judge/models/problem.py:469
msgid "problem translation"
msgstr "Traducció del problema"
-#: judge/models/problem.py:443
+#: judge/models/problem.py:470
msgid "problem translations"
msgstr "Traduccions del problema"
-#: judge/models/problem.py:447
+#: judge/models/problem.py:474
msgid "clarified problem"
msgstr "Problema aclarit"
-#: judge/models/problem.py:448
+#: judge/models/problem.py:475
msgid "clarification body"
msgstr "Cos de l'aclariment"
-#: judge/models/problem.py:449
+#: judge/models/problem.py:476
msgid "clarification timestamp"
msgstr "Marca de temps de l'aclariment"
-#: judge/models/problem.py:464
+#: judge/models/problem.py:491
msgid "language-specific resource limit"
msgstr "Límit de Recursos Específics per Llenguatge"
-#: judge/models/problem.py:465
+#: judge/models/problem.py:492
msgid "language-specific resource limits"
msgstr "Límits de Recursos Específics per Llenguatge"
-#: judge/models/problem.py:469
+#: judge/models/problem.py:496
msgid "associated problem"
msgstr "Problema associat"
-#: judge/models/problem.py:472
+#: judge/models/problem.py:499
msgid "publish date"
msgstr "Data de publicació"
-#: judge/models/problem.py:474
+#: judge/models/problem.py:501
msgid "editorial content"
msgstr "Contingut de l'editorial"
-#: judge/models/problem.py:497
+#: judge/models/problem.py:524
msgid "See hidden solutions"
msgstr "Veure solucions ocultes"
-#: judge/models/problem.py:499
+#: judge/models/problem.py:526
msgid "solution"
msgstr "solució"
-#: judge/models/problem.py:500
+#: judge/models/problem.py:527
msgid "solutions"
msgstr "solucions"
@@ -1690,112 +1699,112 @@ msgstr "nombre de punts"
msgid "case is pretest?"
msgstr "és un cas preliminar?"
-#: judge/models/profile.py:38
+#: judge/models/profile.py:41
msgid "organization title"
msgstr "títol de l'organització"
-#: judge/models/profile.py:39
+#: judge/models/profile.py:42
msgid "organization slug"
msgstr "identificador únic de l'organització"
-#: judge/models/profile.py:40
+#: judge/models/profile.py:43
msgid "Organization name shown in URL"
msgstr "Nom de l'organització tal i com es mostra en l'URL"
-#: judge/models/profile.py:42
+#: judge/models/profile.py:45
msgid "Displayed beside user name during contests"
msgstr "Mostrat al costat del nom de l'usuari durant els concursos"
-#: judge/models/profile.py:43
+#: judge/models/profile.py:46
msgid "organization description"
msgstr "Descripció de l'organització"
-#: judge/models/profile.py:44
+#: judge/models/profile.py:47
msgid "administrators"
msgstr "Administradors"
-#: judge/models/profile.py:45
+#: judge/models/profile.py:48
msgid "Those who can edit this organization"
msgstr "Aquells qui poden editar aquesta organització"
-#: judge/models/profile.py:46
+#: judge/models/profile.py:49
msgid "creation date"
msgstr "Data de creació"
-#: judge/models/profile.py:47
+#: judge/models/profile.py:50
msgid "is open organization?"
msgstr "És una organització oberta?"
-#: judge/models/profile.py:48
+#: judge/models/profile.py:51
msgid "Allow joining organization"
msgstr "Permet unir-se a l'organització"
-#: judge/models/profile.py:49
+#: judge/models/profile.py:52
msgid "maximum size"
msgstr "Mida màxima"
-#: judge/models/profile.py:50
+#: judge/models/profile.py:53
msgid "Maximum amount of users in this organization, only applicable to private organizations"
msgstr "Màxima quantitat d'usuaris en aquesta organiztació, només aplicable per a organitzacions privades"
-#: judge/models/profile.py:52
+#: judge/models/profile.py:55
msgid "Student access code"
msgstr "Codi d'accès de l'estudiant"
-#: judge/models/profile.py:56
+#: judge/models/profile.py:59
msgid "This image will replace the default site logo for users viewing the organization."
msgstr "Aquesta imatge reemplaçarà el logo per defecte a tots els usuaris mirant aquesta organització"
-#: judge/models/profile.py:79
+#: judge/models/profile.py:82
msgid "Administer organizations"
msgstr "Administrar organitzacions"
-#: judge/models/profile.py:80
+#: judge/models/profile.py:83
msgid "Edit all organizations"
msgstr "Edita totes les organitzacions"
-#: judge/models/profile.py:82 judge/models/profile.py:99
-#: judge/models/profile.py:269
+#: judge/models/profile.py:85 judge/models/profile.py:102
+#: judge/models/profile.py:293
msgid "organization"
msgstr "organització"
-#: judge/models/profile.py:87
+#: judge/models/profile.py:90
msgid "user associated"
msgstr "usuari associat"
-#: judge/models/profile.py:88
+#: judge/models/profile.py:91
msgid "self-description"
msgstr "auto-descripció"
-#: judge/models/profile.py:89
+#: judge/models/profile.py:92
msgid "location"
msgstr "Localització"
-#: judge/models/profile.py:91
+#: judge/models/profile.py:94
msgid "preferred language"
msgstr "Llenguatge preferit"
-#: judge/models/profile.py:97
+#: judge/models/profile.py:100
msgid "last access time"
msgstr "Data últim accés"
-#: judge/models/profile.py:98
+#: judge/models/profile.py:101
msgid "last IP"
msgstr "Última IP"
-#: judge/models/profile.py:101
+#: judge/models/profile.py:104
msgid "display rank"
msgstr "mostrar rang"
-#: judge/models/profile.py:103
+#: judge/models/profile.py:106
msgid "Normal User"
msgstr "Usuari normal"
-#: judge/models/profile.py:104
+#: judge/models/profile.py:107
msgid "Problem Setter"
msgstr "Creador de Problemes"
-#: judge/models/profile.py:105 templates/base.html:220
+#: judge/models/profile.py:108 templates/base.html:220
#: templates/comments/list.html:99 templates/contest/contest-list-tabs.html:24
#: templates/contest/ranking-table.html:49
#: templates/problem/problem-list-tabs.html:6
@@ -1804,155 +1813,167 @@ msgstr "Creador de Problemes"
msgid "Admin"
msgstr "Administrador"
-#: judge/models/profile.py:106
+#: judge/models/profile.py:109
msgid "comment mute"
msgstr "silenciar el comentari"
-#: judge/models/profile.py:106
+#: judge/models/profile.py:109
msgid "Some users are at their best when silent."
msgstr "Alguns usuaris son més macos callats."
-#: judge/models/profile.py:108
+#: judge/models/profile.py:111
msgid "unlisted user"
msgstr "usuari desllistat"
-#: judge/models/profile.py:108
+#: judge/models/profile.py:111
msgid "User will not be ranked."
msgstr "Aquest usuari no serà classificat"
-#: judge/models/profile.py:111
+#: judge/models/profile.py:114
msgid "user script"
msgstr "script d'usuari"
-#: judge/models/profile.py:112
+#: judge/models/profile.py:115
msgid "User-defined JavaScript for site customization."
msgstr "JavaScript definit per l'usuari per a la personalització del lloc."
-#: judge/models/profile.py:113
+#: judge/models/profile.py:116
msgid "current contest"
msgstr "concurs actual"
-#: judge/models/profile.py:115
+#: judge/models/profile.py:118
msgid "math engine"
msgstr "motor matemàtic"
-#: judge/models/profile.py:117
+#: judge/models/profile.py:120
msgid "the rendering engine used to render math"
msgstr "el motor fet servir per a representar les matemàtiques"
-#: judge/models/profile.py:118
+#: judge/models/profile.py:121
msgid "TOTP 2FA enabled"
msgstr "TOTP 2FA activat"
-#: judge/models/profile.py:119
+#: judge/models/profile.py:122
msgid "check to enable TOTP-based two-factor authentication"
msgstr "fes click per a activar l'Autenticació de dos passos basada en TOTP"
-#: judge/models/profile.py:120
+#: judge/models/profile.py:123
msgid "WebAuthn 2FA enabled"
msgstr "WebAuthn 2FA activat"
-#: judge/models/profile.py:121
+#: judge/models/profile.py:124
msgid "check to enable WebAuthn-based two-factor authentication"
msgstr "fes click per a activar l'Autenticació de dos passos basada en WebAuthn"
-#: judge/models/profile.py:122
+#: judge/models/profile.py:125
msgid "TOTP key"
msgstr "clau TOTP"
-#: judge/models/profile.py:123
+#: judge/models/profile.py:126
msgid "32 character base32-encoded key for TOTP"
msgstr "clau de 32 caràcters en base32 per a TOTP"
-#: judge/models/profile.py:125
+#: judge/models/profile.py:128
msgid "TOTP key must be empty or base32"
msgstr "la clau TOTP ha d'estar buida o ser base32"
-#: judge/models/profile.py:126
+#: judge/models/profile.py:129
msgid "scratch codes"
msgstr "codis Scratch"
-#: judge/models/profile.py:127
+#: judge/models/profile.py:130
msgid "JSON array of 16 character base32-encoded codes for scratch codes"
msgstr "Array JSON de codis de 16 caràcters en base32"
-#: judge/models/profile.py:131
+#: judge/models/profile.py:134
msgid "Scratch codes must be empty or a JSON array of 16-character base32 codes"
msgstr "Els codis Scratch han de estar buits o ser un Array JSON de codis de 16 caràcters en base32"
-#: judge/models/profile.py:133
+#: judge/models/profile.py:136
+msgid "last TOTP timecode"
+msgstr ""
+
+#: judge/models/profile.py:137
msgid "API token"
msgstr "Token de l'API"
-#: judge/models/profile.py:134
+#: judge/models/profile.py:138
msgid "64 character hex-encoded API access token"
msgstr "token d'accès a l'API de 64 caràcters hexadecimals"
-#: judge/models/profile.py:136
+#: judge/models/profile.py:140
msgid "API token must be None or hexadecimal"
msgstr "el token de l'API ha d'estar buit o ser hexadecimal"
-#: judge/models/profile.py:137
+#: judge/models/profile.py:141
msgid "internal notes"
msgstr "notes internes"
-#: judge/models/profile.py:138
+#: judge/models/profile.py:142
msgid "Notes for administrators regarding this user."
msgstr "Notes dels administradors sobre aquest usuari."
-#: judge/models/profile.py:139
+#: judge/models/profile.py:143
msgid "last data download time"
msgstr "última data de descàrrega de dades"
-#: judge/models/profile.py:236
+#: judge/models/profile.py:253
msgid "Shows in-progress development stuff"
msgstr "Mostra coses de desenvolupament en progrès"
-#: judge/models/profile.py:237
+#: judge/models/profile.py:254
msgid "Edit TOTP settings"
msgstr "Editar ajustos de TOTP"
-#: judge/models/profile.py:239
+#: judge/models/profile.py:256
msgid "user profile"
msgstr "perfil d'usuari"
-#: judge/models/profile.py:240
+#: judge/models/profile.py:257
msgid "user profiles"
msgstr "perfils d'usuaris"
-#: judge/models/profile.py:246
+#: judge/models/profile.py:263
msgid "device name"
msgstr "nom de dispositiu"
-#: judge/models/profile.py:247
+#: judge/models/profile.py:264
msgid "credential ID"
msgstr "ID de la credencial"
-#: judge/models/profile.py:248
+#: judge/models/profile.py:265
msgid "public key"
msgstr "clau pública"
-#: judge/models/profile.py:249
+#: judge/models/profile.py:266
msgid "sign counter"
msgstr "comptador de firmes"
-#: judge/models/profile.py:271
+#: judge/models/profile.py:287
+msgid "WebAuthn credential"
+msgstr ""
+
+#: judge/models/profile.py:288
+msgid "WebAuthn credentials"
+msgstr ""
+
+#: judge/models/profile.py:295
msgid "request time"
msgstr "data de solicitud"
-#: judge/models/profile.py:272
+#: judge/models/profile.py:296
msgid "state"
msgstr "estat"
-#: judge/models/profile.py:277
+#: judge/models/profile.py:301
msgid "reason"
msgstr "motiu"
-#: judge/models/profile.py:280
+#: judge/models/profile.py:304
msgid "organization join request"
msgstr "petició d'unir-se a organització"
-#: judge/models/profile.py:281
+#: judge/models/profile.py:305
msgid "organization join requests"
msgstr "peticions d'unir-se a organització"
@@ -2108,210 +2129,210 @@ msgstr "jutges"
msgid "judge"
msgstr "jutge"
-#: judge/models/submission.py:20 judge/models/submission.py:47
+#: judge/models/submission.py:21 judge/models/submission.py:48
#: judge/utils/problems.py:74
msgid "Accepted"
msgstr "Acceptat"
-#: judge/models/submission.py:21 judge/models/submission.py:48
+#: judge/models/submission.py:22 judge/models/submission.py:49
msgid "Wrong Answer"
msgstr "Resposta errònia"
-#: judge/models/submission.py:22 judge/models/submission.py:50
+#: judge/models/submission.py:23 judge/models/submission.py:51
msgid "Time Limit Exceeded"
msgstr "Temps Límit excedit"
-#: judge/models/submission.py:23 judge/models/submission.py:51
+#: judge/models/submission.py:24 judge/models/submission.py:52
msgid "Memory Limit Exceeded"
msgstr "Límit de memòria excedit"
-#: judge/models/submission.py:24 judge/models/submission.py:52
+#: judge/models/submission.py:25 judge/models/submission.py:53
msgid "Output Limit Exceeded"
msgstr "Límit de dades de sortida excedit"
-#: judge/models/submission.py:25 judge/models/submission.py:53
+#: judge/models/submission.py:26 judge/models/submission.py:54
msgid "Invalid Return"
msgstr "Retorn invàlid (El programa ha tingut un retorn no-estàndard. Això sol implicar una excepció en llenguatges interpretats)"
-#: judge/models/submission.py:26 judge/models/submission.py:54
+#: judge/models/submission.py:27 judge/models/submission.py:55
msgid "Runtime Error"
msgstr "Errors en temps d'execució"
-#: judge/models/submission.py:27 judge/models/submission.py:41
-#: judge/models/submission.py:55 judge/utils/problems.py:76
+#: judge/models/submission.py:28 judge/models/submission.py:42
+#: judge/models/submission.py:56 judge/utils/problems.py:76
msgid "Compile Error"
msgstr "Error de compilació"
-#: judge/models/submission.py:28 judge/models/submission.py:40
+#: judge/models/submission.py:29 judge/models/submission.py:41
msgid "Internal Error"
msgstr "Error intern"
-#: judge/models/submission.py:29
+#: judge/models/submission.py:30
msgid "Short circuit"
msgstr "Curt Circuit"
-#: judge/models/submission.py:30 judge/models/submission.py:42
-#: judge/models/submission.py:61
+#: judge/models/submission.py:31 judge/models/submission.py:43
+#: judge/models/submission.py:62
msgid "Aborted"
msgstr "Avortat"
-#: judge/models/submission.py:36 judge/models/submission.py:57
+#: judge/models/submission.py:37 judge/models/submission.py:58
msgid "Queued"
msgstr "En cua"
-#: judge/models/submission.py:37 judge/models/submission.py:58
+#: judge/models/submission.py:38 judge/models/submission.py:59
msgid "Processing"
msgstr "Processant"
-#: judge/models/submission.py:38 judge/models/submission.py:59
+#: judge/models/submission.py:39 judge/models/submission.py:60
msgid "Grading"
msgstr "Avaluant"
-#: judge/models/submission.py:39 judge/models/submission.py:60
+#: judge/models/submission.py:40 judge/models/submission.py:61
msgid "Completed"
msgstr "Completat"
-#: judge/models/submission.py:56
+#: judge/models/submission.py:57
msgid "Internal Error (judging server error)"
msgstr "Error Intern (error en el servidor del jutge)"
-#: judge/models/submission.py:66
+#: judge/models/submission.py:67
msgid "submission time"
msgstr "Temps d'enviament"
-#: judge/models/submission.py:67 judge/models/submission.py:227
+#: judge/models/submission.py:68 judge/models/submission.py:238
msgid "execution time"
msgstr "Temps d'execució"
-#: judge/models/submission.py:68 judge/models/submission.py:228
+#: judge/models/submission.py:69 judge/models/submission.py:239
msgid "memory usage"
msgstr "Ús de memòria"
-#: judge/models/submission.py:69 judge/models/submission.py:229
+#: judge/models/submission.py:70 judge/models/submission.py:240
msgid "points granted"
msgstr "Punts atorgats"
-#: judge/models/submission.py:70
+#: judge/models/submission.py:71
msgid "submission language"
msgstr "llenguatge de l'enviament"
-#: judge/models/submission.py:71
+#: judge/models/submission.py:72
msgid "status"
msgstr "estat"
-#: judge/models/submission.py:72
+#: judge/models/submission.py:73
msgid "result"
msgstr "resultat"
-#: judge/models/submission.py:74
+#: judge/models/submission.py:75
msgid "compile errors"
msgstr "errors de compilació"
-#: judge/models/submission.py:76
+#: judge/models/submission.py:77
msgid "batched cases"
msgstr "casos en lot (batch)"
-#: judge/models/submission.py:77
+#: judge/models/submission.py:78
msgid "test case points"
msgstr "punts del cas de proves"
-#: judge/models/submission.py:78
+#: judge/models/submission.py:79
msgid "test case total points"
msgstr "punts totals del cas de proves"
-#: judge/models/submission.py:79
+#: judge/models/submission.py:80
msgid "judged on"
msgstr "jutjat en:"
-#: judge/models/submission.py:81
+#: judge/models/submission.py:82
msgid "submission judge time"
msgstr "temps per a jutjar l'enviament"
-#: judge/models/submission.py:82
-msgid "was rejudged by admin"
-msgstr "ha estat rejutjat per un administrador"
-
#: judge/models/submission.py:83
+msgid "last rejudge date by admin"
+msgstr ""
+
+#: judge/models/submission.py:84
msgid "was ran on pretests only"
msgstr "només s'han passat casos de proves preliminars"
-#: judge/models/submission.py:86
-msgid "lock submission"
-msgstr "bloquejar enviament"
+#: judge/models/submission.py:87
+msgid "submission lock"
+msgstr ""
-#: judge/models/submission.py:199
+#: judge/models/submission.py:210
msgid "Abort any submission"
msgstr "Avortar qualsevol enviament"
-#: judge/models/submission.py:200
+#: judge/models/submission.py:211
msgid "Rejudge the submission"
msgstr "Rejutjar l'enviament"
-#: judge/models/submission.py:201
+#: judge/models/submission.py:212
msgid "Rejudge a lot of submissions"
msgstr "Rejutjar molts enviaments"
-#: judge/models/submission.py:202
+#: judge/models/submission.py:213
msgid "Submit without limit"
msgstr "Enviar sense límit"
-#: judge/models/submission.py:203
+#: judge/models/submission.py:214
msgid "View all submission"
msgstr "Veure tots els enviaments"
-#: judge/models/submission.py:204
+#: judge/models/submission.py:215
msgid "Resubmit others' submission"
msgstr "Reenviar l'enviament d'un altre"
-#: judge/models/submission.py:205
+#: judge/models/submission.py:216
msgid "Change lock status of submission"
msgstr "Canviar l'estat de bloqueig d'un enviament"
-#: judge/models/submission.py:208 templates/contest/moss.html:58
+#: judge/models/submission.py:219 templates/contest/moss.html:58
msgid "submissions"
msgstr "enviaments"
-#: judge/models/submission.py:212 judge/models/submission.py:223
+#: judge/models/submission.py:223 judge/models/submission.py:234
msgid "associated submission"
msgstr "enviament associat"
-#: judge/models/submission.py:214
+#: judge/models/submission.py:225
msgid "source code"
msgstr "Codi font"
-#: judge/models/submission.py:225
+#: judge/models/submission.py:236
msgid "test case ID"
msgstr "Id del cas de proves"
-#: judge/models/submission.py:226
+#: judge/models/submission.py:237
msgid "status flag"
msgstr "flag d'estat"
-#: judge/models/submission.py:230
+#: judge/models/submission.py:241
msgid "points possible"
msgstr "punts possibles"
-#: judge/models/submission.py:231
+#: judge/models/submission.py:242
msgid "batch number"
msgstr "nombre de lot (batch)"
-#: judge/models/submission.py:232
+#: judge/models/submission.py:243
msgid "judging feedback"
msgstr "resultat del jutge"
-#: judge/models/submission.py:233
+#: judge/models/submission.py:244
msgid "extended judging feedback"
msgstr "resultat extés del jutge"
-#: judge/models/submission.py:234
+#: judge/models/submission.py:245
msgid "program output"
msgstr "sortida del programa"
-#: judge/models/submission.py:242
+#: judge/models/submission.py:253
msgid "submission test case"
msgstr "cas de prova de l'enviament"
-#: judge/models/submission.py:243
+#: judge/models/submission.py:254
msgid "submission test cases"
msgstr "casos de prova de l'enviament"
@@ -2359,6 +2380,10 @@ msgstr "ticket"
msgid "poster"
msgstr "publicador"
+#: judge/models/ticket.py:30
+msgid "message body"
+msgstr "Cos del missatge"
+
#: judge/models/ticket.py:31
msgid "message time"
msgstr "data del missatge"
@@ -2381,19 +2406,23 @@ msgstr "Recalculant puntuacions del concurs"
msgid "Running MOSS"
msgstr "Executant sistema anticòpia MOSS"
-#: judge/tasks/submission.py:43
+#: judge/tasks/submission.py:45
msgid "Modifying submissions"
msgstr "Modificant enviaments"
-#: judge/tasks/submission.py:56
+#: judge/tasks/submission.py:58
msgid "Recalculating user points"
msgstr "Recalculant punts d'usuari"
-#: judge/tasks/user.py:50
+#: judge/tasks/user.py:49
+msgid "Applying filters"
+msgstr ""
+
+#: judge/tasks/user.py:64
msgid "Preparing your submission data"
msgstr "Preparant les dades del teu enviament"
-#: judge/tasks/user.py:81
+#: judge/tasks/user.py:95
msgid "Preparing your comment data"
msgstr "Preparant les dades del teu comentari"
@@ -2506,7 +2535,7 @@ msgstr "Has de resoldre com a mínim un problema abans de poder votar"
msgid "You already voted."
msgstr "Ja has votat"
-#: judge/views/comment.py:129 judge/views/organization.py:298
+#: judge/views/comment.py:129 judge/views/organization.py:297
msgid "Edited from site"
msgstr "Editat des de'l lloc web"
@@ -2514,125 +2543,130 @@ msgstr "Editat des de'l lloc web"
msgid "Editing comment"
msgstr "Editant comentari"
-#: judge/views/contests.py:56 judge/views/contests.py:201
-#: judge/views/contests.py:204 judge/views/contests.py:382
+#: judge/views/contests.py:57 judge/views/contests.py:210
+#: judge/views/contests.py:213 judge/views/contests.py:395
msgid "No such contest"
msgstr "No es troba aquest concurs"
-#: judge/views/contests.py:57 judge/views/contests.py:202
+#: judge/views/contests.py:58 judge/views/contests.py:211
#, python-format
msgid "Could not find a contest with the key \"%s\"."
msgstr "No s'ha pogut trobar un concurs amb la clau \"%s\"."
-#: judge/views/contests.py:70
+#: judge/views/contests.py:71
msgid "Contests"
msgstr "Concursos"
-#: judge/views/contests.py:205
+#: judge/views/contests.py:214
msgid "Could not find such contest."
msgstr "No es troba aquest concurs"
-#: judge/views/contests.py:208
+#: judge/views/contests.py:217
#, python-format
msgid "Access to contest \"%s\" denied"
msgstr "S'ha denegat l'accés al concurs %s"
-#: judge/views/contests.py:235
+#: judge/views/contests.py:244
msgid "Clone Contest"
msgstr "Clonar concurs"
-#: judge/views/contests.py:301
+#: judge/views/contests.py:278
+#, python-format
+msgid "Cloned contest from %s"
+msgstr ""
+
+#: judge/views/contests.py:314
msgid "Contest not ongoing"
msgstr "El concurs no està en curs"
-#: judge/views/contests.py:302
+#: judge/views/contests.py:315
#, python-format
msgid "\"%s\" is not currently ongoing."
msgstr "\"%s\" no està en curs actualment"
-#: judge/views/contests.py:306
+#: judge/views/contests.py:319
msgid "Already in contest"
msgstr "Ja està en el concurs"
-#: judge/views/contests.py:307
+#: judge/views/contests.py:320
#, python-format
msgid "You are already in a contest: \"%s\"."
msgstr "Ja estàs en el concurs \"%s\"."
-#: judge/views/contests.py:310
+#: judge/views/contests.py:323
msgid "Banned from joining"
msgstr "BANEJAT"
-#: judge/views/contests.py:311
+#: judge/views/contests.py:324
msgid "You have been declared persona non grata for this contest. You are permanently barred from joining this contest."
msgstr "Has estat declarat persona non grata per aquest concurs. Estas vetat permanentment."
-#: judge/views/contests.py:372
+#: judge/views/contests.py:385
#, python-format
msgid "Enter access code for \"%s\""
msgstr "Entra el codi d'accés per a \"%s\""
-#: judge/views/contests.py:383
+#: judge/views/contests.py:396
#, python-format
msgid "You are not in contest \"%s\"."
msgstr "No estas en el concurs \"%s\"."
-#: judge/views/contests.py:402
+#: judge/views/contests.py:415
msgid "ContestCalendar requires integer year and month"
msgstr "ContestCalendar necessita un any i mes enters"
-#: judge/views/contests.py:442
+#: judge/views/contests.py:455
#, python-format
msgid "Contests in %(month)s"
msgstr "Concursos en %(month)s"
-#: judge/views/contests.py:442
+#: judge/views/contests.py:455
msgid "F Y"
msgstr "F Y"
-#: judge/views/contests.py:489
+#: judge/views/contests.py:502
#, python-format
msgid "%s Statistics"
msgstr "Estadístiques de %s "
-#: judge/views/contests.py:662
+#: judge/views/contests.py:675
#, python-format
msgid "%s Rankings"
msgstr "Classificacions de %s"
-#: judge/views/contests.py:670
+#: judge/views/contests.py:683
msgid "???"
msgstr "???"
-#: judge/views/contests.py:686
+#: judge/views/contests.py:699
#, python-format
msgid "Your participation in %s"
msgstr "La teva participació en %s"
-#: judge/views/contests.py:687
+#: judge/views/contests.py:700
#, python-format
msgid "%s's participation in %s"
msgstr "participació de %s en %s"
-#: judge/views/contests.py:694
+#: judge/views/contests.py:707
msgid "Live"
msgstr "En directe"
-#: judge/views/contests.py:706 templates/contest/contest-tabs.html:13
+#: judge/views/contests.py:719 templates/contest/contest-tabs.html:13
msgid "Participation"
msgstr "Participació"
-#: judge/views/contests.py:750
+#: judge/views/contests.py:763
#, python-format
msgid "%s MOSS Results"
msgstr "Resultats del MOSS per a %s"
-#: judge/views/contests.py:777
+#: judge/views/contests.py:790
#, python-format
msgid "Running MOSS for %s..."
msgstr "Executant sistema anticòpia MOSS per a %s..."
-#: judge/views/contests.py:800
+#: judge/views/contests.py:813
#, python-format
msgid "Contest tag: %s"
msgstr "etiqueta de Concurs: %s"
@@ -2661,163 +2695,177 @@ msgstr "pàgina corrupta %s"
msgid "Runtimes"
msgstr "Execucions"
-#: judge/views/organization.py:44 judge/views/organization.py:47
+#: judge/views/organization.py:43 judge/views/organization.py:46
msgid "No such organization"
msgstr "No s'ha trobat aquesta organització"
-#: judge/views/organization.py:45
+#: judge/views/organization.py:44
#, python-format
msgid "Could not find an organization with the key \"%s\"."
msgstr "No s'ha pogut trobar una organització amb la clau \"%s\"."
-#: judge/views/organization.py:48
+#: judge/views/organization.py:47
msgid "Could not find such organization."
msgstr "No s'ha trobat aquesta organització"
-#: judge/views/organization.py:72 judge/views/register.py:34
+#: judge/views/organization.py:71 judge/views/register.py:33
#: templates/organization/list.html:15 templates/user/user-list-tabs.html:5
msgid "Organizations"
msgstr "Organitzacions"
-#: judge/views/organization.py:93
+#: judge/views/organization.py:92
#, python-format
msgid "%s Members"
msgstr "Membres de %s"
-#: judge/views/organization.py:118 judge/views/organization.py:121
-#: judge/views/organization.py:126
+#: judge/views/organization.py:117 judge/views/organization.py:120
+#: judge/views/organization.py:125
msgid "Joining organization"
msgstr "Unint-se a l'organització"
-#: judge/views/organization.py:118
+#: judge/views/organization.py:117
msgid "You are already in the organization."
msgstr "Ja estàs en l'organització"
-#: judge/views/organization.py:121
+#: judge/views/organization.py:120
msgid "This organization is not open."
msgstr "Aquesta organització no està oberta."
-#: judge/views/organization.py:138
+#: judge/views/organization.py:137
msgid "Leaving organization"
msgstr "Abandonant l'organització"
-#: judge/views/organization.py:138
+#: judge/views/organization.py:137
#, python-format
msgid "You are not in \"%s\"."
msgstr "No estas en \"%s\"."
-#: judge/views/organization.py:162
+#: judge/views/organization.py:161
#, python-format
msgid "Request to join %s"
msgstr "Sol·licitud d'unir-se a %s"
-#: judge/views/organization.py:180
+#: judge/views/organization.py:179
msgid "Join request detail"
msgstr "Detall de la sol·licitud"
-#: judge/views/organization.py:208
+#: judge/views/organization.py:207
#, python-format
msgid "Managing join requests for %s"
msgstr "Administrants sol·licituds per a %s"
-#: judge/views/organization.py:239
+#: judge/views/organization.py:238
#, python-format
msgid "Your organization can only receive %d more members. You cannot approve %d users."
msgstr "La teva organització només por tenir %d membres més. No pots aprovar %d usuaris."
-#: judge/views/organization.py:251
+#: judge/views/organization.py:250
#, python-format
msgid "Approved %d user."
msgid_plural "Approved %d users."
msgstr[0] "%d usuari aprovat"
msgstr[1] "%d usuaris aprovats"
-#: judge/views/organization.py:252
+#: judge/views/organization.py:251
#, python-format
msgid "Rejected %d user."
msgid_plural "Rejected %d users."
msgstr[0] "%d usuari denegat,"
msgstr[1] "%d usuaris denegats."
-#: judge/views/organization.py:282
+#: judge/views/organization.py:281
#, python-format
msgid "Editing %s"
msgstr "Editant %s"
-#: judge/views/organization.py:306 judge/views/organization.py:314
+#: judge/views/organization.py:305 judge/views/organization.py:313
msgid "Can't edit organization"
msgstr "No es pot editar l'organització"
-#: judge/views/organization.py:307
+#: judge/views/organization.py:306
msgid "You are not allowed to edit this organization."
msgstr "No tens permisos per editar aquesta organització"
-#: judge/views/organization.py:315
+#: judge/views/organization.py:314
msgid "You are not allowed to kick people from this organization."
msgstr "No tens permisos per fer fora a gent d'aquesta organització"
-#: judge/views/organization.py:320 judge/views/organization.py:324
+#: judge/views/organization.py:319 judge/views/organization.py:323
msgid "Can't kick user"
msgstr "No pots fer fora a aquest usuari"
-#: judge/views/organization.py:321
+#: judge/views/organization.py:320
msgid "The user you are trying to kick does not exist!"
msgstr "L'usuari que estas intentant expulsar no existeix!"
-#: judge/views/organization.py:325
+#: judge/views/organization.py:324
#, python-format
msgid "The user you are trying to kick is not in organization: %s."
msgstr "L'usuari que estas intentant expulsar no està en l'organització: %s."
-#: judge/views/problem.py:67
+#: judge/views/problem.py:68
msgid "No such problem"
msgstr "No existeix aquest problema"
-#: judge/views/problem.py:68
+#: judge/views/problem.py:69
#, python-format
msgid "Could not find a problem with the code \"%s\"."
msgstr "No s'ha pogut trobar un problema amb la clau \"%s\"."
-#: judge/views/problem.py:110
+#: judge/views/problem.py:111
#, python-brace-format
msgid "Editorial for {0}"
msgstr "Editorial per a {0}"
-#: judge/views/problem.py:113
+#: judge/views/problem.py:114
#, python-brace-format
msgid "Editorial for {0}"
msgstr "Editorial per a {0}"
-#: judge/views/problem.py:283 templates/contest/contest.html:79
+#: judge/views/problem.py:133
+msgid "No such editorial"
+msgstr ""
+
+#: judge/views/problem.py:134
+#, python-format
+msgid "Could not find an editorial with the code \"%s\"."
+msgstr ""
+
+#: judge/views/problem.py:289 templates/contest/contest.html:79
#: templates/user/user-tabs.html:5 templates/user/users-table.html:23
msgid "Problems"
msgstr "Problemes"
-#: judge/views/problem.py:556 judge/views/problem.py:564
+#: judge/views/problem.py:562 judge/views/problem.py:570
#, python-format
msgid "Submit to %s"
msgstr "Enviar a %s"
-#: judge/views/problem.py:613
+#: judge/views/problem.py:619
msgid "Banned from submitting"
msgstr "Banejat de fer enviaments"
-#: judge/views/problem.py:614
+#: judge/views/problem.py:620
msgid "You have been declared persona non grata for this problem. You are permanently barred from submitting this problem."
msgstr "Has estat declarat persona non grata per aquest problema. Estas vetat permanentment de fer enviaments."
-#: judge/views/problem.py:618
+#: judge/views/problem.py:624
msgid "Too many submissions"
msgstr "Masses enviaments"
-#: judge/views/problem.py:619
+#: judge/views/problem.py:625
msgid "You have exceeded the submission limit for this problem."
msgstr "Has superat el límit d'enviaments per a aquest problema"
-#: judge/views/problem.py:681
+#: judge/views/problem.py:693
msgid "Clone Problem"
msgstr "Clonar problema"
+#: judge/views/problem.py:720
+#, python-format
+msgid "Cloned problem from %s"
+msgstr ""
+
#: judge/views/problem_data.py:37
msgid "Checker arguments must be a JSON object"
msgstr "els arguments del verificador han de ser un objecte JSON"
@@ -2887,52 +2935,52 @@ msgstr "Millor solucions per a %s"
msgid "Best solutions for {0}"
msgstr "Millor solucions per a {0}"
-#: judge/views/ranked_submission.py:80
+#: judge/views/ranked_submission.py:82
#, python-format
msgid "Best solutions for %(problem)s in %(contest)s"
msgstr "Millor solucions per a %(problem)s en %(contest)s"
-#: judge/views/ranked_submission.py:83
+#: judge/views/ranked_submission.py:85
#, python-format
msgid "Best solutions for problem %(number)s in %(contest)s"
msgstr "Millor solucions per al problema %(number)s en %(contest)s"
-#: judge/views/ranked_submission.py:89
+#: judge/views/ranked_submission.py:91
#, python-brace-format
msgid "Best solutions for {0} in {2}"
msgstr "Millor solucions per a {0} en {2}"
-#: judge/views/ranked_submission.py:92
+#: judge/views/ranked_submission.py:94
#, python-brace-format
msgid "Best solutions for problem {0} in {1}"
msgstr "Millor solucions per al problema {0} en {1}"
-#: judge/views/register.py:27
+#: judge/views/register.py:26
msgid "A username must contain letters, numbers, or underscores"
msgstr "El nom d'usuàri només pot contenir lletres, números i guions baixos"
-#: judge/views/register.py:31
+#: judge/views/register.py:30
msgid "Preferred language"
msgstr "Llenguatge preferit"
-#: judge/views/register.py:38
+#: judge/views/register.py:37
msgid "Subscribe to newsletter?"
msgstr "Subscriu-te al nostre butlletí?"
-#: judge/views/register.py:45
+#: judge/views/register.py:44
#, python-format
msgid "The email address \"%s\" is already taken. Only one registration is allowed per address."
msgstr "El correu electrònic \"%s\" ja existeix. Només es permet un registre per correu"
-#: judge/views/register.py:51
+#: judge/views/register.py:50
msgid "Your email provider is not allowed due to history of abuse. Please use a reputable email provider."
msgstr "El teu proveïdor de correu electrònic no està permés degut a un historial d'abús. Siusplau fes servir un proveïdor fiable."
-#: judge/views/register.py:57 judge/views/register.py:95
+#: judge/views/register.py:56 judge/views/register.py:94
msgid "Registration"
msgstr "Registre"
-#: judge/views/register.py:106
+#: judge/views/register.py:105
msgid "Authentication failure"
msgstr "Error d'autenticació"
@@ -2940,7 +2988,7 @@ msgstr "Error d'autenticació"
msgid "Language statistics"
msgstr "Estadístiques de Llenguatge"
-#: judge/views/status.py:24 templates/submission/list.html:311
+#: judge/views/status.py:24 templates/submission/list.html:310
msgid "Status"
msgstr "Estat"
@@ -2948,74 +2996,74 @@ msgstr "Estat"
msgid "Version matrix"
msgstr "Matriu de versions"
-#: judge/views/submission.py:53 judge/views/submission.py:60
+#: judge/views/submission.py:55 judge/views/submission.py:62
#, python-format
msgid "Submission of %(problem)s by %(user)s"
msgstr "Enviament de %(problem)s per %(user)s"
-#: judge/views/submission.py:203 judge/views/submission.py:204
+#: judge/views/submission.py:205 judge/views/submission.py:206
#: templates/problem/problem.html:127
msgid "All submissions"
msgstr "Tots els enviaments"
-#: judge/views/submission.py:349
+#: judge/views/submission.py:355
msgid "All my submissions"
msgstr "Tots els meus enviaments"
-#: judge/views/submission.py:350
+#: judge/views/submission.py:356
#, python-format
msgid "All submissions by %s"
msgstr "Tots els enviaments per %s"
-#: judge/views/submission.py:381
+#: judge/views/submission.py:387
#, python-format
msgid "All submissions for %s"
msgstr "Tots els enviaments per a %s"
-#: judge/views/submission.py:400
+#: judge/views/submission.py:410
msgid "Must pass a problem"
msgstr "Ha de passar un problema"
-#: judge/views/submission.py:439
+#: judge/views/submission.py:449
#, python-format
msgid "My submissions for %(problem)s"
msgstr "Els meus enviaments per a %(problem)s"
-#: judge/views/submission.py:440
+#: judge/views/submission.py:450
#, python-format
msgid "%(user)s's submissions for %(problem)s"
msgstr "Els enviaments de %(user)s per a %(problem)s"
-#: judge/views/submission.py:536
+#: judge/views/submission.py:546
msgid "Must pass a contest"
msgstr "Ha de passar un concurs"
-#: judge/views/submission.py:544
+#: judge/views/submission.py:554
#, python-format
msgid "My submissions in %(contest)s"
msgstr "Els meus enviaments per a %(contest)s"
-#: judge/views/submission.py:545
+#: judge/views/submission.py:555
#, python-format
msgid "%(user)s's submissions in %(contest)s"
msgstr "Els enviaments de %(user)s per a %(contest)s"
-#: judge/views/submission.py:559
+#: judge/views/submission.py:569
#, python-brace-format
msgid "My submissions in {0}"
msgstr "Els meus enviaments en {0}"
-#: judge/views/submission.py:561
+#: judge/views/submission.py:571
#, python-brace-format
msgid "{0}'s submissions in {2}"
msgstr "Els enviaments de {0} en {2}"
-#: judge/views/submission.py:585
+#: judge/views/submission.py:597
#, python-brace-format
msgid "{0}'s submissions for {2} in {4}"
msgstr "Els enviaments de {0} per {2} en {4}"
-#: judge/views/submission.py:590
+#: judge/views/submission.py:602
#, python-brace-format
msgid "{0}'s submissions for problem {2} in {3}"
msgstr "Els enviaments de {0} per al problema {2} en {3}"
@@ -3032,40 +3080,40 @@ msgstr "Descripció del problema"
msgid "You must solve at least one problem before you can create a ticket."
msgstr ""
-#: judge/views/ticket.py:87 judge/views/ticket.py:90
+#: judge/views/ticket.py:91 judge/views/ticket.py:94
#, python-format
msgid "New ticket for %s"
msgstr "Nou ticket per a %s"
-#: judge/views/ticket.py:144
+#: judge/views/ticket.py:148
#, python-format
msgid "%(title)s - Ticket %(id)d"
msgstr "%(title)s - Ticket %(id)d"
-#: judge/views/ticket.py:249
+#: judge/views/ticket.py:253
#, python-format
msgid "Tickets - Page %(number)d of %(total)d"
msgstr "Tickets - Pàgina %(number)d de %(total)d"
-#: judge/views/ticket.py:298
+#: judge/views/ticket.py:302
#, python-format
msgid "New Ticket: %s"
msgstr "Nou Ticket: %s"
-#: judge/views/ticket.py:299
+#: judge/views/ticket.py:303
#, python-format
msgid "#%(id)d, assigned to: %(users)s"
msgstr "#%(id)d, assignat a: %(users)s"
-#: judge/views/ticket.py:301
+#: judge/views/ticket.py:305
msgid ", "
msgstr ", "
-#: judge/views/ticket.py:301
+#: judge/views/ticket.py:305
msgid "no one"
msgstr "Ningú"
-#: judge/views/ticket.py:321
+#: judge/views/ticket.py:325
#, python-format
msgid "New Ticket Message For: %s"
msgstr "Nou missatge de Ticket per a: %s"
@@ -3074,87 +3122,91 @@ msgstr "Nou missatge de Ticket per a: %s"
msgid "Enable Two-factor Authentication"
msgstr "Activar autenticació en dos passos"
-#: judge/views/two_factor.py:99
+#: judge/views/two_factor.py:108
+msgid "Refresh Two-factor Authentication"
+msgstr ""
+
+#: judge/views/two_factor.py:116
msgid "Disable Two-factor Authentication"
msgstr "Deshabilitar l'autenticació en dos passos"
-#: judge/views/two_factor.py:148
+#: judge/views/two_factor.py:165
msgid "Invalid WebAuthn response"
msgstr "Resposta WebAuthn invàlida"
-#: judge/views/two_factor.py:151
+#: judge/views/two_factor.py:168
msgid "Invalid name"
msgstr "Nom invàlid"
-#: judge/views/two_factor.py:204
+#: judge/views/two_factor.py:221
msgid "Staff may not disable 2FA"
msgstr "Els usuaris amb permisos elevats no poden desactivar l'autenticació en dos passos"
-#: judge/views/two_factor.py:216
+#: judge/views/two_factor.py:229
msgid "Perform Two-factor Authentication"
msgstr "Activar autenticació en dos passos"
-#: judge/views/user.py:79
+#: judge/views/user.py:78
msgid "No such user"
msgstr "No hi ha tal usuari"
-#: judge/views/user.py:79
+#: judge/views/user.py:78
#, python-format
msgid "No user handle \"%s\"."
msgstr "No hi ha cap usuari amb la id \"%s\"."
-#: judge/views/user.py:83
+#: judge/views/user.py:82
msgid "My account"
msgstr "El meu compte"
-#: judge/views/user.py:84
+#: judge/views/user.py:83
#, python-format
msgid "User %s"
msgstr "Usuari %s"
-#: judge/views/user.py:132
+#: judge/views/user.py:131
msgid "Login"
msgstr "Iniciar sessió"
-#: judge/views/user.py:173
+#: judge/views/user.py:172
msgid "M j, Y, G:i"
msgstr "M j, Y, G:i"
-#: judge/views/user.py:307
+#: judge/views/user.py:306
msgid "Preparing your data..."
msgstr "Preparant les teves dates..."
-#: judge/views/user.py:311 templates/user/edit-profile.html:348
+#: judge/views/user.py:310 templates/user/edit-profile.html:352
msgid "Download your data"
msgstr "Descarrega les teves dades"
-#: judge/views/user.py:367
+#: judge/views/user.py:366
msgid "Updated on site"
msgstr "Actualitzat al lloc web"
-#: judge/views/user.py:400 templates/admin/auth/user/change_form.html:14
+#: judge/views/user.py:399 templates/admin/auth/user/change_form.html:14
#: templates/admin/auth/user/change_form.html:17 templates/base.html:222
#: templates/user/user-tabs.html:16
msgid "Edit profile"
msgstr "Edita el perfil"
-#: judge/views/user.py:415
+#: judge/views/user.py:414
msgid "Generated API token for user"
msgstr "token API de l'usuari generat"
-#: judge/views/user.py:427
+#: judge/views/user.py:426
msgid "Removed API token for user"
msgstr "token API de l'usuari esborrat"
-#: judge/views/user.py:437
+#: judge/views/user.py:436
msgid "Generated scratch codes for user"
msgstr "codis Scratch de l'usuari generat"
-#: judge/views/user.py:443 templates/user/user-list-tabs.html:4
+#: judge/views/user.py:442 templates/user/user-list-tabs.html:4
msgid "Leaderboard"
msgstr "Taula de classificació"
-#: judge/views/user.py:504
+#: judge/views/user.py:503
msgid "You have been successfully logged out."
msgstr ""
@@ -3283,11 +3335,11 @@ msgstr "Notícies"
msgid "posted on {time}"
msgstr "publicat a les {time}"
-#: templates/blog/list.html:130 templates/problem/problem.html:309
+#: templates/blog/list.html:130 templates/problem/problem.html:311
msgid "Clarifications"
msgstr "Aclariments"
-#: templates/blog/list.html:146 templates/problem/problem.html:320
+#: templates/blog/list.html:146 templates/problem/problem.html:322
msgid "No clarifications have been made at this time."
msgstr "No s'han fet aclariments de moment."
@@ -3483,7 +3535,7 @@ msgid "Info"
msgstr "Informació"
#: templates/contest/contest-tabs.html:6 templates/stats/base.html:9
-#: templates/submission/list.html:337
+#: templates/submission/list.html:336
msgid "Statistics"
msgstr "Estadístiques"
@@ -3686,19 +3738,19 @@ msgstr "Eliminar la Descalificació"
msgid "Disqualify"
msgstr "Descalificar"
-#: templates/contest/ranking.html:169
+#: templates/contest/ranking.html:173
msgid "Are you sure you want to disqualify this participation?"
msgstr "Estàs segur que vols descalificar aquesta participació?"
-#: templates/contest/ranking.html:174
+#: templates/contest/ranking.html:178
msgid "Are you sure you want to un-disqualify this participation?"
msgstr "Estàs segur que vols eliminar la descalificació d'aquesta participació?"
-#: templates/contest/ranking.html:246
+#: templates/contest/ranking.html:250
msgid "View user participation"
msgstr "Veure la participació de l'usuari"
-#: templates/contest/ranking.html:250
+#: templates/contest/ranking.html:254
msgid "Show organizations"
msgstr "Mostrar organitzacions"
@@ -3973,7 +4025,7 @@ msgstr ""
msgid "Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence."
msgstr "Recorda: fes servir aquesta editorial només si estàs encallat, i no facis un còpia-enganxa del codi. Siusplau, sigues respectuós amb l'autor/a del problema i l'editorialista.
Enviar una solució oficial abans de resoldre el problema per un mateix és motiu de Baneig."
-#: templates/problem/editorial.html:27 templates/problem/problem.html:209
+#: templates/problem/editorial.html:27 templates/problem/problem.html:210
msgid "Author:"
msgid_plural "Authors:"
msgstr[0] "Autor/a:"
@@ -4140,36 +4192,36 @@ msgstr "Temps Límit:"
msgid "Memory limit:"
msgstr "Límit de memòria:"
-#: templates/problem/problem.html:224
+#: templates/problem/problem.html:226
msgid "Problem type"
msgid_plural "Problem types"
msgstr[0] "tipus del problema"
msgstr[1] "tipus del problema"
-#: templates/problem/problem.html:237
+#: templates/problem/problem.html:239
msgid "Allowed languages"
msgstr "Llenguatges permesos"
-#: templates/problem/problem.html:245
+#: templates/problem/problem.html:247
#, python-format
msgid "No %(lang)s judge online"
msgstr "No hi ha cap jutge per a %(lang)s"
-#: templates/problem/problem.html:256
+#: templates/problem/problem.html:258
msgid "Judge:"
msgid_plural "Judges:"
msgstr[0] "Jutge:"
msgstr[1] "Jutges:"
-#: templates/problem/problem.html:273
+#: templates/problem/problem.html:275
msgid "none available"
msgstr "cap disponible"
-#: templates/problem/problem.html:298
+#: templates/problem/problem.html:300
msgid "Request clarification"
msgstr "Demanar aclariment"
-#: templates/problem/problem.html:300
+#: templates/problem/problem.html:302
msgid "Report an issue"
msgstr "Notifica un problema"
@@ -4214,7 +4266,7 @@ msgstr "Tipus de problemes"
msgid "Point range"
msgstr "Rang de punts"
-#: templates/problem/search-form.html:63 templates/submission/list.html:329
+#: templates/problem/search-form.html:63 templates/submission/list.html:328
#: templates/ticket/list.html:248
msgid "Go"
msgstr "Vés"
@@ -4261,7 +4313,7 @@ msgid "Invalid username or password."
msgstr "Nom d'usurari o contrasenya incorrecte."
#: templates/registration/login.html:53
-#: templates/registration/two_factor_auth.html:86
+#: templates/registration/two_factor_auth.html:92
msgid "Login!"
msgstr "Iniciar sessió!"
@@ -4381,12 +4433,12 @@ msgid "Default language"
msgstr "Llenguatge per defecte"
#: templates/registration/registration_form.html:184
-#: templates/user/edit-profile.html:310
+#: templates/user/edit-profile.html:314
msgid "Affiliated organizations"
msgstr "Organitzacions afiliades"
#: templates/registration/registration_form.html:190
-#: templates/user/edit-profile.html:324
+#: templates/user/edit-profile.html:328
msgid "Notify me about upcoming contests"
msgstr "Avisa'm sobre concursos vinents"
@@ -4402,57 +4454,93 @@ msgstr "Termes i condicions"
msgid "Register!"
msgstr "Registra't!"
-#: templates/registration/totp_disable.html:38
+#: templates/registration/totp_disable.html:31
msgid "To protect your account, you must first authenticate before you can disable Two Factor Authentication."
msgstr "Per protegir la teva compta, t'has d'autenticar abans de poder desactivar l'Autenticació en dos passos"
-#: templates/registration/totp_disable.html:45
+#: templates/registration/totp_disable.html:38
msgid "Enter the 6-digit code generated by your app or one of your 16-digit scratch codes:"
msgstr "Entra el codi de 6 dígits generat per la teva app o un dels teus codis scratch de 16 dígits"
-#: templates/registration/totp_disable.html:48
+#: templates/registration/totp_disable.html:41
msgid "Disable Two Factor Authentication"
msgstr "Deshabilitar l'autenticació en dos passos"
-#: templates/registration/totp_enable.html:75
+#: templates/registration/totp_enable.html:72
msgid "Scan this code with your authenticator app:"
msgstr "Escanegeu aquest codi QR amb l'aplicació autenticadora"
-#: templates/registration/totp_enable.html:76
+#: templates/registration/totp_enable.html:73
msgid "QR code"
msgstr "Codi QR"
-#: templates/registration/totp_enable.html:77
+#: templates/registration/totp_enable.html:74
msgid "Or enter this code manually:"
msgstr "O entra aquest codi a ma:"
-#: templates/registration/totp_enable.html:88
+#: templates/registration/totp_enable.html:85
msgid "Enter the 6-digit code generated by your app:"
msgstr "Entra el codi de 6 dígits generat per la teva app:"
-#: templates/registration/totp_enable.html:91
+#: templates/registration/totp_enable.html:90
+msgid "Refresh Two Factor Authentication"
+msgstr ""
+
+#: templates/registration/totp_enable.html:92
msgid "Enable Two Factor Authentication"
msgstr "Activar autenticació en dos passos"
+#: templates/registration/totp_enable.html:98
+msgid "Below is a list of one-time use scratch codes."
+msgstr ""
+
+#: templates/registration/totp_enable.html:99
+msgid "These codes can only be used once and are for emergency use."
+msgstr ""
+
+#: templates/registration/totp_enable.html:100
+msgid "You can use these codes to login to your account or disable two-factor authentication."
+msgstr ""
+
+#: templates/registration/totp_enable.html:101
+msgid "If you ever need more scratch codes, you can regenerate them on the edit profile tab."
+msgstr ""
+
+#: templates/registration/totp_enable.html:102
+msgid "Please write these down and keep them in a secure location."
+msgstr ""
+
+#: templates/registration/totp_enable.html:103
+msgid "These codes will never be shown again after you enable two-factor authentication."
+msgstr ""
+
#: templates/registration/two_factor_auth.html:33
-#: templates/user/edit-profile.html:161
+#: templates/user/edit-profile.html:165
msgid "WebAuthn is not supported by your browser."
msgstr "WebAuthn no és suportat pel teu navegador."
#: templates/registration/two_factor_auth.html:54
-#: templates/user/edit-profile.html:185
+#: templates/user/edit-profile.html:189
msgid "Failed to contact server."
msgstr "No s'ha pogut connectar amb el servidor."
-#: templates/registration/two_factor_auth.html:77
+#: templates/registration/two_factor_auth.html:79
msgid "Enter the 6-digit code generated by your app or one of your 16-character scratch codes:"
msgstr "Entra el codi de 6 dígits generat per la teva app o un dels teus codis scratch de 16 dígits:"
-#: templates/registration/two_factor_auth.html:83
+#: templates/registration/two_factor_auth.html:81
+msgid "Enter one of your 16-character scratch codes:"
+msgstr ""
+
+#: templates/registration/two_factor_auth.html:89
msgid "Use security key"
msgstr "Fes servir la clau de seguretat"
-#: templates/registration/two_factor_auth.html:89
+#: templates/registration/two_factor_auth.html:94
+msgid "Use scratch code"
+msgstr ""
+
+#: templates/registration/two_factor_auth.html:97
#, python-format
msgid "If you lost your authentication device and are unable to use your scratch codes, please contact us at %(email)s."
msgstr "Si has perdut el teu dispositiu d'autenticació i no pots fer servir els teus codis scratch, contacta'ns a %(email)s"
@@ -4533,15 +4621,15 @@ msgstr "Filtra per estat..."
msgid "Filter by language..."
msgstr "Filtra per llenguatge..."
-#: templates/submission/list.html:307
+#: templates/submission/list.html:306
msgid "Filter submissions"
msgstr "Filtra enviaments"
-#: templates/submission/list.html:343
+#: templates/submission/list.html:342
msgid "Total:"
msgstr "Total:"
-#: templates/submission/list.html:353
+#: templates/submission/list.html:352
msgid "You were disconnected. Refresh to show latest updates."
msgstr "Has estat desconnectat. Actualitza la pàgina per mostrar les últimes actualitzacions."
@@ -4757,121 +4845,125 @@ msgstr "Classificació"
msgid "Search by handle..."
msgstr "Cerca per l'adreça..."
-#: templates/user/edit-profile.html:109
+#: templates/user/edit-profile.html:113
msgid "Are you sure you want to generate or regenerate your API token?"
msgstr "Esteu segur que voleu generar o regenerar el token API?"
-#: templates/user/edit-profile.html:110
+#: templates/user/edit-profile.html:114
msgid "This will invalidate any previous API tokens."
msgstr "Això invalidarà qualsevol token API anterior."
-#: templates/user/edit-profile.html:111
+#: templates/user/edit-profile.html:115
msgid "It also allows access to your account without Two-factor Authentication."
msgstr "També permet accés a la compta sense l'Autenticació de dos passos."
-#: templates/user/edit-profile.html:112
+#: templates/user/edit-profile.html:116
msgid "You will not be able to view your api token after you leave this page!"
msgstr "No podràs veure el teu token API després de que deixis aquesta pàgina!"
-#: templates/user/edit-profile.html:113 templates/user/edit-profile.html:207
+#: templates/user/edit-profile.html:117 templates/user/edit-profile.html:211
msgid "Generating..."
msgstr "Generant..."
-#: templates/user/edit-profile.html:121 templates/user/edit-profile.html:243
-#: templates/user/edit-profile.html:371 templates/user/edit-profile.html:390
+#: templates/user/edit-profile.html:125 templates/user/edit-profile.html:247
+#: templates/user/edit-profile.html:373 templates/user/edit-profile.html:395
msgid "Regenerate"
msgstr "Regenera"
-#: templates/user/edit-profile.html:127 templates/user/edit-profile.html:392
+#: templates/user/edit-profile.html:131 templates/user/edit-profile.html:397
msgid "Remove"
msgstr "Elimina"
-#: templates/user/edit-profile.html:137
+#: templates/user/edit-profile.html:141
msgid "Are you sure you want to remove your API token?"
msgstr "Estàs segur que vols suprimir el teu token API?"
-#: templates/user/edit-profile.html:144 templates/user/edit-profile.html:375
-#: templates/user/edit-profile.html:396
+#: templates/user/edit-profile.html:148 templates/user/edit-profile.html:377
+#: templates/user/edit-profile.html:401
msgid "Generate"
msgstr "Generar"
-#: templates/user/edit-profile.html:190
+#: templates/user/edit-profile.html:194
msgid "Are you sure you want to delete this security key?"
msgstr "Segur que vols suprimir aquesta clau de seguretat?"
-#: templates/user/edit-profile.html:280
+#: templates/user/edit-profile.html:284
msgid "Self-description"
msgstr "Auto-descripció"
-#: templates/user/edit-profile.html:287
+#: templates/user/edit-profile.html:291
msgid "Select your closest major city"
msgstr "Tria la ciutat més propera"
-#: templates/user/edit-profile.html:296
+#: templates/user/edit-profile.html:300
msgid "Editor theme"
msgstr "Tema de l'editor"
-#: templates/user/edit-profile.html:301
+#: templates/user/edit-profile.html:305
msgid "Math engine"
msgstr "Motor matemàtic"
-#: templates/user/edit-profile.html:335 templates/user/edit-profile.html:337
+#: templates/user/edit-profile.html:339 templates/user/edit-profile.html:341
msgid "Change your avatar"
msgstr "Canviar avatar"
-#: templates/user/edit-profile.html:342
+#: templates/user/edit-profile.html:346
msgid "Change your password"
msgstr "Canvia la teva contrasenya"
-#: templates/user/edit-profile.html:356
+#: templates/user/edit-profile.html:359
msgid "Two-factor Authentication is enabled"
msgstr "S'ha activat l'autenticació de dos passos"
-#: templates/user/edit-profile.html:358
-msgid "Two-factor Authentication is disabled"
-msgstr "S'ha desactivat l'autenticació de dos passos"
-
-#: templates/user/edit-profile.html:363 templates/user/edit-profile.html:365
+#: templates/user/edit-profile.html:362 templates/user/edit-profile.html:365
msgid "Disable"
msgstr "Inhabilita"
-#: templates/user/edit-profile.html:368
+#: templates/user/edit-profile.html:367
+msgid "Refresh"
+msgstr ""
+
+#: templates/user/edit-profile.html:370
msgid "Scratch Codes:"
msgstr "Codis Scratch:"
-#: templates/user/edit-profile.html:372 templates/user/edit-profile.html:393
+#: templates/user/edit-profile.html:374 templates/user/edit-profile.html:398
msgid "Hidden"
msgstr "Ocult"
-#: templates/user/edit-profile.html:381
+#: templates/user/edit-profile.html:384
+msgid "Two-factor Authentication is disabled"
+msgstr "S'ha desactivat l'autenticació de dos passos"
+
+#: templates/user/edit-profile.html:385
msgid "Enable"
msgstr "Habilita"
-#: templates/user/edit-profile.html:387
+#: templates/user/edit-profile.html:392
msgid "API Token"
msgstr "Token de l'API"
-#: templates/user/edit-profile.html:404
+#: templates/user/edit-profile.html:409
msgid "Security keys"
msgstr "Claus de seguretat"
-#: templates/user/edit-profile.html:414
+#: templates/user/edit-profile.html:419
msgid "Delete"
msgstr "Eliminar"
-#: templates/user/edit-profile.html:421
+#: templates/user/edit-profile.html:426
msgid "Enter a name for this key"
msgstr "Entreu un nom per a aquesta clau"
-#: templates/user/edit-profile.html:422
+#: templates/user/edit-profile.html:427
msgid "Add"
msgstr "Afegir"
-#: templates/user/edit-profile.html:430
+#: templates/user/edit-profile.html:435
msgid "User-script"
msgstr "Script d'usuari"
-#: templates/user/edit-profile.html:434
+#: templates/user/edit-profile.html:439
msgid "Update profile"
msgstr "Actualitzar perfil"
diff --git a/locale/ca/LC_MESSAGES/djangojs.po b/locale/ca/LC_MESSAGES/djangojs.po
index fc9b1f2c52..8b482486c6 100644
--- a/locale/ca/LC_MESSAGES/djangojs.po
+++ b/locale/ca/LC_MESSAGES/djangojs.po
@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: dmoj\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-10-01 23:12+0000\n"
-"PO-Revision-Date: 2021-04-25 00:08\n"
+"PO-Revision-Date: 2021-07-07 00:27\n"
"Last-Translator: \n"
"Language-Team: Catalan\n"
"Language: ca_ES\n"
diff --git a/locale/de/LC_MESSAGES/django.po b/locale/de/LC_MESSAGES/django.po
index c6235c7e02..657420acce 100644
--- a/locale/de/LC_MESSAGES/django.po
+++ b/locale/de/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: dmoj\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-24 19:15+0000\n"
-"PO-Revision-Date: 2021-04-25 00:08\n"
+"POT-Creation-Date: 2021-06-17 01:38+0000\n"
+"PO-Revision-Date: 2021-07-07 00:27\n"
"Last-Translator: \n"
"Language-Team: German\n"
"Language: de_DE\n"
@@ -17,75 +17,75 @@ msgstr ""
"X-Crowdin-File: django.po\n"
"X-Crowdin-File-ID: 10\n"
-#: dmoj/settings.py:364
+#: dmoj/settings.py:365
msgid "Catalan"
msgstr ""
-#: dmoj/settings.py:365
+#: dmoj/settings.py:366
msgid "German"
msgstr "Deutsch"
-#: dmoj/settings.py:366
+#: dmoj/settings.py:367
msgid "English"
msgstr "Englisch"
-#: dmoj/settings.py:367
+#: dmoj/settings.py:368
msgid "Spanish"
msgstr ""
-#: dmoj/settings.py:368
+#: dmoj/settings.py:369
msgid "French"
msgstr "Französisch"
-#: dmoj/settings.py:369
+#: dmoj/settings.py:370
msgid "Croatian"
msgstr ""
-#: dmoj/settings.py:370
+#: dmoj/settings.py:371
msgid "Hungarian"
msgstr ""
-#: dmoj/settings.py:371
+#: dmoj/settings.py:372
msgid "Japanese"
msgstr ""
-#: dmoj/settings.py:372
+#: dmoj/settings.py:373
msgid "Korean"
msgstr ""
-#: dmoj/settings.py:373
+#: dmoj/settings.py:374
msgid "Brazilian Portuguese"
msgstr ""
-#: dmoj/settings.py:374
+#: dmoj/settings.py:375
msgid "Romanian"
msgstr "Rumänisch"
-#: dmoj/settings.py:375
+#: dmoj/settings.py:376
msgid "Russian"
msgstr "Russisch"
-#: dmoj/settings.py:376
+#: dmoj/settings.py:377
msgid "Serbian (Latin)"
msgstr ""
-#: dmoj/settings.py:377
+#: dmoj/settings.py:378
msgid "Turkish"
msgstr ""
-#: dmoj/settings.py:378
+#: dmoj/settings.py:379
msgid "Vietnamese"
msgstr ""
-#: dmoj/settings.py:379
+#: dmoj/settings.py:380
msgid "Simplified Chinese"
msgstr "Chinesisch (vereinfacht)"
-#: dmoj/settings.py:380
+#: dmoj/settings.py:381
msgid "Traditional Chinese"
msgstr ""
-#: dmoj/urls.py:103 templates/base.html:190
+#: dmoj/urls.py:104 templates/base.html:190
msgid "Home"
msgstr ""
@@ -115,112 +115,112 @@ msgstr ""
msgid "Associated page"
msgstr ""
-#: judge/admin/contest.py:31
+#: judge/admin/contest.py:32
msgid "Included contests"
msgstr ""
-#: judge/admin/contest.py:65 templates/contest/contest.html:83
+#: judge/admin/contest.py:66 templates/contest/contest.html:83
#: templates/contest/moss.html:43 templates/problem/list.html:204
#: templates/problem/list.html:219 templates/user/user-problems.html:58
#: templates/user/user-problems.html:100
msgid "Problem"
msgstr ""
-#: judge/admin/contest.py:114
+#: judge/admin/contest.py:117
msgid "Settings"
msgstr ""
-#: judge/admin/contest.py:116
+#: judge/admin/contest.py:120
msgid "Scheduling"
msgstr ""
-#: judge/admin/contest.py:117
+#: judge/admin/contest.py:121
msgid "Details"
msgstr ""
-#: judge/admin/contest.py:118
+#: judge/admin/contest.py:122
msgid "Format"
msgstr ""
-#: judge/admin/contest.py:119 templates/contest/ranking-table.html:5
+#: judge/admin/contest.py:123 templates/contest/ranking-table.html:5
msgid "Rating"
msgstr ""
-#: judge/admin/contest.py:120
+#: judge/admin/contest.py:124
msgid "Access"
msgstr ""
-#: judge/admin/contest.py:122 judge/admin/problem.py:134
+#: judge/admin/contest.py:126 judge/admin/problem.py:135
msgid "Justice"
msgstr ""
-#: judge/admin/contest.py:211
+#: judge/admin/contest.py:215
#, python-format
msgid "%d contest successfully marked as visible."
msgid_plural "%d contests successfully marked as visible."
msgstr[0] ""
msgstr[1] ""
-#: judge/admin/contest.py:214
+#: judge/admin/contest.py:218
msgid "Mark contests as visible"
msgstr ""
-#: judge/admin/contest.py:220
+#: judge/admin/contest.py:224
#, python-format
msgid "%d contest successfully marked as hidden."
msgid_plural "%d contests successfully marked as hidden."
msgstr[0] ""
msgstr[1] ""
-#: judge/admin/contest.py:223
+#: judge/admin/contest.py:227
msgid "Mark contests as hidden"
msgstr ""
-#: judge/admin/contest.py:229
+#: judge/admin/contest.py:233
#, python-format
msgid "%d contest successfully locked."
msgid_plural "%d contests successfully locked."
msgstr[0] ""
msgstr[1] ""
-#: judge/admin/contest.py:232
+#: judge/admin/contest.py:236
msgid "Lock contest submissions"
msgstr ""
-#: judge/admin/contest.py:238
+#: judge/admin/contest.py:242
#, python-format
msgid "%d contest successfully unlocked."
msgid_plural "%d contests successfully unlocked."
msgstr[0] ""
msgstr[1] ""
-#: judge/admin/contest.py:241
+#: judge/admin/contest.py:245
msgid "Unlock contest submissions"
msgstr ""
-#: judge/admin/contest.py:262 judge/admin/submission.py:170
+#: judge/admin/contest.py:266 judge/admin/submission.py:170
#, python-format
msgid "%d submission was successfully scheduled for rejudging."
msgid_plural "%d submissions were successfully scheduled for rejudging."
msgstr[0] ""
msgstr[1] ""
-#: judge/admin/contest.py:337
+#: judge/admin/contest.py:341
#, python-format
msgid "%d participation recalculated."
msgid_plural "%d participations recalculated."
msgstr[0] ""
msgstr[1] ""
-#: judge/admin/contest.py:340
+#: judge/admin/contest.py:344
msgid "Recalculate results"
msgstr ""
-#: judge/admin/contest.py:344 judge/admin/organization.py:63
+#: judge/admin/contest.py:348 judge/admin/organization.py:63
msgid "username"
msgstr ""
-#: judge/admin/contest.py:349 templates/base.html:258
+#: judge/admin/contest.py:353 templates/base.html:258
msgid "virtual"
msgstr ""
@@ -236,9 +236,9 @@ msgstr ""
msgid "Summary"
msgstr ""
-#: judge/admin/interface.py:113 judge/models/contest.py:383
-#: judge/models/contest.py:509 judge/models/profile.py:244
-#: judge/models/profile.py:268
+#: judge/admin/interface.py:113 judge/models/contest.py:419
+#: judge/models/contest.py:546 judge/models/profile.py:261
+#: judge/models/profile.py:292
msgid "user"
msgstr ""
@@ -246,8 +246,8 @@ msgstr ""
msgid "object"
msgstr ""
-#: judge/admin/organization.py:32 judge/admin/problem.py:181
-#: judge/admin/profile.py:82
+#: judge/admin/organization.py:32 judge/admin/problem.py:182
+#: judge/admin/profile.py:92
msgid "View on site"
msgstr ""
@@ -255,69 +255,69 @@ msgstr ""
msgid "Describe the changes you made (optional)"
msgstr ""
-#: judge/admin/problem.py:129
+#: judge/admin/problem.py:130
msgid "Social Media"
msgstr ""
-#: judge/admin/problem.py:130
+#: judge/admin/problem.py:131
msgid "Taxonomy"
msgstr "Systematik"
-#: judge/admin/problem.py:131 templates/contest/contest.html:84
+#: judge/admin/problem.py:132 templates/contest/contest.html:84
#: templates/problem/data.html:385 templates/problem/list.html:209
#: templates/problem/list.html:230 templates/user/base-users-table.html:10
#: templates/user/user-problems.html:60
msgid "Points"
msgstr ""
-#: judge/admin/problem.py:132
+#: judge/admin/problem.py:133
msgid "Limits"
msgstr "Grenzen"
-#: judge/admin/problem.py:133 judge/admin/submission.py:238
-#: templates/stats/base.html:14 templates/submission/list.html:320
-#: templates/user/edit-profile.html:292
+#: judge/admin/problem.py:134 judge/admin/submission.py:238
+#: templates/stats/base.html:14 templates/submission/list.html:319
+#: templates/user/edit-profile.html:296
msgid "Language"
msgstr "Programmiersprache"
-#: judge/admin/problem.py:135
+#: judge/admin/problem.py:136
msgid "History"
msgstr ""
-#: judge/admin/problem.py:178
+#: judge/admin/problem.py:179
msgid "Authors"
msgstr "Autoren"
-#: judge/admin/problem.py:191
+#: judge/admin/problem.py:192
#, python-format
msgid "%d problem's publish date successfully updated."
msgid_plural "%d problems' publish date successfully updated."
msgstr[0] ""
msgstr[1] ""
-#: judge/admin/problem.py:195
+#: judge/admin/problem.py:196
msgid "Set publish date to now"
msgstr ""
-#: judge/admin/problem.py:201
+#: judge/admin/problem.py:202
#, python-format
msgid "%d problem successfully marked as public."
msgid_plural "%d problems successfully marked as public."
msgstr[0] ""
msgstr[1] ""
-#: judge/admin/problem.py:205
+#: judge/admin/problem.py:206
msgid "Mark problems as public"
msgstr ""
-#: judge/admin/problem.py:211
+#: judge/admin/problem.py:212
#, python-format
msgid "%d problem successfully marked as private."
msgid_plural "%d problems successfully marked as private."
msgstr[0] ""
msgstr[1] ""
-#: judge/admin/problem.py:215
+#: judge/admin/problem.py:216
msgid "Mark problems as private"
msgstr ""
@@ -325,35 +325,35 @@ msgstr ""
msgid "timezone"
msgstr ""
-#: judge/admin/profile.py:88 judge/admin/submission.py:217
+#: judge/admin/profile.py:98 judge/admin/submission.py:217
#: templates/organization/requests/log.html:9
#: templates/organization/requests/pending.html:12
#: templates/ticket/list.html:261
msgid "User"
msgstr ""
-#: judge/admin/profile.py:93 templates/registration/registration_form.html:143
+#: judge/admin/profile.py:103 templates/registration/registration_form.html:143
msgid "Email"
msgstr ""
-#: judge/admin/profile.py:98 judge/views/register.py:29
+#: judge/admin/profile.py:108 judge/views/register.py:28
#: templates/registration/registration_form.html:171
-#: templates/user/edit-profile.html:288
+#: templates/user/edit-profile.html:292
msgid "Timezone"
msgstr ""
-#: judge/admin/profile.py:103
+#: judge/admin/profile.py:113
msgid "date joined"
msgstr ""
-#: judge/admin/profile.py:110
+#: judge/admin/profile.py:120
#, python-format
msgid "%d user have scores recalculated."
msgid_plural "%d users have scores recalculated."
msgstr[0] ""
msgstr[1] ""
-#: judge/admin/profile.py:113
+#: judge/admin/profile.py:123
msgid "Recalculate scores"
msgstr ""
@@ -506,115 +506,116 @@ msgstr ""
msgid "IOI (pre-2016)"
msgstr ""
-#: judge/forms.py:26
-msgid "Two-factor authentication tokens must be 6 decimal digits."
+#: judge/forms.py:27
+#, python-brace-format
+msgid "Two-factor authentication tokens must be {TOTP_CODE_LENGTH} decimal digits."
msgstr ""
-#: judge/forms.py:29
+#: judge/forms.py:30
msgid "Invalid two-factor authentication token."
msgstr ""
-#: judge/forms.py:32
+#: judge/forms.py:33
msgid "Scratch codes must be 16 base32 characters."
msgstr ""
-#: judge/forms.py:34
+#: judge/forms.py:35 judge/forms.py:264
msgid "Invalid scratch code."
msgstr ""
-#: judge/forms.py:45
+#: judge/forms.py:46
msgid "Subscribe to contest updates"
msgstr ""
-#: judge/forms.py:46
+#: judge/forms.py:47
msgid "Enable experimental features"
msgstr ""
-#: judge/forms.py:71
+#: judge/forms.py:72
msgid "You must solve at least one problem before you can update your profile."
msgstr ""
-#: judge/forms.py:80 judge/views/organization.py:127
+#: judge/forms.py:81 judge/views/organization.py:126
#, python-brace-format
msgid "You may not be part of more than {count} public organizations."
msgstr ""
-#: judge/forms.py:96
+#: judge/forms.py:97
msgid "Download comments?"
msgstr ""
-#: judge/forms.py:97
+#: judge/forms.py:98
msgid "Download submissions?"
msgstr ""
-#: judge/forms.py:98
+#: judge/forms.py:99
msgid "Filter by problem code glob:"
msgstr ""
-#: judge/forms.py:102
+#: judge/forms.py:103
msgid "Leave empty to include all submissions"
msgstr ""
-#: judge/forms.py:105 templates/problem/manage_submission.html:142
+#: judge/forms.py:106 templates/problem/manage_submission.html:142
msgid "Filter by result:"
msgstr ""
-#: judge/forms.py:111
+#: judge/forms.py:112
msgid "Please select at least one thing to download."
msgstr ""
-#: judge/forms.py:137
+#: judge/forms.py:138
msgid "Any judge"
msgstr ""
-#: judge/forms.py:167 judge/views/register.py:26
+#: judge/forms.py:159 judge/views/register.py:25
#: templates/registration/registration_form.html:137
#: templates/user/base-users-table.html:5
msgid "Username"
msgstr ""
-#: judge/forms.py:168 templates/registration/registration_form.html:149
+#: judge/forms.py:160 templates/registration/registration_form.html:149
#: templates/registration/registration_form.html:163
msgid "Password"
msgstr ""
-#: judge/forms.py:201
+#: judge/forms.py:192
msgid "Invalid code length."
msgstr ""
-#: judge/forms.py:219
+#: judge/forms.py:223
msgid "Invalid WebAuthn response."
msgstr ""
-#: judge/forms.py:222
+#: judge/forms.py:226
msgid "No WebAuthn challenge issued."
msgstr ""
-#: judge/forms.py:228
+#: judge/forms.py:232
msgid "Invalid WebAuthn credential ID."
msgstr ""
-#: judge/forms.py:257
+#: judge/forms.py:262
msgid "Invalid two-factor authentication token or scratch code."
msgstr ""
-#: judge/forms.py:259
+#: judge/forms.py:266
msgid "Must specify either totp_token or webauthn_response."
msgstr ""
-#: judge/forms.py:263 judge/models/problem.py:105
+#: judge/forms.py:270 judge/models/problem.py:119
msgid "Problem code must be ^[a-z0-9]+$"
msgstr ""
-#: judge/forms.py:268
+#: judge/forms.py:275
msgid "Problem with code already exists."
msgstr ""
-#: judge/forms.py:273 judge/models/contest.py:66
+#: judge/forms.py:280 judge/models/contest.py:66
msgid "Contest id must be ^[a-z0-9]+$"
msgstr ""
-#: judge/forms.py:278
+#: judge/forms.py:285
msgid "Contest with key already exists."
msgstr ""
@@ -694,7 +695,7 @@ msgid "comments"
msgstr ""
#: judge/models/comment.py:89 judge/models/comment.py:141
-#: judge/models/problem.py:484
+#: judge/models/problem.py:511
#, python-format
msgid "Editorial for %s"
msgstr ""
@@ -735,7 +736,7 @@ msgstr ""
msgid "contest tag"
msgstr ""
-#: judge/models/contest.py:53 judge/models/contest.py:117
+#: judge/models/contest.py:53 judge/models/contest.py:126
msgid "contest tags"
msgstr ""
@@ -760,410 +761,426 @@ msgid "contest name"
msgstr ""
#: judge/models/contest.py:68
-msgid "These people will be able to edit the contest."
+msgid "These users will be able to edit the contest."
msgstr ""
-#: judge/models/contest.py:70 judge/models/runtime.py:136
+#: judge/models/contest.py:70
+msgid "These users will be able to edit the contest, but will not be listed as authors."
+msgstr ""
+
+#: judge/models/contest.py:73
+msgid "These users will be able to view the contest, but not edit it."
+msgstr ""
+
+#: judge/models/contest.py:76 judge/models/runtime.py:136
msgid "description"
msgstr ""
-#: judge/models/contest.py:71 judge/models/problem.py:431
+#: judge/models/contest.py:77 judge/models/problem.py:458
#: judge/models/runtime.py:138
msgid "problems"
msgstr ""
-#: judge/models/contest.py:72 judge/models/contest.py:384
+#: judge/models/contest.py:78 judge/models/contest.py:420
msgid "start time"
msgstr ""
-#: judge/models/contest.py:73
+#: judge/models/contest.py:79
msgid "end time"
msgstr ""
-#: judge/models/contest.py:74 judge/models/problem.py:126
-#: judge/models/problem.py:455
+#: judge/models/contest.py:80 judge/models/problem.py:140
+#: judge/models/problem.py:482
msgid "time limit"
msgstr ""
-#: judge/models/contest.py:75 judge/models/problem.py:144
+#: judge/models/contest.py:81 judge/models/problem.py:158
msgid "publicly visible"
msgstr ""
-#: judge/models/contest.py:76
+#: judge/models/contest.py:82
msgid "Should be set even for organization-private contests, where it determines whether the contest is visible to members of the specified organizations."
msgstr ""
-#: judge/models/contest.py:79
+#: judge/models/contest.py:85
msgid "contest rated"
msgstr ""
-#: judge/models/contest.py:79
+#: judge/models/contest.py:85
msgid "Whether this contest can be rated."
msgstr ""
-#: judge/models/contest.py:81
+#: judge/models/contest.py:87
msgid "view contest scoreboard"
msgstr ""
-#: judge/models/contest.py:83
+#: judge/models/contest.py:89
msgid "These users will be able to view the scoreboard."
msgstr ""
-#: judge/models/contest.py:84
+#: judge/models/contest.py:90
msgid "scoreboard visibility"
msgstr ""
-#: judge/models/contest.py:85
+#: judge/models/contest.py:91
msgid "Scoreboard visibility through the duration of the contest"
msgstr ""
-#: judge/models/contest.py:87
+#: judge/models/contest.py:93
msgid "no comments"
msgstr ""
-#: judge/models/contest.py:88
+#: judge/models/contest.py:94
msgid "Use clarification system instead of comments."
msgstr ""
-#: judge/models/contest.py:90
+#: judge/models/contest.py:96
msgid "Rating floor for contest"
msgstr ""
-#: judge/models/contest.py:92
+#: judge/models/contest.py:98
msgid "Rating ceiling for contest"
msgstr ""
-#: judge/models/contest.py:94
+#: judge/models/contest.py:100
msgid "rate all"
msgstr ""
-#: judge/models/contest.py:94
+#: judge/models/contest.py:100
msgid "Rate all users who joined."
msgstr ""
-#: judge/models/contest.py:95
+#: judge/models/contest.py:101
msgid "exclude from ratings"
msgstr ""
-#: judge/models/contest.py:97
+#: judge/models/contest.py:103
msgid "private to specific users"
msgstr ""
-#: judge/models/contest.py:98
+#: judge/models/contest.py:104
msgid "private contestants"
msgstr ""
-#: judge/models/contest.py:99
+#: judge/models/contest.py:105
msgid "If private, only these users may see the contest"
msgstr ""
-#: judge/models/contest.py:101
+#: judge/models/contest.py:107
msgid "hide problem tags"
msgstr ""
-#: judge/models/contest.py:102
+#: judge/models/contest.py:108
msgid "Whether problem tags should be hidden by default."
msgstr ""
-#: judge/models/contest.py:104
+#: judge/models/contest.py:110
+msgid "hide problem authors"
+msgstr ""
+
+#: judge/models/contest.py:111
+msgid "Whether problem authors should be hidden by default."
+msgstr ""
+
+#: judge/models/contest.py:113
msgid "run pretests only"
msgstr ""
-#: judge/models/contest.py:105
+#: judge/models/contest.py:114
msgid "Whether judges should grade pretests only, versus all testcases. Commonly set during a contest, then unset prior to rejudging user submissions when the contest ends."
msgstr ""
-#: judge/models/contest.py:109 judge/models/problem.py:166
+#: judge/models/contest.py:118 judge/models/problem.py:183
msgid "private to organizations"
msgstr ""
-#: judge/models/contest.py:110 judge/models/problem.py:164
-#: judge/models/profile.py:83
+#: judge/models/contest.py:119 judge/models/problem.py:181
+#: judge/models/profile.py:86
msgid "organizations"
msgstr ""
-#: judge/models/contest.py:111
+#: judge/models/contest.py:120
msgid "If private, only these organizations may see the contest"
msgstr ""
-#: judge/models/contest.py:112 judge/models/problem.py:153
+#: judge/models/contest.py:121 judge/models/problem.py:167
msgid "OpenGraph image"
msgstr ""
-#: judge/models/contest.py:113 judge/models/profile.py:54
+#: judge/models/contest.py:122 judge/models/profile.py:57
msgid "Logo override image"
msgstr ""
-#: judge/models/contest.py:115
+#: judge/models/contest.py:124
msgid "This image will replace the default site logo for users inside the contest."
msgstr ""
-#: judge/models/contest.py:118
+#: judge/models/contest.py:127
msgid "the amount of live participants"
msgstr ""
-#: judge/models/contest.py:119
+#: judge/models/contest.py:128
msgid "contest summary"
msgstr ""
-#: judge/models/contest.py:120 judge/models/problem.py:155
+#: judge/models/contest.py:129 judge/models/problem.py:169
msgid "Plain-text, shown in meta description tag, e.g. for social media."
msgstr ""
-#: judge/models/contest.py:121 judge/models/profile.py:53
+#: judge/models/contest.py:130 judge/models/profile.py:56
msgid "access code"
msgstr ""
-#: judge/models/contest.py:122
+#: judge/models/contest.py:131
msgid "An optional code to prompt contestants before they are allowed to join the contest. Leave it blank to disable."
msgstr ""
-#: judge/models/contest.py:124 judge/models/problem.py:149
+#: judge/models/contest.py:133 judge/models/problem.py:163
msgid "personae non gratae"
msgstr ""
-#: judge/models/contest.py:125
+#: judge/models/contest.py:134
msgid "Bans the selected users from joining this contest."
msgstr ""
-#: judge/models/contest.py:126
+#: judge/models/contest.py:135
msgid "contest format"
msgstr ""
-#: judge/models/contest.py:127
+#: judge/models/contest.py:136
msgid "The contest format module to use."
msgstr ""
-#: judge/models/contest.py:128
+#: judge/models/contest.py:137
msgid "contest format configuration"
msgstr ""
-#: judge/models/contest.py:129
+#: judge/models/contest.py:138
msgid "A JSON object to serve as the configuration for the chosen contest format module. Leave empty to use None. Exact format depends on the contest format selected."
msgstr ""
-#: judge/models/contest.py:136
+#: judge/models/contest.py:145
msgid "contest lock"
msgstr ""
-#: judge/models/contest.py:137
-msgid "Prevent submissions from this contest from being rejudged."
+#: judge/models/contest.py:146
+msgid "Prevent submissions from this contest from being rejudged after this date."
msgstr ""
-#: judge/models/contest.py:138
+#: judge/models/contest.py:148
msgid "precision points"
msgstr ""
-#: judge/models/contest.py:140
+#: judge/models/contest.py:150
msgid "Number of digits to round points to."
msgstr ""
-#: judge/models/contest.py:362
+#: judge/models/contest.py:398
msgid "See private contests"
msgstr ""
-#: judge/models/contest.py:363
+#: judge/models/contest.py:399
msgid "Edit own contests"
msgstr ""
-#: judge/models/contest.py:364
+#: judge/models/contest.py:400
msgid "Edit all contests"
msgstr ""
-#: judge/models/contest.py:365
+#: judge/models/contest.py:401
msgid "Clone contest"
msgstr ""
-#: judge/models/contest.py:366 templates/contest/moss.html:74
+#: judge/models/contest.py:402 templates/contest/moss.html:74
msgid "MOSS contest"
msgstr ""
-#: judge/models/contest.py:367
+#: judge/models/contest.py:403
msgid "Rate contests"
msgstr ""
-#: judge/models/contest.py:368
+#: judge/models/contest.py:404
msgid "Contest access codes"
msgstr ""
-#: judge/models/contest.py:369
+#: judge/models/contest.py:405
msgid "Create private contests"
msgstr ""
-#: judge/models/contest.py:370
+#: judge/models/contest.py:406
msgid "Change contest visibility"
msgstr ""
-#: judge/models/contest.py:371
+#: judge/models/contest.py:407
msgid "Edit contest problem label script"
msgstr ""
-#: judge/models/contest.py:372
+#: judge/models/contest.py:408
msgid "Change lock status of contest"
msgstr ""
-#: judge/models/contest.py:374 judge/models/contest.py:472
-#: judge/models/contest.py:510 judge/models/contest.py:532
-#: judge/models/submission.py:84
+#: judge/models/contest.py:410 judge/models/contest.py:508
+#: judge/models/contest.py:547 judge/models/contest.py:569
+#: judge/models/submission.py:85
msgid "contest"
msgstr ""
-#: judge/models/contest.py:375
+#: judge/models/contest.py:411
msgid "contests"
msgstr ""
-#: judge/models/contest.py:382
+#: judge/models/contest.py:418
msgid "associated contest"
msgstr ""
-#: judge/models/contest.py:385
+#: judge/models/contest.py:421
msgid "score"
msgstr ""
-#: judge/models/contest.py:386
+#: judge/models/contest.py:422
msgid "cumulative time"
msgstr ""
-#: judge/models/contest.py:387
+#: judge/models/contest.py:423
msgid "is disqualified"
msgstr ""
-#: judge/models/contest.py:388
+#: judge/models/contest.py:424
msgid "Whether this participation is disqualified."
msgstr ""
-#: judge/models/contest.py:389
+#: judge/models/contest.py:425
msgid "tie-breaking field"
msgstr ""
-#: judge/models/contest.py:390
+#: judge/models/contest.py:426
msgid "virtual participation id"
msgstr ""
-#: judge/models/contest.py:391
+#: judge/models/contest.py:427
msgid "0 means non-virtual, otherwise the n-th virtual participation."
msgstr ""
-#: judge/models/contest.py:392
+#: judge/models/contest.py:428
msgid "contest format specific data"
msgstr ""
-#: judge/models/contest.py:458
+#: judge/models/contest.py:494
#, python-format
msgid "%s spectating in %s"
msgstr ""
-#: judge/models/contest.py:460
+#: judge/models/contest.py:496
#, python-format
msgid "%s in %s, v%d"
msgstr ""
-#: judge/models/contest.py:461
+#: judge/models/contest.py:497
#, python-format
msgid "%s in %s"
msgstr ""
-#: judge/models/contest.py:464
+#: judge/models/contest.py:500
msgid "contest participation"
msgstr ""
-#: judge/models/contest.py:465
+#: judge/models/contest.py:501
msgid "contest participations"
msgstr ""
-#: judge/models/contest.py:471 judge/models/contest.py:494
-#: judge/models/contest.py:533 judge/models/problem.py:430
-#: judge/models/problem.py:435 judge/models/problem.py:453
+#: judge/models/contest.py:507 judge/models/contest.py:531
+#: judge/models/contest.py:570 judge/models/problem.py:457
+#: judge/models/problem.py:462 judge/models/problem.py:480
#: judge/models/problem_data.py:35
msgid "problem"
msgstr ""
-#: judge/models/contest.py:473 judge/models/contest.py:498
-#: judge/models/problem.py:137
+#: judge/models/contest.py:509 judge/models/contest.py:535
+#: judge/models/problem.py:151
msgid "points"
msgstr ""
-#: judge/models/contest.py:474
+#: judge/models/contest.py:510
msgid "partial"
msgstr ""
-#: judge/models/contest.py:475 judge/models/contest.py:499
+#: judge/models/contest.py:511 judge/models/contest.py:536
msgid "is pretested"
msgstr ""
-#: judge/models/contest.py:476 judge/models/interface.py:43
+#: judge/models/contest.py:512 judge/models/interface.py:43
msgid "order"
msgstr ""
-#: judge/models/contest.py:477
+#: judge/models/contest.py:513
msgid "output prefix length override"
msgstr ""
-#: judge/models/contest.py:479
+#: judge/models/contest.py:515
msgid "Maximum number of submissions for this problem, or leave blank for no limit."
msgstr ""
-#: judge/models/contest.py:482
+#: judge/models/contest.py:518
msgid "Why include a problem you can't submit to?"
msgstr ""
-#: judge/models/contest.py:487
+#: judge/models/contest.py:523
msgid "contest problem"
msgstr ""
-#: judge/models/contest.py:488
+#: judge/models/contest.py:524
msgid "contest problems"
msgstr ""
-#: judge/models/contest.py:492 judge/models/submission.py:207
+#: judge/models/contest.py:529 judge/models/submission.py:218
msgid "submission"
msgstr ""
-#: judge/models/contest.py:496 judge/models/contest.py:511
+#: judge/models/contest.py:533 judge/models/contest.py:548
msgid "participation"
msgstr ""
-#: judge/models/contest.py:500
+#: judge/models/contest.py:537
msgid "Whether this submission was ran only on pretests."
msgstr ""
-#: judge/models/contest.py:504
+#: judge/models/contest.py:541
msgid "contest submission"
msgstr ""
-#: judge/models/contest.py:505
+#: judge/models/contest.py:542
msgid "contest submissions"
msgstr ""
-#: judge/models/contest.py:513
+#: judge/models/contest.py:550
msgid "rank"
msgstr ""
-#: judge/models/contest.py:514
+#: judge/models/contest.py:551
msgid "rating"
msgstr ""
-#: judge/models/contest.py:515
+#: judge/models/contest.py:552
msgid "volatility"
msgstr ""
-#: judge/models/contest.py:516
+#: judge/models/contest.py:553
msgid "last rated"
msgstr ""
-#: judge/models/contest.py:520
+#: judge/models/contest.py:557
msgid "contest rating"
msgstr ""
-#: judge/models/contest.py:521
+#: judge/models/contest.py:558
msgid "contest ratings"
msgstr ""
-#: judge/models/contest.py:540
+#: judge/models/contest.py:577
msgid "contest moss result"
msgstr ""
-#: judge/models/contest.py:541
+#: judge/models/contest.py:578
msgid "contest moss results"
msgstr ""
@@ -1203,7 +1220,7 @@ msgstr ""
msgid "post title"
msgstr ""
-#: judge/models/interface.py:67 judge/models/problem.py:473
+#: judge/models/interface.py:67 judge/models/problem.py:500
msgid "authors"
msgstr ""
@@ -1211,7 +1228,7 @@ msgstr ""
msgid "slug"
msgstr ""
-#: judge/models/interface.py:69 judge/models/problem.py:471
+#: judge/models/interface.py:69 judge/models/problem.py:498
msgid "public visibility"
msgstr ""
@@ -1247,34 +1264,6 @@ msgstr ""
msgid "blog posts"
msgstr ""
-#: judge/models/message.py:11
-msgid "message title"
-msgstr ""
-
-#: judge/models/message.py:12 judge/models/ticket.py:30
-msgid "message body"
-msgstr ""
-
-#: judge/models/message.py:13
-msgid "sender"
-msgstr ""
-
-#: judge/models/message.py:14
-msgid "target"
-msgstr ""
-
-#: judge/models/message.py:15
-msgid "message timestamp"
-msgstr ""
-
-#: judge/models/message.py:16
-msgid "read"
-msgstr ""
-
-#: judge/models/message.py:20
-msgid "messages in the thread"
-msgstr ""
-
#: judge/models/problem.py:30
#, python-format
msgid "Disallowed characters: %(value)s"
@@ -1292,7 +1281,7 @@ msgstr ""
msgid "problem type"
msgstr ""
-#: judge/models/problem.py:44 judge/models/problem.py:121
+#: judge/models/problem.py:44 judge/models/problem.py:135
msgid "problem types"
msgstr ""
@@ -1304,7 +1293,7 @@ msgstr ""
msgid "problem group name"
msgstr ""
-#: judge/models/problem.py:56 judge/models/problem.py:124
+#: judge/models/problem.py:56 judge/models/problem.py:138
msgid "problem group"
msgstr ""
@@ -1324,7 +1313,7 @@ msgstr ""
msgid "full name"
msgstr ""
-#: judge/models/problem.py:65 judge/models/profile.py:41
+#: judge/models/problem.py:65 judge/models/profile.py:44
#: judge/models/runtime.py:24
msgid "short name"
msgstr ""
@@ -1353,232 +1342,252 @@ msgstr ""
msgid "licenses"
msgstr ""
-#: judge/models/problem.py:104
+#: judge/models/problem.py:112
+msgid "Follow global setting"
+msgstr ""
+
+#: judge/models/problem.py:113
+msgid "Always visible"
+msgstr ""
+
+#: judge/models/problem.py:114
+msgid "Visible if problem solved"
+msgstr ""
+
+#: judge/models/problem.py:115
+msgid "Only own submissions"
+msgstr ""
+
+#: judge/models/problem.py:118
msgid "problem code"
msgstr ""
-#: judge/models/problem.py:106
+#: judge/models/problem.py:120
msgid "A short, unique code for the problem, used in the url after /problem/"
msgstr ""
-#: judge/models/problem.py:108
+#: judge/models/problem.py:122
msgid "problem name"
msgstr ""
-#: judge/models/problem.py:109
+#: judge/models/problem.py:123
msgid "The full name of the problem, as shown in the problem list."
msgstr ""
-#: judge/models/problem.py:111
+#: judge/models/problem.py:125
msgid "problem body"
msgstr ""
-#: judge/models/problem.py:112
+#: judge/models/problem.py:126
msgid "creators"
msgstr ""
-#: judge/models/problem.py:113
+#: judge/models/problem.py:127
msgid "These users will be able to edit the problem, and be listed as authors."
msgstr ""
-#: judge/models/problem.py:115
+#: judge/models/problem.py:129
msgid "curators"
msgstr ""
-#: judge/models/problem.py:116
+#: judge/models/problem.py:130
msgid "These users will be able to edit the problem, but not be listed as authors."
msgstr ""
-#: judge/models/problem.py:118
+#: judge/models/problem.py:132
msgid "testers"
msgstr ""
-#: judge/models/problem.py:120
+#: judge/models/problem.py:134
msgid "These users will be able to view the private problem, but not edit it."
msgstr ""
-#: judge/models/problem.py:122
+#: judge/models/problem.py:136
msgid "The type of problem, as shown on the problem's page."
msgstr ""
-#: judge/models/problem.py:125
+#: judge/models/problem.py:139
msgid "The group of problem, shown under Category in the problem list."
msgstr ""
-#: judge/models/problem.py:127
+#: judge/models/problem.py:141
msgid "The time limit for this problem, in seconds. Fractional seconds (e.g. 1.5) are supported."
msgstr ""
-#: judge/models/problem.py:131 judge/models/problem.py:458
+#: judge/models/problem.py:145 judge/models/problem.py:485
msgid "memory limit"
msgstr ""
-#: judge/models/problem.py:132
+#: judge/models/problem.py:146
msgid "The memory limit for this problem, in kilobytes (e.g. 64mb = 65536 kilobytes)."
msgstr ""
-#: judge/models/problem.py:138
+#: judge/models/problem.py:152
msgid "Points awarded for problem completion. Points are displayed with a 'p' suffix if partial."
msgstr ""
-#: judge/models/problem.py:141
+#: judge/models/problem.py:155
msgid "allows partial points"
msgstr ""
-#: judge/models/problem.py:142
+#: judge/models/problem.py:156
msgid "allowed languages"
msgstr ""
-#: judge/models/problem.py:143
+#: judge/models/problem.py:157
msgid "List of allowed submission languages."
msgstr ""
-#: judge/models/problem.py:145
+#: judge/models/problem.py:159
msgid "manually managed"
msgstr ""
-#: judge/models/problem.py:146
+#: judge/models/problem.py:160
msgid "Whether judges should be allowed to manage data or not."
msgstr ""
-#: judge/models/problem.py:147
+#: judge/models/problem.py:161
msgid "date of publishing"
msgstr ""
-#: judge/models/problem.py:148
+#: judge/models/problem.py:162
msgid "Doesn't have magic ability to auto-publish due to backward compatibility"
msgstr ""
-#: judge/models/problem.py:150
+#: judge/models/problem.py:164
msgid "Bans the selected users from submitting to this problem."
msgstr ""
-#: judge/models/problem.py:152
+#: judge/models/problem.py:166
msgid "The license under which this problem is published."
msgstr ""
-#: judge/models/problem.py:154
+#: judge/models/problem.py:168
msgid "problem summary"
msgstr ""
-#: judge/models/problem.py:156
+#: judge/models/problem.py:170
msgid "number of users"
msgstr ""
-#: judge/models/problem.py:157
+#: judge/models/problem.py:171
msgid "The number of users who solved the problem."
msgstr ""
-#: judge/models/problem.py:158
+#: judge/models/problem.py:172
msgid "solve rate"
msgstr ""
-#: judge/models/problem.py:159
+#: judge/models/problem.py:173
msgid "allow full markdown access"
msgstr ""
-#: judge/models/problem.py:165
+#: judge/models/problem.py:174
+msgid "submission source visibility"
+msgstr ""
+
+#: judge/models/problem.py:182
msgid "If private, only these organizations may see the problem."
msgstr ""
-#: judge/models/problem.py:420
+#: judge/models/problem.py:447
msgid "See hidden problems"
msgstr ""
-#: judge/models/problem.py:421
+#: judge/models/problem.py:448
msgid "Edit own problems"
msgstr ""
-#: judge/models/problem.py:422
+#: judge/models/problem.py:449
msgid "Edit all problems"
msgstr ""
-#: judge/models/problem.py:423
+#: judge/models/problem.py:450
msgid "Edit all public problems"
msgstr ""
-#: judge/models/problem.py:424
+#: judge/models/problem.py:451
msgid "Edit problems with full markup"
msgstr ""
-#: judge/models/problem.py:425 templates/problem/problem.html:161
+#: judge/models/problem.py:452 templates/problem/problem.html:161
msgid "Clone problem"
msgstr ""
-#: judge/models/problem.py:426
+#: judge/models/problem.py:453
msgid "Change is_public field"
msgstr ""
-#: judge/models/problem.py:427
+#: judge/models/problem.py:454
msgid "Change is_manually_managed field"
msgstr ""
-#: judge/models/problem.py:428
+#: judge/models/problem.py:455
msgid "See organization-private problems"
msgstr ""
-#: judge/models/problem.py:436 judge/models/problem.py:454
+#: judge/models/problem.py:463 judge/models/problem.py:481
#: judge/models/runtime.py:111
msgid "language"
msgstr ""
-#: judge/models/problem.py:437
+#: judge/models/problem.py:464
msgid "translated name"
msgstr ""
-#: judge/models/problem.py:438
+#: judge/models/problem.py:465
msgid "translated description"
msgstr ""
-#: judge/models/problem.py:442
+#: judge/models/problem.py:469
msgid "problem translation"
msgstr ""
-#: judge/models/problem.py:443
+#: judge/models/problem.py:470
msgid "problem translations"
msgstr ""
-#: judge/models/problem.py:447
+#: judge/models/problem.py:474
msgid "clarified problem"
msgstr ""
-#: judge/models/problem.py:448
+#: judge/models/problem.py:475
msgid "clarification body"
msgstr ""
-#: judge/models/problem.py:449
+#: judge/models/problem.py:476
msgid "clarification timestamp"
msgstr ""
-#: judge/models/problem.py:464
+#: judge/models/problem.py:491
msgid "language-specific resource limit"
msgstr ""
-#: judge/models/problem.py:465
+#: judge/models/problem.py:492
msgid "language-specific resource limits"
msgstr ""
-#: judge/models/problem.py:469
+#: judge/models/problem.py:496
msgid "associated problem"
msgstr ""
-#: judge/models/problem.py:472
+#: judge/models/problem.py:499
msgid "publish date"
msgstr ""
-#: judge/models/problem.py:474
+#: judge/models/problem.py:501
msgid "editorial content"
msgstr ""
-#: judge/models/problem.py:497
+#: judge/models/problem.py:524
msgid "See hidden solutions"
msgstr ""
-#: judge/models/problem.py:499
+#: judge/models/problem.py:526
msgid "solution"
msgstr ""
-#: judge/models/problem.py:500
+#: judge/models/problem.py:527
msgid "solutions"
msgstr ""
@@ -1690,112 +1699,112 @@ msgstr ""
msgid "case is pretest?"
msgstr ""
-#: judge/models/profile.py:38
+#: judge/models/profile.py:41
msgid "organization title"
msgstr ""
-#: judge/models/profile.py:39
+#: judge/models/profile.py:42
msgid "organization slug"
msgstr ""
-#: judge/models/profile.py:40
+#: judge/models/profile.py:43
msgid "Organization name shown in URL"
msgstr ""
-#: judge/models/profile.py:42
+#: judge/models/profile.py:45
msgid "Displayed beside user name during contests"
msgstr ""
-#: judge/models/profile.py:43
+#: judge/models/profile.py:46
msgid "organization description"
msgstr ""
-#: judge/models/profile.py:44
+#: judge/models/profile.py:47
msgid "administrators"
msgstr ""
-#: judge/models/profile.py:45
+#: judge/models/profile.py:48
msgid "Those who can edit this organization"
msgstr ""
-#: judge/models/profile.py:46
+#: judge/models/profile.py:49
msgid "creation date"
msgstr ""
-#: judge/models/profile.py:47
+#: judge/models/profile.py:50
msgid "is open organization?"
msgstr ""
-#: judge/models/profile.py:48
+#: judge/models/profile.py:51
msgid "Allow joining organization"
msgstr ""
-#: judge/models/profile.py:49
+#: judge/models/profile.py:52
msgid "maximum size"
msgstr ""
-#: judge/models/profile.py:50
+#: judge/models/profile.py:53
msgid "Maximum amount of users in this organization, only applicable to private organizations"
msgstr ""
-#: judge/models/profile.py:52
+#: judge/models/profile.py:55
msgid "Student access code"
msgstr ""
-#: judge/models/profile.py:56
+#: judge/models/profile.py:59
msgid "This image will replace the default site logo for users viewing the organization."
msgstr ""
-#: judge/models/profile.py:79
+#: judge/models/profile.py:82
msgid "Administer organizations"
msgstr ""
-#: judge/models/profile.py:80
+#: judge/models/profile.py:83
msgid "Edit all organizations"
msgstr ""
-#: judge/models/profile.py:82 judge/models/profile.py:99
-#: judge/models/profile.py:269
+#: judge/models/profile.py:85 judge/models/profile.py:102
+#: judge/models/profile.py:293
msgid "organization"
msgstr ""
-#: judge/models/profile.py:87
+#: judge/models/profile.py:90
msgid "user associated"
msgstr ""
-#: judge/models/profile.py:88
+#: judge/models/profile.py:91
msgid "self-description"
msgstr ""
-#: judge/models/profile.py:89
+#: judge/models/profile.py:92
msgid "location"
msgstr ""
-#: judge/models/profile.py:91
+#: judge/models/profile.py:94
msgid "preferred language"
msgstr ""
-#: judge/models/profile.py:97
+#: judge/models/profile.py:100
msgid "last access time"
msgstr ""
-#: judge/models/profile.py:98
+#: judge/models/profile.py:101
msgid "last IP"
msgstr ""
-#: judge/models/profile.py:101
+#: judge/models/profile.py:104
msgid "display rank"
msgstr ""
-#: judge/models/profile.py:103
+#: judge/models/profile.py:106
msgid "Normal User"
msgstr ""
-#: judge/models/profile.py:104
+#: judge/models/profile.py:107
msgid "Problem Setter"
msgstr ""
-#: judge/models/profile.py:105 templates/base.html:220
+#: judge/models/profile.py:108 templates/base.html:220
#: templates/comments/list.html:99 templates/contest/contest-list-tabs.html:24
#: templates/contest/ranking-table.html:49
#: templates/problem/problem-list-tabs.html:6
@@ -1804,155 +1813,167 @@ msgstr ""
msgid "Admin"
msgstr ""
-#: judge/models/profile.py:106
+#: judge/models/profile.py:109
msgid "comment mute"
msgstr ""
-#: judge/models/profile.py:106
+#: judge/models/profile.py:109
msgid "Some users are at their best when silent."
msgstr ""
-#: judge/models/profile.py:108
+#: judge/models/profile.py:111
msgid "unlisted user"
msgstr ""
-#: judge/models/profile.py:108
+#: judge/models/profile.py:111
msgid "User will not be ranked."
msgstr ""
-#: judge/models/profile.py:111
+#: judge/models/profile.py:114
msgid "user script"
msgstr ""
-#: judge/models/profile.py:112
+#: judge/models/profile.py:115
msgid "User-defined JavaScript for site customization."
msgstr ""
-#: judge/models/profile.py:113
+#: judge/models/profile.py:116
msgid "current contest"
msgstr ""
-#: judge/models/profile.py:115
+#: judge/models/profile.py:118
msgid "math engine"
msgstr ""
-#: judge/models/profile.py:117
+#: judge/models/profile.py:120
msgid "the rendering engine used to render math"
msgstr ""
-#: judge/models/profile.py:118
+#: judge/models/profile.py:121
msgid "TOTP 2FA enabled"
msgstr ""
-#: judge/models/profile.py:119
+#: judge/models/profile.py:122
msgid "check to enable TOTP-based two-factor authentication"
msgstr ""
-#: judge/models/profile.py:120
+#: judge/models/profile.py:123
msgid "WebAuthn 2FA enabled"
msgstr ""
-#: judge/models/profile.py:121
+#: judge/models/profile.py:124
msgid "check to enable WebAuthn-based two-factor authentication"
msgstr ""
-#: judge/models/profile.py:122
+#: judge/models/profile.py:125
msgid "TOTP key"
msgstr ""
-#: judge/models/profile.py:123
+#: judge/models/profile.py:126
msgid "32 character base32-encoded key for TOTP"
msgstr ""
-#: judge/models/profile.py:125
+#: judge/models/profile.py:128
msgid "TOTP key must be empty or base32"
msgstr ""
-#: judge/models/profile.py:126
+#: judge/models/profile.py:129
msgid "scratch codes"
msgstr ""
-#: judge/models/profile.py:127
+#: judge/models/profile.py:130
msgid "JSON array of 16 character base32-encoded codes for scratch codes"
msgstr ""
-#: judge/models/profile.py:131
+#: judge/models/profile.py:134
msgid "Scratch codes must be empty or a JSON array of 16-character base32 codes"
msgstr ""
-#: judge/models/profile.py:133
+#: judge/models/profile.py:136
+msgid "last TOTP timecode"
+msgstr ""
+
+#: judge/models/profile.py:137
msgid "API token"
msgstr ""
-#: judge/models/profile.py:134
+#: judge/models/profile.py:138
msgid "64 character hex-encoded API access token"
msgstr ""
-#: judge/models/profile.py:136
+#: judge/models/profile.py:140
msgid "API token must be None or hexadecimal"
msgstr ""
-#: judge/models/profile.py:137
+#: judge/models/profile.py:141
msgid "internal notes"
msgstr ""
-#: judge/models/profile.py:138
+#: judge/models/profile.py:142
msgid "Notes for administrators regarding this user."
msgstr ""
-#: judge/models/profile.py:139
+#: judge/models/profile.py:143
msgid "last data download time"
msgstr ""
-#: judge/models/profile.py:236
+#: judge/models/profile.py:253
msgid "Shows in-progress development stuff"
msgstr ""
-#: judge/models/profile.py:237
+#: judge/models/profile.py:254
msgid "Edit TOTP settings"
msgstr ""
-#: judge/models/profile.py:239
+#: judge/models/profile.py:256
msgid "user profile"
msgstr ""
-#: judge/models/profile.py:240
+#: judge/models/profile.py:257
msgid "user profiles"
msgstr ""
-#: judge/models/profile.py:246
+#: judge/models/profile.py:263
msgid "device name"
msgstr ""
-#: judge/models/profile.py:247
+#: judge/models/profile.py:264
msgid "credential ID"
msgstr ""
-#: judge/models/profile.py:248
+#: judge/models/profile.py:265
msgid "public key"
msgstr ""
-#: judge/models/profile.py:249
+#: judge/models/profile.py:266
msgid "sign counter"
msgstr ""
-#: judge/models/profile.py:271
+#: judge/models/profile.py:287
+msgid "WebAuthn credential"
+msgstr ""
+
+#: judge/models/profile.py:288
+msgid "WebAuthn credentials"
+msgstr ""
+
+#: judge/models/profile.py:295
msgid "request time"
msgstr ""
-#: judge/models/profile.py:272
+#: judge/models/profile.py:296
msgid "state"
msgstr ""
-#: judge/models/profile.py:277
+#: judge/models/profile.py:301
msgid "reason"
msgstr ""
-#: judge/models/profile.py:280
+#: judge/models/profile.py:304
msgid "organization join request"
msgstr ""
-#: judge/models/profile.py:281
+#: judge/models/profile.py:305
msgid "organization join requests"
msgstr ""
@@ -2108,210 +2129,210 @@ msgstr ""
msgid "judge"
msgstr ""
-#: judge/models/submission.py:20 judge/models/submission.py:47
+#: judge/models/submission.py:21 judge/models/submission.py:48
#: judge/utils/problems.py:74
msgid "Accepted"
msgstr ""
-#: judge/models/submission.py:21 judge/models/submission.py:48
+#: judge/models/submission.py:22 judge/models/submission.py:49
msgid "Wrong Answer"
msgstr ""
-#: judge/models/submission.py:22 judge/models/submission.py:50
+#: judge/models/submission.py:23 judge/models/submission.py:51
msgid "Time Limit Exceeded"
msgstr ""
-#: judge/models/submission.py:23 judge/models/submission.py:51
+#: judge/models/submission.py:24 judge/models/submission.py:52
msgid "Memory Limit Exceeded"
msgstr ""
-#: judge/models/submission.py:24 judge/models/submission.py:52
+#: judge/models/submission.py:25 judge/models/submission.py:53
msgid "Output Limit Exceeded"
msgstr ""
-#: judge/models/submission.py:25 judge/models/submission.py:53
+#: judge/models/submission.py:26 judge/models/submission.py:54
msgid "Invalid Return"
msgstr ""
-#: judge/models/submission.py:26 judge/models/submission.py:54
+#: judge/models/submission.py:27 judge/models/submission.py:55
msgid "Runtime Error"
msgstr ""
-#: judge/models/submission.py:27 judge/models/submission.py:41
-#: judge/models/submission.py:55 judge/utils/problems.py:76
+#: judge/models/submission.py:28 judge/models/submission.py:42
+#: judge/models/submission.py:56 judge/utils/problems.py:76
msgid "Compile Error"
msgstr ""
-#: judge/models/submission.py:28 judge/models/submission.py:40
+#: judge/models/submission.py:29 judge/models/submission.py:41
msgid "Internal Error"
msgstr ""
-#: judge/models/submission.py:29
+#: judge/models/submission.py:30
msgid "Short circuit"
msgstr ""
-#: judge/models/submission.py:30 judge/models/submission.py:42
-#: judge/models/submission.py:61
+#: judge/models/submission.py:31 judge/models/submission.py:43
+#: judge/models/submission.py:62
msgid "Aborted"
msgstr ""
-#: judge/models/submission.py:36 judge/models/submission.py:57
+#: judge/models/submission.py:37 judge/models/submission.py:58
msgid "Queued"
msgstr ""
-#: judge/models/submission.py:37 judge/models/submission.py:58
+#: judge/models/submission.py:38 judge/models/submission.py:59
msgid "Processing"
msgstr ""
-#: judge/models/submission.py:38 judge/models/submission.py:59
+#: judge/models/submission.py:39 judge/models/submission.py:60
msgid "Grading"
msgstr ""
-#: judge/models/submission.py:39 judge/models/submission.py:60
+#: judge/models/submission.py:40 judge/models/submission.py:61
msgid "Completed"
msgstr ""
-#: judge/models/submission.py:56
+#: judge/models/submission.py:57
msgid "Internal Error (judging server error)"
msgstr ""
-#: judge/models/submission.py:66
+#: judge/models/submission.py:67
msgid "submission time"
msgstr ""
-#: judge/models/submission.py:67 judge/models/submission.py:227
+#: judge/models/submission.py:68 judge/models/submission.py:238
msgid "execution time"
msgstr ""
-#: judge/models/submission.py:68 judge/models/submission.py:228
+#: judge/models/submission.py:69 judge/models/submission.py:239
msgid "memory usage"
msgstr ""
-#: judge/models/submission.py:69 judge/models/submission.py:229
+#: judge/models/submission.py:70 judge/models/submission.py:240
msgid "points granted"
msgstr ""
-#: judge/models/submission.py:70
+#: judge/models/submission.py:71
msgid "submission language"
msgstr ""
-#: judge/models/submission.py:71
+#: judge/models/submission.py:72
msgid "status"
msgstr ""
-#: judge/models/submission.py:72
+#: judge/models/submission.py:73
msgid "result"
msgstr ""
-#: judge/models/submission.py:74
+#: judge/models/submission.py:75
msgid "compile errors"
msgstr ""
-#: judge/models/submission.py:76
+#: judge/models/submission.py:77
msgid "batched cases"
msgstr ""
-#: judge/models/submission.py:77
+#: judge/models/submission.py:78
msgid "test case points"
msgstr ""
-#: judge/models/submission.py:78
+#: judge/models/submission.py:79
msgid "test case total points"
msgstr ""
-#: judge/models/submission.py:79
+#: judge/models/submission.py:80
msgid "judged on"
msgstr ""
-#: judge/models/submission.py:81
+#: judge/models/submission.py:82
msgid "submission judge time"
msgstr ""
-#: judge/models/submission.py:82
-msgid "was rejudged by admin"
+#: judge/models/submission.py:83
+msgid "last rejudge date by admin"
msgstr ""
-#: judge/models/submission.py:83
+#: judge/models/submission.py:84
msgid "was ran on pretests only"
msgstr ""
-#: judge/models/submission.py:86
-msgid "lock submission"
+#: judge/models/submission.py:87
+msgid "submission lock"
msgstr ""
-#: judge/models/submission.py:199
+#: judge/models/submission.py:210
msgid "Abort any submission"
msgstr ""
-#: judge/models/submission.py:200
+#: judge/models/submission.py:211
msgid "Rejudge the submission"
msgstr ""
-#: judge/models/submission.py:201
+#: judge/models/submission.py:212
msgid "Rejudge a lot of submissions"
msgstr ""
-#: judge/models/submission.py:202
+#: judge/models/submission.py:213
msgid "Submit without limit"
msgstr ""
-#: judge/models/submission.py:203
+#: judge/models/submission.py:214
msgid "View all submission"
msgstr ""
-#: judge/models/submission.py:204
+#: judge/models/submission.py:215
msgid "Resubmit others' submission"
msgstr ""
-#: judge/models/submission.py:205
+#: judge/models/submission.py:216
msgid "Change lock status of submission"
msgstr ""
-#: judge/models/submission.py:208 templates/contest/moss.html:58
+#: judge/models/submission.py:219 templates/contest/moss.html:58
msgid "submissions"
msgstr ""
-#: judge/models/submission.py:212 judge/models/submission.py:223
+#: judge/models/submission.py:223 judge/models/submission.py:234
msgid "associated submission"
msgstr ""
-#: judge/models/submission.py:214
+#: judge/models/submission.py:225
msgid "source code"
msgstr ""
-#: judge/models/submission.py:225
+#: judge/models/submission.py:236
msgid "test case ID"
msgstr ""
-#: judge/models/submission.py:226
+#: judge/models/submission.py:237
msgid "status flag"
msgstr ""
-#: judge/models/submission.py:230
+#: judge/models/submission.py:241
msgid "points possible"
msgstr ""
-#: judge/models/submission.py:231
+#: judge/models/submission.py:242
msgid "batch number"
msgstr ""
-#: judge/models/submission.py:232
+#: judge/models/submission.py:243
msgid "judging feedback"
msgstr ""
-#: judge/models/submission.py:233
+#: judge/models/submission.py:244
msgid "extended judging feedback"
msgstr ""
-#: judge/models/submission.py:234
+#: judge/models/submission.py:245
msgid "program output"
msgstr ""
-#: judge/models/submission.py:242
+#: judge/models/submission.py:253
msgid "submission test case"
msgstr ""
-#: judge/models/submission.py:243
+#: judge/models/submission.py:254
msgid "submission test cases"
msgstr ""
@@ -2359,6 +2380,10 @@ msgstr ""
msgid "poster"
msgstr ""
+#: judge/models/ticket.py:30
+msgid "message body"
+msgstr ""
+
#: judge/models/ticket.py:31
msgid "message time"
msgstr ""
@@ -2381,19 +2406,23 @@ msgstr ""
msgid "Running MOSS"
msgstr ""
-#: judge/tasks/submission.py:43
+#: judge/tasks/submission.py:45
msgid "Modifying submissions"
msgstr ""
-#: judge/tasks/submission.py:56
+#: judge/tasks/submission.py:58
msgid "Recalculating user points"
msgstr ""
-#: judge/tasks/user.py:50
+#: judge/tasks/user.py:49
+msgid "Applying filters"
+msgstr ""
+
+#: judge/tasks/user.py:64
msgid "Preparing your submission data"
msgstr ""
-#: judge/tasks/user.py:81
+#: judge/tasks/user.py:95
msgid "Preparing your comment data"
msgstr ""
@@ -2506,7 +2535,7 @@ msgstr ""
msgid "You already voted."
msgstr ""
-#: judge/views/comment.py:129 judge/views/organization.py:298
+#: judge/views/comment.py:129 judge/views/organization.py:297
msgid "Edited from site"
msgstr ""
@@ -2514,125 +2543,130 @@ msgstr ""
msgid "Editing comment"
msgstr ""
-#: judge/views/contests.py:56 judge/views/contests.py:201
-#: judge/views/contests.py:204 judge/views/contests.py:382
+#: judge/views/contests.py:57 judge/views/contests.py:210
+#: judge/views/contests.py:213 judge/views/contests.py:395
msgid "No such contest"
msgstr ""
-#: judge/views/contests.py:57 judge/views/contests.py:202
+#: judge/views/contests.py:58 judge/views/contests.py:211
#, python-format
msgid "Could not find a contest with the key \"%s\"."
msgstr ""
-#: judge/views/contests.py:70
+#: judge/views/contests.py:71
msgid "Contests"
msgstr ""
-#: judge/views/contests.py:205
+#: judge/views/contests.py:214
msgid "Could not find such contest."
msgstr ""
-#: judge/views/contests.py:208
+#: judge/views/contests.py:217
#, python-format
msgid "Access to contest \"%s\" denied"
msgstr ""
-#: judge/views/contests.py:235
+#: judge/views/contests.py:244
msgid "Clone Contest"
msgstr ""
-#: judge/views/contests.py:301
+#: judge/views/contests.py:278
+#, python-format
+msgid "Cloned contest from %s"
+msgstr ""
+
+#: judge/views/contests.py:314
msgid "Contest not ongoing"
msgstr ""
-#: judge/views/contests.py:302
+#: judge/views/contests.py:315
#, python-format
msgid "\"%s\" is not currently ongoing."
msgstr ""
-#: judge/views/contests.py:306
+#: judge/views/contests.py:319
msgid "Already in contest"
msgstr ""
-#: judge/views/contests.py:307
+#: judge/views/contests.py:320
#, python-format
msgid "You are already in a contest: \"%s\"."
msgstr ""
-#: judge/views/contests.py:310
+#: judge/views/contests.py:323
msgid "Banned from joining"
msgstr ""
-#: judge/views/contests.py:311
+#: judge/views/contests.py:324
msgid "You have been declared persona non grata for this contest. You are permanently barred from joining this contest."
msgstr ""
-#: judge/views/contests.py:372
+#: judge/views/contests.py:385
#, python-format
msgid "Enter access code for \"%s\""
msgstr ""
-#: judge/views/contests.py:383
+#: judge/views/contests.py:396
#, python-format
msgid "You are not in contest \"%s\"."
msgstr ""
-#: judge/views/contests.py:402
+#: judge/views/contests.py:415
msgid "ContestCalendar requires integer year and month"
msgstr ""
-#: judge/views/contests.py:442
+#: judge/views/contests.py:455
#, python-format
msgid "Contests in %(month)s"
msgstr ""
-#: judge/views/contests.py:442
+#: judge/views/contests.py:455
msgid "F Y"
msgstr ""
-#: judge/views/contests.py:489
+#: judge/views/contests.py:502
#, python-format
msgid "%s Statistics"
msgstr ""
-#: judge/views/contests.py:662
+#: judge/views/contests.py:675
#, python-format
msgid "%s Rankings"
msgstr ""
-#: judge/views/contests.py:670
+#: judge/views/contests.py:683
msgid "???"
msgstr ""
-#: judge/views/contests.py:686
+#: judge/views/contests.py:699
#, python-format
msgid "Your participation in %s"
msgstr ""
-#: judge/views/contests.py:687
+#: judge/views/contests.py:700
#, python-format
msgid "%s's participation in %s"
msgstr ""
-#: judge/views/contests.py:694
+#: judge/views/contests.py:707
msgid "Live"
msgstr ""
-#: judge/views/contests.py:706 templates/contest/contest-tabs.html:13
+#: judge/views/contests.py:719 templates/contest/contest-tabs.html:13
msgid "Participation"
msgstr ""
-#: judge/views/contests.py:750
+#: judge/views/contests.py:763
#, python-format
msgid "%s MOSS Results"
msgstr ""
-#: judge/views/contests.py:777
+#: judge/views/contests.py:790
#, python-format
msgid "Running MOSS for %s..."
msgstr ""
-#: judge/views/contests.py:800
+#: judge/views/contests.py:813
#, python-format
msgid "Contest tag: %s"
msgstr ""
@@ -2661,163 +2695,177 @@ msgstr ""
msgid "Runtimes"
msgstr ""
-#: judge/views/organization.py:44 judge/views/organization.py:47
+#: judge/views/organization.py:43 judge/views/organization.py:46
msgid "No such organization"
msgstr ""
-#: judge/views/organization.py:45
+#: judge/views/organization.py:44
#, python-format
msgid "Could not find an organization with the key \"%s\"."
msgstr ""
-#: judge/views/organization.py:48
+#: judge/views/organization.py:47
msgid "Could not find such organization."
msgstr ""
-#: judge/views/organization.py:72 judge/views/register.py:34
+#: judge/views/organization.py:71 judge/views/register.py:33
#: templates/organization/list.html:15 templates/user/user-list-tabs.html:5
msgid "Organizations"
msgstr ""
-#: judge/views/organization.py:93
+#: judge/views/organization.py:92
#, python-format
msgid "%s Members"
msgstr ""
-#: judge/views/organization.py:118 judge/views/organization.py:121
-#: judge/views/organization.py:126
+#: judge/views/organization.py:117 judge/views/organization.py:120
+#: judge/views/organization.py:125
msgid "Joining organization"
msgstr ""
-#: judge/views/organization.py:118
+#: judge/views/organization.py:117
msgid "You are already in the organization."
msgstr ""
-#: judge/views/organization.py:121
+#: judge/views/organization.py:120
msgid "This organization is not open."
msgstr ""
-#: judge/views/organization.py:138
+#: judge/views/organization.py:137
msgid "Leaving organization"
msgstr ""
-#: judge/views/organization.py:138
+#: judge/views/organization.py:137
#, python-format
msgid "You are not in \"%s\"."
msgstr ""
-#: judge/views/organization.py:162
+#: judge/views/organization.py:161
#, python-format
msgid "Request to join %s"
msgstr ""
-#: judge/views/organization.py:180
+#: judge/views/organization.py:179
msgid "Join request detail"
msgstr ""
-#: judge/views/organization.py:208
+#: judge/views/organization.py:207
#, python-format
msgid "Managing join requests for %s"
msgstr ""
-#: judge/views/organization.py:239
+#: judge/views/organization.py:238
#, python-format
msgid "Your organization can only receive %d more members. You cannot approve %d users."
msgstr ""
-#: judge/views/organization.py:251
+#: judge/views/organization.py:250
#, python-format
msgid "Approved %d user."
msgid_plural "Approved %d users."
msgstr[0] ""
msgstr[1] ""
-#: judge/views/organization.py:252
+#: judge/views/organization.py:251
#, python-format
msgid "Rejected %d user."
msgid_plural "Rejected %d users."
msgstr[0] ""
msgstr[1] ""
-#: judge/views/organization.py:282
+#: judge/views/organization.py:281
#, python-format
msgid "Editing %s"
msgstr ""
-#: judge/views/organization.py:306 judge/views/organization.py:314
+#: judge/views/organization.py:305 judge/views/organization.py:313
msgid "Can't edit organization"
msgstr ""
-#: judge/views/organization.py:307
+#: judge/views/organization.py:306
msgid "You are not allowed to edit this organization."
msgstr ""
-#: judge/views/organization.py:315
+#: judge/views/organization.py:314
msgid "You are not allowed to kick people from this organization."
msgstr ""
-#: judge/views/organization.py:320 judge/views/organization.py:324
+#: judge/views/organization.py:319 judge/views/organization.py:323
msgid "Can't kick user"
msgstr ""
-#: judge/views/organization.py:321
+#: judge/views/organization.py:320
msgid "The user you are trying to kick does not exist!"
msgstr ""
-#: judge/views/organization.py:325
+#: judge/views/organization.py:324
#, python-format
msgid "The user you are trying to kick is not in organization: %s."
msgstr ""
-#: judge/views/problem.py:67
+#: judge/views/problem.py:68
msgid "No such problem"
msgstr ""
-#: judge/views/problem.py:68
+#: judge/views/problem.py:69
#, python-format
msgid "Could not find a problem with the code \"%s\"."
msgstr ""
-#: judge/views/problem.py:110
+#: judge/views/problem.py:111
#, python-brace-format
msgid "Editorial for {0}"
msgstr ""
-#: judge/views/problem.py:113
+#: judge/views/problem.py:114
#, python-brace-format
msgid "Editorial for {0}"
msgstr ""
-#: judge/views/problem.py:283 templates/contest/contest.html:79
+#: judge/views/problem.py:133
+msgid "No such editorial"
+msgstr ""
+
+#: judge/views/problem.py:134
+#, python-format
+msgid "Could not find an editorial with the code \"%s\"."
+msgstr ""
+
+#: judge/views/problem.py:289 templates/contest/contest.html:79
#: templates/user/user-tabs.html:5 templates/user/users-table.html:23
msgid "Problems"
msgstr ""
-#: judge/views/problem.py:556 judge/views/problem.py:564
+#: judge/views/problem.py:562 judge/views/problem.py:570
#, python-format
msgid "Submit to %s"
msgstr ""
-#: judge/views/problem.py:613
+#: judge/views/problem.py:619
msgid "Banned from submitting"
msgstr ""
-#: judge/views/problem.py:614
+#: judge/views/problem.py:620
msgid "You have been declared persona non grata for this problem. You are permanently barred from submitting this problem."
msgstr ""
-#: judge/views/problem.py:618
+#: judge/views/problem.py:624
msgid "Too many submissions"
msgstr ""
-#: judge/views/problem.py:619
+#: judge/views/problem.py:625
msgid "You have exceeded the submission limit for this problem."
msgstr ""
-#: judge/views/problem.py:681
+#: judge/views/problem.py:693
msgid "Clone Problem"
msgstr ""
+#: judge/views/problem.py:720
+#, python-format
+msgid "Cloned problem from %s"
+msgstr ""
+
#: judge/views/problem_data.py:37
msgid "Checker arguments must be a JSON object"
msgstr ""
@@ -2887,52 +2935,52 @@ msgstr ""
msgid "Best solutions for {0}"
msgstr ""
-#: judge/views/ranked_submission.py:80
+#: judge/views/ranked_submission.py:82
#, python-format
msgid "Best solutions for %(problem)s in %(contest)s"
msgstr ""
-#: judge/views/ranked_submission.py:83
+#: judge/views/ranked_submission.py:85
#, python-format
msgid "Best solutions for problem %(number)s in %(contest)s"
msgstr ""
-#: judge/views/ranked_submission.py:89
+#: judge/views/ranked_submission.py:91
#, python-brace-format
msgid "Best solutions for {0} in {2}"
msgstr ""
-#: judge/views/ranked_submission.py:92
+#: judge/views/ranked_submission.py:94
#, python-brace-format
msgid "Best solutions for problem {0} in {1}"
msgstr ""
-#: judge/views/register.py:27
+#: judge/views/register.py:26
msgid "A username must contain letters, numbers, or underscores"
msgstr ""
-#: judge/views/register.py:31
+#: judge/views/register.py:30
msgid "Preferred language"
msgstr ""
-#: judge/views/register.py:38
+#: judge/views/register.py:37
msgid "Subscribe to newsletter?"
msgstr ""
-#: judge/views/register.py:45
+#: judge/views/register.py:44
#, python-format
msgid "The email address \"%s\" is already taken. Only one registration is allowed per address."
msgstr ""
-#: judge/views/register.py:51
+#: judge/views/register.py:50
msgid "Your email provider is not allowed due to history of abuse. Please use a reputable email provider."
msgstr ""
-#: judge/views/register.py:57 judge/views/register.py:95
+#: judge/views/register.py:56 judge/views/register.py:94
msgid "Registration"
msgstr ""
-#: judge/views/register.py:106
+#: judge/views/register.py:105
msgid "Authentication failure"
msgstr ""
@@ -2940,7 +2988,7 @@ msgstr ""
msgid "Language statistics"
msgstr ""
-#: judge/views/status.py:24 templates/submission/list.html:311
+#: judge/views/status.py:24 templates/submission/list.html:310
msgid "Status"
msgstr ""
@@ -2948,74 +2996,74 @@ msgstr ""
msgid "Version matrix"
msgstr ""
-#: judge/views/submission.py:53 judge/views/submission.py:60
+#: judge/views/submission.py:55 judge/views/submission.py:62
#, python-format
msgid "Submission of %(problem)s by %(user)s"
msgstr ""
-#: judge/views/submission.py:203 judge/views/submission.py:204
+#: judge/views/submission.py:205 judge/views/submission.py:206
#: templates/problem/problem.html:127
msgid "All submissions"
msgstr ""
-#: judge/views/submission.py:349
+#: judge/views/submission.py:355
msgid "All my submissions"
msgstr ""
-#: judge/views/submission.py:350
+#: judge/views/submission.py:356
#, python-format
msgid "All submissions by %s"
msgstr ""
-#: judge/views/submission.py:381
+#: judge/views/submission.py:387
#, python-format
msgid "All submissions for %s"
msgstr ""
-#: judge/views/submission.py:400
+#: judge/views/submission.py:410
msgid "Must pass a problem"
msgstr ""
-#: judge/views/submission.py:439
+#: judge/views/submission.py:449
#, python-format
msgid "My submissions for %(problem)s"
msgstr ""
-#: judge/views/submission.py:440
+#: judge/views/submission.py:450
#, python-format
msgid "%(user)s's submissions for %(problem)s"
msgstr ""
-#: judge/views/submission.py:536
+#: judge/views/submission.py:546
msgid "Must pass a contest"
msgstr ""
-#: judge/views/submission.py:544
+#: judge/views/submission.py:554
#, python-format
msgid "My submissions in %(contest)s"
msgstr ""
-#: judge/views/submission.py:545
+#: judge/views/submission.py:555
#, python-format
msgid "%(user)s's submissions in %(contest)s"
msgstr ""
-#: judge/views/submission.py:559
+#: judge/views/submission.py:569
#, python-brace-format
msgid "My submissions in {0}"
msgstr ""
-#: judge/views/submission.py:561
+#: judge/views/submission.py:571
#, python-brace-format
msgid "{0}'s submissions in {2}"
msgstr ""
-#: judge/views/submission.py:585
+#: judge/views/submission.py:597
#, python-brace-format
msgid "{0}'s submissions for {2} in {4}"
msgstr ""
-#: judge/views/submission.py:590
+#: judge/views/submission.py:602
#, python-brace-format
msgid "{0}'s submissions for problem {2} in {3}"
msgstr ""
@@ -3032,40 +3080,40 @@ msgstr ""
msgid "You must solve at least one problem before you can create a ticket."
msgstr ""
-#: judge/views/ticket.py:87 judge/views/ticket.py:90
+#: judge/views/ticket.py:91 judge/views/ticket.py:94
#, python-format
msgid "New ticket for %s"
msgstr ""
-#: judge/views/ticket.py:144
+#: judge/views/ticket.py:148
#, python-format
msgid "%(title)s - Ticket %(id)d"
msgstr ""
-#: judge/views/ticket.py:249
+#: judge/views/ticket.py:253
#, python-format
msgid "Tickets - Page %(number)d of %(total)d"
msgstr ""
-#: judge/views/ticket.py:298
+#: judge/views/ticket.py:302
#, python-format
msgid "New Ticket: %s"
msgstr ""
-#: judge/views/ticket.py:299
+#: judge/views/ticket.py:303
#, python-format
msgid "#%(id)d, assigned to: %(users)s"
msgstr ""
-#: judge/views/ticket.py:301
+#: judge/views/ticket.py:305
msgid ", "
msgstr ""
-#: judge/views/ticket.py:301
+#: judge/views/ticket.py:305
msgid "no one"
msgstr ""
-#: judge/views/ticket.py:321
+#: judge/views/ticket.py:325
#, python-format
msgid "New Ticket Message For: %s"
msgstr ""
@@ -3074,87 +3122,91 @@ msgstr ""
msgid "Enable Two-factor Authentication"
msgstr ""
-#: judge/views/two_factor.py:99
+#: judge/views/two_factor.py:108
+msgid "Refresh Two-factor Authentication"
+msgstr ""
+
+#: judge/views/two_factor.py:116
msgid "Disable Two-factor Authentication"
msgstr ""
-#: judge/views/two_factor.py:148
+#: judge/views/two_factor.py:165
msgid "Invalid WebAuthn response"
msgstr ""
-#: judge/views/two_factor.py:151
+#: judge/views/two_factor.py:168
msgid "Invalid name"
msgstr ""
-#: judge/views/two_factor.py:204
+#: judge/views/two_factor.py:221
msgid "Staff may not disable 2FA"
msgstr ""
-#: judge/views/two_factor.py:216
+#: judge/views/two_factor.py:229
msgid "Perform Two-factor Authentication"
msgstr ""
-#: judge/views/user.py:79
+#: judge/views/user.py:78
msgid "No such user"
msgstr ""
-#: judge/views/user.py:79
+#: judge/views/user.py:78
#, python-format
msgid "No user handle \"%s\"."
msgstr ""
-#: judge/views/user.py:83
+#: judge/views/user.py:82
msgid "My account"
msgstr ""
-#: judge/views/user.py:84
+#: judge/views/user.py:83
#, python-format
msgid "User %s"
msgstr ""
-#: judge/views/user.py:132
+#: judge/views/user.py:131
msgid "Login"
msgstr ""
-#: judge/views/user.py:173
+#: judge/views/user.py:172
msgid "M j, Y, G:i"
msgstr ""
-#: judge/views/user.py:307
+#: judge/views/user.py:306
msgid "Preparing your data..."
msgstr ""
-#: judge/views/user.py:311 templates/user/edit-profile.html:348
+#: judge/views/user.py:310 templates/user/edit-profile.html:352
msgid "Download your data"
msgstr ""
-#: judge/views/user.py:367
+#: judge/views/user.py:366
msgid "Updated on site"
msgstr ""
-#: judge/views/user.py:400 templates/admin/auth/user/change_form.html:14
+#: judge/views/user.py:399 templates/admin/auth/user/change_form.html:14
#: templates/admin/auth/user/change_form.html:17 templates/base.html:222
#: templates/user/user-tabs.html:16
msgid "Edit profile"
msgstr ""
-#: judge/views/user.py:415
+#: judge/views/user.py:414
msgid "Generated API token for user"
msgstr ""
-#: judge/views/user.py:427
+#: judge/views/user.py:426
msgid "Removed API token for user"
msgstr ""
-#: judge/views/user.py:437
+#: judge/views/user.py:436
msgid "Generated scratch codes for user"
msgstr ""
-#: judge/views/user.py:443 templates/user/user-list-tabs.html:4
+#: judge/views/user.py:442 templates/user/user-list-tabs.html:4
msgid "Leaderboard"
msgstr ""
-#: judge/views/user.py:504
+#: judge/views/user.py:503
msgid "You have been successfully logged out."
msgstr ""
@@ -3279,11 +3331,11 @@ msgstr ""
msgid "posted on {time}"
msgstr ""
-#: templates/blog/list.html:130 templates/problem/problem.html:309
+#: templates/blog/list.html:130 templates/problem/problem.html:311
msgid "Clarifications"
msgstr ""
-#: templates/blog/list.html:146 templates/problem/problem.html:320
+#: templates/blog/list.html:146 templates/problem/problem.html:322
msgid "No clarifications have been made at this time."
msgstr ""
@@ -3476,7 +3528,7 @@ msgid "Info"
msgstr ""
#: templates/contest/contest-tabs.html:6 templates/stats/base.html:9
-#: templates/submission/list.html:337
+#: templates/submission/list.html:336
msgid "Statistics"
msgstr ""
@@ -3679,19 +3731,19 @@ msgstr ""
msgid "Disqualify"
msgstr ""
-#: templates/contest/ranking.html:169
+#: templates/contest/ranking.html:173
msgid "Are you sure you want to disqualify this participation?"
msgstr ""
-#: templates/contest/ranking.html:174
+#: templates/contest/ranking.html:178
msgid "Are you sure you want to un-disqualify this participation?"
msgstr ""
-#: templates/contest/ranking.html:246
+#: templates/contest/ranking.html:250
msgid "View user participation"
msgstr ""
-#: templates/contest/ranking.html:250
+#: templates/contest/ranking.html:254
msgid "Show organizations"
msgstr ""
@@ -3966,7 +4018,7 @@ msgstr ""
msgid "Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence."
msgstr ""
-#: templates/problem/editorial.html:27 templates/problem/problem.html:209
+#: templates/problem/editorial.html:27 templates/problem/problem.html:210
msgid "Author:"
msgid_plural "Authors:"
msgstr[0] ""
@@ -4133,36 +4185,36 @@ msgstr ""
msgid "Memory limit:"
msgstr ""
-#: templates/problem/problem.html:224
+#: templates/problem/problem.html:226
msgid "Problem type"
msgid_plural "Problem types"
msgstr[0] ""
msgstr[1] ""
-#: templates/problem/problem.html:237
+#: templates/problem/problem.html:239
msgid "Allowed languages"
msgstr ""
-#: templates/problem/problem.html:245
+#: templates/problem/problem.html:247
#, python-format
msgid "No %(lang)s judge online"
msgstr ""
-#: templates/problem/problem.html:256
+#: templates/problem/problem.html:258
msgid "Judge:"
msgid_plural "Judges:"
msgstr[0] ""
msgstr[1] ""
-#: templates/problem/problem.html:273
+#: templates/problem/problem.html:275
msgid "none available"
msgstr ""
-#: templates/problem/problem.html:298
+#: templates/problem/problem.html:300
msgid "Request clarification"
msgstr ""
-#: templates/problem/problem.html:300
+#: templates/problem/problem.html:302
msgid "Report an issue"
msgstr ""
@@ -4207,7 +4259,7 @@ msgstr ""
msgid "Point range"
msgstr ""
-#: templates/problem/search-form.html:63 templates/submission/list.html:329
+#: templates/problem/search-form.html:63 templates/submission/list.html:328
#: templates/ticket/list.html:248
msgid "Go"
msgstr ""
@@ -4254,7 +4306,7 @@ msgid "Invalid username or password."
msgstr ""
#: templates/registration/login.html:53
-#: templates/registration/two_factor_auth.html:86
+#: templates/registration/two_factor_auth.html:92
msgid "Login!"
msgstr ""
@@ -4374,12 +4426,12 @@ msgid "Default language"
msgstr ""
#: templates/registration/registration_form.html:184
-#: templates/user/edit-profile.html:310
+#: templates/user/edit-profile.html:314
msgid "Affiliated organizations"
msgstr ""
#: templates/registration/registration_form.html:190
-#: templates/user/edit-profile.html:324
+#: templates/user/edit-profile.html:328
msgid "Notify me about upcoming contests"
msgstr ""
@@ -4395,57 +4447,93 @@ msgstr ""
msgid "Register!"
msgstr ""
-#: templates/registration/totp_disable.html:38
+#: templates/registration/totp_disable.html:31
msgid "To protect your account, you must first authenticate before you can disable Two Factor Authentication."
msgstr ""
-#: templates/registration/totp_disable.html:45
+#: templates/registration/totp_disable.html:38
msgid "Enter the 6-digit code generated by your app or one of your 16-digit scratch codes:"
msgstr ""
-#: templates/registration/totp_disable.html:48
+#: templates/registration/totp_disable.html:41
msgid "Disable Two Factor Authentication"
msgstr ""
-#: templates/registration/totp_enable.html:75
+#: templates/registration/totp_enable.html:72
msgid "Scan this code with your authenticator app:"
msgstr ""
-#: templates/registration/totp_enable.html:76
+#: templates/registration/totp_enable.html:73
msgid "QR code"
msgstr ""
-#: templates/registration/totp_enable.html:77
+#: templates/registration/totp_enable.html:74
msgid "Or enter this code manually:"
msgstr ""
-#: templates/registration/totp_enable.html:88
+#: templates/registration/totp_enable.html:85
msgid "Enter the 6-digit code generated by your app:"
msgstr ""
-#: templates/registration/totp_enable.html:91
+#: templates/registration/totp_enable.html:90
+msgid "Refresh Two Factor Authentication"
+msgstr ""
+
+#: templates/registration/totp_enable.html:92
msgid "Enable Two Factor Authentication"
msgstr ""
+#: templates/registration/totp_enable.html:98
+msgid "Below is a list of one-time use scratch codes."
+msgstr ""
+
+#: templates/registration/totp_enable.html:99
+msgid "These codes can only be used once and are for emergency use."
+msgstr ""
+
+#: templates/registration/totp_enable.html:100
+msgid "You can use these codes to login to your account or disable two-factor authentication."
+msgstr ""
+
+#: templates/registration/totp_enable.html:101
+msgid "If you ever need more scratch codes, you can regenerate them on the edit profile tab."
+msgstr ""
+
+#: templates/registration/totp_enable.html:102
+msgid "Please write these down and keep them in a secure location."
+msgstr ""
+
+#: templates/registration/totp_enable.html:103
+msgid "These codes will never be shown again after you enable two-factor authentication."
+msgstr ""
+
#: templates/registration/two_factor_auth.html:33
-#: templates/user/edit-profile.html:161
+#: templates/user/edit-profile.html:165
msgid "WebAuthn is not supported by your browser."
msgstr ""
#: templates/registration/two_factor_auth.html:54
-#: templates/user/edit-profile.html:185
+#: templates/user/edit-profile.html:189
msgid "Failed to contact server."
msgstr ""
-#: templates/registration/two_factor_auth.html:77
+#: templates/registration/two_factor_auth.html:79
msgid "Enter the 6-digit code generated by your app or one of your 16-character scratch codes:"
msgstr ""
-#: templates/registration/two_factor_auth.html:83
-msgid "Use security key"
+#: templates/registration/two_factor_auth.html:81
+msgid "Enter one of your 16-character scratch codes:"
msgstr ""
#: templates/registration/two_factor_auth.html:89
+msgid "Use security key"
+msgstr ""
+
+#: templates/registration/two_factor_auth.html:94
+msgid "Use scratch code"
+msgstr ""
+
+#: templates/registration/two_factor_auth.html:97
#, python-format
msgid "If you lost your authentication device and are unable to use your scratch codes, please contact us at %(email)s."
msgstr ""
@@ -4526,15 +4614,15 @@ msgstr ""
msgid "Filter by language..."
msgstr ""
-#: templates/submission/list.html:307
+#: templates/submission/list.html:306
msgid "Filter submissions"
msgstr ""
-#: templates/submission/list.html:343
+#: templates/submission/list.html:342
msgid "Total:"
msgstr ""
-#: templates/submission/list.html:353
+#: templates/submission/list.html:352
msgid "You were disconnected. Refresh to show latest updates."
msgstr ""
@@ -4750,121 +4838,125 @@ msgstr ""
msgid "Search by handle..."
msgstr ""
-#: templates/user/edit-profile.html:109
+#: templates/user/edit-profile.html:113
msgid "Are you sure you want to generate or regenerate your API token?"
msgstr ""
-#: templates/user/edit-profile.html:110
+#: templates/user/edit-profile.html:114
msgid "This will invalidate any previous API tokens."
msgstr ""
-#: templates/user/edit-profile.html:111
+#: templates/user/edit-profile.html:115
msgid "It also allows access to your account without Two-factor Authentication."
msgstr ""
-#: templates/user/edit-profile.html:112
+#: templates/user/edit-profile.html:116
msgid "You will not be able to view your api token after you leave this page!"
msgstr ""
-#: templates/user/edit-profile.html:113 templates/user/edit-profile.html:207
+#: templates/user/edit-profile.html:117 templates/user/edit-profile.html:211
msgid "Generating..."
msgstr ""
-#: templates/user/edit-profile.html:121 templates/user/edit-profile.html:243
-#: templates/user/edit-profile.html:371 templates/user/edit-profile.html:390
+#: templates/user/edit-profile.html:125 templates/user/edit-profile.html:247
+#: templates/user/edit-profile.html:373 templates/user/edit-profile.html:395
msgid "Regenerate"
msgstr ""
-#: templates/user/edit-profile.html:127 templates/user/edit-profile.html:392
+#: templates/user/edit-profile.html:131 templates/user/edit-profile.html:397
msgid "Remove"
msgstr ""
-#: templates/user/edit-profile.html:137
+#: templates/user/edit-profile.html:141
msgid "Are you sure you want to remove your API token?"
msgstr ""
-#: templates/user/edit-profile.html:144 templates/user/edit-profile.html:375
-#: templates/user/edit-profile.html:396
+#: templates/user/edit-profile.html:148 templates/user/edit-profile.html:377
+#: templates/user/edit-profile.html:401
msgid "Generate"
msgstr ""
-#: templates/user/edit-profile.html:190
+#: templates/user/edit-profile.html:194
msgid "Are you sure you want to delete this security key?"
msgstr ""
-#: templates/user/edit-profile.html:280
+#: templates/user/edit-profile.html:284
msgid "Self-description"
msgstr ""
-#: templates/user/edit-profile.html:287
+#: templates/user/edit-profile.html:291
msgid "Select your closest major city"
msgstr ""
-#: templates/user/edit-profile.html:296
+#: templates/user/edit-profile.html:300
msgid "Editor theme"
msgstr ""
-#: templates/user/edit-profile.html:301
+#: templates/user/edit-profile.html:305
msgid "Math engine"
msgstr ""
-#: templates/user/edit-profile.html:335 templates/user/edit-profile.html:337
+#: templates/user/edit-profile.html:339 templates/user/edit-profile.html:341
msgid "Change your avatar"
msgstr ""
-#: templates/user/edit-profile.html:342
+#: templates/user/edit-profile.html:346
msgid "Change your password"
msgstr ""
-#: templates/user/edit-profile.html:356
+#: templates/user/edit-profile.html:359
msgid "Two-factor Authentication is enabled"
msgstr ""
-#: templates/user/edit-profile.html:358
-msgid "Two-factor Authentication is disabled"
+#: templates/user/edit-profile.html:362 templates/user/edit-profile.html:365
+msgid "Disable"
msgstr ""
-#: templates/user/edit-profile.html:363 templates/user/edit-profile.html:365
-msgid "Disable"
+#: templates/user/edit-profile.html:367
+msgid "Refresh"
msgstr ""
-#: templates/user/edit-profile.html:368
+#: templates/user/edit-profile.html:370
msgid "Scratch Codes:"
msgstr ""
-#: templates/user/edit-profile.html:372 templates/user/edit-profile.html:393
+#: templates/user/edit-profile.html:374 templates/user/edit-profile.html:398
msgid "Hidden"
msgstr ""
-#: templates/user/edit-profile.html:381
+#: templates/user/edit-profile.html:384
+msgid "Two-factor Authentication is disabled"
+msgstr ""
+
+#: templates/user/edit-profile.html:385
msgid "Enable"
msgstr ""
-#: templates/user/edit-profile.html:387
+#: templates/user/edit-profile.html:392
msgid "API Token"
msgstr ""
-#: templates/user/edit-profile.html:404
+#: templates/user/edit-profile.html:409
msgid "Security keys"
msgstr ""
-#: templates/user/edit-profile.html:414
+#: templates/user/edit-profile.html:419
msgid "Delete"
msgstr ""
-#: templates/user/edit-profile.html:421
+#: templates/user/edit-profile.html:426
msgid "Enter a name for this key"
msgstr ""
-#: templates/user/edit-profile.html:422
+#: templates/user/edit-profile.html:427
msgid "Add"
msgstr ""
-#: templates/user/edit-profile.html:430
+#: templates/user/edit-profile.html:435
msgid "User-script"
msgstr ""
-#: templates/user/edit-profile.html:434
+#: templates/user/edit-profile.html:439
msgid "Update profile"
msgstr ""
diff --git a/locale/de/LC_MESSAGES/djangojs.po b/locale/de/LC_MESSAGES/djangojs.po
index 9b32690e02..a6d2980402 100644
--- a/locale/de/LC_MESSAGES/djangojs.po
+++ b/locale/de/LC_MESSAGES/djangojs.po
@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: dmoj\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-10-01 23:12+0000\n"
-"PO-Revision-Date: 2021-04-25 00:08\n"
+"PO-Revision-Date: 2021-07-07 00:27\n"
"Last-Translator: \n"
"Language-Team: German\n"
"Language: de_DE\n"
diff --git a/locale/en/LC_MESSAGES/django.po b/locale/en/LC_MESSAGES/django.po
index ff237480c3..86d709fc3c 100644
--- a/locale/en/LC_MESSAGES/django.po
+++ b/locale/en/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-08-21 17:54-0400\n"
+"POT-Creation-Date: 2021-07-23 00:28+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -18,2543 +18,3352 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: .\dmoj\settings.py:247
+#: dmoj/settings.py:365
+msgid "Catalan"
+msgstr ""
+
+#: dmoj/settings.py:366
msgid "German"
msgstr ""
-#: .\dmoj\settings.py:248
+#: dmoj/settings.py:367
msgid "English"
msgstr ""
-#: .\dmoj\settings.py:249
+#: dmoj/settings.py:368
msgid "Spanish"
msgstr ""
-#: .\dmoj\settings.py:250
+#: dmoj/settings.py:369
msgid "French"
msgstr ""
-#: .\dmoj\settings.py:251
+#: dmoj/settings.py:370
msgid "Croatian"
msgstr ""
-#: .\dmoj\settings.py:252
+#: dmoj/settings.py:371
msgid "Hungarian"
msgstr ""
-#: .\dmoj\settings.py:253
+#: dmoj/settings.py:372
+msgid "Japanese"
+msgstr ""
+
+#: dmoj/settings.py:373
msgid "Korean"
msgstr ""
-#: .\dmoj\settings.py:254
+#: dmoj/settings.py:374
+msgid "Brazilian Portuguese"
+msgstr ""
+
+#: dmoj/settings.py:375
msgid "Romanian"
msgstr ""
-#: .\dmoj\settings.py:255
+#: dmoj/settings.py:376
msgid "Russian"
msgstr ""
-#: .\dmoj\settings.py:256
+#: dmoj/settings.py:377
msgid "Serbian (Latin)"
msgstr ""
-#: .\dmoj\settings.py:257
+#: dmoj/settings.py:378
msgid "Turkish"
msgstr ""
-#: .\dmoj\settings.py:258
+#: dmoj/settings.py:379
msgid "Vietnamese"
msgstr ""
-#: .\dmoj\settings.py:259
+#: dmoj/settings.py:380
msgid "Simplified Chinese"
msgstr ""
-#: .\dmoj\urls.py:51 .\templates\base.html:234
-msgid "Login"
+#: dmoj/settings.py:381
+msgid "Traditional Chinese"
msgstr ""
-#: .\dmoj\urls.py:92 .\templates\base.html:185
+#: dmoj/urls.py:104 templates/base.html:190
msgid "Home"
msgstr ""
-#: .\judge\admin\comments.py:40
+#: judge/admin/comments.py:40
#, python-format
msgid "%d comment successfully hidden."
msgid_plural "%d comments successfully hidden."
msgstr[0] ""
msgstr[1] ""
-#: .\judge\admin\comments.py:43
+#: judge/admin/comments.py:43
msgid "Hide comments"
msgstr ""
-#: .\judge\admin\comments.py:47
+#: judge/admin/comments.py:47
#, python-format
msgid "%d comment successfully unhidden."
msgid_plural "%d comments successfully unhidden."
msgstr[0] ""
msgstr[1] ""
-#: .\judge\admin\comments.py:50
+#: judge/admin/comments.py:50
msgid "Unhide comments"
msgstr ""
-#: .\judge\admin\comments.py:58
+#: judge/admin/comments.py:58
msgid "Associated page"
msgstr ""
-#: .\judge\admin\contest.py:27
+#: judge/admin/contest.py:32
msgid "Included contests"
msgstr ""
-#: .\judge\admin\contest.py:63 .\templates\contest\contest.html:83
-#: .\templates\problem\list.html:206 .\templates\problem\list.html:221
-#: .\templates\user\user-problems.html:61
-#: .\templates\user\user-problems.html:103
+#: judge/admin/contest.py:66 templates/contest/contest.html:83
+#: templates/contest/moss.html:43 templates/problem/list.html:204
+#: templates/problem/list.html:219 templates/user/user-problems.html:58
+#: templates/user/user-problems.html:100
msgid "Problem"
msgstr ""
-#: .\judge\admin\contest.py:91
+#: judge/admin/contest.py:117
+msgid "Settings"
+msgstr ""
+
+#: judge/admin/contest.py:120
msgid "Scheduling"
msgstr ""
-#: .\judge\admin\contest.py:92
+#: judge/admin/contest.py:121
msgid "Details"
msgstr ""
-#: .\judge\admin\contest.py:93 .\templates\contest\ranking-table.html:5
+#: judge/admin/contest.py:122
+msgid "Format"
+msgstr ""
+
+#: judge/admin/contest.py:123 templates/contest/ranking-table.html:5
msgid "Rating"
msgstr ""
-#: .\judge\admin\contest.py:94 .\templates\contest\ranking-table.html:7
-msgid "Organization"
+#: judge/admin/contest.py:124
+msgid "Access"
msgstr ""
-#: .\judge\admin\contest.py:130
+#: judge/admin/contest.py:126 judge/admin/problem.py:135
+msgid "Justice"
+msgstr ""
+
+#: judge/admin/contest.py:215
#, python-format
-msgid "%d contest successfully marked as public."
-msgid_plural "%d contests successfully marked as public."
+msgid "%d contest successfully marked as visible."
+msgid_plural "%d contests successfully marked as visible."
msgstr[0] ""
msgstr[1] ""
-#: .\judge\admin\contest.py:133
-msgid "Mark contests as public"
+#: judge/admin/contest.py:218
+msgid "Mark contests as visible"
msgstr ""
-#: .\judge\admin\contest.py:137
+#: judge/admin/contest.py:224
#, python-format
-msgid "%d contest successfully marked as private."
-msgid_plural "%d contests successfully marked as private."
+msgid "%d contest successfully marked as hidden."
+msgid_plural "%d contests successfully marked as hidden."
msgstr[0] ""
msgstr[1] ""
-#: .\judge\admin\contest.py:140
-msgid "Mark contests as private"
+#: judge/admin/contest.py:227
+msgid "Mark contests as hidden"
msgstr ""
-#: .\judge\admin\contest.py:211
+#: judge/admin/contest.py:233
#, python-format
-msgid "%d participation have scores recalculated."
-msgid_plural "%d participations have scores recalculated."
+msgid "%d contest successfully locked."
+msgid_plural "%d contests successfully locked."
msgstr[0] ""
msgstr[1] ""
-#: .\judge\admin\contest.py:214 .\judge\admin\profile.py:90
-msgid "Recalculate scores"
+#: judge/admin/contest.py:236
+msgid "Lock contest submissions"
msgstr ""
-#: .\judge\admin\contest.py:221
+#: judge/admin/contest.py:242
#, python-format
-msgid "%d participation have times recalculated."
-msgid_plural "%d participations have times recalculated."
+msgid "%d contest successfully unlocked."
+msgid_plural "%d contests successfully unlocked."
msgstr[0] ""
msgstr[1] ""
-#: .\judge\admin\contest.py:224
-msgid "Recalculate cumulative time"
+#: judge/admin/contest.py:245
+msgid "Unlock contest submissions"
msgstr ""
-#: .\judge\admin\contest.py:228 .\judge\admin\organization.py:63
+#: judge/admin/contest.py:266 judge/admin/submission.py:170
+#, python-format
+msgid "%d submission was successfully scheduled for rejudging."
+msgid_plural "%d submissions were successfully scheduled for rejudging."
+msgstr[0] ""
+msgstr[1] ""
+
+#: judge/admin/contest.py:341
+#, python-format
+msgid "%d participation recalculated."
+msgid_plural "%d participations recalculated."
+msgstr[0] ""
+msgstr[1] ""
+
+#: judge/admin/contest.py:344
+msgid "Recalculate results"
+msgstr ""
+
+#: judge/admin/contest.py:348 judge/admin/organization.py:63
msgid "username"
msgstr ""
-#: .\judge\admin\contest.py:233 .\templates\base.html:253
+#: judge/admin/contest.py:353 templates/base.html:258
msgid "virtual"
msgstr ""
-#: .\judge\admin\interface.py:27 .\judge\models\interface.py:46
+#: judge/admin/interface.py:29 judge/models/interface.py:46
msgid "link path"
msgstr ""
-#: .\judge\admin\interface.py:61
+#: judge/admin/interface.py:72
msgid "Content"
msgstr ""
-#: .\judge\admin\interface.py:62
+#: judge/admin/interface.py:73
msgid "Summary"
msgstr ""
-#: .\judge\admin\organization.py:32 .\judge\admin\problem.py:168
-#: .\judge\admin\profile.py:59
+#: judge/admin/interface.py:113 judge/models/contest.py:419
+#: judge/models/contest.py:546 judge/models/profile.py:261
+#: judge/models/profile.py:292
+msgid "user"
+msgstr ""
+
+#: judge/admin/interface.py:154
+msgid "object"
+msgstr ""
+
+#: judge/admin/organization.py:32 judge/admin/problem.py:182
+#: judge/admin/profile.py:92
msgid "View on site"
msgstr ""
-#: .\judge\admin\problem.py:28
+#: judge/admin/problem.py:29
msgid "Describe the changes you made (optional)"
msgstr ""
-#: .\judge\admin\problem.py:123
+#: judge/admin/problem.py:130
msgid "Social Media"
msgstr ""
-#: .\judge\admin\problem.py:124
+#: judge/admin/problem.py:131
msgid "Taxonomy"
msgstr ""
-#: .\judge\admin\problem.py:125 .\templates\contest\contest.html:84
-#: .\templates\problem\data.html:394 .\templates\problem\list.html:211
-#: .\templates\problem\list.html:232 .\templates\user\base-users-table.html:10
-#: .\templates\user\user-problems.html:63
+#: judge/admin/problem.py:132 templates/contest/contest.html:84
+#: templates/problem/data.html:385 templates/problem/list.html:209
+#: templates/problem/list.html:230 templates/user/base-users-table.html:10
+#: templates/user/user-problems.html:60
msgid "Points"
msgstr ""
-#: .\judge\admin\problem.py:126
+#: judge/admin/problem.py:133
msgid "Limits"
msgstr ""
-#: .\judge\admin\problem.py:127 .\templates\stats\base.html:16
-#: .\templates\submission\list.html:231
+#: judge/admin/problem.py:134 judge/admin/submission.py:238
+#: templates/stats/base.html:14 templates/submission/list.html:319
+#: templates/user/edit-profile.html:296
msgid "Language"
msgstr ""
-#: .\judge\admin\problem.py:128
-msgid "Justice"
-msgstr ""
-
-#: .\judge\admin\problem.py:129
+#: judge/admin/problem.py:136
msgid "History"
msgstr ""
-#: .\judge\admin\problem.py:165
+#: judge/admin/problem.py:179
msgid "Authors"
msgstr ""
-#: .\judge\admin\problem.py:203
+#: judge/admin/problem.py:192
+#, python-format
+msgid "%d problem's publish date successfully updated."
+msgid_plural "%d problems' publish date successfully updated."
+msgstr[0] ""
+msgstr[1] ""
+
+#: judge/admin/problem.py:196
+msgid "Set publish date to now"
+msgstr ""
+
+#: judge/admin/problem.py:202
#, python-format
msgid "%d problem successfully marked as public."
msgid_plural "%d problems successfully marked as public."
msgstr[0] ""
msgstr[1] ""
-#: .\judge\admin\problem.py:207
+#: judge/admin/problem.py:206
msgid "Mark problems as public"
msgstr ""
-#: .\judge\admin\problem.py:212
+#: judge/admin/problem.py:212
#, python-format
msgid "%d problem successfully marked as private."
msgid_plural "%d problems successfully marked as private."
msgstr[0] ""
msgstr[1] ""
-#: .\judge\admin\problem.py:216
+#: judge/admin/problem.py:216
msgid "Mark problems as private"
msgstr ""
-#: .\judge\admin\profile.py:32
+#: judge/admin/profile.py:35
msgid "timezone"
msgstr ""
-#: .\judge\admin\profile.py:65 .\judge\admin\submission.py:197
-#: .\templates\organization\requests\log.html:9
-#: .\templates\organization\requests\pending.html:19
-#: .\templates\ticket\list.html:247
+#: judge/admin/profile.py:98 judge/admin/submission.py:217
+#: templates/organization/requests/log.html:9
+#: templates/organization/requests/pending.html:12
+#: templates/ticket/list.html:261
msgid "User"
msgstr ""
-#: .\judge\admin\profile.py:70
-#: .\templates\registration\registration_form.html:141
+#: judge/admin/profile.py:103 templates/registration/registration_form.html:143
msgid "Email"
msgstr ""
-#: .\judge\admin\profile.py:75 .\judge\views\register.py:30
-#: .\templates\registration\registration_form.html:169
-#: .\templates\user\edit-profile.html:104
+#: judge/admin/profile.py:108 judge/views/register.py:28
+#: templates/registration/registration_form.html:171
+#: templates/user/edit-profile.html:292
msgid "Timezone"
msgstr ""
-#: .\judge\admin\profile.py:80
+#: judge/admin/profile.py:113
msgid "date joined"
msgstr ""
-#: .\judge\admin\profile.py:87
+#: judge/admin/profile.py:120
#, python-format
msgid "%d user have scores recalculated."
msgid_plural "%d users have scores recalculated."
msgstr[0] ""
msgstr[1] ""
-#: .\judge\admin\runtime.py:15
+#: judge/admin/profile.py:123
+msgid "Recalculate scores"
+msgstr ""
+
+#: judge/admin/runtime.py:19
msgid "Disallowed problems"
msgstr ""
-#: .\judge\admin\runtime.py:18
+#: judge/admin/runtime.py:22
msgid "These problems are NOT allowed to be submitted in this language"
msgstr ""
-#: .\judge\admin\runtime.py:81
+#: judge/admin/runtime.py:80
msgid "Description"
msgstr ""
-#: .\judge\admin\runtime.py:82
+#: judge/admin/runtime.py:81
msgid "Information"
msgstr ""
-#: .\judge\admin\runtime.py:83
+#: judge/admin/runtime.py:82
msgid "Capabilities"
msgstr ""
-#: .\judge\admin\submission.py:21 .\judge\admin\submission.py:40
-#: .\judge\admin\submission.py:207
+#: judge/admin/submission.py:23 judge/admin/submission.py:42
+#: judge/admin/submission.py:227
msgid "None"
msgstr ""
-#: .\judge\admin\submission.py:21
+#: judge/admin/submission.py:23
msgid "Not done"
msgstr ""
-#: .\judge\admin\submission.py:21
+#: judge/admin/submission.py:23
msgid "Exceptional"
msgstr ""
-#: .\judge\admin\submission.py:40
+#: judge/admin/submission.py:42
msgid "Unaccepted"
msgstr ""
-#: .\judge\admin\submission.py:83
+#: judge/admin/submission.py:89
#, python-format
msgctxt "contest problem"
msgid "%(problem)s in %(contest)s"
msgstr ""
-#: .\judge\admin\submission.py:127 .\judge\admin\submission.py:148
+#: judge/admin/submission.py:155 judge/admin/submission.py:177
msgid "You do not have the permission to rejudge submissions."
msgstr ""
-#: .\judge\admin\submission.py:132
+#: judge/admin/submission.py:161
msgid "You do not have the permission to rejudge THAT many submissions."
msgstr ""
-#: .\judge\admin\submission.py:141
-#, python-format
-msgid "%d submission were successfully scheduled for rejudging."
-msgid_plural "%d submissions were successfully scheduled for rejudging."
-msgstr[0] ""
-msgstr[1] ""
-
-#: .\judge\admin\submission.py:144
+#: judge/admin/submission.py:173
msgid "Rejudge the selected submissions"
msgstr ""
-#: .\judge\admin\submission.py:177
+#: judge/admin/submission.py:199 judge/views/problem_manage.py:128
#, python-format
msgid "%d submission were successfully rescored."
msgid_plural "%d submissions were successfully rescored."
msgstr[0] ""
msgstr[1] ""
-#: .\judge\admin\submission.py:180
+#: judge/admin/submission.py:202
msgid "Rescore the selected submissions"
msgstr ""
-#: .\judge\admin\submission.py:184
+#: judge/admin/submission.py:206
msgid "Problem code"
msgstr ""
-#: .\judge\admin\submission.py:189
+#: judge/admin/submission.py:211
msgid "Problem name"
msgstr ""
-#: .\judge\admin\submission.py:201
-#: .\templates\organization\requests\log.html:10
-#: .\templates\organization\requests\pending.html:20
+#: judge/admin/submission.py:221 templates/organization/requests/log.html:10
+#: templates/organization/requests/pending.html:13
msgid "Time"
msgstr ""
-#: .\judge\admin\submission.py:209
+#: judge/admin/submission.py:229
#, python-format
msgid "%d KB"
msgstr ""
-#: .\judge\admin\submission.py:211
+#: judge/admin/submission.py:231
#, python-format
msgid "%.2f MB"
msgstr ""
-#: .\judge\admin\submission.py:213
+#: judge/admin/submission.py:233
msgid "Memory"
msgstr ""
-#: .\judge\admin\taxon.py:11 .\judge\admin\taxon.py:34
+#: judge/admin/taxon.py:11 judge/admin/taxon.py:34
msgid "Included problems"
msgstr ""
-#: .\judge\admin\taxon.py:14
+#: judge/admin/taxon.py:14
msgid "These problems are included in this group of problems"
msgstr ""
-#: .\judge\admin\taxon.py:37
+#: judge/admin/taxon.py:37
msgid "These problems are included in this type of problems"
msgstr ""
-#: .\judge\apps.py:8
+#: judge/apps.py:8
msgid "Online Judge"
msgstr ""
-#: .\judge\comments.py:40
-msgid "Comment title"
-msgstr ""
-
-#: .\judge\comments.py:41
+#: judge/comments.py:41
msgid "Comment body"
msgstr ""
-#: .\judge\comments.py:47 .\judge\views\ticket.py:50
+#: judge/comments.py:47 judge/views/comment.py:40 judge/views/ticket.py:46
msgid "Your part is silent, little toad."
msgstr ""
-#: .\judge\comments.py:50 .\templates\comments\list.html:122
+#: judge/comments.py:49 templates/comments/list.html:142
msgid ""
"You need to have solved at least one problem before your voice can be heard."
msgstr ""
-#: .\judge\comments.py:75
+#: judge/comments.py:93
msgid "Posted comment"
msgstr ""
-#: .\judge\forms.py:25
+#: judge/contest_format/atcoder.py:19
+msgid "AtCoder"
+msgstr ""
+
+#: judge/contest_format/default.py:18
+msgid "Default"
+msgstr ""
+
+#: judge/contest_format/ecoo.py:18
+msgid "ECOO"
+msgstr ""
+
+#: judge/contest_format/icpc.py:19
+msgid "ICPC"
+msgstr ""
+
+#: judge/contest_format/ioi.py:11
+msgid "IOI"
+msgstr ""
+
+#: judge/contest_format/legacy_ioi.py:18
+msgid "IOI (pre-2016)"
+msgstr ""
+
+#: judge/forms.py:27
+#, python-brace-format
+msgid ""
+"Two-factor authentication tokens must be {TOTP_CODE_LENGTH} decimal digits."
+msgstr ""
+
+#: judge/forms.py:30
+msgid "Invalid two-factor authentication token."
+msgstr ""
+
+#: judge/forms.py:33
+msgid "Scratch codes must be 16 base32 characters."
+msgstr ""
+
+#: judge/forms.py:35 judge/forms.py:264
+msgid "Invalid scratch code."
+msgstr ""
+
+#: judge/forms.py:46
msgid "Subscribe to contest updates"
msgstr ""
-#: .\judge\forms.py:26
+#: judge/forms.py:47
msgid "Enable experimental features"
msgstr ""
-#: .\judge\forms.py:51
+#: judge/forms.py:72
+msgid "You must solve at least one problem before you can update your profile."
+msgstr ""
+
+#: judge/forms.py:81 judge/views/organization.py:126
#, python-brace-format
msgid "You may not be part of more than {count} public organizations."
msgstr ""
-#: .\judge\forms.py:109 .\judge\views\register.py:26
-#: .\templates\registration\registration_form.html:135
-#: .\templates\user\base-users-table.html:5
+#: judge/forms.py:97
+msgid "Download comments?"
+msgstr ""
+
+#: judge/forms.py:98
+msgid "Download submissions?"
+msgstr ""
+
+#: judge/forms.py:99
+msgid "Filter by problem code glob:"
+msgstr ""
+
+#: judge/forms.py:103
+msgid "Leave empty to include all submissions"
+msgstr ""
+
+#: judge/forms.py:106 templates/problem/manage_submission.html:142
+msgid "Filter by result:"
+msgstr ""
+
+#: judge/forms.py:112
+msgid "Please select at least one thing to download."
+msgstr ""
+
+#: judge/forms.py:138
+msgid "Any judge"
+msgstr ""
+
+#: judge/forms.py:159 judge/views/register.py:25
+#: templates/registration/registration_form.html:137
+#: templates/user/base-users-table.html:5
msgid "Username"
msgstr ""
-#: .\judge\forms.py:110 .\templates\registration\registration_form.html:147
-#: .\templates\registration\registration_form.html:161
+#: judge/forms.py:160 templates/registration/registration_form.html:149
+#: templates/registration/registration_form.html:163
msgid "Password"
msgstr ""
-#: .\judge\jinja2\datetime.py:26 .\templates\blog\content.html:27
-#: .\templates\blog\dashboard.html:21
-msgid "N j, Y, g:i a"
+#: judge/forms.py:192
+msgid "Invalid code length."
msgstr ""
-#: .\judge\jinja2\datetime.py:26
-#, python-brace-format
-msgid "{time}"
+#: judge/forms.py:223
+msgid "Invalid WebAuthn response."
msgstr ""
-#: .\judge\jinja2\datetime.py:26
-#, python-brace-format
-msgid "on {time}"
+#: judge/forms.py:226
+msgid "No WebAuthn challenge issued."
msgstr ""
-#: .\judge\jinja2\timedelta.py:52
-msgctxt "time format with day"
-msgid "%d day %h:%m:%s"
-msgid_plural "%d days %h:%m:%s"
-msgstr[0] ""
-msgstr[1] ""
+#: judge/forms.py:232
+msgid "Invalid WebAuthn credential ID."
+msgstr ""
-#: .\judge\jinja2\timedelta.py:56
-msgctxt "time format without day"
-msgid "%h:%m:%s"
+#: judge/forms.py:262
+msgid "Invalid two-factor authentication token or scratch code."
msgstr ""
-#: .\judge\jinja2\timedelta.py:62
-msgctxt "time format no seconds with day"
-msgid "%d day %h:%m"
-msgid_plural "%d days %h:%m"
-msgstr[0] ""
-msgstr[1] ""
+#: judge/forms.py:266
+msgid "Must specify either totp_token or webauthn_response."
+msgstr ""
-#: .\judge\jinja2\timedelta.py:64
-#, python-format
-msgid "%d day"
-msgid_plural "%d days"
-msgstr[0] ""
-msgstr[1] ""
+#: judge/forms.py:270 judge/models/problem.py:119
+msgid "Problem code must be ^[a-z0-9]+$"
+msgstr ""
-#: .\judge\jinja2\timedelta.py:66
-msgctxt "hours and minutes"
-msgid "%h:%m"
+#: judge/forms.py:275
+msgid "Problem with code already exists."
+msgstr ""
+
+#: judge/forms.py:280 judge/models/contest.py:66
+msgid "Contest id must be ^[a-z0-9]+$"
+msgstr ""
+
+#: judge/forms.py:285
+msgid "Contest with key already exists."
+msgstr ""
+
+#: judge/jinja2/datetime.py:26 templates/blog/content.html:27
+#: templates/blog/dashboard.html:21
+msgid "N j, Y, g:i a"
+msgstr ""
+
+#: judge/jinja2/datetime.py:26
+#, python-brace-format
+msgid "{time}"
+msgstr ""
+
+#: judge/jinja2/datetime.py:26
+#, python-brace-format
+msgid "on {time}"
msgstr ""
-#: .\judge\models\choices.py:60
+#: judge/models/choices.py:59
msgid "Leave as LaTeX"
msgstr ""
-#: .\judge\models\choices.py:61
+#: judge/models/choices.py:60
msgid "SVG with PNG fallback"
msgstr ""
-#: .\judge\models\choices.py:62
+#: judge/models/choices.py:61
msgid "MathML only"
msgstr ""
-#: .\judge\models\choices.py:63
+#: judge/models/choices.py:62
msgid "MathJax with SVG/PNG fallback"
msgstr ""
-#: .\judge\models\choices.py:64
+#: judge/models/choices.py:63
msgid "Detect best quality"
msgstr ""
-#: .\judge\models\comment.py:36
-msgid "commenter"
+#: judge/models/comment.py:25
+msgid "Page code must be ^[pcs]:[a-z0-9]+$|^b:\\d+$"
msgstr ""
-#: .\judge\models\comment.py:37
-msgid "posted time"
+#: judge/models/comment.py:41
+msgid "commenter"
msgstr ""
-#: .\judge\models\comment.py:38
-msgid "associated Page"
+#: judge/models/comment.py:42
+msgid "posted time"
msgstr ""
-#: .\judge\models\comment.py:40
-msgid "Page code must be ^[pc]:[a-z0-9]+$|^b:\\d+$"
+#: judge/models/comment.py:43 judge/models/comment.py:196
+msgid "associated page"
msgstr ""
-#: .\judge\models\comment.py:41
+#: judge/models/comment.py:45
msgid "votes"
msgstr ""
-#: .\judge\models\comment.py:42
-msgid "title of comment"
-msgstr ""
-
-#: .\judge\models\comment.py:43
+#: judge/models/comment.py:46
msgid "body of comment"
msgstr ""
-#: .\judge\models\comment.py:44
+#: judge/models/comment.py:47
msgid "hide the comment"
msgstr ""
-#: .\judge\models\comment.py:45
+#: judge/models/comment.py:48
msgid "parent"
msgstr ""
-#: .\judge\models\comment.py:49
+#: judge/models/comment.py:53
msgid "comment"
msgstr ""
-#: .\judge\models\comment.py:50
+#: judge/models/comment.py:54
msgid "comments"
msgstr ""
-#: .\judge\models\comment.py:115 .\judge\models\problem.py:353
+#: judge/models/comment.py:89 judge/models/comment.py:141
+#: judge/models/problem.py:511
#, python-format
msgid "Editorial for %s"
msgstr ""
-#: .\judge\models\comment.py:146
+#: judge/models/comment.py:191
msgid "comment vote"
msgstr ""
-#: .\judge\models\comment.py:147
+#: judge/models/comment.py:192
msgid "comment votes"
msgstr ""
-#: .\judge\models\contest.py:20
+#: judge/models/comment.py:201
+msgid "Override comment lock"
+msgstr ""
+
+#: judge/models/contest.py:28
msgid "Invalid colour."
msgstr ""
-#: .\judge\models\contest.py:22
+#: judge/models/contest.py:30
msgid "tag name"
msgstr ""
-#: .\judge\models\contest.py:23
+#: judge/models/contest.py:31
msgid "Lowercase letters and hyphens only."
msgstr ""
-#: .\judge\models\contest.py:24
+#: judge/models/contest.py:32
msgid "tag colour"
msgstr ""
-#: .\judge\models\contest.py:25
+#: judge/models/contest.py:33
msgid "tag description"
msgstr ""
-#: .\judge\models\contest.py:44
+#: judge/models/contest.py:52
msgid "contest tag"
msgstr ""
-#: .\judge\models\contest.py:45 .\judge\models\contest.py:87
+#: judge/models/contest.py:53 judge/models/contest.py:126
msgid "contest tags"
msgstr ""
-#: .\judge\models\contest.py:49
-msgid "contest id"
+#: judge/models/contest.py:61
+msgid "Visible"
msgstr ""
-#: .\judge\models\contest.py:50
-msgid "Contest id must be ^[a-z0-9]+$"
+#: judge/models/contest.py:62
+msgid "Hidden for duration of contest"
+msgstr ""
+
+#: judge/models/contest.py:63
+msgid "Hidden for duration of participation"
+msgstr ""
+
+#: judge/models/contest.py:65
+msgid "contest id"
msgstr ""
-#: .\judge\models\contest.py:51
+#: judge/models/contest.py:67
msgid "contest name"
msgstr ""
-#: .\judge\models\contest.py:52
-msgid "These people will be able to edit the contest."
+#: judge/models/contest.py:68
+msgid "These users will be able to edit the contest."
+msgstr ""
+
+#: judge/models/contest.py:70
+msgid ""
+"These users will be able to edit the contest, but will not be listed as "
+"authors."
+msgstr ""
+
+#: judge/models/contest.py:73
+msgid "These users will be able to view the contest, but not edit it."
msgstr ""
-#: .\judge\models\contest.py:54 .\judge\models\runtime.py:118
+#: judge/models/contest.py:76 judge/models/runtime.py:136
msgid "description"
msgstr ""
-#: .\judge\models\contest.py:55 .\judge\models\problem.py:304
-#: .\judge\models\runtime.py:120
+#: judge/models/contest.py:77 judge/models/problem.py:458
+#: judge/models/runtime.py:138
msgid "problems"
msgstr ""
-#: .\judge\models\contest.py:56 .\judge\models\contest.py:182
+#: judge/models/contest.py:78 judge/models/contest.py:420
msgid "start time"
msgstr ""
-#: .\judge\models\contest.py:57
+#: judge/models/contest.py:79
msgid "end time"
msgstr ""
-#: .\judge\models\contest.py:58 .\judge\models\problem.py:109
-#: .\judge\models\problem.py:328
+#: judge/models/contest.py:80 judge/models/problem.py:140
+#: judge/models/problem.py:482
msgid "time limit"
msgstr ""
-#: .\judge\models\contest.py:59 .\judge\models\problem.py:115
+#: judge/models/contest.py:81 judge/models/problem.py:158
msgid "publicly visible"
msgstr ""
-#: .\judge\models\contest.py:60
+#: judge/models/contest.py:82
msgid ""
"Should be set even for organization-private contests, where it determines "
"whether the contest is visible to members of the specified organizations."
msgstr ""
-#: .\judge\models\contest.py:63
+#: judge/models/contest.py:85
msgid "contest rated"
msgstr ""
-#: .\judge\models\contest.py:63
+#: judge/models/contest.py:85
msgid "Whether this contest can be rated."
msgstr ""
-#: .\judge\models\contest.py:65
-msgid "hide scoreboard"
+#: judge/models/contest.py:87
+msgid "view contest scoreboard"
msgstr ""
-#: .\judge\models\contest.py:66
-msgid ""
-"Whether the scoreboard should remain hidden for the duration of the contest."
+#: judge/models/contest.py:89
+msgid "These users will be able to view the scoreboard."
+msgstr ""
+
+#: judge/models/contest.py:90
+msgid "scoreboard visibility"
msgstr ""
-#: .\judge\models\contest.py:69
+#: judge/models/contest.py:91
+msgid "Scoreboard visibility through the duration of the contest"
+msgstr ""
+
+#: judge/models/contest.py:93
msgid "no comments"
msgstr ""
-#: .\judge\models\contest.py:70
+#: judge/models/contest.py:94
msgid "Use clarification system instead of comments."
msgstr ""
-#: .\judge\models\contest.py:72
+#: judge/models/contest.py:96
+msgid "Rating floor for contest"
+msgstr ""
+
+#: judge/models/contest.py:98
+msgid "Rating ceiling for contest"
+msgstr ""
+
+#: judge/models/contest.py:100
msgid "rate all"
msgstr ""
-#: .\judge\models\contest.py:72
+#: judge/models/contest.py:100
msgid "Rate all users who joined."
msgstr ""
-#: .\judge\models\contest.py:73
+#: judge/models/contest.py:101
msgid "exclude from ratings"
msgstr ""
-#: .\judge\models\contest.py:75
-msgid "private to organizations"
+#: judge/models/contest.py:103
+msgid "private to specific users"
+msgstr ""
+
+#: judge/models/contest.py:104
+msgid "private contestants"
+msgstr ""
+
+#: judge/models/contest.py:105
+msgid "If private, only these users may see the contest"
msgstr ""
-#: .\judge\models\contest.py:76
+#: judge/models/contest.py:107
msgid "hide problem tags"
msgstr ""
-#: .\judge\models\contest.py:77
+#: judge/models/contest.py:108
msgid "Whether problem tags should be hidden by default."
msgstr ""
-#: .\judge\models\contest.py:79
+#: judge/models/contest.py:110
+msgid "hide problem authors"
+msgstr ""
+
+#: judge/models/contest.py:111
+msgid "Whether problem authors should be hidden by default."
+msgstr ""
+
+#: judge/models/contest.py:113
msgid "run pretests only"
msgstr ""
-#: .\judge\models\contest.py:80
+#: judge/models/contest.py:114
msgid ""
"Whether judges should grade pretests only, versus all testcases. Commonly "
"set during a contest, then unset prior to rejudging user submissions when "
"the contest ends."
msgstr ""
-#: .\judge\models\contest.py:84 .\judge\models\profile.py:64
+#: judge/models/contest.py:118 judge/models/problem.py:183
+msgid "private to organizations"
+msgstr ""
+
+#: judge/models/contest.py:119 judge/models/problem.py:181
+#: judge/models/profile.py:86
msgid "organizations"
msgstr ""
-#: .\judge\models\contest.py:85
+#: judge/models/contest.py:120
msgid "If private, only these organizations may see the contest"
msgstr ""
-#: .\judge\models\contest.py:86 .\judge\models\problem.py:123
+#: judge/models/contest.py:121 judge/models/problem.py:167
msgid "OpenGraph image"
msgstr ""
-#: .\judge\models\contest.py:88
+#: judge/models/contest.py:122 judge/models/profile.py:57
+msgid "Logo override image"
+msgstr ""
+
+#: judge/models/contest.py:124
+msgid ""
+"This image will replace the default site logo for users inside the contest."
+msgstr ""
+
+#: judge/models/contest.py:127
msgid "the amount of live participants"
msgstr ""
-#: .\judge\models\contest.py:89
+#: judge/models/contest.py:128
msgid "contest summary"
msgstr ""
-#: .\judge\models\contest.py:90 .\judge\models\problem.py:125
+#: judge/models/contest.py:129 judge/models/problem.py:169
msgid "Plain-text, shown in meta description tag, e.g. for social media."
msgstr ""
-#: .\judge\models\contest.py:91 .\judge\models\profile.py:41
+#: judge/models/contest.py:130 judge/models/profile.py:56
msgid "access code"
msgstr ""
-#: .\judge\models\contest.py:92
+#: judge/models/contest.py:131
msgid ""
"An optional code to prompt contestants before they are allowed to join the "
"contest. Leave it blank to disable."
msgstr ""
-#: .\judge\models\contest.py:169
+#: judge/models/contest.py:133 judge/models/problem.py:163
+msgid "personae non gratae"
+msgstr ""
+
+#: judge/models/contest.py:134
+msgid "Bans the selected users from joining this contest."
+msgstr ""
+
+#: judge/models/contest.py:135
+msgid "contest format"
+msgstr ""
+
+#: judge/models/contest.py:136
+msgid "The contest format module to use."
+msgstr ""
+
+#: judge/models/contest.py:137
+msgid "contest format configuration"
+msgstr ""
+
+#: judge/models/contest.py:138
+msgid ""
+"A JSON object to serve as the configuration for the chosen contest format "
+"module. Leave empty to use None. Exact format depends on the contest format "
+"selected."
+msgstr ""
+
+#: judge/models/contest.py:145
+msgid "contest lock"
+msgstr ""
+
+#: judge/models/contest.py:146
+msgid ""
+"Prevent submissions from this contest from being rejudged after this date."
+msgstr ""
+
+#: judge/models/contest.py:148
+msgid "precision points"
+msgstr ""
+
+#: judge/models/contest.py:150
+msgid "Number of digits to round points to."
+msgstr ""
+
+#: judge/models/contest.py:398
msgid "See private contests"
msgstr ""
-#: .\judge\models\contest.py:170
+#: judge/models/contest.py:399
msgid "Edit own contests"
msgstr ""
-#: .\judge\models\contest.py:171
+#: judge/models/contest.py:400
msgid "Edit all contests"
msgstr ""
-#: .\judge\models\contest.py:172
+#: judge/models/contest.py:401
+msgid "Clone contest"
+msgstr ""
+
+#: judge/models/contest.py:402 templates/contest/moss.html:74
+msgid "MOSS contest"
+msgstr ""
+
+#: judge/models/contest.py:403
msgid "Rate contests"
msgstr ""
-#: .\judge\models\contest.py:173
+#: judge/models/contest.py:404
msgid "Contest access codes"
msgstr ""
-#: .\judge\models\contest.py:175 .\judge\models\contest.py:263
-#: .\judge\models\contest.py:298
+#: judge/models/contest.py:405
+msgid "Create private contests"
+msgstr ""
+
+#: judge/models/contest.py:406
+msgid "Change contest visibility"
+msgstr ""
+
+#: judge/models/contest.py:407
+msgid "Edit contest problem label script"
+msgstr ""
+
+#: judge/models/contest.py:408
+msgid "Change lock status of contest"
+msgstr ""
+
+#: judge/models/contest.py:410 judge/models/contest.py:508
+#: judge/models/contest.py:547 judge/models/contest.py:569
+#: judge/models/submission.py:85
msgid "contest"
msgstr ""
-#: .\judge\models\contest.py:176
+#: judge/models/contest.py:411
msgid "contests"
msgstr ""
-#: .\judge\models\contest.py:180
+#: judge/models/contest.py:418
msgid "associated contest"
msgstr ""
-#: .\judge\models\contest.py:181 .\judge\models\contest.py:297
-#: .\judge\models\profile.py:173
-msgid "user"
-msgstr ""
-
-#: .\judge\models\contest.py:183
+#: judge/models/contest.py:421
msgid "score"
msgstr ""
-#: .\judge\models\contest.py:184
+#: judge/models/contest.py:422
msgid "cumulative time"
msgstr ""
-#: .\judge\models\contest.py:185
+#: judge/models/contest.py:423
+msgid "is disqualified"
+msgstr ""
+
+#: judge/models/contest.py:424
+msgid "Whether this participation is disqualified."
+msgstr ""
+
+#: judge/models/contest.py:425
+msgid "tie-breaking field"
+msgstr ""
+
+#: judge/models/contest.py:426
msgid "virtual participation id"
msgstr ""
-#: .\judge\models\contest.py:186
-msgid "0 means non-virtual, otherwise the n-th virtual participation"
+#: judge/models/contest.py:427
+msgid "0 means non-virtual, otherwise the n-th virtual participation."
+msgstr ""
+
+#: judge/models/contest.py:428
+msgid "contest format specific data"
msgstr ""
-#: .\judge\models\contest.py:249
+#: judge/models/contest.py:494
#, python-format
msgid "%s spectating in %s"
msgstr ""
-#: .\judge\models\contest.py:251
+#: judge/models/contest.py:496
#, python-format
msgid "%s in %s, v%d"
msgstr ""
-#: .\judge\models\contest.py:252
+#: judge/models/contest.py:497
#, python-format
msgid "%s in %s"
msgstr ""
-#: .\judge\models\contest.py:255
+#: judge/models/contest.py:500
msgid "contest participation"
msgstr ""
-#: .\judge\models\contest.py:256
+#: judge/models/contest.py:501
msgid "contest participations"
msgstr ""
-#: .\judge\models\contest.py:262 .\judge\models\contest.py:282
-#: .\judge\models\problem.py:303 .\judge\models\problem.py:308
-#: .\judge\models\problem.py:326 .\judge\models\problem_data.py:34
+#: judge/models/contest.py:507 judge/models/contest.py:531
+#: judge/models/contest.py:570 judge/models/problem.py:457
+#: judge/models/problem.py:462 judge/models/problem.py:480
+#: judge/models/problem_data.py:35
msgid "problem"
msgstr ""
-#: .\judge\models\contest.py:264 .\judge\models\contest.py:286
-#: .\judge\models\problem.py:112
+#: judge/models/contest.py:509 judge/models/contest.py:535
+#: judge/models/problem.py:151
msgid "points"
msgstr ""
-#: .\judge\models\contest.py:265
+#: judge/models/contest.py:510
msgid "partial"
msgstr ""
-#: .\judge\models\contest.py:266 .\judge\models\contest.py:287
+#: judge/models/contest.py:511 judge/models/contest.py:536
msgid "is pretested"
msgstr ""
-#: .\judge\models\contest.py:267 .\judge\models\interface.py:43
+#: judge/models/contest.py:512 judge/models/interface.py:43
msgid "order"
msgstr ""
-#: .\judge\models\contest.py:268
+#: judge/models/contest.py:513
msgid "output prefix length override"
msgstr ""
-#: .\judge\models\contest.py:269
-msgid "Maximum number of submissions for this problem, or 0 for no limit."
+#: judge/models/contest.py:515
+msgid ""
+"Maximum number of submissions for this problem, or leave blank for no limit."
msgstr ""
-#: .\judge\models\contest.py:271
+#: judge/models/contest.py:518
msgid "Why include a problem you can't submit to?"
msgstr ""
-#: .\judge\models\contest.py:276
+#: judge/models/contest.py:523
msgid "contest problem"
msgstr ""
-#: .\judge\models\contest.py:277
+#: judge/models/contest.py:524
msgid "contest problems"
msgstr ""
-#: .\judge\models\contest.py:281 .\judge\models\submission.py:149
+#: judge/models/contest.py:529 judge/models/submission.py:218
msgid "submission"
msgstr ""
-#: .\judge\models\contest.py:284 .\judge\models\contest.py:299
+#: judge/models/contest.py:533 judge/models/contest.py:548
msgid "participation"
msgstr ""
-#: .\judge\models\contest.py:288
+#: judge/models/contest.py:537
msgid "Whether this submission was ran only on pretests."
msgstr ""
-#: .\judge\models\contest.py:292
+#: judge/models/contest.py:541
msgid "contest submission"
msgstr ""
-#: .\judge\models\contest.py:293
+#: judge/models/contest.py:542
msgid "contest submissions"
msgstr ""
-#: .\judge\models\contest.py:300
+#: judge/models/contest.py:550
msgid "rank"
msgstr ""
-#: .\judge\models\contest.py:301
+#: judge/models/contest.py:551
msgid "rating"
msgstr ""
-#: .\judge\models\contest.py:302
+#: judge/models/contest.py:552
msgid "volatility"
msgstr ""
-#: .\judge\models\contest.py:303
+#: judge/models/contest.py:553
msgid "last rated"
msgstr ""
-#: .\judge\models\contest.py:307
+#: judge/models/contest.py:557
msgid "contest rating"
msgstr ""
-#: .\judge\models\contest.py:308
+#: judge/models/contest.py:558
msgid "contest ratings"
msgstr ""
-#: .\judge\models\interface.py:24
+#: judge/models/contest.py:577
+msgid "contest moss result"
+msgstr ""
+
+#: judge/models/contest.py:578
+msgid "contest moss results"
+msgstr ""
+
+#: judge/models/interface.py:24
msgid "configuration item"
msgstr ""
-#: .\judge\models\interface.py:25
+#: judge/models/interface.py:25
msgid "miscellaneous configuration"
msgstr ""
-#: .\judge\models\interface.py:37
+#: judge/models/interface.py:37
msgid "navigation item"
msgstr ""
-#: .\judge\models\interface.py:38
+#: judge/models/interface.py:38
msgid "navigation bar"
msgstr ""
-#: .\judge\models\interface.py:44 .\judge\models\profile.py:22
+#: judge/models/interface.py:44
msgid "identifier"
msgstr ""
-#: .\judge\models\interface.py:45
+#: judge/models/interface.py:45
msgid "label"
msgstr ""
-#: .\judge\models\interface.py:47
+#: judge/models/interface.py:47
msgid "highlight regex"
msgstr ""
-#: .\judge\models\interface.py:48
+#: judge/models/interface.py:48
msgid "parent item"
msgstr ""
-#: .\judge\models\interface.py:65
+#: judge/models/interface.py:66
msgid "post title"
msgstr ""
-#: .\judge\models\interface.py:66 .\judge\models\problem.py:342
+#: judge/models/interface.py:67 judge/models/problem.py:500
msgid "authors"
msgstr ""
-#: .\judge\models\interface.py:67
+#: judge/models/interface.py:68
msgid "slug"
msgstr ""
-#: .\judge\models\interface.py:68 .\judge\models\problem.py:340
+#: judge/models/interface.py:69 judge/models/problem.py:498
msgid "public visibility"
msgstr ""
-#: .\judge\models\interface.py:69
+#: judge/models/interface.py:70
msgid "sticky"
msgstr ""
-#: .\judge\models\interface.py:70
+#: judge/models/interface.py:71
msgid "publish after"
msgstr ""
-#: .\judge\models\interface.py:71
+#: judge/models/interface.py:72
msgid "post content"
msgstr ""
-#: .\judge\models\interface.py:72
+#: judge/models/interface.py:73
msgid "post summary"
msgstr ""
-#: .\judge\models\interface.py:73
+#: judge/models/interface.py:74
msgid "openGraph image"
msgstr ""
-#: .\judge\models\interface.py:90
+#: judge/models/interface.py:96
msgid "Edit all posts"
msgstr ""
-#: .\judge\models\interface.py:92
+#: judge/models/interface.py:98
msgid "blog post"
msgstr ""
-#: .\judge\models\interface.py:93
+#: judge/models/interface.py:99
msgid "blog posts"
msgstr ""
-#: .\judge\models\message.py:10
-msgid "message title"
-msgstr ""
-
-#: .\judge\models\message.py:11 .\judge\models\ticket.py:27
-msgid "message body"
-msgstr ""
-
-#: .\judge\models\message.py:12
-msgid "sender"
-msgstr ""
-
-#: .\judge\models\message.py:13
-msgid "target"
-msgstr ""
-
-#: .\judge\models\message.py:14
-msgid "message timestamp"
-msgstr ""
-
-#: .\judge\models\message.py:15
-msgid "read"
-msgstr ""
-
-#: .\judge\models\message.py:19
-msgid "messages in the thread"
+#: judge/models/problem.py:30
+#, python-format
+msgid "Disallowed characters: %(value)s"
msgstr ""
-#: .\judge\models\problem.py:26
+#: judge/models/problem.py:35
msgid "problem category ID"
msgstr ""
-#: .\judge\models\problem.py:27
+#: judge/models/problem.py:36
msgid "problem category name"
msgstr ""
-#: .\judge\models\problem.py:34
+#: judge/models/problem.py:43
msgid "problem type"
msgstr ""
-#: .\judge\models\problem.py:35 .\judge\models\problem.py:107
+#: judge/models/problem.py:44 judge/models/problem.py:135
msgid "problem types"
msgstr ""
-#: .\judge\models\problem.py:39
+#: judge/models/problem.py:48
msgid "problem group ID"
msgstr ""
-#: .\judge\models\problem.py:40
+#: judge/models/problem.py:49
msgid "problem group name"
msgstr ""
-#: .\judge\models\problem.py:47 .\judge\models\problem.py:108
+#: judge/models/problem.py:56 judge/models/problem.py:138
msgid "problem group"
msgstr ""
-#: .\judge\models\problem.py:48
+#: judge/models/problem.py:57
msgid "problem groups"
msgstr ""
-#: .\judge\models\problem.py:52
+#: judge/models/problem.py:61
msgid "key"
msgstr ""
-#: .\judge\models\problem.py:54
+#: judge/models/problem.py:63
msgid "link"
msgstr ""
-#: .\judge\models\problem.py:55
+#: judge/models/problem.py:64
msgid "full name"
msgstr ""
-#: .\judge\models\problem.py:56 .\judge\models\profile.py:26
-#: .\judge\models\runtime.py:20
+#: judge/models/problem.py:65 judge/models/profile.py:44
+#: judge/models/runtime.py:24
msgid "short name"
msgstr ""
-#: .\judge\models\problem.py:57
+#: judge/models/problem.py:66
msgid "Displayed on pages under this license"
msgstr ""
-#: .\judge\models\problem.py:58
+#: judge/models/problem.py:67
msgid "icon"
msgstr ""
-#: .\judge\models\problem.py:58
+#: judge/models/problem.py:67
msgid "URL to the icon"
msgstr ""
-#: .\judge\models\problem.py:59
+#: judge/models/problem.py:68
msgid "license text"
msgstr ""
-#: .\judge\models\problem.py:68
+#: judge/models/problem.py:77
msgid "license"
msgstr ""
-#: .\judge\models\problem.py:69
+#: judge/models/problem.py:78
msgid "licenses"
msgstr ""
-#: .\judge\models\problem.py:96
-msgid "problem code"
+#: judge/models/problem.py:112
+msgid "Follow global setting"
msgstr ""
-#: .\judge\models\problem.py:97
-msgid "Problem code must be ^[a-z0-9]+$"
+#: judge/models/problem.py:113
+msgid "Always visible"
msgstr ""
-#: .\judge\models\problem.py:98
-msgid "problem name"
+#: judge/models/problem.py:114
+msgid "Visible if problem solved"
msgstr ""
-#: .\judge\models\problem.py:99
-msgid "problem body"
+#: judge/models/problem.py:115
+msgid "Only own submissions"
msgstr ""
-#: .\judge\models\problem.py:100
-msgid "creators"
+#: judge/models/problem.py:118
+msgid "problem code"
msgstr ""
-#: .\judge\models\problem.py:101
-msgid "curators"
+#: judge/models/problem.py:120
+msgid "A short, unique code for the problem, used in the url after /problem/"
msgstr ""
-#: .\judge\models\problem.py:102
-msgid ""
-"These users will be able to edit a problem, but not be publicly shown as an "
-"author."
+#: judge/models/problem.py:122
+msgid "problem name"
msgstr ""
-#: .\judge\models\problem.py:104
-msgid "testers"
+#: judge/models/problem.py:123
+msgid "The full name of the problem, as shown in the problem list."
msgstr ""
-#: .\judge\models\problem.py:106
-msgid "These users will be able to view a private problem, but not edit it."
+#: judge/models/problem.py:125
+msgid "problem body"
msgstr ""
-#: .\judge\models\problem.py:109
-msgid ""
+#: judge/models/problem.py:126
+msgid "creators"
+msgstr ""
+
+#: judge/models/problem.py:127
+msgid "These users will be able to edit the problem, and be listed as authors."
+msgstr ""
+
+#: judge/models/problem.py:129
+msgid "curators"
+msgstr ""
+
+#: judge/models/problem.py:130
+msgid ""
+"These users will be able to edit the problem, but not be listed as authors."
+msgstr ""
+
+#: judge/models/problem.py:132
+msgid "testers"
+msgstr ""
+
+#: judge/models/problem.py:134
+msgid "These users will be able to view the private problem, but not edit it."
+msgstr ""
+
+#: judge/models/problem.py:136
+msgid "The type of problem, as shown on the problem's page."
+msgstr ""
+
+#: judge/models/problem.py:139
+msgid "The group of problem, shown under Category in the problem list."
+msgstr ""
+
+#: judge/models/problem.py:141
+msgid ""
"The time limit for this problem, in seconds. Fractional seconds (e.g. 1.5) "
"are supported."
msgstr ""
-#: .\judge\models\problem.py:110 .\judge\models\problem.py:329
+#: judge/models/problem.py:145 judge/models/problem.py:485
msgid "memory limit"
msgstr ""
-#: .\judge\models\problem.py:110
+#: judge/models/problem.py:146
msgid ""
"The memory limit for this problem, in kilobytes (e.g. 64mb = 65536 "
"kilobytes)."
msgstr ""
-#: .\judge\models\problem.py:113
+#: judge/models/problem.py:152
+msgid ""
+"Points awarded for problem completion. Points are displayed with a 'p' "
+"suffix if partial."
+msgstr ""
+
+#: judge/models/problem.py:155
msgid "allows partial points"
msgstr ""
-#: .\judge\models\problem.py:114
+#: judge/models/problem.py:156
msgid "allowed languages"
msgstr ""
-#: .\judge\models\problem.py:116
+#: judge/models/problem.py:157
+msgid "List of allowed submission languages."
+msgstr ""
+
+#: judge/models/problem.py:159
msgid "manually managed"
msgstr ""
-#: .\judge\models\problem.py:117
-msgid "Whether judges should be allowed to manage data or not"
+#: judge/models/problem.py:160
+msgid "Whether judges should be allowed to manage data or not."
msgstr ""
-#: .\judge\models\problem.py:118
+#: judge/models/problem.py:161
msgid "date of publishing"
msgstr ""
-#: .\judge\models\problem.py:119
+#: judge/models/problem.py:162
msgid ""
"Doesn't have magic ability to auto-publish due to backward compatibility"
msgstr ""
-#: .\judge\models\problem.py:120
-msgid "personae non gratae"
+#: judge/models/problem.py:164
+msgid "Bans the selected users from submitting to this problem."
msgstr ""
-#: .\judge\models\problem.py:121
-msgid "Bans the selected users from submitting to this problem"
+#: judge/models/problem.py:166
+msgid "The license under which this problem is published."
msgstr ""
-#: .\judge\models\problem.py:124
+#: judge/models/problem.py:168
msgid "problem summary"
msgstr ""
-#: .\judge\models\problem.py:126
-msgid "amount of users"
+#: judge/models/problem.py:170
+msgid "number of users"
+msgstr ""
+
+#: judge/models/problem.py:171
+msgid "The number of users who solved the problem."
+msgstr ""
+
+#: judge/models/problem.py:172
+msgid "solve rate"
+msgstr ""
+
+#: judge/models/problem.py:173
+msgid "allow full markdown access"
+msgstr ""
+
+#: judge/models/problem.py:174
+msgid "submission source visibility"
+msgstr ""
+
+#: judge/models/problem.py:182
+msgid "If private, only these organizations may see the problem."
+msgstr ""
+
+#: judge/models/problem.py:447
+msgid "See hidden problems"
+msgstr ""
+
+#: judge/models/problem.py:448
+msgid "Edit own problems"
+msgstr ""
+
+#: judge/models/problem.py:449
+msgid "Edit all problems"
+msgstr ""
+
+#: judge/models/problem.py:450
+msgid "Edit all public problems"
+msgstr ""
+
+#: judge/models/problem.py:451
+msgid "Edit problems with full markup"
+msgstr ""
+
+#: judge/models/problem.py:452 templates/problem/problem.html:161
+msgid "Clone problem"
+msgstr ""
+
+#: judge/models/problem.py:453
+msgid "Change is_public field"
msgstr ""
-#: .\judge\models\problem.py:127
-msgid "The amount of users on the best solutions page."
+#: judge/models/problem.py:454
+msgid "Change is_manually_managed field"
msgstr ""
-#: .\judge\models\problem.py:128
-msgid "rate of AC submissions"
+#: judge/models/problem.py:455
+msgid "See organization-private problems"
msgstr ""
-#: .\judge\models\problem.py:309 .\judge\models\problem.py:327
-#: .\judge\models\runtime.py:96
+#: judge/models/problem.py:463 judge/models/problem.py:481
+#: judge/models/runtime.py:111
msgid "language"
msgstr ""
-#: .\judge\models\problem.py:310
+#: judge/models/problem.py:464
msgid "translated name"
msgstr ""
-#: .\judge\models\problem.py:311
+#: judge/models/problem.py:465
msgid "translated description"
msgstr ""
-#: .\judge\models\problem.py:315
+#: judge/models/problem.py:469
msgid "problem translation"
msgstr ""
-#: .\judge\models\problem.py:316
+#: judge/models/problem.py:470
msgid "problem translations"
msgstr ""
-#: .\judge\models\problem.py:320
+#: judge/models/problem.py:474
msgid "clarified problem"
msgstr ""
-#: .\judge\models\problem.py:321
+#: judge/models/problem.py:475
msgid "clarification body"
msgstr ""
-#: .\judge\models\problem.py:322
+#: judge/models/problem.py:476
msgid "clarification timestamp"
msgstr ""
-#: .\judge\models\problem.py:333
+#: judge/models/problem.py:491
msgid "language-specific resource limit"
msgstr ""
-#: .\judge\models\problem.py:334
+#: judge/models/problem.py:492
msgid "language-specific resource limits"
msgstr ""
-#: .\judge\models\problem.py:338
+#: judge/models/problem.py:496
msgid "associated problem"
msgstr ""
-#: .\judge\models\problem.py:341
+#: judge/models/problem.py:499
msgid "publish date"
msgstr ""
-#: .\judge\models\problem.py:343
+#: judge/models/problem.py:501
msgid "editorial content"
msgstr ""
-#: .\judge\models\problem.py:359
+#: judge/models/problem.py:524
+msgid "See hidden solutions"
+msgstr ""
+
+#: judge/models/problem.py:526
msgid "solution"
msgstr ""
-#: .\judge\models\problem.py:360
+#: judge/models/problem.py:527
msgid "solutions"
msgstr ""
-#: .\judge\models\problem_data.py:23
+#: judge/models/problem_data.py:23
msgid "Standard"
msgstr ""
-#: .\judge\models\problem_data.py:24
+#: judge/models/problem_data.py:24
msgid "Floats"
msgstr ""
-#: .\judge\models\problem_data.py:25
+#: judge/models/problem_data.py:25
msgid "Floats (absolute)"
msgstr ""
-#: .\judge\models\problem_data.py:26
+#: judge/models/problem_data.py:26
msgid "Floats (relative)"
msgstr ""
-#: .\judge\models\problem_data.py:27
+#: judge/models/problem_data.py:27
msgid "Non-trailing spaces"
msgstr ""
-#: .\judge\models\problem_data.py:28
+#: judge/models/problem_data.py:28
msgid "Unordered"
msgstr ""
-#: .\judge\models\problem_data.py:29
+#: judge/models/problem_data.py:29
msgid "Byte identical"
msgstr ""
-#: .\judge\models\problem_data.py:35
+#: judge/models/problem_data.py:30
+msgid "Line-by-line"
+msgstr ""
+
+#: judge/models/problem_data.py:37
msgid "data zip file"
msgstr ""
-#: .\judge\models\problem_data.py:37
+#: judge/models/problem_data.py:39
msgid "generator file"
msgstr ""
-#: .\judge\models\problem_data.py:39 .\judge\models\problem_data.py:87
+#: judge/models/problem_data.py:41 judge/models/problem_data.py:90
msgid "output prefix length"
msgstr ""
-#: .\judge\models\problem_data.py:40 .\judge\models\problem_data.py:88
+#: judge/models/problem_data.py:42 judge/models/problem_data.py:91
msgid "output limit length"
msgstr ""
-#: .\judge\models\problem_data.py:41
+#: judge/models/problem_data.py:43
msgid "init.yml generation feedback"
msgstr ""
-#: .\judge\models\problem_data.py:42 .\judge\models\problem_data.py:89
+#: judge/models/problem_data.py:44 judge/models/problem_data.py:92
msgid "checker"
msgstr ""
-#: .\judge\models\problem_data.py:43 .\judge\models\problem_data.py:90
+#: judge/models/problem_data.py:45 judge/models/problem_data.py:93
msgid "checker arguments"
msgstr ""
-#: .\judge\models\problem_data.py:44 .\judge\models\problem_data.py:91
+#: judge/models/problem_data.py:46 judge/models/problem_data.py:94
msgid "checker arguments as a JSON object"
msgstr ""
-#: .\judge\models\problem_data.py:75
+#: judge/models/problem_data.py:77
msgid "problem data set"
msgstr ""
-#: .\judge\models\problem_data.py:76
+#: judge/models/problem_data.py:79
msgid "case position"
msgstr ""
-#: .\judge\models\problem_data.py:77
+#: judge/models/problem_data.py:80
msgid "case type"
msgstr ""
-#: .\judge\models\problem_data.py:78
+#: judge/models/problem_data.py:81
msgid "Normal case"
msgstr ""
-#: .\judge\models\problem_data.py:79
+#: judge/models/problem_data.py:82
msgid "Batch start"
msgstr ""
-#: .\judge\models\problem_data.py:80
+#: judge/models/problem_data.py:83
msgid "Batch end"
msgstr ""
-#: .\judge\models\problem_data.py:82
+#: judge/models/problem_data.py:85
msgid "input file name"
msgstr ""
-#: .\judge\models\problem_data.py:83
+#: judge/models/problem_data.py:86
msgid "output file name"
msgstr ""
-#: .\judge\models\problem_data.py:84
+#: judge/models/problem_data.py:87
msgid "generator arguments"
msgstr ""
-#: .\judge\models\problem_data.py:85
+#: judge/models/problem_data.py:88
msgid "point value"
msgstr ""
-#: .\judge\models\problem_data.py:86
+#: judge/models/problem_data.py:89
msgid "case is pretest?"
msgstr ""
-#: .\judge\models\profile.py:21
+#: judge/models/profile.py:41
msgid "organization title"
msgstr ""
-#: .\judge\models\profile.py:23
-msgid "Organization name shows in URL"
+#: judge/models/profile.py:42
+msgid "organization slug"
msgstr ""
-#: .\judge\models\profile.py:27
-msgid "Displayed beside user name during contests"
-msgstr ""
-
-#: .\judge\models\profile.py:28
-msgid "organization description"
+#: judge/models/profile.py:43
+msgid "Organization name shown in URL"
msgstr ""
-#: .\judge\models\profile.py:29
-msgid "registrant"
+#: judge/models/profile.py:45
+msgid "Displayed beside user name during contests"
msgstr ""
-#: .\judge\models\profile.py:31
-msgid "User who registered this organization"
+#: judge/models/profile.py:46
+msgid "organization description"
msgstr ""
-#: .\judge\models\profile.py:32
+#: judge/models/profile.py:47
msgid "administrators"
msgstr ""
-#: .\judge\models\profile.py:33
+#: judge/models/profile.py:48
msgid "Those who can edit this organization"
msgstr ""
-#: .\judge\models\profile.py:34
+#: judge/models/profile.py:49
msgid "creation date"
msgstr ""
-#: .\judge\models\profile.py:35
+#: judge/models/profile.py:50
msgid "is open organization?"
msgstr ""
-#: .\judge\models\profile.py:36
+#: judge/models/profile.py:51
msgid "Allow joining organization"
msgstr ""
-#: .\judge\models\profile.py:37
+#: judge/models/profile.py:52
msgid "maximum size"
msgstr ""
-#: .\judge\models\profile.py:38
+#: judge/models/profile.py:53
msgid ""
"Maximum amount of users in this organization, only applicable to private "
"organizations"
msgstr ""
-#: .\judge\models\profile.py:40
+#: judge/models/profile.py:55
msgid "Student access code"
msgstr ""
-#: .\judge\models\profile.py:63 .\judge\models\profile.py:80
-#: .\judge\models\profile.py:174
-msgid "organization"
+#: judge/models/profile.py:59
+msgid ""
+"This image will replace the default site logo for users viewing the "
+"organization."
msgstr ""
-#: .\judge\models\profile.py:68
-msgid "user associated"
+#: judge/models/profile.py:82
+msgid "Administer organizations"
+msgstr ""
+
+#: judge/models/profile.py:83
+msgid "Edit all organizations"
+msgstr ""
+
+#: judge/models/profile.py:85 judge/models/profile.py:102
+#: judge/models/profile.py:293
+msgid "organization"
msgstr ""
-#: .\judge\models\profile.py:69
-msgid "display name"
+#: judge/models/profile.py:90
+msgid "user associated"
msgstr ""
-#: .\judge\models\profile.py:70
+#: judge/models/profile.py:91
msgid "self-description"
msgstr ""
-#: .\judge\models\profile.py:71
+#: judge/models/profile.py:92
msgid "location"
msgstr ""
-#: .\judge\models\profile.py:73
+#: judge/models/profile.py:94
msgid "preferred language"
msgstr ""
-#: .\judge\models\profile.py:78
+#: judge/models/profile.py:100
msgid "last access time"
msgstr ""
-#: .\judge\models\profile.py:79
+#: judge/models/profile.py:101
msgid "last IP"
msgstr ""
-#: .\judge\models\profile.py:82
+#: judge/models/profile.py:104
msgid "display rank"
msgstr ""
-#: .\judge\models\profile.py:84
+#: judge/models/profile.py:106
+msgid "Normal User"
+msgstr ""
+
+#: judge/models/profile.py:107
+msgid "Problem Setter"
+msgstr ""
+
+#: judge/models/profile.py:108 templates/base.html:220
+#: templates/comments/list.html:99 templates/contest/contest-list-tabs.html:24
+#: templates/contest/ranking-table.html:49
+#: templates/problem/problem-list-tabs.html:6
+#: templates/submission/info-base.html:13
+#: templates/submission/submission-list-tabs.html:15
+msgid "Admin"
+msgstr ""
+
+#: judge/models/profile.py:109
msgid "comment mute"
msgstr ""
-#: .\judge\models\profile.py:84
+#: judge/models/profile.py:109
msgid "Some users are at their best when silent."
msgstr ""
-#: .\judge\models\profile.py:87
+#: judge/models/profile.py:111
+msgid "unlisted user"
+msgstr ""
+
+#: judge/models/profile.py:111
+msgid "User will not be ranked."
+msgstr ""
+
+#: judge/models/profile.py:114
msgid "user script"
msgstr ""
-#: .\judge\models\profile.py:88
+#: judge/models/profile.py:115
msgid "User-defined JavaScript for site customization."
msgstr ""
-#: .\judge\models\profile.py:89
+#: judge/models/profile.py:116
msgid "current contest"
msgstr ""
-#: .\judge\models\profile.py:91
+#: judge/models/profile.py:118
msgid "math engine"
msgstr ""
-#: .\judge\models\profile.py:93
+#: judge/models/profile.py:120
msgid "the rendering engine used to render math"
msgstr ""
-#: .\judge\models\profile.py:130
-#, python-format
-msgctxt "user display name"
-msgid "%(username)s (%(display)s)"
+#: judge/models/profile.py:121
+msgid "TOTP 2FA enabled"
+msgstr ""
+
+#: judge/models/profile.py:122
+msgid "check to enable TOTP-based two-factor authentication"
+msgstr ""
+
+#: judge/models/profile.py:123
+msgid "WebAuthn 2FA enabled"
+msgstr ""
+
+#: judge/models/profile.py:124
+msgid "check to enable WebAuthn-based two-factor authentication"
+msgstr ""
+
+#: judge/models/profile.py:125
+msgid "TOTP key"
+msgstr ""
+
+#: judge/models/profile.py:126
+msgid "32 character base32-encoded key for TOTP"
+msgstr ""
+
+#: judge/models/profile.py:128
+msgid "TOTP key must be empty or base32"
+msgstr ""
+
+#: judge/models/profile.py:129
+msgid "scratch codes"
+msgstr ""
+
+#: judge/models/profile.py:130
+msgid ""
+"JSON array of 16 character base32-encoded "
+"codes for scratch "
+"codes"
+msgstr ""
+
+#: judge/models/profile.py:134
+msgid ""
+"Scratch codes must be empty or a JSON array "
+"of 16-"
+"character base32 codes"
+msgstr ""
+
+#: judge/models/profile.py:136
+msgid "last TOTP timecode"
+msgstr ""
+
+#: judge/models/profile.py:137
+msgid "API token"
+msgstr ""
+
+#: judge/models/profile.py:138
+msgid "64 character hex-encoded API access token"
+msgstr ""
+
+#: judge/models/profile.py:140
+msgid "API token must be None or hexadecimal"
+msgstr ""
+
+#: judge/models/profile.py:141
+msgid "internal notes"
+msgstr ""
+
+#: judge/models/profile.py:142
+msgid "Notes for administrators regarding this user."
+msgstr ""
+
+#: judge/models/profile.py:143
+msgid "last data download time"
+msgstr ""
+
+#: judge/models/profile.py:253
+msgid "Shows in-progress development stuff"
+msgstr ""
+
+#: judge/models/profile.py:254
+msgid "Edit TOTP settings"
msgstr ""
-#: .\judge\models\profile.py:168
+#: judge/models/profile.py:256
msgid "user profile"
msgstr ""
-#: .\judge\models\profile.py:169
+#: judge/models/profile.py:257
msgid "user profiles"
msgstr ""
-#: .\judge\models\profile.py:175
+#: judge/models/profile.py:263
+msgid "device name"
+msgstr ""
+
+#: judge/models/profile.py:264
+msgid "credential ID"
+msgstr ""
+
+#: judge/models/profile.py:265
+msgid "public key"
+msgstr ""
+
+#: judge/models/profile.py:266
+msgid "sign counter"
+msgstr ""
+
+#: judge/models/profile.py:287
+msgid "WebAuthn credential"
+msgstr ""
+
+#: judge/models/profile.py:288
+msgid "WebAuthn credentials"
+msgstr ""
+
+#: judge/models/profile.py:295
msgid "request time"
msgstr ""
-#: .\judge\models\profile.py:176
+#: judge/models/profile.py:296
msgid "state"
msgstr ""
-#: .\judge\models\profile.py:181
+#: judge/models/profile.py:301
msgid "reason"
msgstr ""
-#: .\judge\models\profile.py:184
+#: judge/models/profile.py:304
msgid "organization join request"
msgstr ""
-#: .\judge\models\profile.py:185
+#: judge/models/profile.py:305
msgid "organization join requests"
msgstr ""
-#: .\judge\models\runtime.py:15
+#: judge/models/runtime.py:19
msgid "short identifier"
msgstr ""
-#: .\judge\models\runtime.py:16
+#: judge/models/runtime.py:20
msgid ""
"The identifier for this language; the same as its executor id for judges."
msgstr ""
-#: .\judge\models\runtime.py:18
+#: judge/models/runtime.py:22
msgid "long name"
msgstr ""
-#: .\judge\models\runtime.py:19
+#: judge/models/runtime.py:23
msgid "Longer name for the language, e.g. \"Python 2\" or \"C++11\"."
msgstr ""
-#: .\judge\models\runtime.py:21
+#: judge/models/runtime.py:25
msgid ""
"More readable, but short, name to display publicly; e.g. \"PY2\" or \"C+"
"+11\". If left blank, it will default to the short identifier."
msgstr ""
-#: .\judge\models\runtime.py:25
+#: judge/models/runtime.py:29
msgid "common name"
msgstr ""
-#: .\judge\models\runtime.py:26
+#: judge/models/runtime.py:30
msgid ""
"Common name for the language. For example, the common name for C++03, C++11, "
"and C++14 would be \"C++\""
msgstr ""
-#: .\judge\models\runtime.py:28
+#: judge/models/runtime.py:32
msgid "ace mode name"
msgstr ""
-#: .\judge\models\runtime.py:29
+#: judge/models/runtime.py:33
msgid ""
"Language ID for Ace.js editor highlighting, appended to \"mode-\" to "
"determine the Ace JavaScript file to use, e.g., \"python\"."
msgstr ""
-#: .\judge\models\runtime.py:31
+#: judge/models/runtime.py:35
msgid "pygments name"
msgstr ""
-#: .\judge\models\runtime.py:32
+#: judge/models/runtime.py:36
msgid "Language ID for Pygments highlighting in source windows."
msgstr ""
-#: .\judge\models\runtime.py:33
+#: judge/models/runtime.py:37
msgid "code template"
msgstr ""
-#: .\judge\models\runtime.py:34
+#: judge/models/runtime.py:38
msgid "Code template to display in submission editor."
msgstr ""
-#: .\judge\models\runtime.py:35
+#: judge/models/runtime.py:39
msgid "runtime info override"
msgstr ""
-#: .\judge\models\runtime.py:36
+#: judge/models/runtime.py:40
msgid ""
"Do not set this unless you know what you're doing! It will override the "
"usually more specific, judge-provided runtime info!"
msgstr ""
-#: .\judge\models\runtime.py:38
+#: judge/models/runtime.py:42
msgid "language description"
msgstr ""
-#: .\judge\models\runtime.py:39
+#: judge/models/runtime.py:43
msgid ""
-"Use field this to inform users of quirks with your environment, additional "
+"Use this field to inform users of quirks with your environment, additional "
"restrictions, etc."
msgstr ""
-#: .\judge\models\runtime.py:41
+#: judge/models/runtime.py:45
msgid "extension"
msgstr ""
-#: .\judge\models\runtime.py:42
+#: judge/models/runtime.py:46
msgid "The extension of source files, e.g., \"py\" or \"cpp\"."
msgstr ""
-#: .\judge\models\runtime.py:97
+#: judge/models/runtime.py:112
msgid "languages"
msgstr ""
-#: .\judge\models\runtime.py:101
+#: judge/models/runtime.py:116
msgid "language to which this runtime belongs"
msgstr ""
-#: .\judge\models\runtime.py:102
+#: judge/models/runtime.py:117
msgid "judge on which this runtime exists"
msgstr ""
-#: .\judge\models\runtime.py:103
+#: judge/models/runtime.py:118
msgid "runtime name"
msgstr ""
-#: .\judge\models\runtime.py:104
+#: judge/models/runtime.py:119
msgid "runtime version"
msgstr ""
-#: .\judge\models\runtime.py:105
+#: judge/models/runtime.py:120
msgid "order in which to display this runtime"
msgstr ""
-#: .\judge\models\runtime.py:109
+#: judge/models/runtime.py:124
msgid "Server name, hostname-style"
msgstr ""
-#: .\judge\models\runtime.py:110
+#: judge/models/runtime.py:125
msgid "time of creation"
msgstr ""
-#: .\judge\models\runtime.py:111
-msgid "A key to authenticated this judge"
+#: judge/models/runtime.py:126
+msgid "A key to authenticate this judge"
msgstr ""
-#: .\judge\models\runtime.py:112
+#: judge/models/runtime.py:127
msgid "authentication key"
msgstr ""
-#: .\judge\models\runtime.py:113
+#: judge/models/runtime.py:128
+msgid "block judge"
+msgstr ""
+
+#: judge/models/runtime.py:129
+msgid ""
+"Whether this judge should be blocked from connecting, even if its key is "
+"correct."
+msgstr ""
+
+#: judge/models/runtime.py:131
msgid "judge online status"
msgstr ""
-#: .\judge\models\runtime.py:114
+#: judge/models/runtime.py:132
msgid "judge start time"
msgstr ""
-#: .\judge\models\runtime.py:115
+#: judge/models/runtime.py:133
msgid "response time"
msgstr ""
-#: .\judge\models\runtime.py:116
+#: judge/models/runtime.py:134
msgid "system load"
msgstr ""
-#: .\judge\models\runtime.py:117
+#: judge/models/runtime.py:135
msgid "Load for the last minute, divided by processors to be fair."
msgstr ""
-#: .\judge\models\runtime.py:121 .\judge\models\runtime.py:156
+#: judge/models/runtime.py:139 judge/models/runtime.py:181
msgid "judges"
msgstr ""
-#: .\judge\models\runtime.py:155
+#: judge/models/runtime.py:180
msgid "judge"
msgstr ""
-#: .\judge\models\submission.py:15 .\judge\models\submission.py:41
-#: .\judge\utils\problems.py:81
+#: judge/models/submission.py:21 judge/models/submission.py:48
+#: judge/utils/problems.py:74
msgid "Accepted"
msgstr ""
-#: .\judge\models\submission.py:16 .\judge\models\submission.py:42
-#: .\judge\utils\problems.py:82
+#: judge/models/submission.py:22 judge/models/submission.py:49
msgid "Wrong Answer"
msgstr ""
-#: .\judge\models\submission.py:17 .\judge\models\submission.py:44
-#: .\judge\utils\problems.py:84
+#: judge/models/submission.py:23 judge/models/submission.py:51
msgid "Time Limit Exceeded"
msgstr ""
-#: .\judge\models\submission.py:18 .\judge\models\submission.py:45
-#: .\judge\utils\problems.py:85
+#: judge/models/submission.py:24 judge/models/submission.py:52
msgid "Memory Limit Exceeded"
msgstr ""
-#: .\judge\models\submission.py:19 .\judge\models\submission.py:46
+#: judge/models/submission.py:25 judge/models/submission.py:53
msgid "Output Limit Exceeded"
msgstr ""
-#: .\judge\models\submission.py:20 .\judge\models\submission.py:47
+#: judge/models/submission.py:26 judge/models/submission.py:54
msgid "Invalid Return"
msgstr ""
-#: .\judge\models\submission.py:21 .\judge\models\submission.py:48
+#: judge/models/submission.py:27 judge/models/submission.py:55
msgid "Runtime Error"
msgstr ""
-#: .\judge\models\submission.py:22 .\judge\models\submission.py:36
-#: .\judge\models\submission.py:49 .\judge\utils\problems.py:83
+#: judge/models/submission.py:28 judge/models/submission.py:42
+#: judge/models/submission.py:56 judge/utils/problems.py:76
msgid "Compile Error"
msgstr ""
-#: .\judge\models\submission.py:23 .\judge\models\submission.py:35
+#: judge/models/submission.py:29 judge/models/submission.py:41
msgid "Internal Error"
msgstr ""
-#: .\judge\models\submission.py:24
+#: judge/models/submission.py:30
msgid "Short circuit"
msgstr ""
-#: .\judge\models\submission.py:25 .\judge\models\submission.py:37
-#: .\judge\models\submission.py:55
+#: judge/models/submission.py:31 judge/models/submission.py:43
+#: judge/models/submission.py:62
msgid "Aborted"
msgstr ""
-#: .\judge\models\submission.py:31 .\judge\models\submission.py:51
+#: judge/models/submission.py:37 judge/models/submission.py:58
msgid "Queued"
msgstr ""
-#: .\judge\models\submission.py:32 .\judge\models\submission.py:52
+#: judge/models/submission.py:38 judge/models/submission.py:59
msgid "Processing"
msgstr ""
-#: .\judge\models\submission.py:33 .\judge\models\submission.py:53
+#: judge/models/submission.py:39 judge/models/submission.py:60
msgid "Grading"
msgstr ""
-#: .\judge\models\submission.py:34 .\judge\models\submission.py:54
+#: judge/models/submission.py:40 judge/models/submission.py:61
msgid "Completed"
msgstr ""
-#: .\judge\models\submission.py:50
+#: judge/models/submission.py:57
msgid "Internal Error (judging server error)"
msgstr ""
-#: .\judge\models\submission.py:60
+#: judge/models/submission.py:67
msgid "submission time"
msgstr ""
-#: .\judge\models\submission.py:61 .\judge\models\submission.py:159
+#: judge/models/submission.py:68 judge/models/submission.py:238
msgid "execution time"
msgstr ""
-#: .\judge\models\submission.py:62 .\judge\models\submission.py:160
+#: judge/models/submission.py:69 judge/models/submission.py:239
msgid "memory usage"
msgstr ""
-#: .\judge\models\submission.py:63 .\judge\models\submission.py:161
+#: judge/models/submission.py:70 judge/models/submission.py:240
msgid "points granted"
msgstr ""
-#: .\judge\models\submission.py:64
+#: judge/models/submission.py:71
msgid "submission language"
msgstr ""
-#: .\judge\models\submission.py:65
-msgid "source code"
-msgstr ""
-
-#: .\judge\models\submission.py:66
+#: judge/models/submission.py:72
msgid "status"
msgstr ""
-#: .\judge\models\submission.py:67
+#: judge/models/submission.py:73
msgid "result"
msgstr ""
-#: .\judge\models\submission.py:69
+#: judge/models/submission.py:75
msgid "compile errors"
msgstr ""
-#: .\judge\models\submission.py:71
+#: judge/models/submission.py:77
msgid "batched cases"
msgstr ""
-#: .\judge\models\submission.py:72
+#: judge/models/submission.py:78
msgid "test case points"
msgstr ""
-#: .\judge\models\submission.py:73
+#: judge/models/submission.py:79
msgid "test case total points"
msgstr ""
-#: .\judge\models\submission.py:74
+#: judge/models/submission.py:80
msgid "judged on"
msgstr ""
-#: .\judge\models\submission.py:76
-msgid "was rejudged by admin"
+#: judge/models/submission.py:82
+msgid "submission judge time"
+msgstr ""
+
+#: judge/models/submission.py:83
+msgid "last rejudge date by admin"
msgstr ""
-#: .\judge\models\submission.py:77
+#: judge/models/submission.py:84
msgid "was ran on pretests only"
msgstr ""
-#: .\judge\models\submission.py:150
+#: judge/models/submission.py:87
+msgid "submission lock"
+msgstr ""
+
+#: judge/models/submission.py:210
+msgid "Abort any submission"
+msgstr ""
+
+#: judge/models/submission.py:211
+msgid "Rejudge the submission"
+msgstr ""
+
+#: judge/models/submission.py:212
+msgid "Rejudge a lot of submissions"
+msgstr ""
+
+#: judge/models/submission.py:213
+msgid "Submit without limit"
+msgstr ""
+
+#: judge/models/submission.py:214
+msgid "View all submission"
+msgstr ""
+
+#: judge/models/submission.py:215
+msgid "Resubmit others' submission"
+msgstr ""
+
+#: judge/models/submission.py:216
+msgid "Change lock status of submission"
+msgstr ""
+
+#: judge/models/submission.py:219 templates/contest/moss.html:58
msgid "submissions"
msgstr ""
-#: .\judge\models\submission.py:156
+#: judge/models/submission.py:223 judge/models/submission.py:234
msgid "associated submission"
msgstr ""
-#: .\judge\models\submission.py:157
+#: judge/models/submission.py:225
+msgid "source code"
+msgstr ""
+
+#: judge/models/submission.py:236
msgid "test case ID"
msgstr ""
-#: .\judge\models\submission.py:158
+#: judge/models/submission.py:237
msgid "status flag"
msgstr ""
-#: .\judge\models\submission.py:162
+#: judge/models/submission.py:241
msgid "points possible"
msgstr ""
-#: .\judge\models\submission.py:163
+#: judge/models/submission.py:242
msgid "batch number"
msgstr ""
-#: .\judge\models\submission.py:164
+#: judge/models/submission.py:243
msgid "judging feedback"
msgstr ""
-#: .\judge\models\submission.py:165
+#: judge/models/submission.py:244
+msgid "extended judging feedback"
+msgstr ""
+
+#: judge/models/submission.py:245
msgid "program output"
msgstr ""
-#: .\judge\models\submission.py:172
+#: judge/models/submission.py:253
msgid "submission test case"
msgstr ""
-#: .\judge\models\submission.py:173
+#: judge/models/submission.py:254
msgid "submission test cases"
msgstr ""
-#: .\judge\models\ticket.py:10
+#: judge/models/ticket.py:10
msgid "ticket title"
msgstr ""
-#: .\judge\models\ticket.py:11
+#: judge/models/ticket.py:11
msgid "ticket creator"
msgstr ""
-#: .\judge\models\ticket.py:12
+#: judge/models/ticket.py:13
msgid "creation time"
msgstr ""
-#: .\judge\models\ticket.py:13
+#: judge/models/ticket.py:14
msgid "assignees"
msgstr ""
-#: .\judge\models\ticket.py:14
+#: judge/models/ticket.py:16
msgid "quick notes"
msgstr ""
-#: .\judge\models\ticket.py:15
+#: judge/models/ticket.py:17
msgid "Staff notes for this issue to aid in processing."
msgstr ""
-#: .\judge\models\ticket.py:16
+#: judge/models/ticket.py:18
msgid "linked item type"
msgstr ""
-#: .\judge\models\ticket.py:18
+#: judge/models/ticket.py:20
msgid "linked item ID"
msgstr ""
-#: .\judge\models\ticket.py:20
+#: judge/models/ticket.py:22
msgid "is ticket open?"
msgstr ""
-#: .\judge\models\ticket.py:24
+#: judge/models/ticket.py:26
msgid "ticket"
msgstr ""
-#: .\judge\models\ticket.py:26
+#: judge/models/ticket.py:28
msgid "poster"
msgstr ""
-#: .\judge\models\ticket.py:28
+#: judge/models/ticket.py:30
+msgid "message body"
+msgstr ""
+
+#: judge/models/ticket.py:31
msgid "message time"
msgstr ""
-#: .\judge\pdf_problems.py:111
+#: judge/pdf_problems.py:147 judge/pdf_problems.py:200
+#: judge/pdf_problems.py:260
msgid "Page [page] of [topage]"
msgstr ""
-#: .\judge\utils\problem_data.py:63
+#: judge/pdf_problems.py:282
+#, python-format
+msgid "Page %s of %s"
+msgstr ""
+
+#: judge/tasks/contest.py:19
+msgid "Recalculating contest scores"
+msgstr ""
+
+#: judge/tasks/contest.py:40
+msgid "Running MOSS"
+msgstr ""
+
+#: judge/tasks/submission.py:45
+msgid "Modifying submissions"
+msgstr ""
+
+#: judge/tasks/submission.py:58
+msgid "Recalculating user points"
+msgstr ""
+
+#: judge/tasks/user.py:49
+msgid "Applying filters"
+msgstr ""
+
+#: judge/tasks/user.py:64
+msgid "Preparing your submission data"
+msgstr ""
+
+#: judge/tasks/user.py:95
+msgid "Preparing your comment data"
+msgstr ""
+
+#: judge/utils/problem_data.py:63
msgid "Empty batches not allowed."
msgstr ""
-#: .\judge\utils\problem_data.py:82
+#: judge/utils/problem_data.py:82
#, python-format
msgid "Points must be defined for non-batch case #%d."
msgstr ""
-#: .\judge\utils\problem_data.py:87
+#: judge/utils/problem_data.py:87
#, python-format
msgid "Input file for case %d does not exist: %s"
msgstr ""
-#: .\judge\utils\problem_data.py:90
+#: judge/utils/problem_data.py:90
#, python-format
msgid "Output file for case %d does not exist: %s"
msgstr ""
-#: .\judge\utils\problem_data.py:115
+#: judge/utils/problem_data.py:115
#, python-format
msgid "Batch start case #%d requires points."
msgstr ""
-#: .\judge\utils\problem_data.py:136
+#: judge/utils/problem_data.py:136
#, python-format
msgid "Attempt to end batch outside of one in case #%d"
msgstr ""
-#: .\judge\utils\problem_data.py:154
+#: judge/utils/problem_data.py:154
msgid "How did you corrupt the zip path?"
msgstr ""
-#: .\judge\utils\problem_data.py:160
+#: judge/utils/problem_data.py:160
msgid "How did you corrupt the generator path?"
msgstr ""
-#: .\judge\utils\problems.py:76
+#: judge/utils/problems.py:75
+msgid "Wrong"
+msgstr ""
+
+#: judge/utils/problems.py:77
+msgid "Timeout"
+msgstr ""
+
+#: judge/utils/problems.py:78
+msgid "Error"
+msgstr ""
+
+#: judge/utils/problems.py:89
msgid "Can't pass both queryset and keyword filters"
msgstr ""
-#: .\judge\utils\problems.py:86
-msgid "Other"
+#: judge/utils/pwned.py:101
+msgid "Your password can't be a commonly used password."
+msgstr ""
+
+#: judge/utils/pwned.py:102
+msgid "This password is too common."
msgstr ""
-#: .\judge\utils\problems.py:87
-msgid "Total"
+#: judge/utils/timedelta.py:49
+msgctxt "time format with day"
+msgid "%d day %h:%m:%s"
+msgid_plural "%d days %h:%m:%s"
+msgstr[0] ""
+msgstr[1] ""
+
+#: judge/utils/timedelta.py:53
+msgctxt "time format without day"
+msgid "%h:%m:%s"
+msgstr ""
+
+#: judge/utils/timedelta.py:59
+msgctxt "time format no seconds with day"
+msgid "%d day %h:%m"
+msgid_plural "%d days %h:%m"
+msgstr[0] ""
+msgstr[1] ""
+
+#: judge/utils/timedelta.py:61
+#, python-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+
+#: judge/utils/timedelta.py:63
+msgctxt "hours and minutes"
+msgid "%h:%m"
msgstr ""
-#: .\judge\views\blog.py:36
+#: judge/views/blog.py:37
#, python-format
msgid "Page %d of Posts"
msgstr ""
-#: .\judge\views\comment.py:27
+#: judge/views/comment.py:27
msgid "Messing around, are we?"
msgstr ""
-#: .\judge\views\comment.py:59
+#: judge/views/comment.py:36
+msgid "You must solve at least one problem before you can vote."
+msgstr ""
+
+#: judge/views/comment.py:66
msgid "You already voted."
msgstr ""
-#: .\judge\views\comment.py:116 .\judge\views\organization.py:282
+#: judge/views/comment.py:129 judge/views/organization.py:297
msgid "Edited from site"
msgstr ""
-#: .\judge\views\comment.py:137
+#: judge/views/comment.py:150
msgid "Editing comment"
msgstr ""
-#: .\judge\views\contests.py:48 .\judge\views\contests.py:178
-#: .\judge\views\contests.py:181 .\judge\views\contests.py:308
+#: judge/views/contests.py:57 judge/views/contests.py:210
+#: judge/views/contests.py:213 judge/views/contests.py:395
msgid "No such contest"
msgstr ""
-#: .\judge\views\contests.py:49 .\judge\views\contests.py:179
+#: judge/views/contests.py:58 judge/views/contests.py:211
#, python-format
msgid "Could not find a contest with the key \"%s\"."
msgstr ""
-#: .\judge\views\contests.py:72 .\judge\views\contests.py:322
+#: judge/views/contests.py:71
msgid "Contests"
msgstr ""
-#: .\judge\views\contests.py:182
+#: judge/views/contests.py:214
msgid "Could not find such contest."
msgstr ""
-#: .\judge\views\contests.py:185
+#: judge/views/contests.py:217
#, python-format
msgid "Access to contest \"%s\" denied"
msgstr ""
-#: .\judge\views\contests.py:236
+#: judge/views/contests.py:244
+msgid "Clone Contest"
+msgstr ""
+
+#: judge/views/contests.py:278
+#, python-format
+msgid "Cloned contest from %s"
+msgstr ""
+
+#: judge/views/contests.py:314
msgid "Contest not ongoing"
msgstr ""
-#: .\judge\views\contests.py:237
+#: judge/views/contests.py:315
#, python-format
msgid "\"%s\" is not currently ongoing."
msgstr ""
-#: .\judge\views\contests.py:241
+#: judge/views/contests.py:319
msgid "Already in contest"
msgstr ""
-#: .\judge\views\contests.py:242
+#: judge/views/contests.py:320
#, python-format
msgid "You are already in a contest: \"%s\"."
msgstr ""
-#: .\judge\views\contests.py:298
+#: judge/views/contests.py:323
+msgid "Banned from joining"
+msgstr ""
+
+#: judge/views/contests.py:324
+msgid ""
+"You have been declared persona non grata for this contest. You are "
+"permanently barred from joining this contest."
+msgstr ""
+
+#: judge/views/contests.py:385
#, python-format
msgid "Enter access code for \"%s\""
msgstr ""
-#: .\judge\views\contests.py:309
+#: judge/views/contests.py:396
#, python-format
msgid "You are not in contest \"%s\"."
msgstr ""
-#: .\judge\views\contests.py:329
-msgid "ContestCalender requires integer year and month"
+#: judge/views/contests.py:415
+msgid "ContestCalendar requires integer year and month"
msgstr ""
-#: .\judge\views\contests.py:504
-msgid "???"
+#: judge/views/contests.py:455
+#, python-format
+msgid "Contests in %(month)s"
+msgstr ""
+
+#: judge/views/contests.py:455
+msgid "F Y"
+msgstr ""
+
+#: judge/views/contests.py:502
+#, python-format
+msgid "%s Statistics"
msgstr ""
-#: .\judge\views\contests.py:540
+#: judge/views/contests.py:675
#, python-format
msgid "%s Rankings"
msgstr ""
-#: .\judge\views\contests.py:592
-msgid "Live"
+#: judge/views/contests.py:683
+msgid "???"
msgstr ""
-#: .\judge\views\contests.py:600
+#: judge/views/contests.py:699
#, python-format
msgid "Your participation in %s"
msgstr ""
-#: .\judge\views\contests.py:601
+#: judge/views/contests.py:700
#, python-format
msgid "%s's participation in %s"
msgstr ""
-#: .\judge\views\contests.py:610 .\templates\contest\contest-tabs.html:13
+#: judge/views/contests.py:707
+msgid "Live"
+msgstr ""
+
+#: judge/views/contests.py:719 templates/contest/contest-tabs.html:13
msgid "Participation"
msgstr ""
-#: .\judge\views\contests.py:635
+#: judge/views/contests.py:763
+#, python-format
+msgid "%s MOSS Results"
+msgstr ""
+
+#: judge/views/contests.py:790
+#, python-format
+msgid "Running MOSS for %s..."
+msgstr ""
+
+#: judge/views/contests.py:813
#, python-format
msgid "Contest tag: %s"
msgstr ""
-#: .\judge\views\error.py:14
+#: judge/views/error.py:14
msgid "404 error"
msgstr ""
-#: .\judge\views\error.py:15
+#: judge/views/error.py:15
#, python-format
msgid "Could not find page \"%s\""
msgstr ""
-#: .\judge\views\error.py:21
+#: judge/views/error.py:22
#, python-format
msgid "no permission for %s"
msgstr ""
-#: .\judge\views\error.py:27
+#: judge/views/error.py:30
#, python-format
msgid "corrupt page %s"
msgstr ""
-#: .\judge\views\language.py:12 .\templates\status\judge-status-table.html:9
-#: .\templates\status\status-tabs.html:5
+#: judge/views/language.py:12 templates/status/judge-status-table.html:9
+#: templates/status/status-tabs.html:5
msgid "Runtimes"
msgstr ""
-#: .\judge\views\organization.py:43 .\judge\views\organization.py:46
+#: judge/views/organization.py:43 judge/views/organization.py:46
msgid "No such organization"
msgstr ""
-#: .\judge\views\organization.py:44
+#: judge/views/organization.py:44
#, python-format
msgid "Could not find an organization with the key \"%s\"."
msgstr ""
-#: .\judge\views\organization.py:47
+#: judge/views/organization.py:47
msgid "Could not find such organization."
msgstr ""
-#: .\judge\views\organization.py:62 .\judge\views\register.py:35
-#: .\templates\organization\list.html:15 .\templates\user\user-list-tabs.html:5
+#: judge/views/organization.py:71 judge/views/register.py:33
+#: templates/organization/list.html:15 templates/user/user-list-tabs.html:5
msgid "Organizations"
msgstr ""
-#: .\judge\views\organization.py:83
+#: judge/views/organization.py:92
#, python-format
msgid "%s Members"
msgstr ""
-#: .\judge\views\organization.py:113 .\judge\views\organization.py:115
+#: judge/views/organization.py:117 judge/views/organization.py:120
+#: judge/views/organization.py:125
msgid "Joining organization"
msgstr ""
-#: .\judge\views\organization.py:113
+#: judge/views/organization.py:117
msgid "You are already in the organization."
msgstr ""
-#: .\judge\views\organization.py:115
+#: judge/views/organization.py:120
msgid "This organization is not open."
msgstr ""
-#: .\judge\views\organization.py:124
+#: judge/views/organization.py:137
msgid "Leaving organization"
msgstr ""
-#: .\judge\views\organization.py:124
+#: judge/views/organization.py:137
#, python-format
msgid "You are not in \"%s\"."
msgstr ""
-#: .\judge\views\organization.py:148
+#: judge/views/organization.py:161
#, python-format
msgid "Request to join %s"
msgstr ""
-#: .\judge\views\organization.py:164
+#: judge/views/organization.py:179
msgid "Join request detail"
msgstr ""
-#: .\judge\views\organization.py:193
+#: judge/views/organization.py:207
#, python-format
msgid "Managing join requests for %s"
msgstr ""
-#: .\judge\views\organization.py:224
+#: judge/views/organization.py:238
#, python-format
msgid ""
"Your organization can only receive %d more members. You cannot approve %d "
"users."
msgstr ""
-#: .\judge\views\organization.py:236
+#: judge/views/organization.py:250
#, python-format
msgid "Approved %d user."
msgid_plural "Approved %d users."
msgstr[0] ""
msgstr[1] ""
-#: .\judge\views\organization.py:237
+#: judge/views/organization.py:251
#, python-format
msgid "Rejected %d user."
msgid_plural "Rejected %d users."
msgstr[0] ""
msgstr[1] ""
-#: .\judge\views\organization.py:267
+#: judge/views/organization.py:281
#, python-format
msgid "Editing %s"
msgstr ""
-#: .\judge\views\organization.py:290 .\judge\views\organization.py:298
+#: judge/views/organization.py:305 judge/views/organization.py:313
msgid "Can't edit organization"
msgstr ""
-#: .\judge\views\organization.py:291
+#: judge/views/organization.py:306
msgid "You are not allowed to edit this organization."
msgstr ""
-#: .\judge\views\organization.py:299
+#: judge/views/organization.py:314
msgid "You are not allowed to kick people from this organization."
msgstr ""
-#: .\judge\views\organization.py:304 .\judge\views\organization.py:308
+#: judge/views/organization.py:319 judge/views/organization.py:323
msgid "Can't kick user"
msgstr ""
-#: .\judge\views\organization.py:305
+#: judge/views/organization.py:320
msgid "The user you are trying to kick does not exist!"
msgstr ""
-#: .\judge\views\organization.py:309
+#: judge/views/organization.py:324
#, python-format
msgid "The user you are trying to kick is not in organization: %s."
msgstr ""
-#: .\judge\views\problem.py:72
+#: judge/views/problem.py:68
msgid "No such problem"
msgstr ""
-#: .\judge\views\problem.py:73
+#: judge/views/problem.py:69
#, python-format
msgid "Could not find a problem with the code \"%s\"."
msgstr ""
-#: .\judge\views\problem.py:109
+#: judge/views/problem.py:111
#, python-brace-format
msgid "Editorial for {0}"
msgstr ""
-#: .\judge\views\problem.py:112
+#: judge/views/problem.py:114
#, python-brace-format
msgid "Editorial for {0}"
msgstr ""
-#: .\judge\views\problem.py:271 .\templates\contest\contest.html:79
-#: .\templates\user\user-tabs.html:5 .\templates\user\users-table.html:22
+#: judge/views/problem.py:133
+msgid "No such editorial"
+msgstr ""
+
+#: judge/views/problem.py:134
+#, python-format
+msgid "Could not find an editorial with the code \"%s\"."
+msgstr ""
+
+#: judge/views/problem.py:289 templates/contest/contest.html:79
+#: templates/user/user-tabs.html:5 templates/user/users-table.html:23
msgid "Problems"
msgstr ""
-#: .\judge\views\problem.py:527
+#: judge/views/problem.py:562 judge/views/problem.py:570
+#, python-format
+msgid "Submit to %s"
+msgstr ""
+
+#: judge/views/problem.py:619
msgid "Banned from submitting"
msgstr ""
-#: .\judge\views\problem.py:528
+#: judge/views/problem.py:620
msgid ""
"You have been declared persona non grata for this problem. You are "
"permanently barred from submitting this problem."
msgstr ""
-#: .\judge\views\problem.py:539
+#: judge/views/problem.py:624
msgid "Too many submissions"
msgstr ""
-#: .\judge\views\problem.py:540
+#: judge/views/problem.py:625
msgid "You have exceeded the submission limit for this problem."
msgstr ""
-#: .\judge\views\problem.py:595 .\judge\views\problem.py:598
-#, python-format
-msgid "Submit to %(problem)s"
+#: judge/views/problem.py:693
+msgid "Clone Problem"
msgstr ""
-#: .\judge\views\problem_data.py:36
+#: judge/views/problem.py:720
+#, python-format
+msgid "Cloned problem from %s"
+msgstr ""
+
+#: judge/views/problem_data.py:37
msgid "Checker arguments must be a JSON object"
msgstr ""
-#: .\judge\views\problem_data.py:38
+#: judge/views/problem_data.py:39
msgid "Checker arguments is invalid JSON"
msgstr ""
-#: .\judge\views\problem_data.py:45
+#: judge/views/problem_data.py:46
msgid "Your zip file is invalid!"
msgstr ""
-#: .\judge\views\problem_data.py:102
+#: judge/views/problem_data.py:104
#, python-brace-format
msgid "Comparing submissions for {0}"
msgstr ""
-#: .\judge\views\problem_data.py:105
+#: judge/views/problem_data.py:107
#, python-brace-format
msgid "Comparing submissions for {0}"
msgstr ""
-#: .\judge\views\problem_data.py:140
+#: judge/views/problem_data.py:142
#, python-brace-format
msgid "Editing data for {0}"
msgstr ""
-#: .\judge\views\problem_data.py:143
-#, python-brace-format
-msgid "Editing data for {0}"
-msgstr ""
-
-#: .\judge\views\problem_data.py:147
+#: judge/views/problem_data.py:145
#, python-format
msgid "Editing data for %s"
msgstr ""
-#: .\judge\views\problem_data.py:242 .\judge\views\problem_data.py:243
+#: judge/views/problem_data.py:243 judge/views/problem_data.py:244
#, python-format
msgid "Generated init.yml for %s"
msgstr ""
-#: .\judge\views\ranked_submission.py:59
+#: judge/views/problem_manage.py:50 judge/views/problem_manage.py:53
+#, python-format
+msgid "Managing submissions for %s"
+msgstr ""
+
+#: judge/views/problem_manage.py:95
+#, python-format
+msgid "Rejudging selected submissions for %s..."
+msgstr ""
+
+#: judge/views/problem_manage.py:110
+#, python-format
+msgid "Rescoring all submissions for %s..."
+msgstr ""
+
+#: judge/views/problem_manage.py:119
+#, python-format
+msgid "Successfully scheduled %d submission for rejudging."
+msgid_plural "Successfully scheduled %d submissions for rejudging."
+msgstr[0] ""
+msgstr[1] ""
+
+#: judge/views/ranked_submission.py:67
#, python-format
msgid "Best solutions for %s"
msgstr ""
-#: .\judge\views\ranked_submission.py:62
+#: judge/views/ranked_submission.py:70
#, python-brace-format
msgid "Best solutions for {0}"
msgstr ""
-#: .\judge\views\ranked_submission.py:72
+#: judge/views/ranked_submission.py:82
#, python-format
msgid "Best solutions for %(problem)s in %(contest)s"
msgstr ""
-#: .\judge\views\ranked_submission.py:74
+#: judge/views/ranked_submission.py:85
#, python-format
msgid "Best solutions for problem %(number)s in %(contest)s"
msgstr ""
-#: .\judge\views\ranked_submission.py:79
+#: judge/views/ranked_submission.py:91
#, python-brace-format
msgid "Best solutions for {0} in {2}"
msgstr ""
-#: .\judge\views\ranked_submission.py:82
+#: judge/views/ranked_submission.py:94
#, python-brace-format
msgid "Best solutions for problem {0} in {1}"
msgstr ""
-#: .\judge\views\register.py:27
+#: judge/views/register.py:26
msgid "A username must contain letters, numbers, or underscores"
msgstr ""
-#: .\judge\views\register.py:29
-msgid "Real name (optional)"
-msgstr ""
-
-#: .\judge\views\register.py:32 .\templates\user\edit-profile.html:108
+#: judge/views/register.py:30
msgid "Preferred language"
msgstr ""
-#: .\judge\views\register.py:39
+#: judge/views/register.py:37
msgid "Subscribe to newsletter?"
msgstr ""
-#: .\judge\views\register.py:46
+#: judge/views/register.py:44
#, python-format
msgid ""
"The email address \"%s\" is already taken. Only one registration is allowed "
"per address."
msgstr ""
-#: .\judge\views\register.py:52
+#: judge/views/register.py:50
msgid ""
"Your email provider is not allowed due to history of abuse. Please use a "
"reputable email provider."
msgstr ""
-#: .\judge\views\register.py:58 .\judge\views\register.py:97
+#: judge/views/register.py:56 judge/views/register.py:94
msgid "Registration"
msgstr ""
-#: .\judge\views\register.py:108
+#: judge/views/register.py:105
msgid "Authentication failure"
msgstr ""
-#: .\judge\views\stats.py:94
+#: judge/views/stats.py:67
msgid "Language statistics"
msgstr ""
-#: .\judge\views\status.py:24 .\templates\submission\list.html:222
+#: judge/views/status.py:24 templates/submission/list.html:310
msgid "Status"
msgstr ""
-#: .\judge\views\status.py:109
+#: judge/views/status.py:109
msgid "Version matrix"
msgstr ""
-#: .\judge\views\submission.py:56 .\judge\views\submission.py:63
+#: judge/views/submission.py:55 judge/views/submission.py:62
#, python-format
msgid "Submission of %(problem)s by %(user)s"
msgstr ""
-#: .\judge\views\submission.py:155 .\judge\views\submission.py:156
-#: .\templates\problem\problem.html:111
+#: judge/views/submission.py:205 judge/views/submission.py:206
+#: templates/problem/problem.html:127
msgid "All submissions"
msgstr ""
-#: .\judge\views\submission.py:287
+#: judge/views/submission.py:355
msgid "All my submissions"
msgstr ""
-#: .\judge\views\submission.py:288
+#: judge/views/submission.py:356
#, python-format
msgid "All submissions by %s"
msgstr ""
-#: .\judge\views\submission.py:318
+#: judge/views/submission.py:387
#, python-format
msgid "All submissions for %s"
msgstr ""
-#: .\judge\views\submission.py:339
+#: judge/views/submission.py:410
msgid "Must pass a problem"
msgstr ""
-#: .\judge\views\submission.py:370
+#: judge/views/submission.py:449
#, python-format
msgid "My submissions for %(problem)s"
msgstr ""
-#: .\judge\views\submission.py:371
+#: judge/views/submission.py:450
#, python-format
msgid "%(user)s's submissions for %(problem)s"
msgstr ""
-#: .\judge\views\submission.py:445
+#: judge/views/submission.py:546
msgid "Must pass a contest"
msgstr ""
-#: .\judge\views\submission.py:464
+#: judge/views/submission.py:554
+#, python-format
+msgid "My submissions in %(contest)s"
+msgstr ""
+
+#: judge/views/submission.py:555
+#, python-format
+msgid "%(user)s's submissions in %(contest)s"
+msgstr ""
+
+#: judge/views/submission.py:569
+#, python-brace-format
+msgid "My submissions in {0}"
+msgstr ""
+
+#: judge/views/submission.py:571
+#, python-brace-format
+msgid "{0}'s submissions in {2}"
+msgstr ""
+
+#: judge/views/submission.py:597
#, python-brace-format
msgid ""
"{0}'s submissions for {2} in {4}"
msgstr ""
-#: .\judge\views\submission.py:469
+#: judge/views/submission.py:602
#, python-brace-format
msgid ""
"{0}'s submissions for problem {2} in {3}"
""
msgstr ""
-#: .\judge\views\ticket.py:37 .\judge\views\ticket.py:43
+#: judge/views/ticket.py:33 judge/views/ticket.py:39
msgid "Ticket title"
msgstr ""
-#: .\judge\views\ticket.py:44
+#: judge/views/ticket.py:40
msgid "Issue description"
msgstr ""
-#: .\judge\views\ticket.py:102 .\judge\views\ticket.py:105
+#: judge/views/ticket.py:48
+msgid "You must solve at least one problem before you can create a ticket."
+msgstr ""
+
+#: judge/views/ticket.py:91 judge/views/ticket.py:94
#, python-format
msgid "New ticket for %s"
msgstr ""
-#: .\judge\views\ticket.py:151
+#: judge/views/ticket.py:148
#, python-format
msgid "%(title)s - Ticket %(id)d"
msgstr ""
-#: .\judge\views\ticket.py:258
+#: judge/views/ticket.py:253
#, python-format
msgid "Tickets - Page %(number)d of %(total)d"
msgstr ""
-#: .\judge\views\ticket.py:307
+#: judge/views/ticket.py:302
#, python-format
msgid "New Ticket: %s"
msgstr ""
-#: .\judge\views\ticket.py:308
+#: judge/views/ticket.py:303
#, python-format
msgid "#%(id)d, assigned to: %(users)s"
msgstr ""
-#: .\judge\views\ticket.py:309
+#: judge/views/ticket.py:305
msgid ", "
msgstr ""
-#: .\judge\views\ticket.py:310
+#: judge/views/ticket.py:305
msgid "no one"
msgstr ""
-#: .\judge\views\user.py:70
+#: judge/views/ticket.py:325
+#, python-format
+msgid "New Ticket Message For: %s"
+msgstr ""
+
+#: judge/views/two_factor.py:49
+msgid "Enable Two-factor Authentication"
+msgstr ""
+
+#: judge/views/two_factor.py:108
+msgid "Refresh Two-factor Authentication"
+msgstr ""
+
+#: judge/views/two_factor.py:116
+msgid "Disable Two-factor Authentication"
+msgstr ""
+
+#: judge/views/two_factor.py:165
+msgid "Invalid WebAuthn response"
+msgstr ""
+
+#: judge/views/two_factor.py:168
+msgid "Invalid name"
+msgstr ""
+
+#: judge/views/two_factor.py:221
+msgid "Staff may not disable 2FA"
+msgstr ""
+
+#: judge/views/two_factor.py:229
+msgid "Perform Two-factor Authentication"
+msgstr ""
+
+#: judge/views/user.py:78
msgid "No such user"
msgstr ""
-#: .\judge\views\user.py:70
+#: judge/views/user.py:78
#, python-format
msgid "No user handle \"%s\"."
msgstr ""
-#: .\judge\views\user.py:74
+#: judge/views/user.py:82
msgid "My account"
msgstr ""
-#: .\judge\views\user.py:75
+#: judge/views/user.py:83
#, python-format
msgid "User %s"
msgstr ""
-#: .\judge\views\user.py:133
+#: judge/views/user.py:131
+msgid "Login"
+msgstr ""
+
+#: judge/views/user.py:172
msgid "M j, Y, G:i"
msgstr ""
-#: .\judge\views\user.py:215
+#: judge/views/user.py:306
+msgid "Preparing your data..."
+msgstr ""
+
+#: judge/views/user.py:310 templates/user/edit-profile.html:352
+msgid "Download your data"
+msgstr ""
+
+#: judge/views/user.py:366
msgid "Updated on site"
msgstr ""
-#: .\judge\views\user.py:247 .\templates\admin\auth\user\change_form.html:14
-#: .\templates\admin\auth\user\change_form.html:17 .\templates\base.html:217
-#: .\templates\user\user-tabs.html:10
+#: judge/views/user.py:399 templates/admin/auth/user/change_form.html:14
+#: templates/admin/auth/user/change_form.html:17 templates/base.html:222
+#: templates/user/user-tabs.html:16
msgid "Edit profile"
msgstr ""
-#: .\judge\views\user.py:256 .\templates\user\user-list-tabs.html:4
+#: judge/views/user.py:414
+msgid "Generated API token for user"
+msgstr ""
+
+#: judge/views/user.py:426
+msgid "Removed API token for user"
+msgstr ""
+
+#: judge/views/user.py:436
+msgid "Generated scratch codes for user"
+msgstr ""
+
+#: judge/views/user.py:442 templates/user/user-list-tabs.html:4
msgid "Leaderboard"
msgstr ""
-#: .\judge\views\widgets.py:53 .\judge\views\widgets.py:64
+#: judge/views/user.py:503
+msgid "You have been successfully logged out."
+msgstr ""
+
+#: judge/views/widgets.py:52 judge/views/widgets.py:62
#, python-format
msgid "Invalid upstream data: %s"
msgstr ""
-#: .\judge\views\widgets.py:74
+#: judge/views/widgets.py:72
msgid "Bad latitude or longitude"
msgstr ""
-#: .\templates\admin\judge\contest\change_form.html:14
-#: .\templates\admin\judge\contest\change_form.html:17
+#: templates/admin/judge/contest/change_form.html:9
+msgid "Are you sure you want to rejudge ALL the submissions?"
+msgstr ""
+
+#: templates/admin/judge/contest/change_form.html:17
+#: templates/admin/judge/contest/change_form.html:20
msgid "Rate"
msgstr ""
-#: .\templates\admin\judge\contest\change_list.html:9
+#: templates/admin/judge/contest/change_list.html:9
msgid "Rate all ratable contests"
msgstr ""
-#: .\templates\admin\judge\profile\change_form.html:14
-#: .\templates\admin\judge\profile\change_form.html:17
+#: templates/admin/judge/judge/change_form.html:15
+#: templates/admin/judge/judge/change_form.html:18
+msgid "Disconnect"
+msgstr ""
+
+#: templates/admin/judge/judge/change_form.html:20
+#: templates/admin/judge/judge/change_form.html:23
+msgid "Terminate"
+msgstr ""
+
+#: templates/admin/judge/problem/change_form.html:14
+msgid "View Submissions"
+msgstr ""
+
+#: templates/admin/judge/problem/change_form.html:17
+#: templates/user/user-base.html:61
+msgid "View submissions"
+msgstr ""
+
+#: templates/admin/judge/profile/change_form.html:14
+#: templates/admin/judge/profile/change_form.html:17
msgid "Edit user"
msgstr ""
-#: .\templates\admin\judge\submission\change_form.html:14
-#: .\templates\admin\judge\submission\change_form.html:17
-#: .\templates\submission\source.html:34 .\templates\submission\status.html:67
+#: templates/admin/judge/submission/change_form.html:14
+#: templates/admin/judge/submission/change_form.html:17
+#: templates/submission/source.html:34 templates/submission/status.html:80
msgid "Rejudge"
msgstr ""
-#: .\templates\base.html:209
+#: templates/base.html:214
#, python-format
msgid "Hello, %(username)s."
msgstr ""
-#: .\templates\base.html:215 .\templates\comments\list.html:89
-#: .\templates\contest\contest-list-tabs.html:21
-#: .\templates\problem\problem-list-tabs.html:6
-#: .\templates\submission\info-base.html:12
-#: .\templates\submission\submission-list-tabs.html:15
-msgid "Admin"
+#: templates/base.html:229
+msgid "Log out"
msgstr ""
-#: .\templates\base.html:224
-msgid "Log out"
+#: templates/base.html:238
+#: templates/registration/password_reset_complete.html:4
+msgid "Log in"
+msgstr ""
+
+#: templates/base.html:239 templates/registration/registration_form.html:175
+msgid "or"
msgstr ""
-#: .\templates\base.html:235
-msgid "Register"
+#: templates/base.html:240
+msgid "Sign up"
msgstr ""
-#: .\templates\base.html:247
+#: templates/base.html:252
msgid "spectating"
msgstr ""
-#: .\templates\base.html:260
+#: templates/base.html:265
msgid "This site works best with JavaScript enabled."
msgstr ""
-#: .\templates\blog\content.html:13 .\templates\comments\list.html:68
-#: .\templates\comments\list.html:83 .\templates\contest\contest-tabs.html:17
-#: .\templates\contest\tag-title.html:9 .\templates\flatpages\admin_link.html:3
-#: .\templates\license.html:10 .\templates\problem\data.html:437
-#: .\templates\problem\editorial.html:14
+#: templates/blog/content.html:13 templates/comments/list.html:75
+#: templates/comments/list.html:90 templates/contest/contest-tabs.html:23
+#: templates/contest/tag-title.html:9 templates/flatpages/admin_link.html:3
+#: templates/license.html:10 templates/problem/data.html:428
+#: templates/problem/editorial.html:14
msgid "Edit"
msgstr ""
-#: .\templates\blog\content.html:27
+#: templates/blog/content.html:27
#, python-format
msgid ""
"\n"
@@ -2562,7 +3371,7 @@ msgid ""
" "
msgstr ""
-#: .\templates\blog\dashboard.html:21
+#: templates/blog/dashboard.html:21
#, python-format
msgid ""
"\n"
@@ -2570,565 +3379,725 @@ msgid ""
" "
msgstr ""
-#: .\templates\blog\list.html:85
+#: templates/blog/list.html:85
msgid "Blog"
msgstr ""
-#: .\templates\blog\list.html:87
+#: templates/blog/list.html:87
msgid "Events"
msgstr ""
-#: .\templates\blog\list.html:92
+#: templates/blog/list.html:92
msgid "News"
msgstr ""
-#: .\templates\blog\list.html:106
+#: templates/blog/list.html:106
#, python-brace-format
msgid "posted on {time}"
msgstr ""
-#: .\templates\blog\list.html:130 .\templates\problem\problem.html:256
+#: templates/blog/list.html:130 templates/problem/problem.html:311
msgid "Clarifications"
msgstr ""
-#: .\templates\blog\list.html:146 .\templates\problem\problem.html:267
+#: templates/blog/list.html:146 templates/problem/problem.html:322
msgid "No clarifications have been made at this time."
msgstr ""
-#: .\templates\blog\list.html:154
+#: templates/blog/list.html:154
msgid "Ongoing contests"
msgstr ""
-#: .\templates\blog\list.html:172
+#: templates/blog/list.html:172
msgid "Upcoming contests"
msgstr ""
-#: .\templates\blog\list.html:189
+#: templates/blog/list.html:189
msgid "Comment stream"
msgstr ""
-#: .\templates\blog\list.html:208
+#: templates/blog/list.html:209
msgid "New problems"
msgstr ""
-#: .\templates\blog\list.html:225
+#: templates/blog/list.html:226
msgid "My open tickets"
msgstr ""
-#: .\templates\blog\list.html:246
+#: templates/blog/list.html:247
msgid "New tickets"
msgstr ""
-#: .\templates\comments\list.html:2
+#: templates/comments/list.html:2 templates/user/prepare-data.html:97
msgid "Comments"
msgstr ""
-#: .\templates\comments\list.html:18 .\templates\comments\list.html:27
+#: templates/comments/list.html:18 templates/comments/list.html:27
msgid "Please login to vote"
msgstr ""
-#: .\templates\comments\list.html:40
+#: templates/comments/list.html:47
#, python-brace-format
msgid "commented on {time}"
msgstr ""
-#: .\templates\comments\list.html:49
+#: templates/comments/list.html:56
#, python-format
msgid "edit %(edits)s"
msgstr ""
-#: .\templates\comments\list.html:51 .\templates\comments\media-js.html:71
+#: templates/comments/list.html:58 templates/comments/media-js.html:96
msgid "edited"
msgstr ""
-#: .\templates\comments\list.html:60
+#: templates/comments/list.html:67
msgid "Link"
msgstr ""
-#: .\templates\comments\list.html:73 .\templates\comments\list.html:80
+#: templates/comments/list.html:80 templates/comments/list.html:87
msgid "Reply"
msgstr ""
-#: .\templates\comments\list.html:86
+#: templates/comments/list.html:95 templates/comments/votes.html:1
+msgid "Votes"
+msgstr ""
+
+#: templates/comments/list.html:96
msgid "Hide"
msgstr ""
-#: .\templates\comments\list.html:111
+#: templates/comments/list.html:111
+#, python-format
+msgid ""
+"\n"
+" This comment is hidden due "
+"to too much negative feedback.\n"
+" Click here to view it.\n"
+" "
+msgstr ""
+
+#: templates/comments/list.html:131
msgid "There are no comments at the moment."
msgstr ""
-#: .\templates\comments\list.html:117
+#: templates/comments/list.html:137
msgid "New comment"
msgstr ""
-#: .\templates\comments\list.html:131
+#: templates/comments/list.html:151
msgid "Invalid comment body."
msgstr ""
-#: .\templates\comments\list.html:139
+#: templates/comments/list.html:159
msgid "Post!"
msgstr ""
-#: .\templates\comments\media-js.html:66
+#: templates/comments/list.html:167
+msgid "Comments are disabled on this page."
+msgstr ""
+
+#: templates/comments/media-js.html:38
+msgid "Replying to comment"
+msgstr ""
+
+#: templates/comments/media-js.html:91
#, python-brace-format
msgid "edit {edits}"
msgstr ""
-#: .\templates\comments\media-js.html:69
+#: templates/comments/media-js.html:94
msgid "original"
msgstr ""
-#: .\templates\contest\access_code.html:26
+#: templates/comments/votes.html:5
+msgid "Voter"
+msgstr ""
+
+#: templates/comments/votes.html:6 templates/user/user-problems.html:101
+msgid "Score"
+msgstr ""
+
+#: templates/comments/votes.html:17
+msgid "No votes"
+msgstr ""
+
+#: templates/contest/access_code.html:26
msgid "Invalid access code."
msgstr ""
-#: .\templates\contest\access_code.html:29
+#: templates/contest/access_code.html:29
msgid "Please enter your access code:"
msgstr ""
-#: .\templates\contest\access_code.html:32
+#: templates/contest/access_code.html:32
msgid "Join Contest"
msgstr ""
-#: .\templates\contest\calendar.html:6
-#, python-format
-msgid "Contests in %(month)s"
-msgstr ""
-
-#: .\templates\contest\calendar.html:13
+#: templates/contest/calendar.html:12
msgid "Sunday"
msgstr ""
-#: .\templates\contest\calendar.html:14
+#: templates/contest/calendar.html:13
msgid "Monday"
msgstr ""
-#: .\templates\contest\calendar.html:15
+#: templates/contest/calendar.html:14
msgid "Tuesday"
msgstr ""
-#: .\templates\contest\calendar.html:16
+#: templates/contest/calendar.html:15
msgid "Wednesday"
msgstr ""
-#: .\templates\contest\calendar.html:17
+#: templates/contest/calendar.html:16
msgid "Thursday"
msgstr ""
-#: .\templates\contest\calendar.html:18
+#: templates/contest/calendar.html:17
msgid "Friday"
msgstr ""
-#: .\templates\contest\calendar.html:19
+#: templates/contest/calendar.html:18
msgid "Saturday"
msgstr ""
-#: .\templates\contest\contest-list-tabs.html:7
+#: templates/contest/clone.html:37
+msgid "Enter a new key for the cloned contest:"
+msgstr ""
+
+#: templates/contest/clone.html:40 templates/problem/clone.html:40
+msgid "Clone!"
+msgstr ""
+
+#: templates/contest/contest-list-tabs.html:7
msgid "Prev"
msgstr ""
-#: .\templates\contest\contest-list-tabs.html:10
+#: templates/contest/contest-list-tabs.html:10
+msgid "Today"
+msgstr ""
+
+#: templates/contest/contest-list-tabs.html:13
msgid "Next"
msgstr ""
-#: .\templates\contest\contest-list-tabs.html:18
-#: .\templates\problem\problem-list-tabs.html:5
+#: templates/contest/contest-list-tabs.html:21
+#: templates/problem/problem-list-tabs.html:5
msgid "List"
msgstr ""
-#: .\templates\contest\contest-list-tabs.html:19
+#: templates/contest/contest-list-tabs.html:22
msgid "Calendar"
msgstr ""
-#: .\templates\contest\contest-tabs.html:4
+#: templates/contest/contest-tabs.html:4
msgid "Info"
msgstr ""
-#: .\templates\contest\contest-tabs.html:8
+#: templates/contest/contest-tabs.html:6 templates/stats/base.html:9
+#: templates/submission/list.html:336
+msgid "Statistics"
+msgstr ""
+
+#: templates/contest/contest-tabs.html:11
msgid "Rankings"
msgstr ""
-#: .\templates\contest\contest-tabs.html:10
+#: templates/contest/contest-tabs.html:16
msgid "Hidden Rankings"
msgstr ""
-#: .\templates\contest\contest-tabs.html:26
-#: .\templates\contest\contest-tabs.html:40
+#: templates/contest/contest-tabs.html:21
+msgid "MOSS"
+msgstr ""
+
+#: templates/contest/contest-tabs.html:26
+msgid "Clone"
+msgstr ""
+
+#: templates/contest/contest-tabs.html:38
+#: templates/contest/contest-tabs.html:58
msgid "Leave contest"
msgstr ""
-#: .\templates\contest\contest-tabs.html:30 .\templates\contest\list.html:209
+#: templates/contest/contest-tabs.html:45 templates/contest/list.html:294
msgid "Virtual join"
msgstr ""
-#: .\templates\contest\contest-tabs.html:38
+#: templates/contest/contest-tabs.html:56
msgid "Stop spectating"
msgstr ""
-#: .\templates\contest\contest-tabs.html:45
+#: templates/contest/contest-tabs.html:65
msgid "Spectate contest"
msgstr ""
-#: .\templates\contest\contest-tabs.html:48
-#: .\templates\contest\contest-tabs.html:51
+#: templates/contest/contest-tabs.html:72
msgid "Join contest"
msgstr ""
-#: .\templates\contest\contest-tabs.html:57
-msgid "Login to participate"
+#: templates/contest/contest-tabs.html:81
+msgid "Log in to participate"
msgstr ""
-#: .\templates\contest\contest.html:37
+#: templates/contest/contest.html:37
msgid "Participating virtually."
msgstr ""
-#: .\templates\contest\contest.html:43
+#: templates/contest/contest.html:43
msgid "Contest is over."
msgstr ""
-#: .\templates\contest\contest.html:59 .\templates\contest\contest.html:63
+#: templates/contest/contest.html:59 templates/contest/contest.html:63
msgid "F j, Y, G:i T"
msgstr ""
-#: .\templates\contest\contest.html:59
+#: templates/contest/contest.html:59
#, python-format
msgid ""
"%(time_limit)s window between %(start_time)s and "
"%(end_time)s"
msgstr ""
-#: .\templates\contest\contest.html:63
+#: templates/contest/contest.html:63
#, python-format
msgid "%(length)s long starting on %(start_time)s"
msgstr ""
-#: .\templates\contest\contest.html:85
+#: templates/contest/contest.html:85
msgid "AC Rate"
msgstr ""
-#: .\templates\contest\contest.html:86 .\templates\contest\list.html:98
-#: .\templates\contest\list.html:185 .\templates\problem\list.html:212
-#: .\templates\problem\list.html:238
+#: templates/contest/contest.html:86 templates/contest/list.html:152
+#: templates/contest/list.html:194 templates/contest/list.html:271
+#: templates/problem/list.html:210 templates/problem/list.html:236
msgid "Users"
msgstr ""
-#: .\templates\contest\contest.html:99
+#: templates/contest/contest.html:88
+msgid "Editorials"
+msgstr ""
+
+#: templates/contest/contest.html:114
msgid "Editorial"
msgstr ""
-#: .\templates\contest\list.html:27 .\templates\contest\media-js.html:9
+#: templates/contest/list.html:31 templates/contest/media-js.html:9
msgid "Are you sure you want to join?"
msgstr ""
-#: .\templates\contest\list.html:28
+#: templates/contest/list.html:32
msgid ""
"Joining a contest for the first time starts your timer, after which it "
"becomes unstoppable."
msgstr ""
-#: .\templates\contest\list.html:93
-msgid "Ongoing Contests"
+#: templates/contest/list.html:65
+msgid "hidden"
msgstr ""
-#: .\templates\contest\list.html:97 .\templates\contest\list.html:153
-#: .\templates\contest\list.html:184
-msgid "Contest"
+#: templates/contest/list.html:78
+msgid "private"
msgstr ""
-#: .\templates\contest\list.html:132
+#: templates/contest/list.html:83
+msgid "rated"
+msgstr ""
+
+#: templates/contest/list.html:131
msgid "Spectate"
msgstr ""
-#: .\templates\contest\list.html:136
+#: templates/contest/list.html:137
msgid "Join"
msgstr ""
-#: .\templates\contest\list.html:148
+#: templates/contest/list.html:147
+msgid "Active Contests"
+msgstr ""
+
+#: templates/contest/list.html:151 templates/contest/list.html:193
+#: templates/contest/list.html:231 templates/contest/list.html:268
+msgid "Contest"
+msgstr ""
+
+#: templates/contest/list.html:189
+msgid "Ongoing Contests"
+msgstr ""
+
+#: templates/contest/list.html:226
msgid "Upcoming Contests"
msgstr ""
-#: .\templates\contest\list.html:175
+#: templates/contest/list.html:254
msgid "There are no scheduled contests at this time."
msgstr ""
-#: .\templates\contest\list.html:180
+#: templates/contest/list.html:260
msgid "Past Contests"
msgstr ""
-#: .\templates\contest\media-js.html:4
+#: templates/contest/media-js.html:4
msgid "Are you sure you want to leave?"
msgstr ""
-#: .\templates\contest\media-js.html:5
+#: templates/contest/media-js.html:5
msgid ""
"You cannot come back to a virtual participation. You will have to start a "
"new one."
msgstr ""
-#: .\templates\contest\media-js.html:10
+#: templates/contest/media-js.html:10
msgid ""
"Joining a contest starts your timer, after which it becomes unstoppable."
msgstr ""
-#: .\templates\contest\private.html:4
+#: templates/contest/moss.html:28
+msgid "Are you sure you want MOSS the contest?"
+msgstr ""
+
+#: templates/contest/moss.html:33
+msgid "Are you sure you want to delete the MOSS results?"
+msgstr ""
+
+#: templates/contest/moss.html:60
+msgid "No submissions"
+msgstr ""
+
+#: templates/contest/moss.html:74
+msgid "Re-MOSS contest"
+msgstr ""
+
+#: templates/contest/moss.html:82
+msgid "Delete MOSS results"
+msgstr ""
+
+#: templates/contest/private.html:5
+msgid "This contest is private to specific users."
+msgstr ""
+
+#: templates/contest/private.html:10
+msgid "Additionally, only the following organizations may access this contest:"
+msgstr ""
+
+#: templates/contest/private.html:12
msgid "Only the following organizations may access this contest:"
msgstr ""
-#: .\templates\contest\ranking-table.html:27
+#: templates/contest/ranking-table.html:7
+msgid "Organization"
+msgstr ""
+
+#: templates/contest/ranking-table.html:27
#, python-brace-format
msgid "Started on {time}"
msgstr ""
-#: .\templates\contest\ranking-table.html:30
+#: templates/contest/ranking-table.html:30
msgid "Participation ended."
msgstr ""
-#: .\templates\contest\ranking.html:232
+#: templates/contest/ranking-table.html:40
+msgid "Un-Disqualify"
+msgstr ""
+
+#: templates/contest/ranking-table.html:43
+msgid "Disqualify"
+msgstr ""
+
+#: templates/contest/ranking.html:173
+msgid "Are you sure you want to disqualify this participation?"
+msgstr ""
+
+#: templates/contest/ranking.html:178
+msgid "Are you sure you want to un-disqualify this participation?"
+msgstr ""
+
+#: templates/contest/ranking.html:250
msgid "View user participation"
msgstr ""
-#: .\templates\contest\ranking.html:236
+#: templates/contest/ranking.html:254
msgid "Show organizations"
msgstr ""
-#: .\templates\license.html:12
+#: templates/contest/stats.html:38
+msgid "Problem Status Distribution"
+msgstr ""
+
+#: templates/contest/stats.html:43
+msgid "Problem AC Rate"
+msgstr ""
+
+#: templates/contest/stats.html:48 templates/stats/language.html:16
+msgid "Submissions by Language"
+msgstr ""
+
+#: templates/contest/stats.html:54 templates/stats/language.html:26
+msgid "Language AC Rate"
+msgstr ""
+
+#: templates/license.html:12
msgid "Source:"
msgstr ""
-#: .\templates\newsletter\common.html:6
-#: .\templates\newsletter\subscription_unsubscribe_activated.html:3
-#: .\templates\newsletter\subscription_unsubscribe_activated.html:6
-#: .\templates\newsletter\subscription_update_activated.html:3
-#: .\templates\newsletter\subscription_update_activated.html:6
+#: templates/newsletter/common.html:6
+#: templates/newsletter/subscription_unsubscribe_activated.html:3
+#: templates/newsletter/subscription_unsubscribe_activated.html:6
+#: templates/newsletter/subscription_update_activated.html:3
+#: templates/newsletter/subscription_update_activated.html:6
msgid "Newsletter"
msgstr ""
-#: .\templates\newsletter\subscription_unsubscribe_activated.html:3
-#: .\templates\newsletter\subscription_unsubscribe_activated.html:6
-#: .\templates\newsletter\subscription_update_activated.html:3
-#: .\templates\newsletter\subscription_update_activated.html:6
+#: templates/newsletter/subscription_unsubscribe_activated.html:3
+#: templates/newsletter/subscription_unsubscribe_activated.html:6
+#: templates/newsletter/subscription_update_activated.html:3
+#: templates/newsletter/subscription_update_activated.html:6
msgid "activate"
msgstr ""
-#: .\templates\newsletter\subscription_unsubscribe_activated.html:8
+#: templates/newsletter/subscription_unsubscribe_activated.html:8
msgid "You have successfully been unsubscribed."
msgstr ""
-#: .\templates\newsletter\subscription_unsubscribe_email_sent.html:3
-#: .\templates\newsletter\subscription_unsubscribe_email_sent.html:6
-#: .\templates\newsletter\subscription_unsubscribe_user.html:3
-#: .\templates\newsletter\subscription_unsubscribe_user.html:6
+#: templates/newsletter/subscription_unsubscribe_email_sent.html:3
+#: templates/newsletter/subscription_unsubscribe_email_sent.html:6
+#: templates/newsletter/subscription_unsubscribe_user.html:3
+#: templates/newsletter/subscription_unsubscribe_user.html:6
msgid "Newsletter unsubscribe"
msgstr ""
-#: .\templates\newsletter\subscription_unsubscribe_email_sent.html:8
+#: templates/newsletter/subscription_unsubscribe_email_sent.html:8
msgid ""
"Your unsubscription request has successfully been received. An email has "
"been sent to you with a link you need to follow in order to confirm your "
"unsubscription."
msgstr ""
-#: .\templates\newsletter\subscription_unsubscribe_user.html:17
+#: templates/newsletter/subscription_unsubscribe_user.html:17
msgid "Do you want to unsubscribe from this newsletter?"
msgstr ""
-#: .\templates\newsletter\subscription_unsubscribe_user.html:21
+#: templates/newsletter/subscription_unsubscribe_user.html:21
msgid "Unsubscribe"
msgstr ""
-#: .\templates\newsletter\subscription_update.html:3
-#: .\templates\newsletter\subscription_update.html:6
-#: .\templates\newsletter\subscription_update_email_sent.html:3
-#: .\templates\newsletter\subscription_update_email_sent.html:6
+#: templates/newsletter/subscription_update.html:3
+#: templates/newsletter/subscription_update.html:6
+#: templates/newsletter/subscription_update_email_sent.html:3
+#: templates/newsletter/subscription_update_email_sent.html:6
msgid "Newsletter update"
msgstr ""
-#: .\templates\newsletter\subscription_update.html:9
+#: templates/newsletter/subscription_update.html:9
msgid ""
"Due to a technical error we were not able to submit your confirmation email. "
"This could be because your email address is invalid."
msgstr ""
-#: .\templates\newsletter\subscription_update.html:14
+#: templates/newsletter/subscription_update.html:14
msgid "Update subscription"
msgstr ""
-#: .\templates\newsletter\subscription_update_activated.html:8
+#: templates/newsletter/subscription_update_activated.html:8
msgid "Your subscription has successfully been updated."
msgstr ""
-#: .\templates\newsletter\subscription_update_email_sent.html:8
+#: templates/newsletter/subscription_update_email_sent.html:8
msgid ""
"Your update request was successfully received and an activation email has "
"been sent to you. In that email you will find a link which you need to "
"follow in order to update your subscription."
msgstr ""
-#: .\templates\organization\edit.html:46
-#: .\templates\organization\requests\pending.html:41
-#: .\templates\ticket\edit-notes.html:4
+#: templates/organization/edit.html:47
+#: templates/organization/requests/pending.html:34
+#: templates/ticket/edit-notes.html:4
msgid "Update"
msgstr ""
-#: .\templates\organization\home.html:8
+#: templates/organization/home.html:7
+msgid "Are you sure you want to leave this organization?"
+msgstr ""
+
+#: templates/organization/home.html:9
+msgid "You will have to rejoin to show up on the organization leaderboard."
+msgstr ""
+
+#: templates/organization/home.html:11
+msgid "You will have to request membership in order to join again."
+msgstr ""
+
+#: templates/organization/home.html:24
msgid "Leave organization"
msgstr ""
-#: .\templates\organization\home.html:11
+#: templates/organization/home.html:29
msgid "Join organization"
msgstr ""
-#: .\templates\organization\home.html:14
+#: templates/organization/home.html:33
msgid "Request membership"
msgstr ""
-#: .\templates\organization\home.html:21
+#: templates/organization/home.html:39
msgid "Edit organization"
msgstr ""
-#: .\templates\organization\home.html:25
+#: templates/organization/home.html:43
msgid "View requests"
msgstr ""
-#: .\templates\organization\home.html:32
+#: templates/organization/home.html:50
msgid "Admin organization"
msgstr ""
-#: .\templates\organization\home.html:37
+#: templates/organization/home.html:55
msgid "View members"
msgstr ""
-#: .\templates\organization\list.html:23
-#: .\templates\status\language-list.html:33 .\templates\ticket\list.html:245
-msgid "ID"
-msgstr ""
-
-#: .\templates\organization\list.html:24
-#: .\templates\status\language-list.html:34
+#: templates/organization/list.html:23 templates/status/language-list.html:35
msgid "Name"
msgstr ""
-#: .\templates\organization\list.html:25
+#: templates/organization/list.html:24
msgid "Members"
msgstr ""
-#: .\templates\organization\new.html:10 .\templates\ticket\new.html:36
+#: templates/organization/new.html:10 templates/ticket/new.html:39
msgid "Create"
msgstr ""
-#: .\templates\organization\requests\detail.html:13
+#: templates/organization/requests/detail.html:13
msgid "User:"
msgstr ""
-#: .\templates\organization\requests\detail.html:17
+#: templates/organization/requests/detail.html:17
msgid "Organization:"
msgstr ""
-#: .\templates\organization\requests\detail.html:25
+#: templates/organization/requests/detail.html:25
msgid "Time:"
msgstr ""
-#: .\templates\organization\requests\detail.html:29
+#: templates/organization/requests/detail.html:29
msgid "Reason:"
msgstr ""
-#: .\templates\organization\requests\log.html:11
-#: .\templates\organization\requests\pending.html:21
+#: templates/organization/requests/log.html:11
+#: templates/organization/requests/pending.html:14
msgid "State"
msgstr ""
-#: .\templates\organization\requests\log.html:12
-#: .\templates\organization\requests\pending.html:22
+#: templates/organization/requests/log.html:12
+#: templates/organization/requests/pending.html:15
msgid "Reason"
msgstr ""
-#: .\templates\organization\requests\log.html:28
-#: .\templates\organization\requests\pending.html:44
+#: templates/organization/requests/log.html:28
+#: templates/organization/requests/pending.html:37
msgid "There are no requests to approve."
msgstr ""
-#: .\templates\organization\requests\pending.html:24
-#: .\templates\problem\data.html:401
+#: templates/organization/requests/pending.html:17
+#: templates/problem/data.html:392
msgid "Delete?"
msgstr ""
-#: .\templates\organization\requests\request.html:18
+#: templates/organization/requests/request.html:18
msgid "Your reason for joining:"
msgstr ""
-#: .\templates\organization\requests\request.html:20
+#: templates/organization/requests/request.html:20
msgid "Request"
msgstr ""
-#: .\templates\organization\requests\tabs.html:4
+#: templates/organization/requests/tabs.html:4
msgid "Pending"
msgstr ""
-#: .\templates\organization\requests\tabs.html:7
+#: templates/organization/requests/tabs.html:7
msgid "Log"
msgstr ""
-#: .\templates\organization\requests\tabs.html:10
+#: templates/organization/requests/tabs.html:10
msgid "Approved"
msgstr ""
-#: .\templates\organization\requests\tabs.html:13
+#: templates/organization/requests/tabs.html:13
msgid "Rejected"
msgstr ""
-#: .\templates\organization\users-table.html:15
+#: templates/organization/users-table.html:15
msgid "Kick"
msgstr ""
-#: .\templates\problem\data.html:353
+#: templates/organization/users.html:34
+msgid "Are you sure you want to kick this user?"
+msgstr ""
+
+#: templates/pagedown.html:10
+msgid "Update preview"
+msgstr ""
+
+#: templates/problem/clone.html:37
+msgid "Enter a new code for the cloned problem:"
+msgstr ""
+
+#: templates/problem/data.html:344
msgid "View YAML"
msgstr ""
-#: .\templates\problem\data.html:369
+#: templates/problem/data.html:360
msgid "Show columns:"
msgstr ""
-#: .\templates\problem\data.html:372 .\templates\problem\data.html:396
+#: templates/problem/data.html:363 templates/problem/data.html:387
msgid "Output prefix"
msgstr ""
-#: .\templates\problem\data.html:376 .\templates\problem\data.html:397
+#: templates/problem/data.html:367 templates/problem/data.html:388
msgid "Output limit"
msgstr ""
-#: .\templates\problem\data.html:380 .\templates\problem\data.html:398
+#: templates/problem/data.html:371 templates/problem/data.html:389
msgid "Checker"
msgstr ""
-#: .\templates\problem\data.html:384 .\templates\problem\data.html:399
+#: templates/problem/data.html:375 templates/problem/data.html:390
msgid "Generator args"
msgstr ""
-#: .\templates\problem\data.html:391
+#: templates/problem/data.html:382
msgid "Type"
msgstr ""
-#: .\templates\problem\data.html:392
+#: templates/problem/data.html:383
msgid "Input file"
msgstr ""
-#: .\templates\problem\data.html:393
+#: templates/problem/data.html:384
msgid "Output file"
msgstr ""
-#: .\templates\problem\data.html:395
+#: templates/problem/data.html:386
msgid "Pretest?"
msgstr ""
-#: .\templates\problem\data.html:447 .\templates\problem\submit.html:253
+#: templates/problem/data.html:438 templates/problem/submit.html:258
msgid "Submit!"
msgstr ""
-#: .\templates\problem\data.html:448
+#: templates/problem/data.html:439
msgid "Add new case"
msgstr ""
-#: .\templates\problem\editorial.html:22
+#: templates/problem/data.html:441
+msgid "Save"
+msgstr ""
+
+#: templates/problem/editorial.html:22
msgid ""
"Remember to use this editorial only when stuck, and not to copy-"
"paste code from it. Please be respectful to the problem author and "
@@ -3136,654 +4105,987 @@ msgid ""
"problem yourself is a bannable offence."
msgstr ""
-#: .\templates\problem\list.html:62
+#: templates/problem/editorial.html:27 templates/problem/problem.html:210
+msgid "Author:"
+msgid_plural "Authors:"
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/problem/list.html:62
msgid "Filter by type..."
msgstr ""
-#: .\templates\problem\list.html:179
+#: templates/problem/list.html:183
msgid "Hot problems"
msgstr ""
-#: .\templates\problem\list.html:207 .\templates\problem\list.html:224
-#: .\templates\problem\search-form.html:30
-#: .\templates\user\user-problems.html:62
+#: templates/problem/list.html:205 templates/problem/list.html:222
+#: templates/problem/search-form.html:30 templates/user/user-problems.html:59
msgid "Category"
msgstr ""
-#: .\templates\problem\list.html:209 .\templates\problem\list.html:228
+#: templates/problem/list.html:207 templates/problem/list.html:226
msgid "Types"
msgstr ""
-#: .\templates\problem\list.html:235
+#: templates/problem/list.html:233
#, python-format
msgid "AC %%"
msgstr ""
-#: .\templates\problem\problem.html:76
+#: templates/problem/manage_submission.html:55
+msgid "Leave empty to not filter by language"
+msgstr ""
+
+#: templates/problem/manage_submission.html:60
+msgid "Leave empty to not filter by result"
+msgstr ""
+
+#: templates/problem/manage_submission.html:79
+msgid "Need valid values for both start and end IDs."
+msgstr ""
+
+#: templates/problem/manage_submission.html:82
+msgid "End ID must be after start ID."
+msgstr ""
+
+#: templates/problem/manage_submission.html:90
+#, python-brace-format
+msgid ""
+"You are about to rejudge {count} submissions. Are you sure you want to do "
+"this?"
+msgstr ""
+
+#: templates/problem/manage_submission.html:96
+msgid ""
+"You are about to rejudge a few submissions. Are you sure you want to do this?"
+msgstr ""
+
+#: templates/problem/manage_submission.html:115
+msgid "Rejudge Submissions"
+msgstr ""
+
+#: templates/problem/manage_submission.html:120
+msgid "Filter by ID:"
+msgstr ""
+
+#: templates/problem/manage_submission.html:123
+msgid "Starting ID:"
+msgstr ""
+
+#: templates/problem/manage_submission.html:127
+msgid "Ending ID:"
+msgstr ""
+
+#: templates/problem/manage_submission.html:131
+msgid "This range includes both endpoints."
+msgstr ""
+
+#: templates/problem/manage_submission.html:134
+msgid "Filter by language:"
+msgstr ""
+
+#: templates/problem/manage_submission.html:150
+msgid "Rejudge selected submissions"
+msgstr ""
+
+#: templates/problem/manage_submission.html:157
+msgid "Rescore Everything"
+msgstr ""
+
+#: templates/problem/manage_submission.html:158
+#, python-format
+msgid "This will rescore %(count)d submissions."
+msgstr ""
+
+#: templates/problem/manage_submission.html:162
+#, python-format
+msgid "Are you sure you want to rescore %(count)d submissions?"
+msgstr ""
+
+#: templates/problem/manage_submission.html:163
+msgid "Rescore all submissions"
+msgstr ""
+
+#: templates/problem/problem.html:91
msgid "View as PDF"
msgstr ""
-#: .\templates\problem\problem.html:86 .\templates\problem\problem.html:96
-#: .\templates\problem\problem.html:101
+#: templates/problem/problem.html:101 templates/problem/problem.html:111
+#: templates/problem/problem.html:116
msgid "Submit solution"
msgstr ""
-#: .\templates\problem\problem.html:89
+#: templates/problem/problem.html:104
#, python-format
msgid "%(counter)s submission left"
msgid_plural "%(counter)s submissions left"
msgstr[0] ""
msgstr[1] ""
-#: .\templates\problem\problem.html:97
+#: templates/problem/problem.html:112
msgid "0 submissions left"
msgstr ""
-#: .\templates\problem\problem.html:108
+#: templates/problem/problem.html:124
msgid "My submissions"
msgstr ""
-#: .\templates\problem\problem.html:112
+#: templates/problem/problem.html:128
msgid "Best submissions"
msgstr ""
-#: .\templates\problem\problem.html:115
+#: templates/problem/problem.html:131
msgid "Read editorial"
msgstr ""
-#: .\templates\problem\problem.html:120
+#: templates/problem/problem.html:136
msgid "Manage tickets"
msgstr ""
-#: .\templates\problem\problem.html:124
+#: templates/problem/problem.html:140
msgid "Edit problem"
msgstr ""
-#: .\templates\problem\problem.html:126
+#: templates/problem/problem.html:142
msgid "Edit test data"
msgstr ""
-#: .\templates\problem\problem.html:134
-msgid "Clone problem"
+#: templates/problem/problem.html:147
+msgid "My tickets"
+msgstr ""
+
+#: templates/problem/problem.html:155
+msgid "Manage submissions"
msgstr ""
-#: .\templates\problem\problem.html:141
+#: templates/problem/problem.html:168
msgid "Points:"
msgstr ""
-#: .\templates\problem\problem.html:144 .\templates\problem\problem.html:146
+#: templates/problem/problem.html:171 templates/problem/problem.html:173
msgid "(partial)"
msgstr ""
-#: .\templates\problem\problem.html:151
+#: templates/problem/problem.html:178
msgid "Time limit:"
msgstr ""
-#: .\templates\problem\problem.html:163
+#: templates/problem/problem.html:190
msgid "Memory limit:"
msgstr ""
-#: .\templates\problem\problem.html:179
-msgid "Author:"
-msgid_plural "Authors:"
-msgstr[0] ""
-msgstr[1] ""
-
-#: .\templates\problem\problem.html:194
+#: templates/problem/problem.html:226
msgid "Problem type"
msgid_plural "Problem types"
msgstr[0] ""
msgstr[1] ""
-#: .\templates\problem\problem.html:208
+#: templates/problem/problem.html:239
msgid "Allowed languages"
msgstr ""
-#: .\templates\problem\problem.html:216
+#: templates/problem/problem.html:247
#, python-format
msgid "No %(lang)s judge online"
msgstr ""
-#: .\templates\problem\problem.html:245
+#: templates/problem/problem.html:258
+msgid "Judge:"
+msgid_plural "Judges:"
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/problem/problem.html:275
+msgid "none available"
+msgstr ""
+
+#: templates/problem/problem.html:300
msgid "Request clarification"
msgstr ""
-#: .\templates\problem\problem.html:247
+#: templates/problem/problem.html:302
msgid "Report an issue"
msgstr ""
-#: .\templates\problem\search-form.html:2
+#: templates/problem/raw.html:62
+msgid "Time Limit:"
+msgstr ""
+
+#: templates/problem/raw.html:71
+msgid "Memory Limit:"
+msgstr ""
+
+#: templates/problem/search-form.html:2
msgid "Problem search"
msgstr ""
-#: .\templates\problem\search-form.html:8
+#: templates/problem/search-form.html:8
msgid "Search problems..."
msgstr ""
-#: .\templates\problem\search-form.html:14
+#: templates/problem/search-form.html:14
msgid "Full text search"
msgstr ""
-#: .\templates\problem\search-form.html:21
+#: templates/problem/search-form.html:21
msgid "Hide solved problems"
msgstr ""
-#: .\templates\problem\search-form.html:27
+#: templates/problem/search-form.html:27
msgid "Show problem types"
msgstr ""
-#: .\templates\problem\search-form.html:33
-#: .\templates\problem\search-form.html:35
-#: .\templates\submission\submission-list-tabs.html:4
+#: templates/problem/search-form.html:33 templates/problem/search-form.html:35
+#: templates/submission/submission-list-tabs.html:4
msgid "All"
msgstr ""
-#: .\templates\problem\search-form.html:46
+#: templates/problem/search-form.html:46
msgid "Problem types"
msgstr ""
-#: .\templates\problem\search-form.html:57
+#: templates/problem/search-form.html:57
msgid "Point range"
msgstr ""
-#: .\templates\problem\search-form.html:63 .\templates\submission\list.html:240
-#: .\templates\ticket\list.html:232
+#: templates/problem/search-form.html:63 templates/submission/list.html:328
+#: templates/ticket/list.html:248
msgid "Go"
msgstr ""
-#: .\templates\problem\search-form.html:64
+#: templates/problem/search-form.html:64
msgid "Random"
msgstr ""
-#: .\templates\problem\statistics-table.html:1 .\templates\stats\base.html:11
-msgid "Statistics"
+#: templates/problem/submit.html:117
+msgid "Your source code must contain at most 65536 characters."
msgstr ""
-#: .\templates\problem\submit.html:193
+#: templates/problem/submit.html:204
#, python-format
msgid ""
"Warning! Your default language, %(default_language)s, is "
"unavailable for this problem and has been deselected."
msgstr ""
-#: .\templates\problem\submit.html:204
+#: templates/problem/submit.html:215
#, python-format
-msgid ""
-"\n"
-" You have %(left)s submission left\n"
-" "
-msgid_plural ""
-"\n"
-" You have %(left)s submissions left\n"
-" "
+msgid "You have %(left)s submission left"
+msgid_plural "You have %(left)s submissions left"
msgstr[0] ""
msgstr[1] ""
-#: .\templates\problem\submit.html:213
+#: templates/problem/submit.html:220
msgid "You have 0 submissions left"
msgstr ""
-#: .\templates\problem\submit.html:251
+#: templates/problem/submit.html:254
msgid "No judge is available for this problem."
msgstr ""
-#: .\templates\registration\activate.html:3
+#: templates/registration/activate.html:3
#, python-format
msgid "%(key)s is an invalid activation key."
msgstr ""
-#: .\templates\registration\activation_complete.html:3
+#: templates/registration/activation_complete.html:3
msgid "Your account has been successfully activated."
msgstr ""
-#: .\templates\registration\login.html:46
+#: templates/registration/login.html:35
msgid "Invalid username or password."
msgstr ""
-#: .\templates\registration\login.html:64
+#: templates/registration/login.html:53
+#: templates/registration/two_factor_auth.html:92
msgid "Login!"
msgstr ""
-#: .\templates\registration\login.html:67
+#: templates/registration/login.html:56
msgid "Forgot your password?"
msgstr ""
-#: .\templates\registration\login.html:70
+#: templates/registration/login.html:59
msgid "Or log in with..."
msgstr ""
-#: .\templates\registration\logout.html:3
+#: templates/registration/logout.html:3
msgid "See you later!"
msgstr ""
-#: .\templates\registration\password_change_done.html:3
+#: templates/registration/password_change_done.html:3
msgid "Your password was sucessfully changed."
msgstr ""
-#: .\templates\registration\password_change_form.html:8
+#: templates/registration/password_change_form.html:13
msgid "Change Password"
msgstr ""
-#: .\templates\registration\password_reset.html:7
+#: templates/registration/password_reset.html:7
msgid "Send Reset Email"
msgstr ""
-#: .\templates\registration\password_reset_complete.html:3
+#: templates/registration/password_reset_complete.html:3
msgid "Your password has been set. You may go ahead and log in now"
msgstr ""
-#: .\templates\registration\password_reset_complete.html:4
-msgid "Log in"
+#: templates/registration/password_reset_confirm.html:9
+msgid "Reset Password"
msgstr ""
-#: .\templates\registration\password_reset_confirm.html:9
-msgid "Reset Password"
+#: templates/registration/password_reset_confirm.html:12
+msgid "Invalid password reset link."
msgstr ""
-#: .\templates\registration\password_reset_done.html:4
+#: templates/registration/password_reset_done.html:4
msgid ""
"We've emailed you instructions for setting your password. You should be "
"receiving them shortly."
msgstr ""
-#: .\templates\registration\password_reset_done.html:5
+#: templates/registration/password_reset_done.html:5
msgid ""
"If you don't receive an email, please make sure you've entered the address "
"you registered with, and check your spam folder."
msgstr ""
-#: .\templates\registration\password_reset_email.txt:1
+#: templates/registration/password_reset_email.html:9
+#, python-format
+msgid ""
+"\n"
+"Forgot your password on the %(site_name)s? Don't worry!
\n"
+"To reset the password for your account \"%(username)s\", click the button "
+"below.\n"
+msgstr ""
+
+#: templates/registration/password_reset_email.html:17
+msgid ""
+"See you soon! If you have problems resetting your email, feel free to shoot "
+"us an email at"
+msgstr ""
+
+#: templates/registration/password_reset_email.html:19
+msgid "See you soon!"
+msgstr ""
+
+#: templates/registration/password_reset_email.txt:1
#, python-format
msgid ""
"You're receiving this email because you requested a password reset for your "
"user account at %(site_name)s."
msgstr ""
-#: .\templates\registration\password_reset_email.txt:3
+#: templates/registration/password_reset_email.txt:3
msgid "Please go to the following page and choose a new password:"
msgstr ""
-#: .\templates\registration\password_reset_email.txt:7
+#: templates/registration/password_reset_email.txt:7
msgid "Your username, in case you've forgotten:"
msgstr ""
-#: .\templates\registration\password_reset_email.txt:9
+#: templates/registration/password_reset_email.txt:9
msgid "Thanks for using our site!"
msgstr ""
-#: .\templates\registration\password_reset_email.txt:11
+#: templates/registration/password_reset_email.txt:11
#, python-format
msgid "The %(site_name)s team"
msgstr ""
-#: .\templates\registration\password_reset_subject.txt:1
+#: templates/registration/password_reset_subject.txt:1
#, python-format
msgid "Password reset on %(site_name)s"
msgstr ""
-#: .\templates\registration\profile_creation.html:36
-#: .\templates\registration\username_select.html:7
+#: templates/registration/profile_creation.html:36
+#: templates/registration/username_select.html:7
msgid "Continue >"
msgstr ""
-#: .\templates\registration\registration_complete.html:3
+#: templates/registration/registration_closed.html:3
+msgid "Registration is currently closed. Please contact an administrator."
+msgstr ""
+
+#: templates/registration/registration_complete.html:3
msgid ""
"You have successfully been registered. An email has been sent to the email "
"address you provided to confirm your registration."
msgstr ""
-#: .\templates\registration\registration_form.html:162
+#: templates/registration/registration_form.html:164
msgid "(again, for confirmation)"
msgstr ""
-#: .\templates\registration\registration_form.html:169
+#: templates/registration/registration_form.html:171
msgid "(select your closest major city)"
msgstr ""
-#: .\templates\registration\registration_form.html:173
-msgid "or"
-msgstr ""
-
-#: .\templates\registration\registration_form.html:174
+#: templates/registration/registration_form.html:176
msgid "pick from map"
msgstr ""
-#: .\templates\registration\registration_form.html:179
+#: templates/registration/registration_form.html:181
msgid "Default language"
msgstr ""
-#: .\templates\registration\registration_form.html:182
-#: .\templates\user\edit-profile.html:156
+#: templates/registration/registration_form.html:184
+#: templates/user/edit-profile.html:314
msgid "Affiliated organizations"
msgstr ""
-#: .\templates\registration\registration_form.html:188
-#: .\templates\user\edit-profile.html:126
+#: templates/registration/registration_form.html:190
+#: templates/user/edit-profile.html:328
msgid "Notify me about upcoming contests"
msgstr ""
-#: .\templates\registration\registration_form.html:202
+#: templates/registration/registration_form.html:204
msgid "By registering, you agree to our"
msgstr ""
-#: .\templates\registration\registration_form.html:203
+#: templates/registration/registration_form.html:205
msgid "Terms & Conditions"
msgstr ""
-#: .\templates\registration\registration_form.html:206
+#: templates/registration/registration_form.html:208
msgid "Register!"
msgstr ""
-#: .\templates\stats\language.html:44
-msgid "Submission Statistics"
+#: templates/registration/totp_disable.html:31
+msgid ""
+"To protect your account, you must first authenticate before you can disable "
+"Two Factor Authentication."
msgstr ""
-#: .\templates\stats\language.html:50
-msgid "Submissions by Language"
+#: templates/registration/totp_disable.html:38
+msgid ""
+"Enter the 6-digit code generated by your app or one of your 16-digit scratch "
+"codes:"
msgstr ""
-#: .\templates\stats\language.html:56
-msgid "AC Submissions by Language"
+#: templates/registration/totp_disable.html:41
+msgid "Disable Two Factor Authentication"
msgstr ""
-#: .\templates\stats\language.html:62
-msgid "Language AC Rate"
+#: templates/registration/totp_enable.html:72
+msgid "Scan this code with your authenticator app:"
+msgstr ""
+
+#: templates/registration/totp_enable.html:73
+msgid "QR code"
+msgstr ""
+
+#: templates/registration/totp_enable.html:74
+msgid "Or enter this code manually:"
+msgstr ""
+
+#: templates/registration/totp_enable.html:85
+msgid "Enter the 6-digit code generated by your app:"
+msgstr ""
+
+#: templates/registration/totp_enable.html:90
+msgid "Refresh Two Factor Authentication"
msgstr ""
-#: .\templates\status\judge-status-table.html:2
+#: templates/registration/totp_enable.html:92
+msgid "Enable Two Factor Authentication"
+msgstr ""
+
+#: templates/registration/totp_enable.html:98
+msgid "Below is a list of one-time use scratch codes."
+msgstr ""
+
+#: templates/registration/totp_enable.html:99
+msgid "These codes can only be used once and are for emergency use."
+msgstr ""
+
+#: templates/registration/totp_enable.html:100
+msgid ""
+"You can use these codes to login to your account or disable two-factor "
+"authentication."
+msgstr ""
+
+#: templates/registration/totp_enable.html:101
+msgid ""
+"If you ever need more scratch codes, you can regenerate them on the edit "
+"profile tab."
+msgstr ""
+
+#: templates/registration/totp_enable.html:102
+msgid "Please write these down and keep them in a secure location."
+msgstr ""
+
+#: templates/registration/totp_enable.html:103
+msgid ""
+"These codes will never be shown again after you enable two-factor "
+"authentication."
+msgstr ""
+
+#: templates/registration/two_factor_auth.html:33
+#: templates/user/edit-profile.html:165
+msgid "WebAuthn is not supported by your browser."
+msgstr ""
+
+#: templates/registration/two_factor_auth.html:54
+#: templates/user/edit-profile.html:189
+msgid "Failed to contact server."
+msgstr ""
+
+#: templates/registration/two_factor_auth.html:79
+msgid ""
+"Enter the 6-digit code generated by your app or one of your 16-character "
+"scratch codes:"
+msgstr ""
+
+#: templates/registration/two_factor_auth.html:81
+msgid "Enter one of your 16-character scratch codes:"
+msgstr ""
+
+#: templates/registration/two_factor_auth.html:89
+msgid "Use security key"
+msgstr ""
+
+#: templates/registration/two_factor_auth.html:94
+msgid "Use scratch code"
+msgstr ""
+
+#: templates/registration/two_factor_auth.html:97
+#, python-format
+msgid ""
+"If you lost your authentication device and are unable to use your scratch "
+"codes, please contact us at %(email)s."
+msgstr ""
+
+#: templates/stats/language.html:11
+msgid "Submission Statistics"
+msgstr ""
+
+#: templates/stats/language.html:21
+msgid "AC Submissions by Language"
+msgstr ""
+
+#: templates/status/judge-status-table.html:2
msgid "Judge"
msgstr ""
-#: .\templates\status\judge-status-table.html:4
+#: templates/status/judge-status-table.html:4
msgid "Online"
msgstr ""
-#: .\templates\status\judge-status-table.html:6
+#: templates/status/judge-status-table.html:6
msgid "Uptime"
msgstr ""
-#: .\templates\status\judge-status-table.html:7
+#: templates/status/judge-status-table.html:7
msgid "Ping"
msgstr ""
-#: .\templates\status\judge-status-table.html:8
+#: templates/status/judge-status-table.html:8
msgid "Load"
msgstr ""
-#: .\templates\status\judge-status-table.html:34
-#: .\templates\status\judge-status-table.html:41
-#: .\templates\status\judge-status-table.html:48
-#: .\templates\status\judge-status-table.html:59
+#: templates/status/judge-status-table.html:34
+#: templates/status/judge-status-table.html:41
+#: templates/status/judge-status-table.html:48
+#: templates/status/judge-status-table.html:59
msgid "N/A"
msgstr ""
-#: .\templates\status\judge-status-table.html:64
+#: templates/status/judge-status-table.html:64
msgid "There are no judges available at this time."
msgstr ""
-#: .\templates\status\language-list.html:35
+#: templates/status/language-list.html:34 templates/ticket/list.html:259
+msgid "ID"
+msgstr ""
+
+#: templates/status/language-list.html:36
msgid "Runtime Info"
msgstr ""
-#: .\templates\status\status-tabs.html:4
+#: templates/status/status-tabs.html:4
msgid "Judges"
msgstr ""
-#: .\templates\status\status-tabs.html:6
+#: templates/status/status-tabs.html:6
msgid "Version Matrix"
msgstr ""
-#: .\templates\submission\internal-error-message.html:8
+#: templates/submission/internal-error-message.html:3
+#, python-format
+msgid ""
+"An internal error occurred while grading, and the %(SITE_NAME)s "
+"administrators have been notified.
In the meantime, try resubmitting in "
+"a few seconds."
+msgstr ""
+
+#: templates/submission/internal-error-message.html:8
msgid "An internal error occurred while grading."
msgstr ""
-#: .\templates\submission\internal-error-message.html:15
+#: templates/submission/internal-error-message.html:15
msgid "Error information"
msgstr ""
-#: .\templates\submission\list.html:60
+#: templates/submission/list.html:76
msgid "Filter by status..."
msgstr ""
-#: .\templates\submission\list.html:62
+#: templates/submission/list.html:82
msgid "Filter by language..."
msgstr ""
-#: .\templates\submission\list.html:218
+#: templates/submission/list.html:306
msgid "Filter submissions"
msgstr ""
-#: .\templates\submission\list.html:260
+#: templates/submission/list.html:342
+msgid "Total:"
+msgstr ""
+
+#: templates/submission/list.html:352
msgid "You were disconnected. Refresh to show latest updates."
msgstr ""
-#: .\templates\submission\row.html:39
+#: templates/submission/row.html:44
#, python-format
msgid "Case #%(case)s"
msgstr ""
-#: .\templates\submission\row.html:49
+#: templates/submission/row.html:54
msgid "view"
msgstr ""
-#: .\templates\submission\row.html:53
+#: templates/submission/row.html:59
msgid "rejudge"
msgstr ""
-#: .\templates\submission\row.html:58
+#: templates/submission/row.html:64
+msgid "This submission has been locked, and cannot be rejudged."
+msgstr ""
+
+#: templates/submission/row.html:65
+msgid "locked"
+msgstr ""
+
+#: templates/submission/row.html:71
msgid "admin"
msgstr ""
-#: .\templates\submission\source.html:25
+#: templates/submission/source.html:25
msgid "View status"
msgstr ""
-#: .\templates\submission\source.html:26
+#: templates/submission/source.html:26
msgid "View raw source"
msgstr ""
-#: .\templates\submission\source.html:28 .\templates\submission\status.html:61
+#: templates/submission/source.html:28 templates/submission/status.html:74
msgid "Resubmit"
msgstr ""
-#: .\templates\submission\status-testcases.html:10
+#: templates/submission/status-testcases.html:10
msgid "We are waiting for a suitable judge to process your submission..."
msgstr ""
-#: .\templates\submission\status-testcases.html:12
+#: templates/submission/status-testcases.html:12
msgid "Your submission is being processed..."
msgstr ""
-#: .\templates\submission\status-testcases.html:14
+#: templates/submission/status-testcases.html:14
msgid "Compilation Error"
msgstr ""
-#: .\templates\submission\status-testcases.html:18
+#: templates/submission/status-testcases.html:18
msgid "Compilation Warnings"
msgstr ""
-#: .\templates\submission\status-testcases.html:23
+#: templates/submission/status-testcases.html:23
msgid "Pretest Execution Results"
msgstr ""
-#: .\templates\submission\status-testcases.html:25
+#: templates/submission/status-testcases.html:25
msgid "Execution Results"
msgstr ""
-#: .\templates\submission\status-testcases.html:31
+#: templates/submission/status-testcases.html:51
msgid "Batch "
msgstr ""
-#: .\templates\submission\status-testcases.html:43
+#: templates/submission/status-testcases.html:64
msgid "Case"
msgstr ""
-#: .\templates\submission\status-testcases.html:45
+#: templates/submission/status-testcases.html:66
msgid "Pretest"
msgstr ""
-#: .\templates\submission\status-testcases.html:47
+#: templates/submission/status-testcases.html:68
msgid "Test case"
msgstr ""
-#: .\templates\submission\status-testcases.html:79
+#: templates/submission/status-testcases.html:101
msgid "Your output (clipped)"
msgstr ""
-#: .\templates\submission\status-testcases.html:99
+#: templates/submission/status-testcases.html:113
+msgid "Judge feedback"
+msgstr ""
+
+#: templates/submission/status-testcases.html:129
+msgid "Resources:"
+msgstr ""
+
+#: templates/submission/status-testcases.html:138
+msgid "Maximum runtime on single test case:"
+msgstr ""
+
+#: templates/submission/status-testcases.html:143
msgid "Final pretest score:"
msgstr ""
-#: .\templates\submission\status-testcases.html:101
+#: templates/submission/status-testcases.html:145
msgid "Final score:"
msgstr ""
-#: .\templates\submission\status-testcases.html:115
+#: templates/submission/status-testcases.html:159
msgid "Passing pretests does not guarantee a full score on system tests."
msgstr ""
-#: .\templates\submission\status-testcases.html:118
+#: templates/submission/status-testcases.html:162
msgid "Submission aborted!"
msgstr ""
-#: .\templates\submission\status.html:59
+#: templates/submission/status.html:72
msgid "View source"
msgstr ""
-#: .\templates\submission\status.html:88
+#: templates/submission/status.html:100
+msgid "Press Ctrl-Enter or Command-Enter to abort."
+msgstr ""
+
+#: templates/submission/status.html:102
msgid "Abort"
msgstr ""
-#: .\templates\submission\submission-list-tabs.html:6
+#: templates/submission/submission-list-tabs.html:6
msgid "Mine"
msgstr ""
-#: .\templates\submission\submission-list-tabs.html:9
+#: templates/submission/submission-list-tabs.html:9
msgid "Best"
msgstr ""
-#: .\templates\submission\submission-list-tabs.html:12
+#: templates/submission/submission-list-tabs.html:12
#, python-format
msgid "%(user)s's"
msgstr ""
-#: .\templates\ticket\list.html:135 .\templates\ticket\ticket.html:257
+#: templates/ticket/list.html:135 templates/ticket/ticket.html:259
msgid "Reopened: "
msgstr ""
-#: .\templates\ticket\list.html:138 .\templates\ticket\ticket.html:258
+#: templates/ticket/list.html:138 templates/ticket/ticket.html:260
msgid "Closed: "
msgstr ""
-#: .\templates\ticket\list.html:205
+#: templates/ticket/list.html:221
msgid "Use desktop notification"
msgstr ""
-#: .\templates\ticket\list.html:211
+#: templates/ticket/list.html:227
msgid "Show my tickets only"
msgstr ""
-#: .\templates\ticket\list.html:215
+#: templates/ticket/list.html:231
msgid "Filing user"
msgstr ""
-#: .\templates\ticket\list.html:224
+#: templates/ticket/list.html:240 templates/ticket/ticket.html:360
msgid "Assignee"
-msgstr ""
+msgid_plural "Assignees"
+msgstr[0] ""
+msgstr[1] ""
-#: .\templates\ticket\list.html:246
+#: templates/ticket/list.html:260
msgid "Title"
msgstr ""
-#: .\templates\ticket\list.html:248 .\templates\ticket\ticket.html:304
+#: templates/ticket/list.html:262
msgid "Assignees"
msgstr ""
-#: .\templates\ticket\new_problem.html:7
+#: templates/ticket/new_problem.html:7
msgid "Thanks for opening a ticket!"
msgstr ""
-#: .\templates\ticket\new_problem.html:9
+#: templates/ticket/new_problem.html:9
msgid ""
"Please keep in mind that this form is for reporting issues with a problem "
"statement, and not for asking for help. If you require assistance on solving "
"a problem, ask in the comments instead."
msgstr ""
-#: .\templates\ticket\ticket.html:298
+#: templates/ticket/ticket.html:345
+msgid "Post"
+msgstr ""
+
+#: templates/ticket/ticket.html:353
msgid "Associated object"
msgstr ""
-#: .\templates\ticket\ticket.html:309
+#: templates/ticket/ticket.html:370
msgid "No one is assigned."
msgstr ""
-#: .\templates\ticket\ticket.html:315
+#: templates/ticket/ticket.html:376
msgid "Close ticket"
msgstr ""
-#: .\templates\ticket\ticket.html:317
+#: templates/ticket/ticket.html:378
msgid "Reopen ticket"
msgstr ""
-#: .\templates\ticket\ticket.html:321
+#: templates/ticket/ticket.html:382
msgid "Assignee notes"
msgstr ""
-#: .\templates\ticket\ticket.html:328 .\templates\widgets\select_all.html:4
+#: templates/ticket/ticket.html:389 templates/widgets/select_all.html:4
msgid "Nothing here."
msgstr ""
-#: .\templates\ticket\ticket.html:376
-msgid "Post"
-msgstr ""
-
-#: .\templates\user\base-users-table.html:3
+#: templates/user/base-users-table.html:3
msgid "Rank"
msgstr ""
-#: .\templates\user\base-users.html:14 .\templates\user\base-users.html:69
+#: templates/user/base-users.html:14 templates/user/base-users.html:71
msgid "Search by handle..."
msgstr ""
-#: .\templates\user\edit-profile.html:91
-msgid "Display name"
+#: templates/user/edit-profile.html:113
+msgid "Are you sure you want to generate or regenerate your API token?"
+msgstr ""
+
+#: templates/user/edit-profile.html:114
+msgid "This will invalidate any previous API tokens."
+msgstr ""
+
+#: templates/user/edit-profile.html:115
+msgid ""
+"It also allows access to your account without Two-factor Authentication."
+msgstr ""
+
+#: templates/user/edit-profile.html:116
+msgid "You will not be able to view your api token after you leave this page!"
+msgstr ""
+
+#: templates/user/edit-profile.html:117 templates/user/edit-profile.html:211
+msgid "Generating..."
+msgstr ""
+
+#: templates/user/edit-profile.html:125 templates/user/edit-profile.html:247
+#: templates/user/edit-profile.html:373 templates/user/edit-profile.html:395
+msgid "Regenerate"
+msgstr ""
+
+#: templates/user/edit-profile.html:131 templates/user/edit-profile.html:397
+msgid "Remove"
+msgstr ""
+
+#: templates/user/edit-profile.html:141
+msgid "Are you sure you want to remove your API token?"
+msgstr ""
+
+#: templates/user/edit-profile.html:148 templates/user/edit-profile.html:377
+#: templates/user/edit-profile.html:401
+msgid "Generate"
msgstr ""
-#: .\templates\user\edit-profile.html:95
+#: templates/user/edit-profile.html:194
+msgid "Are you sure you want to delete this security key?"
+msgstr ""
+
+#: templates/user/edit-profile.html:284
msgid "Self-description"
msgstr ""
-#: .\templates\user\edit-profile.html:103
+#: templates/user/edit-profile.html:291
msgid "Select your closest major city"
msgstr ""
-#: .\templates\user\edit-profile.html:112
+#: templates/user/edit-profile.html:300
msgid "Editor theme"
msgstr ""
-#: .\templates\user\edit-profile.html:117
+#: templates/user/edit-profile.html:305
msgid "Math engine"
msgstr ""
-#: .\templates\user\edit-profile.html:141
-#: .\templates\user\edit-profile.html:142
+#: templates/user/edit-profile.html:339 templates/user/edit-profile.html:341
msgid "Change your avatar"
msgstr ""
-#: .\templates\user\edit-profile.html:148
+#: templates/user/edit-profile.html:346
msgid "Change your password"
msgstr ""
-#: .\templates\user\edit-profile.html:164
+#: templates/user/edit-profile.html:359
+msgid "Two-factor Authentication is enabled"
+msgstr ""
+
+#: templates/user/edit-profile.html:362 templates/user/edit-profile.html:365
+msgid "Disable"
+msgstr ""
+
+#: templates/user/edit-profile.html:367
+msgid "Refresh"
+msgstr ""
+
+#: templates/user/edit-profile.html:370
+msgid "Scratch Codes:"
+msgstr ""
+
+#: templates/user/edit-profile.html:374 templates/user/edit-profile.html:398
+msgid "Hidden"
+msgstr ""
+
+#: templates/user/edit-profile.html:384
+msgid "Two-factor Authentication is disabled"
+msgstr ""
+
+#: templates/user/edit-profile.html:385
+msgid "Enable"
+msgstr ""
+
+#: templates/user/edit-profile.html:392
+msgid "API Token"
+msgstr ""
+
+#: templates/user/edit-profile.html:409
+msgid "Security keys"
+msgstr ""
+
+#: templates/user/edit-profile.html:419
+msgid "Delete"
+msgstr ""
+
+#: templates/user/edit-profile.html:426
+msgid "Enter a name for this key"
+msgstr ""
+
+#: templates/user/edit-profile.html:427
+msgid "Add"
+msgstr ""
+
+#: templates/user/edit-profile.html:435
msgid "User-script"
msgstr ""
-#: .\templates\user\edit-profile.html:168
+#: templates/user/edit-profile.html:439
msgid "Update profile"
msgstr ""
-#: .\templates\user\pp-row.html:22
+#: templates/user/pp-row.html:24
#, python-format
msgid ""
"\n"
@@ -3791,115 +5093,204 @@ msgid ""
" "
msgstr ""
-#: .\templates\user\pp-row.html:27
+#: templates/user/pp-row.html:29
#, python-format
msgid "%(pp).1fpp"
msgstr ""
-#: .\templates\user\pp-row.html:29
+#: templates/user/pp-row.html:31
#, python-format
msgid "%(pp).0fpp"
msgstr ""
-#: .\templates\user\user-about.html:14
+#: templates/user/prepare-data.html:64
+msgid "Are you sure you want to prepare a download?"
+msgstr ""
+
+#: templates/user/prepare-data.html:79
+msgid "We are currently preparing your data."
+msgstr ""
+
+#: templates/user/prepare-data.html:81
+msgid "Track progress"
+msgstr ""
+
+#: templates/user/prepare-data.html:86
+msgid "Once your data is ready, you will find a download link on this page."
+msgstr ""
+
+#: templates/user/prepare-data.html:103
+msgid "Submissions"
+msgstr ""
+
+#: templates/user/prepare-data.html:120
+msgid "Prepare new download"
+msgstr ""
+
+#: templates/user/prepare-data.html:122
+msgid "Prepare download"
+msgstr ""
+
+#: templates/user/prepare-data.html:126
+msgid "Download prepared data"
+msgstr ""
+
+#: templates/user/prepare-data.html:132
+msgid "Your data is ready!"
+msgstr ""
+
+#: templates/user/prepare-data.html:136
+msgid "Download data"
+msgstr ""
+
+#: templates/user/user-about.html:14
msgid "From"
msgstr ""
-#: .\templates\user\user-about.html:24 .\templates\user\user-tabs.html:4
+#: templates/user/user-about.html:25
+msgid "Admin Notes"
+msgstr ""
+
+#: templates/user/user-about.html:33 templates/user/user-tabs.html:4
msgid "About"
msgstr ""
-#: .\templates\user\user-about.html:31
+#: templates/user/user-about.html:40
msgid "You have not shared any information."
msgstr ""
-#: .\templates\user\user-about.html:33
+#: templates/user/user-about.html:42
msgid "This user has not shared any information."
msgstr ""
-#: .\templates\user\user-base.html:46
-#, python-format
-msgid "%(count)d problems solved"
+#: templates/user/user-about.html:59
+msgid "Sun"
+msgstr ""
+
+#: templates/user/user-about.html:64
+msgid "Mon"
+msgstr ""
+
+#: templates/user/user-about.html:69
+msgid "Tues"
msgstr ""
-#: .\templates\user\user-base.html:48
+#: templates/user/user-about.html:74
+msgid "Wed"
+msgstr ""
+
+#: templates/user/user-about.html:79
+msgid "Thurs"
+msgstr ""
+
+#: templates/user/user-about.html:84
+msgid "Fri"
+msgstr ""
+
+#: templates/user/user-about.html:89
+msgid "Sat"
+msgstr ""
+
+#: templates/user/user-about.html:98
+msgid "Less"
+msgstr ""
+
+#: templates/user/user-about.html:104
+msgid "More"
+msgstr ""
+
+#: templates/user/user-about.html:112
+msgid "Rating history"
+msgstr ""
+
+#: templates/user/user-about.html:183
+msgid "past year"
+msgstr ""
+
+#: templates/user/user-base.html:42
+#, python-format
+msgid "%(counter)s problem solved"
+msgid_plural "%(counter)s problems solved"
+msgstr[0] ""
+msgstr[1] ""
+
+#: templates/user/user-base.html:50
msgid "Rank by points:"
msgstr ""
-#: .\templates\user\user-base.html:50
+#: templates/user/user-base.html:53
msgid "Total points:"
msgstr ""
-#: .\templates\user\user-base.html:58
-msgid "View submissions"
-msgstr ""
+#: templates/user/user-base.html:67
+#, python-format
+msgid "%(counter)s contest written"
+msgid_plural "%(counter)s contests written"
+msgstr[0] ""
+msgstr[1] ""
-#: .\templates\user\user-base.html:64
+#: templates/user/user-base.html:74
msgid "Rank by rating:"
msgstr ""
-#: .\templates\user\user-base.html:65
+#: templates/user/user-base.html:76
msgid "Rating:"
msgstr ""
-#: .\templates\user\user-base.html:66
+#: templates/user/user-base.html:77
msgid "Volatility:"
msgstr ""
-#: .\templates\user\user-base.html:67
+#: templates/user/user-base.html:78
msgid "Min. rating:"
msgstr ""
-#: .\templates\user\user-base.html:68
+#: templates/user/user-base.html:79
msgid "Max rating:"
msgstr ""
-#: .\templates\user\user-problems.html:35
-msgid "Points Breakdown"
+#: templates/user/user-problems.html:37
+msgid "Points breakdown"
msgstr ""
-#: .\templates\user\user-problems.html:46
+#: templates/user/user-problems.html:43
msgid "Load more..."
msgstr ""
-#: .\templates\user\user-problems.html:50
+#: templates/user/user-problems.html:47
msgid "This user has not yet solved any problems."
msgstr ""
-#: .\templates\user\user-problems.html:56
-msgid "Authored Problems"
+#: templates/user/user-problems.html:53
+msgid "Authored problems"
msgstr ""
-#: .\templates\user\user-problems.html:88
+#: templates/user/user-problems.html:85
msgid "Hide problems I've solved"
msgstr ""
-#: .\templates\user\user-problems.html:98
+#: templates/user/user-problems.html:95
#, python-format
msgid "%(points).1f points"
msgstr ""
-#: .\templates\user\user-problems.html:104
-msgid "Score"
-msgstr ""
-
-#: .\templates\user\user-problems.html:115
+#: templates/user/user-problems.html:112
#, python-format
msgid "%(points)s / %(total)s"
msgstr ""
-#: .\templates\user\user-tabs.html:7
+#: templates/user/user-tabs.html:7
msgid "Impersonate"
msgstr ""
-#: .\templates\user\user-tabs.html:13
+#: templates/user/user-tabs.html:10
msgid "Admin User"
msgstr ""
-#: .\templates\user\user-tabs.html:16
+#: templates/user/user-tabs.html:13
msgid "Admin Profile"
msgstr ""
-#: .\templates\widgets\select_all.html:8
+#: templates/widgets/select_all.html:8
msgid "Check all"
msgstr ""
diff --git a/locale/en/LC_MESSAGES/djangojs.po b/locale/en/LC_MESSAGES/djangojs.po
index 2396075508..17d69e329c 100644
--- a/locale/en/LC_MESSAGES/djangojs.po
+++ b/locale/en/LC_MESSAGES/djangojs.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-08-21 17:54-0400\n"
+"POT-Creation-Date: 2021-07-23 00:28+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -18,14 +18,14 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: .\resources\common.js:203
+#: resources/common.js:207
msgctxt "time format with day"
msgid "%d day %h:%m:%s"
msgid_plural "%d days %h:%m:%s"
msgstr[0] ""
msgstr[1] ""
-#: .\resources\common.js:206
+#: resources/common.js:210
msgctxt "time format without day"
msgid "%h:%m:%s"
msgstr ""
diff --git a/locale/es/LC_MESSAGES/django.po b/locale/es/LC_MESSAGES/django.po
index 0e3d754e2d..49a1a946ca 100644
--- a/locale/es/LC_MESSAGES/django.po
+++ b/locale/es/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: dmoj\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-24 19:15+0000\n"
-"PO-Revision-Date: 2021-04-25 00:08\n"
+"POT-Creation-Date: 2021-06-17 01:38+0000\n"
+"PO-Revision-Date: 2021-07-07 00:27\n"
"Last-Translator: \n"
"Language-Team: Spanish\n"
"Language: es_ES\n"
@@ -17,75 +17,75 @@ msgstr ""
"X-Crowdin-File: django.po\n"
"X-Crowdin-File-ID: 10\n"
-#: dmoj/settings.py:364
+#: dmoj/settings.py:365
msgid "Catalan"
msgstr "Catalan"
-#: dmoj/settings.py:365
+#: dmoj/settings.py:366
msgid "German"
msgstr "Alemán"
-#: dmoj/settings.py:366
+#: dmoj/settings.py:367
msgid "English"
msgstr "Inglés"
-#: dmoj/settings.py:367
+#: dmoj/settings.py:368
msgid "Spanish"
msgstr "Español"
-#: dmoj/settings.py:368
+#: dmoj/settings.py:369
msgid "French"
msgstr "Francés"
-#: dmoj/settings.py:369
+#: dmoj/settings.py:370
msgid "Croatian"
msgstr "Croata"
-#: dmoj/settings.py:370
+#: dmoj/settings.py:371
msgid "Hungarian"
msgstr "Húngaro"
-#: dmoj/settings.py:371
+#: dmoj/settings.py:372
msgid "Japanese"
msgstr "Japonés"
-#: dmoj/settings.py:372
+#: dmoj/settings.py:373
msgid "Korean"
msgstr "Coreano"
-#: dmoj/settings.py:373
+#: dmoj/settings.py:374
msgid "Brazilian Portuguese"
msgstr "Portugués (Brasil)"
-#: dmoj/settings.py:374
+#: dmoj/settings.py:375
msgid "Romanian"
msgstr "Rumano"
-#: dmoj/settings.py:375
+#: dmoj/settings.py:376
msgid "Russian"
msgstr "Ruso"
-#: dmoj/settings.py:376
+#: dmoj/settings.py:377
msgid "Serbian (Latin)"
msgstr "Serbio (Latino)"
-#: dmoj/settings.py:377
+#: dmoj/settings.py:378
msgid "Turkish"
msgstr "Turco"
-#: dmoj/settings.py:378
+#: dmoj/settings.py:379
msgid "Vietnamese"
msgstr "Vietnamita"
-#: dmoj/settings.py:379
+#: dmoj/settings.py:380
msgid "Simplified Chinese"
msgstr "Chino simplificado"
-#: dmoj/settings.py:380
+#: dmoj/settings.py:381
msgid "Traditional Chinese"
msgstr "Chino Tradicional"
-#: dmoj/urls.py:103 templates/base.html:190
+#: dmoj/urls.py:104 templates/base.html:190
msgid "Home"
msgstr "Inicio"
@@ -115,112 +115,112 @@ msgstr "Mostrar comentarios"
msgid "Associated page"
msgstr "Página asociada"
-#: judge/admin/contest.py:31
+#: judge/admin/contest.py:32
msgid "Included contests"
msgstr "Concursos incluidos"
-#: judge/admin/contest.py:65 templates/contest/contest.html:83
+#: judge/admin/contest.py:66 templates/contest/contest.html:83
#: templates/contest/moss.html:43 templates/problem/list.html:204
#: templates/problem/list.html:219 templates/user/user-problems.html:58
#: templates/user/user-problems.html:100
msgid "Problem"
msgstr "Problema"
-#: judge/admin/contest.py:114
+#: judge/admin/contest.py:117
msgid "Settings"
msgstr "Ajustes"
-#: judge/admin/contest.py:116
+#: judge/admin/contest.py:120
msgid "Scheduling"
msgstr "Programación Horaria"
-#: judge/admin/contest.py:117
+#: judge/admin/contest.py:121
msgid "Details"
msgstr "Detalles"
-#: judge/admin/contest.py:118
+#: judge/admin/contest.py:122
msgid "Format"
msgstr "Formato"
-#: judge/admin/contest.py:119 templates/contest/ranking-table.html:5
+#: judge/admin/contest.py:123 templates/contest/ranking-table.html:5
msgid "Rating"
msgstr "Puntuación"
-#: judge/admin/contest.py:120
+#: judge/admin/contest.py:124
msgid "Access"
msgstr "Acceso"
-#: judge/admin/contest.py:122 judge/admin/problem.py:134
+#: judge/admin/contest.py:126 judge/admin/problem.py:135
msgid "Justice"
msgstr "Justicia"
-#: judge/admin/contest.py:211
+#: judge/admin/contest.py:215
#, python-format
msgid "%d contest successfully marked as visible."
msgid_plural "%d contests successfully marked as visible."
msgstr[0] "%d concurso ha sido hecho visible con éxito"
msgstr[1] "%d concursos han sido hechos visibles con éxito"
-#: judge/admin/contest.py:214
+#: judge/admin/contest.py:218
msgid "Mark contests as visible"
msgstr "Marcar concursos como visibles"
-#: judge/admin/contest.py:220
+#: judge/admin/contest.py:224
#, python-format
msgid "%d contest successfully marked as hidden."
msgid_plural "%d contests successfully marked as hidden."
msgstr[0] "%d concurso ha sido hecho invisible con éxito"
msgstr[1] "%d concursos han sido hecho invisibles con éxito"
-#: judge/admin/contest.py:223
+#: judge/admin/contest.py:227
msgid "Mark contests as hidden"
msgstr "Marcar concursos como invisibles"
-#: judge/admin/contest.py:229
+#: judge/admin/contest.py:233
#, python-format
msgid "%d contest successfully locked."
msgid_plural "%d contests successfully locked."
msgstr[0] "%d concurso bloqueado exitosamente."
msgstr[1] "%d concursos bloqueados exitosamente."
-#: judge/admin/contest.py:232
+#: judge/admin/contest.py:236
msgid "Lock contest submissions"
msgstr "Bloquear envíos del concurso"
-#: judge/admin/contest.py:238
+#: judge/admin/contest.py:242
#, python-format
msgid "%d contest successfully unlocked."
msgid_plural "%d contests successfully unlocked."
msgstr[0] "%d concurso desbloqueado exitosamente."
msgstr[1] "%d concursos desbloqueados exitosamente."
-#: judge/admin/contest.py:241
+#: judge/admin/contest.py:245
msgid "Unlock contest submissions"
msgstr "Desbloquear envíos del concurso"
-#: judge/admin/contest.py:262 judge/admin/submission.py:170
+#: judge/admin/contest.py:266 judge/admin/submission.py:170
#, python-format
msgid "%d submission was successfully scheduled for rejudging."
msgid_plural "%d submissions were successfully scheduled for rejudging."
msgstr[0] "%d envío ha sido añadido a la cola para rejuzgar con éxito"
msgstr[1] "%d envíos han sido añadidos a la cola para rejuzgar con éxito"
-#: judge/admin/contest.py:337
+#: judge/admin/contest.py:341
#, python-format
msgid "%d participation recalculated."
msgid_plural "%d participations recalculated."
msgstr[0] "%d participación recalculada."
msgstr[1] "%d participaciones recalculadas."
-#: judge/admin/contest.py:340
+#: judge/admin/contest.py:344
msgid "Recalculate results"
msgstr "Recalcular resultados"
-#: judge/admin/contest.py:344 judge/admin/organization.py:63
+#: judge/admin/contest.py:348 judge/admin/organization.py:63
msgid "username"
msgstr "nombre de usuario"
-#: judge/admin/contest.py:349 templates/base.html:258
+#: judge/admin/contest.py:353 templates/base.html:258
msgid "virtual"
msgstr "virtual"
@@ -236,9 +236,9 @@ msgstr "Contenido"
msgid "Summary"
msgstr "Resumen"
-#: judge/admin/interface.py:113 judge/models/contest.py:383
-#: judge/models/contest.py:509 judge/models/profile.py:244
-#: judge/models/profile.py:268
+#: judge/admin/interface.py:113 judge/models/contest.py:419
+#: judge/models/contest.py:546 judge/models/profile.py:261
+#: judge/models/profile.py:292
msgid "user"
msgstr "usuario"
@@ -246,8 +246,8 @@ msgstr "usuario"
msgid "object"
msgstr "objeto"
-#: judge/admin/organization.py:32 judge/admin/problem.py:181
-#: judge/admin/profile.py:82
+#: judge/admin/organization.py:32 judge/admin/problem.py:182
+#: judge/admin/profile.py:92
msgid "View on site"
msgstr "Ver en el sitio web"
@@ -255,69 +255,69 @@ msgstr "Ver en el sitio web"
msgid "Describe the changes you made (optional)"
msgstr "Describe los cambios que realizaste (opcional)"
-#: judge/admin/problem.py:129
+#: judge/admin/problem.py:130
msgid "Social Media"
msgstr "Redes Sociales"
-#: judge/admin/problem.py:130
+#: judge/admin/problem.py:131
msgid "Taxonomy"
msgstr "Taxonomía"
-#: judge/admin/problem.py:131 templates/contest/contest.html:84
+#: judge/admin/problem.py:132 templates/contest/contest.html:84
#: templates/problem/data.html:385 templates/problem/list.html:209
#: templates/problem/list.html:230 templates/user/base-users-table.html:10
#: templates/user/user-problems.html:60
msgid "Points"
msgstr "Puntos"
-#: judge/admin/problem.py:132
+#: judge/admin/problem.py:133
msgid "Limits"
msgstr "Límites"
-#: judge/admin/problem.py:133 judge/admin/submission.py:238
-#: templates/stats/base.html:14 templates/submission/list.html:320
-#: templates/user/edit-profile.html:292
+#: judge/admin/problem.py:134 judge/admin/submission.py:238
+#: templates/stats/base.html:14 templates/submission/list.html:319
+#: templates/user/edit-profile.html:296
msgid "Language"
msgstr "Lenguaje"
-#: judge/admin/problem.py:135
+#: judge/admin/problem.py:136
msgid "History"
msgstr "Historia"
-#: judge/admin/problem.py:178
+#: judge/admin/problem.py:179
msgid "Authors"
msgstr "Autores"
-#: judge/admin/problem.py:191
+#: judge/admin/problem.py:192
#, python-format
msgid "%d problem's publish date successfully updated."
msgid_plural "%d problems' publish date successfully updated."
msgstr[0] "La fecha de publicación de %d problema se ha actualizado correctamente."
msgstr[1] "La fecha de publicación de %d problemas se ha actualizado correctamente."
-#: judge/admin/problem.py:195
+#: judge/admin/problem.py:196
msgid "Set publish date to now"
msgstr "Establecer fecha de publicación a ahora"
-#: judge/admin/problem.py:201
+#: judge/admin/problem.py:202
#, python-format
msgid "%d problem successfully marked as public."
msgid_plural "%d problems successfully marked as public."
msgstr[0] "%d problema marcado exitosamente como público."
msgstr[1] "%d problemas marcados exitosamente como públicos."
-#: judge/admin/problem.py:205
+#: judge/admin/problem.py:206
msgid "Mark problems as public"
msgstr "Marcar problema como publico"
-#: judge/admin/problem.py:211
+#: judge/admin/problem.py:212
#, python-format
msgid "%d problem successfully marked as private."
msgid_plural "%d problems successfully marked as private."
msgstr[0] "%d problema marcado como privado con éxito."
msgstr[1] "%d problemas marcados como privados con éxito."
-#: judge/admin/problem.py:215
+#: judge/admin/problem.py:216
msgid "Mark problems as private"
msgstr "Marcar problemas como privados"
@@ -325,35 +325,35 @@ msgstr "Marcar problemas como privados"
msgid "timezone"
msgstr "zona horaria"
-#: judge/admin/profile.py:88 judge/admin/submission.py:217
+#: judge/admin/profile.py:98 judge/admin/submission.py:217
#: templates/organization/requests/log.html:9
#: templates/organization/requests/pending.html:12
#: templates/ticket/list.html:261
msgid "User"
msgstr "Usuario"
-#: judge/admin/profile.py:93 templates/registration/registration_form.html:143
+#: judge/admin/profile.py:103 templates/registration/registration_form.html:143
msgid "Email"
msgstr "Email"
-#: judge/admin/profile.py:98 judge/views/register.py:29
+#: judge/admin/profile.py:108 judge/views/register.py:28
#: templates/registration/registration_form.html:171
-#: templates/user/edit-profile.html:288
+#: templates/user/edit-profile.html:292
msgid "Timezone"
msgstr "Zona horaria"
-#: judge/admin/profile.py:103
+#: judge/admin/profile.py:113
msgid "date joined"
msgstr "fecha de registro"
-#: judge/admin/profile.py:110
+#: judge/admin/profile.py:120
#, python-format
msgid "%d user have scores recalculated."
msgid_plural "%d users have scores recalculated."
msgstr[0] "se ha recalculado la puntuación de %d usuario"
msgstr[1] "se ha recalculado la puntuación de %d usuarios"
-#: judge/admin/profile.py:113
+#: judge/admin/profile.py:123
msgid "Recalculate scores"
msgstr "Recalcular puntuaciones"
@@ -506,115 +506,116 @@ msgstr "IOI"
msgid "IOI (pre-2016)"
msgstr "IOI (antes de 2016)"
-#: judge/forms.py:26
-msgid "Two-factor authentication tokens must be 6 decimal digits."
-msgstr "Los tokens de la Two Factor Authentication tienen que ser 6 dígitos decimales"
+#: judge/forms.py:27
+#, python-brace-format
+msgid "Two-factor authentication tokens must be {TOTP_CODE_LENGTH} decimal digits."
+msgstr ""
-#: judge/forms.py:29
+#: judge/forms.py:30
msgid "Invalid two-factor authentication token."
msgstr "Token de autenticación de dos pasos no válido."
-#: judge/forms.py:32
+#: judge/forms.py:33
msgid "Scratch codes must be 16 base32 characters."
msgstr "Los códigos de Scratch deben tener 16 caracteres base32."
-#: judge/forms.py:34
+#: judge/forms.py:35 judge/forms.py:264
msgid "Invalid scratch code."
msgstr "Código de acceso scratch inválido."
-#: judge/forms.py:45
+#: judge/forms.py:46
msgid "Subscribe to contest updates"
msgstr "Subscribirse en las actualizaciones de los concursos"
-#: judge/forms.py:46
+#: judge/forms.py:47
msgid "Enable experimental features"
msgstr "Habilitar las actualizaciones experimentales"
-#: judge/forms.py:71
+#: judge/forms.py:72
msgid "You must solve at least one problem before you can update your profile."
msgstr ""
-#: judge/forms.py:80 judge/views/organization.py:127
+#: judge/forms.py:81 judge/views/organization.py:126
#, python-brace-format
msgid "You may not be part of more than {count} public organizations."
msgstr "No puedes formar parte de más de {count} organizaciones públicas."
-#: judge/forms.py:96
+#: judge/forms.py:97
msgid "Download comments?"
msgstr "¿Descargar comentarios?"
-#: judge/forms.py:97
+#: judge/forms.py:98
msgid "Download submissions?"
msgstr "¿Descargar envíos?"
-#: judge/forms.py:98
+#: judge/forms.py:99
msgid "Filter by problem code glob:"
msgstr "Filtrar por código glob del problema:"
-#: judge/forms.py:102
+#: judge/forms.py:103
msgid "Leave empty to include all submissions"
msgstr "Dejar en blanco para incluir todos los envíos"
-#: judge/forms.py:105 templates/problem/manage_submission.html:142
+#: judge/forms.py:106 templates/problem/manage_submission.html:142
msgid "Filter by result:"
msgstr "Filtrar por resultado"
-#: judge/forms.py:111
+#: judge/forms.py:112
msgid "Please select at least one thing to download."
msgstr "Por favor selecciona por lo menos una cosa para descargar."
-#: judge/forms.py:137
+#: judge/forms.py:138
msgid "Any judge"
msgstr "Cualquier juez"
-#: judge/forms.py:167 judge/views/register.py:26
+#: judge/forms.py:159 judge/views/register.py:25
#: templates/registration/registration_form.html:137
#: templates/user/base-users-table.html:5
msgid "Username"
msgstr "Nombre de usuario"
-#: judge/forms.py:168 templates/registration/registration_form.html:149
+#: judge/forms.py:160 templates/registration/registration_form.html:149
#: templates/registration/registration_form.html:163
msgid "Password"
msgstr "Contraseña"
-#: judge/forms.py:201
+#: judge/forms.py:192
msgid "Invalid code length."
msgstr "Longitud de código inválida."
-#: judge/forms.py:219
+#: judge/forms.py:223
msgid "Invalid WebAuthn response."
msgstr "Respuesta WebAuthn inválida"
-#: judge/forms.py:222
+#: judge/forms.py:226
msgid "No WebAuthn challenge issued."
msgstr "Ningúna respuesta de WebAuthn emitida."
-#: judge/forms.py:228
+#: judge/forms.py:232
msgid "Invalid WebAuthn credential ID."
msgstr "ID de credencial de WebAuthn inválida."
-#: judge/forms.py:257
+#: judge/forms.py:262
msgid "Invalid two-factor authentication token or scratch code."
msgstr "Token de autenticación de dos pasos no válido."
-#: judge/forms.py:259
+#: judge/forms.py:266
msgid "Must specify either totp_token or webauthn_response."
msgstr "Debe especificar o totp_token o webauthn_response."
-#: judge/forms.py:263 judge/models/problem.py:105
+#: judge/forms.py:270 judge/models/problem.py:119
msgid "Problem code must be ^[a-z0-9]+$"
msgstr "El código del problema debe ser ^[a-z0-9]+$"
-#: judge/forms.py:268
+#: judge/forms.py:275
msgid "Problem with code already exists."
msgstr "Ya existe un problema con este código"
-#: judge/forms.py:273 judge/models/contest.py:66
+#: judge/forms.py:280 judge/models/contest.py:66
msgid "Contest id must be ^[a-z0-9]+$"
msgstr "La id del concurso debe ser ^[a-z0-9]+$"
-#: judge/forms.py:278
+#: judge/forms.py:285
msgid "Contest with key already exists."
msgstr "Ya existe un concurso con esta llave primaria"
@@ -694,7 +695,7 @@ msgid "comments"
msgstr "comentarios"
#: judge/models/comment.py:89 judge/models/comment.py:141
-#: judge/models/problem.py:484
+#: judge/models/problem.py:511
#, python-format
msgid "Editorial for %s"
msgstr "Editorial de %s"
@@ -735,7 +736,7 @@ msgstr "descripción de la etiqueta"
msgid "contest tag"
msgstr "etiqueta del concurso"
-#: judge/models/contest.py:53 judge/models/contest.py:117
+#: judge/models/contest.py:53 judge/models/contest.py:126
msgid "contest tags"
msgstr "etiquetas del concurso"
@@ -760,410 +761,426 @@ msgid "contest name"
msgstr "nombre del concurso"
#: judge/models/contest.py:68
-msgid "These people will be able to edit the contest."
-msgstr "Estas personas serán capaces de editar el concurso."
+msgid "These users will be able to edit the contest."
+msgstr ""
+
+#: judge/models/contest.py:70
+msgid "These users will be able to edit the contest, but will not be listed as authors."
+msgstr ""
-#: judge/models/contest.py:70 judge/models/runtime.py:136
+#: judge/models/contest.py:73
+msgid "These users will be able to view the contest, but not edit it."
+msgstr ""
+
+#: judge/models/contest.py:76 judge/models/runtime.py:136
msgid "description"
msgstr "descripción"
-#: judge/models/contest.py:71 judge/models/problem.py:431
+#: judge/models/contest.py:77 judge/models/problem.py:458
#: judge/models/runtime.py:138
msgid "problems"
msgstr "problemas"
-#: judge/models/contest.py:72 judge/models/contest.py:384
+#: judge/models/contest.py:78 judge/models/contest.py:420
msgid "start time"
msgstr "hora de inicio"
-#: judge/models/contest.py:73
+#: judge/models/contest.py:79
msgid "end time"
msgstr "hora final"
-#: judge/models/contest.py:74 judge/models/problem.py:126
-#: judge/models/problem.py:455
+#: judge/models/contest.py:80 judge/models/problem.py:140
+#: judge/models/problem.py:482
msgid "time limit"
msgstr "tiempo límite"
-#: judge/models/contest.py:75 judge/models/problem.py:144
+#: judge/models/contest.py:81 judge/models/problem.py:158
msgid "publicly visible"
msgstr "publicidad visible"
-#: judge/models/contest.py:76
+#: judge/models/contest.py:82
msgid "Should be set even for organization-private contests, where it determines whether the contest is visible to members of the specified organizations."
msgstr "Debe establecerse incluso para publicaciones privadas de la organización, donde se determina si la publicación es visible para los miembros de las organizaciones especificadas."
-#: judge/models/contest.py:79
+#: judge/models/contest.py:85
msgid "contest rated"
msgstr "concurso calificado"
-#: judge/models/contest.py:79
+#: judge/models/contest.py:85
msgid "Whether this contest can be rated."
msgstr "Si esta publicación puede ser calificada."
-#: judge/models/contest.py:81
+#: judge/models/contest.py:87
msgid "view contest scoreboard"
msgstr "ver Marcador del concurso"
-#: judge/models/contest.py:83
+#: judge/models/contest.py:89
msgid "These users will be able to view the scoreboard."
msgstr "Estos usuarios podrán ver el marcador."
-#: judge/models/contest.py:84
+#: judge/models/contest.py:90
msgid "scoreboard visibility"
msgstr ""
-#: judge/models/contest.py:85
+#: judge/models/contest.py:91
msgid "Scoreboard visibility through the duration of the contest"
msgstr ""
-#: judge/models/contest.py:87
+#: judge/models/contest.py:93
msgid "no comments"
msgstr "sin comentarios"
-#: judge/models/contest.py:88
+#: judge/models/contest.py:94
msgid "Use clarification system instead of comments."
msgstr "Usar el sistema de aclaración en vez de comentar."
-#: judge/models/contest.py:90
+#: judge/models/contest.py:96
msgid "Rating floor for contest"
msgstr "Puntuación mínima para el concurso"
-#: judge/models/contest.py:92
+#: judge/models/contest.py:98
msgid "Rating ceiling for contest"
msgstr "Puntuación máxima para el concurso"
-#: judge/models/contest.py:94
+#: judge/models/contest.py:100
msgid "rate all"
msgstr "calificar todo"
-#: judge/models/contest.py:94
+#: judge/models/contest.py:100
msgid "Rate all users who joined."
msgstr "Calificar todos los usuarios que se unieron."
-#: judge/models/contest.py:95
+#: judge/models/contest.py:101
msgid "exclude from ratings"
msgstr "excluir de las calificaciones"
-#: judge/models/contest.py:97
+#: judge/models/contest.py:103
msgid "private to specific users"
msgstr "privado a usuarios específicos"
-#: judge/models/contest.py:98
+#: judge/models/contest.py:104
msgid "private contestants"
msgstr "concursantes privados"
-#: judge/models/contest.py:99
+#: judge/models/contest.py:105
msgid "If private, only these users may see the contest"
msgstr "Si es privado, sólo estes usuarios podrán ver el concurso"
-#: judge/models/contest.py:101
+#: judge/models/contest.py:107
msgid "hide problem tags"
msgstr "ocultar etiquetas de problemas"
-#: judge/models/contest.py:102
+#: judge/models/contest.py:108
msgid "Whether problem tags should be hidden by default."
msgstr "Si las etiquetas de problemas deberían estar ocultas de forma predeterminada."
-#: judge/models/contest.py:104
+#: judge/models/contest.py:110
+msgid "hide problem authors"
+msgstr ""
+
+#: judge/models/contest.py:111
+msgid "Whether problem authors should be hidden by default."
+msgstr ""
+
+#: judge/models/contest.py:113
msgid "run pretests only"
msgstr "ejecutar exámenes solamente"
-#: judge/models/contest.py:105
+#: judge/models/contest.py:114
msgid "Whether judges should grade pretests only, versus all testcases. Commonly set during a contest, then unset prior to rejudging user submissions when the contest ends."
msgstr "Si los jueces solo deben calificar los exámenes previos, versus todos los casos de prueba. Se establece normalmente durante una presentación, luego se desactiva antes de volver a juzgar las presentaciones de los usuarios cuando finaliza el concurso."
-#: judge/models/contest.py:109 judge/models/problem.py:166
+#: judge/models/contest.py:118 judge/models/problem.py:183
msgid "private to organizations"
msgstr "privado para organizaciones"
-#: judge/models/contest.py:110 judge/models/problem.py:164
-#: judge/models/profile.py:83
+#: judge/models/contest.py:119 judge/models/problem.py:181
+#: judge/models/profile.py:86
msgid "organizations"
msgstr "organizaciones"
-#: judge/models/contest.py:111
+#: judge/models/contest.py:120
msgid "If private, only these organizations may see the contest"
msgstr "Es privado, sólo estas organizaciones pueden ver el concurso"
-#: judge/models/contest.py:112 judge/models/problem.py:153
+#: judge/models/contest.py:121 judge/models/problem.py:167
msgid "OpenGraph image"
msgstr "Imagen de OpenGraph"
-#: judge/models/contest.py:113 judge/models/profile.py:54
+#: judge/models/contest.py:122 judge/models/profile.py:57
msgid "Logo override image"
msgstr "Imagen que sobreescribe el logo"
-#: judge/models/contest.py:115
+#: judge/models/contest.py:124
msgid "This image will replace the default site logo for users inside the contest."
msgstr "Esta imagen reemplazará el logo del sitio para los usuarios en el concurso"
-#: judge/models/contest.py:118
+#: judge/models/contest.py:127
msgid "the amount of live participants"
msgstr "la cantidad de participantes en vivo"
-#: judge/models/contest.py:119
+#: judge/models/contest.py:128
msgid "contest summary"
msgstr "resumen del concurso"
-#: judge/models/contest.py:120 judge/models/problem.py:155
+#: judge/models/contest.py:129 judge/models/problem.py:169
msgid "Plain-text, shown in meta description tag, e.g. for social media."
msgstr "Texto sin formato, que se muestra en la etiqueta de metadescripción, por ejemplo, para las redes sociales."
-#: judge/models/contest.py:121 judge/models/profile.py:53
+#: judge/models/contest.py:130 judge/models/profile.py:56
msgid "access code"
msgstr "código de acceso"
-#: judge/models/contest.py:122
+#: judge/models/contest.py:131
msgid "An optional code to prompt contestants before they are allowed to join the contest. Leave it blank to disable."
msgstr "Un código opcional para incitar a los concursantes antes de que se les permita unirse al concurso. Déjelo en blanco para desactivar."
-#: judge/models/contest.py:124 judge/models/problem.py:149
+#: judge/models/contest.py:133 judge/models/problem.py:163
msgid "personae non gratae"
msgstr "persona no grata"
-#: judge/models/contest.py:125
+#: judge/models/contest.py:134
msgid "Bans the selected users from joining this contest."
msgstr "Prohibe a los usuarios seleccionados de unirse al concurso"
-#: judge/models/contest.py:126
+#: judge/models/contest.py:135
msgid "contest format"
msgstr "formato de concurso"
-#: judge/models/contest.py:127
+#: judge/models/contest.py:136
msgid "The contest format module to use."
msgstr "el módulo de formato de concurso que va a usarse"
-#: judge/models/contest.py:128
+#: judge/models/contest.py:137
msgid "contest format configuration"
msgstr "configuración del formato de concurso"
-#: judge/models/contest.py:129
+#: judge/models/contest.py:138
msgid "A JSON object to serve as the configuration for the chosen contest format module. Leave empty to use None. Exact format depends on the contest format selected."
msgstr "Un objeto JSON que se usará como configuración para el módulo de concurso escogido. Déjalo vacío para no usar ninguno. El formato exacto depende de que formato de concurso hayas escogido"
-#: judge/models/contest.py:136
+#: judge/models/contest.py:145
msgid "contest lock"
msgstr "bloquear el concurso"
-#: judge/models/contest.py:137
-msgid "Prevent submissions from this contest from being rejudged."
-msgstr "Evitar que los envíos de este concurso sean rejuzgados."
+#: judge/models/contest.py:146
+msgid "Prevent submissions from this contest from being rejudged after this date."
+msgstr ""
-#: judge/models/contest.py:138
+#: judge/models/contest.py:148
msgid "precision points"
msgstr ""
-#: judge/models/contest.py:140
+#: judge/models/contest.py:150
msgid "Number of digits to round points to."
msgstr ""
-#: judge/models/contest.py:362
+#: judge/models/contest.py:398
msgid "See private contests"
msgstr "Ver publicaciones privadas"
-#: judge/models/contest.py:363
+#: judge/models/contest.py:399
msgid "Edit own contests"
msgstr "Editar sus propias notas"
-#: judge/models/contest.py:364
+#: judge/models/contest.py:400
msgid "Edit all contests"
msgstr "Editar todas las publicaciones"
-#: judge/models/contest.py:365
+#: judge/models/contest.py:401
msgid "Clone contest"
msgstr "Clonar concurso"
-#: judge/models/contest.py:366 templates/contest/moss.html:74
+#: judge/models/contest.py:402 templates/contest/moss.html:74
msgid "MOSS contest"
msgstr "Detectar plagios con MOSS"
-#: judge/models/contest.py:367
+#: judge/models/contest.py:403
msgid "Rate contests"
msgstr "Calificar publicaciones"
-#: judge/models/contest.py:368
+#: judge/models/contest.py:404
msgid "Contest access codes"
msgstr "Código de acceso a las publicaciones"
-#: judge/models/contest.py:369
+#: judge/models/contest.py:405
msgid "Create private contests"
msgstr "Crear concursos privados"
-#: judge/models/contest.py:370
+#: judge/models/contest.py:406
msgid "Change contest visibility"
msgstr "Cambiar visibilidad del concurso"
-#: judge/models/contest.py:371
+#: judge/models/contest.py:407
msgid "Edit contest problem label script"
msgstr "Editar script de etiqueta de problema del concurso"
-#: judge/models/contest.py:372
+#: judge/models/contest.py:408
msgid "Change lock status of contest"
msgstr "Cambiar el estado de bloqueo del concurso"
-#: judge/models/contest.py:374 judge/models/contest.py:472
-#: judge/models/contest.py:510 judge/models/contest.py:532
-#: judge/models/submission.py:84
+#: judge/models/contest.py:410 judge/models/contest.py:508
+#: judge/models/contest.py:547 judge/models/contest.py:569
+#: judge/models/submission.py:85
msgid "contest"
msgstr "concurso"
-#: judge/models/contest.py:375
+#: judge/models/contest.py:411
msgid "contests"
msgstr "concursos"
-#: judge/models/contest.py:382
+#: judge/models/contest.py:418
msgid "associated contest"
msgstr "concurso asociado"
-#: judge/models/contest.py:385
+#: judge/models/contest.py:421
msgid "score"
msgstr "puntuación"
-#: judge/models/contest.py:386
+#: judge/models/contest.py:422
msgid "cumulative time"
msgstr "tiempo acumulado"
-#: judge/models/contest.py:387
+#: judge/models/contest.py:423
msgid "is disqualified"
msgstr "se ha descalificado"
-#: judge/models/contest.py:388
+#: judge/models/contest.py:424
msgid "Whether this participation is disqualified."
msgstr "Si esta participación ha sido descalificada"
-#: judge/models/contest.py:389
+#: judge/models/contest.py:425
msgid "tie-breaking field"
msgstr "campo de desempate"
-#: judge/models/contest.py:390
+#: judge/models/contest.py:426
msgid "virtual participation id"
msgstr "identificación de la participación virtual"
-#: judge/models/contest.py:391
+#: judge/models/contest.py:427
msgid "0 means non-virtual, otherwise the n-th virtual participation."
msgstr "0 significa no-virtual, en caso contrario la n-ésima participación virtual"
-#: judge/models/contest.py:392
+#: judge/models/contest.py:428
msgid "contest format specific data"
msgstr "datos específicos del formato de concurso"
-#: judge/models/contest.py:458
+#: judge/models/contest.py:494
#, python-format
msgid "%s spectating in %s"
msgstr "%s ver en %s"
-#: judge/models/contest.py:460
+#: judge/models/contest.py:496
#, python-format
msgid "%s in %s, v%d"
msgstr "%s en %s, v%d"
-#: judge/models/contest.py:461
+#: judge/models/contest.py:497
#, python-format
msgid "%s in %s"
msgstr "%s en %s"
-#: judge/models/contest.py:464
+#: judge/models/contest.py:500
msgid "contest participation"
msgstr "participación del concurso"
-#: judge/models/contest.py:465
+#: judge/models/contest.py:501
msgid "contest participations"
msgstr "participaciones del concurso"
-#: judge/models/contest.py:471 judge/models/contest.py:494
-#: judge/models/contest.py:533 judge/models/problem.py:430
-#: judge/models/problem.py:435 judge/models/problem.py:453
+#: judge/models/contest.py:507 judge/models/contest.py:531
+#: judge/models/contest.py:570 judge/models/problem.py:457
+#: judge/models/problem.py:462 judge/models/problem.py:480
#: judge/models/problem_data.py:35
msgid "problem"
msgstr "problema"
-#: judge/models/contest.py:473 judge/models/contest.py:498
-#: judge/models/problem.py:137
+#: judge/models/contest.py:509 judge/models/contest.py:535
+#: judge/models/problem.py:151
msgid "points"
msgstr "puntos"
-#: judge/models/contest.py:474
+#: judge/models/contest.py:510
msgid "partial"
msgstr "parcial"
-#: judge/models/contest.py:475 judge/models/contest.py:499
+#: judge/models/contest.py:511 judge/models/contest.py:536
msgid "is pretested"
msgstr "está protegido"
-#: judge/models/contest.py:476 judge/models/interface.py:43
+#: judge/models/contest.py:512 judge/models/interface.py:43
msgid "order"
msgstr "orden"
-#: judge/models/contest.py:477
+#: judge/models/contest.py:513
msgid "output prefix length override"
msgstr "anular la longitud del prefijo de salida"
-#: judge/models/contest.py:479
+#: judge/models/contest.py:515
msgid "Maximum number of submissions for this problem, or leave blank for no limit."
msgstr "Número máximo de envíos para este problema, o dejar en blanco para no poner límite."
-#: judge/models/contest.py:482
+#: judge/models/contest.py:518
msgid "Why include a problem you can't submit to?"
msgstr "¿Por qué incluir un problema que no puede enviarse?"
-#: judge/models/contest.py:487
+#: judge/models/contest.py:523
msgid "contest problem"
msgstr "problema de concurso"
-#: judge/models/contest.py:488
+#: judge/models/contest.py:524
msgid "contest problems"
msgstr "problemas del concurso"
-#: judge/models/contest.py:492 judge/models/submission.py:207
+#: judge/models/contest.py:529 judge/models/submission.py:218
msgid "submission"
msgstr "envío"
-#: judge/models/contest.py:496 judge/models/contest.py:511
+#: judge/models/contest.py:533 judge/models/contest.py:548
msgid "participation"
msgstr "participación"
-#: judge/models/contest.py:500
+#: judge/models/contest.py:537
msgid "Whether this submission was ran only on pretests."
msgstr "Si esta presentación funcionó sólo en pruebas previas."
-#: judge/models/contest.py:504
+#: judge/models/contest.py:541
msgid "contest submission"
msgstr "presentación del concurso"
-#: judge/models/contest.py:505
+#: judge/models/contest.py:542
msgid "contest submissions"
msgstr "presentaciones de concurso"
-#: judge/models/contest.py:513
+#: judge/models/contest.py:550
msgid "rank"
msgstr "rango"
-#: judge/models/contest.py:514
+#: judge/models/contest.py:551
msgid "rating"
msgstr "puntuación"
-#: judge/models/contest.py:515
+#: judge/models/contest.py:552
msgid "volatility"
msgstr "volatilidad"
-#: judge/models/contest.py:516
+#: judge/models/contest.py:553
msgid "last rated"
msgstr "último calificado"
-#: judge/models/contest.py:520
+#: judge/models/contest.py:557
msgid "contest rating"
msgstr "calificación del concurso"
-#: judge/models/contest.py:521
+#: judge/models/contest.py:558
msgid "contest ratings"
msgstr "calificaciones del concurso"
-#: judge/models/contest.py:540
+#: judge/models/contest.py:577
msgid "contest moss result"
msgstr "resultado del moss del concurso"
-#: judge/models/contest.py:541
+#: judge/models/contest.py:578
msgid "contest moss results"
msgstr "resultados del moss del concurso"
@@ -1203,7 +1220,7 @@ msgstr "elementos paternales"
msgid "post title"
msgstr "título de la publicación"
-#: judge/models/interface.py:67 judge/models/problem.py:473
+#: judge/models/interface.py:67 judge/models/problem.py:500
msgid "authors"
msgstr "autores"
@@ -1211,7 +1228,7 @@ msgstr "autores"
msgid "slug"
msgstr "babosa (slug)"
-#: judge/models/interface.py:69 judge/models/problem.py:471
+#: judge/models/interface.py:69 judge/models/problem.py:498
msgid "public visibility"
msgstr "visibilidad pública"
@@ -1247,34 +1264,6 @@ msgstr "post del blog"
msgid "blog posts"
msgstr "posts del blog"
-#: judge/models/message.py:11
-msgid "message title"
-msgstr "título del mensaje"
-
-#: judge/models/message.py:12 judge/models/ticket.py:30
-msgid "message body"
-msgstr "cuerpo del mensaje"
-
-#: judge/models/message.py:13
-msgid "sender"
-msgstr "remitente"
-
-#: judge/models/message.py:14
-msgid "target"
-msgstr "objetivo"
-
-#: judge/models/message.py:15
-msgid "message timestamp"
-msgstr "hora del mensaje"
-
-#: judge/models/message.py:16
-msgid "read"
-msgstr "leer"
-
-#: judge/models/message.py:20
-msgid "messages in the thread"
-msgstr "mensajes en el hilo"
-
#: judge/models/problem.py:30
#, python-format
msgid "Disallowed characters: %(value)s"
@@ -1292,7 +1281,7 @@ msgstr "problema de categoría de nombre"
msgid "problem type"
msgstr "tipo del problema"
-#: judge/models/problem.py:44 judge/models/problem.py:121
+#: judge/models/problem.py:44 judge/models/problem.py:135
msgid "problem types"
msgstr "tipos del problema"
@@ -1304,7 +1293,7 @@ msgstr "problema de identificación del grupo"
msgid "problem group name"
msgstr "problema de identificación del nombre"
-#: judge/models/problem.py:56 judge/models/problem.py:124
+#: judge/models/problem.py:56 judge/models/problem.py:138
msgid "problem group"
msgstr "grupo de problema"
@@ -1324,7 +1313,7 @@ msgstr "enlace"
msgid "full name"
msgstr "nombre completo"
-#: judge/models/problem.py:65 judge/models/profile.py:41
+#: judge/models/problem.py:65 judge/models/profile.py:44
#: judge/models/runtime.py:24
msgid "short name"
msgstr "nombre corto"
@@ -1353,232 +1342,252 @@ msgstr "licencia"
msgid "licenses"
msgstr "licencias"
-#: judge/models/problem.py:104
+#: judge/models/problem.py:112
+msgid "Follow global setting"
+msgstr ""
+
+#: judge/models/problem.py:113
+msgid "Always visible"
+msgstr ""
+
+#: judge/models/problem.py:114
+msgid "Visible if problem solved"
+msgstr ""
+
+#: judge/models/problem.py:115
+msgid "Only own submissions"
+msgstr ""
+
+#: judge/models/problem.py:118
msgid "problem code"
msgstr "código del problema"
-#: judge/models/problem.py:106
+#: judge/models/problem.py:120
msgid "A short, unique code for the problem, used in the url after /problem/"
msgstr "Un código corto y unico para el problema, para usar en la url despues de /problem/"
-#: judge/models/problem.py:108
+#: judge/models/problem.py:122
msgid "problem name"
msgstr "nombre del problema"
-#: judge/models/problem.py:109
+#: judge/models/problem.py:123
msgid "The full name of the problem, as shown in the problem list."
msgstr "El nombre completa del problema, tal y como saldrá en la lista"
-#: judge/models/problem.py:111
+#: judge/models/problem.py:125
msgid "problem body"
msgstr "cuerpo del problema"
-#: judge/models/problem.py:112
+#: judge/models/problem.py:126
msgid "creators"
msgstr "creadores"
-#: judge/models/problem.py:113
+#: judge/models/problem.py:127
msgid "These users will be able to edit the problem, and be listed as authors."
msgstr "Estos usuarios serán capaces de editar el problema, y serán listados como autores"
-#: judge/models/problem.py:115
+#: judge/models/problem.py:129
msgid "curators"
msgstr "curadores"
-#: judge/models/problem.py:116
+#: judge/models/problem.py:130
msgid "These users will be able to edit the problem, but not be listed as authors."
msgstr "Estos usuarios serán capaces de editar el problema, pero no serán listados como autores"
-#: judge/models/problem.py:118
+#: judge/models/problem.py:132
msgid "testers"
msgstr "probadores"
-#: judge/models/problem.py:120
+#: judge/models/problem.py:134
msgid "These users will be able to view the private problem, but not edit it."
msgstr "Estos usuarios podrán ver el problema privado, pero no podrán editarlo"
-#: judge/models/problem.py:122
+#: judge/models/problem.py:136
msgid "The type of problem, as shown on the problem's page."
msgstr "El tipo de problema, tal y como se verá en la página del problema"
-#: judge/models/problem.py:125
+#: judge/models/problem.py:139
msgid "The group of problem, shown under Category in the problem list."
msgstr "El grupo del problema, visto como Categoría en la lista de problemas"
-#: judge/models/problem.py:127
+#: judge/models/problem.py:141
msgid "The time limit for this problem, in seconds. Fractional seconds (e.g. 1.5) are supported."
msgstr "El límite de tiempo para este problema, en segundos. Los segundos fraccionarios (por ejemplo, 1.5) están permitidos."
-#: judge/models/problem.py:131 judge/models/problem.py:458
+#: judge/models/problem.py:145 judge/models/problem.py:485
msgid "memory limit"
msgstr "límite de memoria"
-#: judge/models/problem.py:132
+#: judge/models/problem.py:146
msgid "The memory limit for this problem, in kilobytes (e.g. 64mb = 65536 kilobytes)."
msgstr "La memoria límite para este problema, en kilobytes (e.g. 64mb = 65536 kilobytes)."
-#: judge/models/problem.py:138
+#: judge/models/problem.py:152
msgid "Points awarded for problem completion. Points are displayed with a 'p' suffix if partial."
msgstr "Puntos otortgados por completar el problema. Si los puntos son parciales (pasar un caso de prueba da puntos aunque el resto no se hayan pasado) se muestran con el sufijo 'p'"
-#: judge/models/problem.py:141
+#: judge/models/problem.py:155
msgid "allows partial points"
msgstr "permitir puntos parciales"
-#: judge/models/problem.py:142
+#: judge/models/problem.py:156
msgid "allowed languages"
msgstr "lenguajes permitidos"
-#: judge/models/problem.py:143
+#: judge/models/problem.py:157
msgid "List of allowed submission languages."
msgstr "Lista de lenguajes en el que se permite el envío"
-#: judge/models/problem.py:145
+#: judge/models/problem.py:159
msgid "manually managed"
msgstr "manejado manualmente"
-#: judge/models/problem.py:146
+#: judge/models/problem.py:160
msgid "Whether judges should be allowed to manage data or not."
msgstr "Si los jueces se les permite administrar los datos manualmente o no"
-#: judge/models/problem.py:147
+#: judge/models/problem.py:161
msgid "date of publishing"
msgstr "fecha de publicación"
-#: judge/models/problem.py:148
+#: judge/models/problem.py:162
msgid "Doesn't have magic ability to auto-publish due to backward compatibility"
msgstr "No tiene la habilidad mágica para publicar automáticamente debido a la compatibilidad con versiones anteriores"
-#: judge/models/problem.py:150
+#: judge/models/problem.py:164
msgid "Bans the selected users from submitting to this problem."
msgstr "Prohíbe a los usuarios seleccionados envíar soluciones a este problema"
-#: judge/models/problem.py:152
+#: judge/models/problem.py:166
msgid "The license under which this problem is published."
msgstr "La licencia bajo la que este problema ha sido publicado"
-#: judge/models/problem.py:154
+#: judge/models/problem.py:168
msgid "problem summary"
msgstr "problemas de envío"
-#: judge/models/problem.py:156
+#: judge/models/problem.py:170
msgid "number of users"
msgstr "número de usuarios"
-#: judge/models/problem.py:157
+#: judge/models/problem.py:171
msgid "The number of users who solved the problem."
msgstr "El número de usuarios que ha resuelto este problema"
-#: judge/models/problem.py:158
+#: judge/models/problem.py:172
msgid "solve rate"
msgstr "porcentaje de solucionados"
-#: judge/models/problem.py:159
+#: judge/models/problem.py:173
msgid "allow full markdown access"
msgstr "permitir acceso completo al markdown"
-#: judge/models/problem.py:165
+#: judge/models/problem.py:174
+msgid "submission source visibility"
+msgstr ""
+
+#: judge/models/problem.py:182
msgid "If private, only these organizations may see the problem."
msgstr "Si privado, solo estas organizaciones pueden ver el problema"
-#: judge/models/problem.py:420
+#: judge/models/problem.py:447
msgid "See hidden problems"
msgstr "Ver problemas ocultos"
-#: judge/models/problem.py:421
+#: judge/models/problem.py:448
msgid "Edit own problems"
msgstr "Editar problemas propios"
-#: judge/models/problem.py:422
+#: judge/models/problem.py:449
msgid "Edit all problems"
msgstr "Editar todos los problemas"
-#: judge/models/problem.py:423
+#: judge/models/problem.py:450
msgid "Edit all public problems"
msgstr "Editar todos los problemas públicos"
-#: judge/models/problem.py:424
+#: judge/models/problem.py:451
msgid "Edit problems with full markup"
msgstr "Editar problemas con markup completo"
-#: judge/models/problem.py:425 templates/problem/problem.html:161
+#: judge/models/problem.py:452 templates/problem/problem.html:161
msgid "Clone problem"
msgstr "Clonar problema"
-#: judge/models/problem.py:426
+#: judge/models/problem.py:453
msgid "Change is_public field"
msgstr "Cambiar campo is_public"
-#: judge/models/problem.py:427
+#: judge/models/problem.py:454
msgid "Change is_manually_managed field"
msgstr "Cambiar campo is_manually_managed"
-#: judge/models/problem.py:428
+#: judge/models/problem.py:455
msgid "See organization-private problems"
msgstr "Ver problemas privados para la organización"
-#: judge/models/problem.py:436 judge/models/problem.py:454
+#: judge/models/problem.py:463 judge/models/problem.py:481
#: judge/models/runtime.py:111
msgid "language"
msgstr "lenguaje"
-#: judge/models/problem.py:437
+#: judge/models/problem.py:464
msgid "translated name"
msgstr "nombre traducido"
-#: judge/models/problem.py:438
+#: judge/models/problem.py:465
msgid "translated description"
msgstr "descripción traducida"
-#: judge/models/problem.py:442
+#: judge/models/problem.py:469
msgid "problem translation"
msgstr "problemas de traducción"
-#: judge/models/problem.py:443
+#: judge/models/problem.py:470
msgid "problem translations"
msgstr "problemas de traducciones"
-#: judge/models/problem.py:447
+#: judge/models/problem.py:474
msgid "clarified problem"
msgstr "problema aclarado"
-#: judge/models/problem.py:448
+#: judge/models/problem.py:475
msgid "clarification body"
msgstr "cuerpo de la aclaración"
-#: judge/models/problem.py:449
+#: judge/models/problem.py:476
msgid "clarification timestamp"
msgstr "hora de la aclaración"
-#: judge/models/problem.py:464
+#: judge/models/problem.py:491
msgid "language-specific resource limit"
msgstr "límite de recursos específicos del lenguaje"
-#: judge/models/problem.py:465
+#: judge/models/problem.py:492
msgid "language-specific resource limits"
msgstr "límites de recursos específicos del lenguaje"
-#: judge/models/problem.py:469
+#: judge/models/problem.py:496
msgid "associated problem"
msgstr "problema asociado"
-#: judge/models/problem.py:472
+#: judge/models/problem.py:499
msgid "publish date"
msgstr "fecha de publicación"
-#: judge/models/problem.py:474
+#: judge/models/problem.py:501
msgid "editorial content"
msgstr "contenido editorial"
-#: judge/models/problem.py:497
+#: judge/models/problem.py:524
msgid "See hidden solutions"
msgstr "Ver soluciones ocultas"
-#: judge/models/problem.py:499
+#: judge/models/problem.py:526
msgid "solution"
msgstr "solución"
-#: judge/models/problem.py:500
+#: judge/models/problem.py:527
msgid "solutions"
msgstr "soluciones"
@@ -1690,112 +1699,112 @@ msgstr "valor del punto"
msgid "case is pretest?"
msgstr "¿Es este caso una prueba previa?"
-#: judge/models/profile.py:38
+#: judge/models/profile.py:41
msgid "organization title"
msgstr "título de la organización"
-#: judge/models/profile.py:39
+#: judge/models/profile.py:42
msgid "organization slug"
msgstr "sufijo de la organización"
-#: judge/models/profile.py:40
+#: judge/models/profile.py:43
msgid "Organization name shown in URL"
msgstr "Nombre de la organización tal y como se muestra en la URL"
-#: judge/models/profile.py:42
+#: judge/models/profile.py:45
msgid "Displayed beside user name during contests"
msgstr "Se muestra junto al nombre de usuario durante los concursos"
-#: judge/models/profile.py:43
+#: judge/models/profile.py:46
msgid "organization description"
msgstr "descripción de la organización"
-#: judge/models/profile.py:44
+#: judge/models/profile.py:47
msgid "administrators"
msgstr "administradores"
-#: judge/models/profile.py:45
+#: judge/models/profile.py:48
msgid "Those who can edit this organization"
msgstr "Aquellos que pueden editar esta organización"
-#: judge/models/profile.py:46
+#: judge/models/profile.py:49
msgid "creation date"
msgstr "fecha de creación"
-#: judge/models/profile.py:47
+#: judge/models/profile.py:50
msgid "is open organization?"
msgstr "¿es una organización abierta?"
-#: judge/models/profile.py:48
+#: judge/models/profile.py:51
msgid "Allow joining organization"
msgstr "Permitir la unión a la organización"
-#: judge/models/profile.py:49
+#: judge/models/profile.py:52
msgid "maximum size"
msgstr "tamaño máximo"
-#: judge/models/profile.py:50
+#: judge/models/profile.py:53
msgid "Maximum amount of users in this organization, only applicable to private organizations"
msgstr "Máxima cantidad de usuarios en esta organización, solo aplicable para organizaciones privadas"
-#: judge/models/profile.py:52
+#: judge/models/profile.py:55
msgid "Student access code"
msgstr "Código de acceso para estudiantes"
-#: judge/models/profile.py:56
+#: judge/models/profile.py:59
msgid "This image will replace the default site logo for users viewing the organization."
msgstr "Esta imagen reemplazará el logo del sitio para los usuarios que estén mirando la organización"
-#: judge/models/profile.py:79
+#: judge/models/profile.py:82
msgid "Administer organizations"
msgstr "Administrar organizaciones"
-#: judge/models/profile.py:80
+#: judge/models/profile.py:83
msgid "Edit all organizations"
msgstr "Editar todas las organizaciones"
-#: judge/models/profile.py:82 judge/models/profile.py:99
-#: judge/models/profile.py:269
+#: judge/models/profile.py:85 judge/models/profile.py:102
+#: judge/models/profile.py:293
msgid "organization"
msgstr "onganización"
-#: judge/models/profile.py:87
+#: judge/models/profile.py:90
msgid "user associated"
msgstr "usuario asociado"
-#: judge/models/profile.py:88
+#: judge/models/profile.py:91
msgid "self-description"
msgstr "descripción propia"
-#: judge/models/profile.py:89
+#: judge/models/profile.py:92
msgid "location"
msgstr "ubicación"
-#: judge/models/profile.py:91
+#: judge/models/profile.py:94
msgid "preferred language"
msgstr "lenguaje preferido"
-#: judge/models/profile.py:97
+#: judge/models/profile.py:100
msgid "last access time"
msgstr "último tiempo de acceso"
-#: judge/models/profile.py:98
+#: judge/models/profile.py:101
msgid "last IP"
msgstr "último IP"
-#: judge/models/profile.py:101
+#: judge/models/profile.py:104
msgid "display rank"
msgstr "mostrar rango"
-#: judge/models/profile.py:103
+#: judge/models/profile.py:106
msgid "Normal User"
msgstr "Usuario normal"
-#: judge/models/profile.py:104
+#: judge/models/profile.py:107
msgid "Problem Setter"
msgstr "Creador de Problemas"
-#: judge/models/profile.py:105 templates/base.html:220
+#: judge/models/profile.py:108 templates/base.html:220
#: templates/comments/list.html:99 templates/contest/contest-list-tabs.html:24
#: templates/contest/ranking-table.html:49
#: templates/problem/problem-list-tabs.html:6
@@ -1804,155 +1813,167 @@ msgstr "Creador de Problemas"
msgid "Admin"
msgstr "Administrador"
-#: judge/models/profile.py:106
+#: judge/models/profile.py:109
msgid "comment mute"
msgstr "comentario en silencio"
-#: judge/models/profile.py:106
+#: judge/models/profile.py:109
msgid "Some users are at their best when silent."
msgstr "Algunos usuarios están en su mejor momento cuando están en silencio."
-#: judge/models/profile.py:108
+#: judge/models/profile.py:111
msgid "unlisted user"
msgstr "usuario no-listado"
-#: judge/models/profile.py:108
+#: judge/models/profile.py:111
msgid "User will not be ranked."
msgstr "Este usuario no será puesto en los rankings"
-#: judge/models/profile.py:111
+#: judge/models/profile.py:114
msgid "user script"
msgstr "scrip de usuario"
-#: judge/models/profile.py:112
+#: judge/models/profile.py:115
msgid "User-defined JavaScript for site customization."
msgstr "JavaScript definido por el usuario para la personalización del sitio."
-#: judge/models/profile.py:113
+#: judge/models/profile.py:116
msgid "current contest"
msgstr "concurso actual"
-#: judge/models/profile.py:115
+#: judge/models/profile.py:118
msgid "math engine"
msgstr "motor matemático"
-#: judge/models/profile.py:117
+#: judge/models/profile.py:120
msgid "the rendering engine used to render math"
msgstr "el motor de renderizado utilizado para representar las matemáticas"
-#: judge/models/profile.py:118
+#: judge/models/profile.py:121
msgid "TOTP 2FA enabled"
msgstr "TOTP de la Autenticación en dos pasos habilitado"
-#: judge/models/profile.py:119
+#: judge/models/profile.py:122
msgid "check to enable TOTP-based two-factor authentication"
msgstr "activar autenticación de dos pasos basada en TOTP"
-#: judge/models/profile.py:120
+#: judge/models/profile.py:123
msgid "WebAuthn 2FA enabled"
msgstr "WebAuthn de Autenticación en dos pasos habilitado"
-#: judge/models/profile.py:121
+#: judge/models/profile.py:124
msgid "check to enable WebAuthn-based two-factor authentication"
msgstr "activar autenticación de dos pasos basada en WebAuthn"
-#: judge/models/profile.py:122
+#: judge/models/profile.py:125
msgid "TOTP key"
msgstr "llave TOTP"
-#: judge/models/profile.py:123
+#: judge/models/profile.py:126
msgid "32 character base32-encoded key for TOTP"
msgstr "llave con codificacion base32 de 32 carácteres para el TOTP "
-#: judge/models/profile.py:125
+#: judge/models/profile.py:128
msgid "TOTP key must be empty or base32"
msgstr "la llave TOTP debe estar vacía o ser base32"
-#: judge/models/profile.py:126
+#: judge/models/profile.py:129
msgid "scratch codes"
msgstr "códigos scratch"
-#: judge/models/profile.py:127
+#: judge/models/profile.py:130
msgid "JSON array of 16 character base32-encoded codes for scratch codes"
msgstr "Array JSON de 16 códigos codificados en base32 de caracteres para los códigos scratch"
-#: judge/models/profile.py:131
+#: judge/models/profile.py:134
msgid "Scratch codes must be empty or a JSON array of 16-character base32 codes"
msgstr "Los códigos Scratch deben estar vacíos o ser un array JSON de 16 caracteres base32"
-#: judge/models/profile.py:133
+#: judge/models/profile.py:136
+msgid "last TOTP timecode"
+msgstr ""
+
+#: judge/models/profile.py:137
msgid "API token"
msgstr "Token API"
-#: judge/models/profile.py:134
+#: judge/models/profile.py:138
msgid "64 character hex-encoded API access token"
msgstr "Token de acceso a la API codificado con 64 caracteres hexadecimales"
-#: judge/models/profile.py:136
+#: judge/models/profile.py:140
msgid "API token must be None or hexadecimal"
msgstr "El Token API debe ser Ninguno o hexadecimal"
-#: judge/models/profile.py:137
+#: judge/models/profile.py:141
msgid "internal notes"
msgstr "notas internas"
-#: judge/models/profile.py:138
+#: judge/models/profile.py:142
msgid "Notes for administrators regarding this user."
msgstr "Notas para administradores sobre este usuario"
-#: judge/models/profile.py:139
+#: judge/models/profile.py:143
msgid "last data download time"
msgstr "última descarga de datos"
-#: judge/models/profile.py:236
+#: judge/models/profile.py:253
msgid "Shows in-progress development stuff"
msgstr "Muestra las cosas que el equipo de desarrollo está haciendo actualmente"
-#: judge/models/profile.py:237
+#: judge/models/profile.py:254
msgid "Edit TOTP settings"
msgstr "Editar ajustes TOTP"
-#: judge/models/profile.py:239
+#: judge/models/profile.py:256
msgid "user profile"
msgstr "perfil del usuario"
-#: judge/models/profile.py:240
+#: judge/models/profile.py:257
msgid "user profiles"
msgstr "perfiles de usuarios"
-#: judge/models/profile.py:246
+#: judge/models/profile.py:263
msgid "device name"
msgstr "nombre de dispositivo"
-#: judge/models/profile.py:247
+#: judge/models/profile.py:264
msgid "credential ID"
msgstr "ID de credencial"
-#: judge/models/profile.py:248
+#: judge/models/profile.py:265
msgid "public key"
msgstr "clave pública"
-#: judge/models/profile.py:249
+#: judge/models/profile.py:266
msgid "sign counter"
msgstr "contador de señales"
-#: judge/models/profile.py:271
+#: judge/models/profile.py:287
+msgid "WebAuthn credential"
+msgstr ""
+
+#: judge/models/profile.py:288
+msgid "WebAuthn credentials"
+msgstr ""
+
+#: judge/models/profile.py:295
msgid "request time"
msgstr "tiempo requerido"
-#: judge/models/profile.py:272
+#: judge/models/profile.py:296
msgid "state"
msgstr "estado"
-#: judge/models/profile.py:277
+#: judge/models/profile.py:301
msgid "reason"
msgstr "razón"
-#: judge/models/profile.py:280
+#: judge/models/profile.py:304
msgid "organization join request"
msgstr "solicitud para asociarse a la organización"
-#: judge/models/profile.py:281
+#: judge/models/profile.py:305
msgid "organization join requests"
msgstr "peticiones para unirse a la organización"
@@ -2108,210 +2129,210 @@ msgstr "jueces"
msgid "judge"
msgstr "juez"
-#: judge/models/submission.py:20 judge/models/submission.py:47
+#: judge/models/submission.py:21 judge/models/submission.py:48
#: judge/utils/problems.py:74
msgid "Accepted"
msgstr "Aceptado"
-#: judge/models/submission.py:21 judge/models/submission.py:48
+#: judge/models/submission.py:22 judge/models/submission.py:49
msgid "Wrong Answer"
msgstr "Respuesta incorrecta"
-#: judge/models/submission.py:22 judge/models/submission.py:50
+#: judge/models/submission.py:23 judge/models/submission.py:51
msgid "Time Limit Exceeded"
msgstr "Límite de tiempo excedido"
-#: judge/models/submission.py:23 judge/models/submission.py:51
+#: judge/models/submission.py:24 judge/models/submission.py:52
msgid "Memory Limit Exceeded"
msgstr "Límite de memoria excedido"
-#: judge/models/submission.py:24 judge/models/submission.py:52
+#: judge/models/submission.py:25 judge/models/submission.py:53
msgid "Output Limit Exceeded"
msgstr "Límite de tiempo excedido"
-#: judge/models/submission.py:25 judge/models/submission.py:53
+#: judge/models/submission.py:26 judge/models/submission.py:54
msgid "Invalid Return"
msgstr "Retorno no válido"
-#: judge/models/submission.py:26 judge/models/submission.py:54
+#: judge/models/submission.py:27 judge/models/submission.py:55
msgid "Runtime Error"
msgstr "Error de tiempo de ejecución"
-#: judge/models/submission.py:27 judge/models/submission.py:41
-#: judge/models/submission.py:55 judge/utils/problems.py:76
+#: judge/models/submission.py:28 judge/models/submission.py:42
+#: judge/models/submission.py:56 judge/utils/problems.py:76
msgid "Compile Error"
msgstr "Error de compilación"
-#: judge/models/submission.py:28 judge/models/submission.py:40
+#: judge/models/submission.py:29 judge/models/submission.py:41
msgid "Internal Error"
msgstr "Error interno"
-#: judge/models/submission.py:29
+#: judge/models/submission.py:30
msgid "Short circuit"
msgstr "Circuito corto"
-#: judge/models/submission.py:30 judge/models/submission.py:42
-#: judge/models/submission.py:61
+#: judge/models/submission.py:31 judge/models/submission.py:43
+#: judge/models/submission.py:62
msgid "Aborted"
msgstr "Cancelado"
-#: judge/models/submission.py:36 judge/models/submission.py:57
+#: judge/models/submission.py:37 judge/models/submission.py:58
msgid "Queued"
msgstr "En espera"
-#: judge/models/submission.py:37 judge/models/submission.py:58
+#: judge/models/submission.py:38 judge/models/submission.py:59
msgid "Processing"
msgstr "Procesando"
-#: judge/models/submission.py:38 judge/models/submission.py:59
+#: judge/models/submission.py:39 judge/models/submission.py:60
msgid "Grading"
msgstr "Clasificación"
-#: judge/models/submission.py:39 judge/models/submission.py:60
+#: judge/models/submission.py:40 judge/models/submission.py:61
msgid "Completed"
msgstr "Completado"
-#: judge/models/submission.py:56
+#: judge/models/submission.py:57
msgid "Internal Error (judging server error)"
msgstr "Error interno (juzgando error del servidor)"
-#: judge/models/submission.py:66
+#: judge/models/submission.py:67
msgid "submission time"
msgstr "tiempo de envío"
-#: judge/models/submission.py:67 judge/models/submission.py:227
+#: judge/models/submission.py:68 judge/models/submission.py:238
msgid "execution time"
msgstr "tiempo de ejecución"
-#: judge/models/submission.py:68 judge/models/submission.py:228
+#: judge/models/submission.py:69 judge/models/submission.py:239
msgid "memory usage"
msgstr "uso de memoria"
-#: judge/models/submission.py:69 judge/models/submission.py:229
+#: judge/models/submission.py:70 judge/models/submission.py:240
msgid "points granted"
msgstr "puntos otorgados"
-#: judge/models/submission.py:70
+#: judge/models/submission.py:71
msgid "submission language"
msgstr "lenguaje del envío"
-#: judge/models/submission.py:71
+#: judge/models/submission.py:72
msgid "status"
msgstr "estatus"
-#: judge/models/submission.py:72
+#: judge/models/submission.py:73
msgid "result"
msgstr "resultado"
-#: judge/models/submission.py:74
+#: judge/models/submission.py:75
msgid "compile errors"
msgstr "errores de compilación"
-#: judge/models/submission.py:76
+#: judge/models/submission.py:77
msgid "batched cases"
msgstr "casos de lotes"
-#: judge/models/submission.py:77
+#: judge/models/submission.py:78
msgid "test case points"
msgstr "puntos de prueba"
-#: judge/models/submission.py:78
+#: judge/models/submission.py:79
msgid "test case total points"
msgstr "total de puntos del caso de prueba"
-#: judge/models/submission.py:79
+#: judge/models/submission.py:80
msgid "judged on"
msgstr "juzgado en"
-#: judge/models/submission.py:81
+#: judge/models/submission.py:82
msgid "submission judge time"
msgstr "hora del envío del juez"
-#: judge/models/submission.py:82
-msgid "was rejudged by admin"
-msgstr "fue reevaluado por el administrador"
-
#: judge/models/submission.py:83
+msgid "last rejudge date by admin"
+msgstr ""
+
+#: judge/models/submission.py:84
msgid "was ran on pretests only"
msgstr "solo se ejecutó en pruebas previas"
-#: judge/models/submission.py:86
-msgid "lock submission"
-msgstr "bloquear envío"
+#: judge/models/submission.py:87
+msgid "submission lock"
+msgstr ""
-#: judge/models/submission.py:199
+#: judge/models/submission.py:210
msgid "Abort any submission"
msgstr "Cancelar cualquier envío"
-#: judge/models/submission.py:200
+#: judge/models/submission.py:211
msgid "Rejudge the submission"
msgstr "Rejuzgar el envío"
-#: judge/models/submission.py:201
+#: judge/models/submission.py:212
msgid "Rejudge a lot of submissions"
msgstr "Rejuzgar un montón de envíos"
-#: judge/models/submission.py:202
+#: judge/models/submission.py:213
msgid "Submit without limit"
msgstr "Enviar sin límite"
-#: judge/models/submission.py:203
+#: judge/models/submission.py:214
msgid "View all submission"
msgstr "Ver todos los envíos"
-#: judge/models/submission.py:204
+#: judge/models/submission.py:215
msgid "Resubmit others' submission"
msgstr "Reenviar el envío de otros"
-#: judge/models/submission.py:205
+#: judge/models/submission.py:216
msgid "Change lock status of submission"
msgstr "Cambiar el estado de bloqueo del envío"
-#: judge/models/submission.py:208 templates/contest/moss.html:58
+#: judge/models/submission.py:219 templates/contest/moss.html:58
msgid "submissions"
msgstr "envíos"
-#: judge/models/submission.py:212 judge/models/submission.py:223
+#: judge/models/submission.py:223 judge/models/submission.py:234
msgid "associated submission"
msgstr "presentaciones asociadas"
-#: judge/models/submission.py:214
+#: judge/models/submission.py:225
msgid "source code"
msgstr "código fuente"
-#: judge/models/submission.py:225
+#: judge/models/submission.py:236
msgid "test case ID"
msgstr "identificación en caso de prueba"
-#: judge/models/submission.py:226
+#: judge/models/submission.py:237
msgid "status flag"
msgstr "indicador de estado"
-#: judge/models/submission.py:230
+#: judge/models/submission.py:241
msgid "points possible"
msgstr "puntos posibles"
-#: judge/models/submission.py:231
+#: judge/models/submission.py:242
msgid "batch number"
msgstr "número de lote"
-#: judge/models/submission.py:232
+#: judge/models/submission.py:243
msgid "judging feedback"
msgstr "respuesta del juez"
-#: judge/models/submission.py:233
+#: judge/models/submission.py:244
msgid "extended judging feedback"
msgstr "respuesta extendida del juez"
-#: judge/models/submission.py:234
+#: judge/models/submission.py:245
msgid "program output"
msgstr "salida del programa"
-#: judge/models/submission.py:242
+#: judge/models/submission.py:253
msgid "submission test case"
msgstr "prueba de presentación"
-#: judge/models/submission.py:243
+#: judge/models/submission.py:254
msgid "submission test cases"
msgstr "pruebas de presentación"
@@ -2359,6 +2380,10 @@ msgstr "ticket"
msgid "poster"
msgstr "publicación"
+#: judge/models/ticket.py:30
+msgid "message body"
+msgstr "cuerpo del mensaje"
+
#: judge/models/ticket.py:31
msgid "message time"
msgstr "hora del mensaje"
@@ -2381,19 +2406,23 @@ msgstr "Recalculando puntuaciones del concurso"
msgid "Running MOSS"
msgstr "Ejecutando MOSS"
-#: judge/tasks/submission.py:43
+#: judge/tasks/submission.py:45
msgid "Modifying submissions"
msgstr "Modificando envíos"
-#: judge/tasks/submission.py:56
+#: judge/tasks/submission.py:58
msgid "Recalculating user points"
msgstr "Recalculado los puntos de los usuarios"
-#: judge/tasks/user.py:50
+#: judge/tasks/user.py:49
+msgid "Applying filters"
+msgstr ""
+
+#: judge/tasks/user.py:64
msgid "Preparing your submission data"
msgstr "Preparando sus datos de envío"
-#: judge/tasks/user.py:81
+#: judge/tasks/user.py:95
msgid "Preparing your comment data"
msgstr "Preparando los datos de tus comentarios"
@@ -2506,7 +2535,7 @@ msgstr "Debes resolver como mínimo un problema antes de poder votar"
msgid "You already voted."
msgstr "Ya has votado."
-#: judge/views/comment.py:129 judge/views/organization.py:298
+#: judge/views/comment.py:129 judge/views/organization.py:297
msgid "Edited from site"
msgstr "Editado desde sitio"
@@ -2514,125 +2543,130 @@ msgstr "Editado desde sitio"
msgid "Editing comment"
msgstr "Comentario editado"
-#: judge/views/contests.py:56 judge/views/contests.py:201
-#: judge/views/contests.py:204 judge/views/contests.py:382
+#: judge/views/contests.py:57 judge/views/contests.py:210
+#: judge/views/contests.py:213 judge/views/contests.py:395
msgid "No such contest"
msgstr "No hay tal concurso"
-#: judge/views/contests.py:57 judge/views/contests.py:202
+#: judge/views/contests.py:58 judge/views/contests.py:211
#, python-format
msgid "Could not find a contest with the key \"%s\"."
msgstr "No se pudo encontrar una publicación con la clave \"%s\"."
-#: judge/views/contests.py:70
+#: judge/views/contests.py:71
msgid "Contests"
msgstr "Concursos"
-#: judge/views/contests.py:205
+#: judge/views/contests.py:214
msgid "Could not find such contest."
msgstr "No se pudo encontrar dicho concurso."
-#: judge/views/contests.py:208
+#: judge/views/contests.py:217
#, python-format
msgid "Access to contest \"%s\" denied"
msgstr "Acceso al concurso \"%s\" denegado"
-#: judge/views/contests.py:235
+#: judge/views/contests.py:244
msgid "Clone Contest"
msgstr "Clonar Concurso"
-#: judge/views/contests.py:301
+#: judge/views/contests.py:278
+#, python-format
+msgid "Cloned contest from %s"
+msgstr ""
+
+#: judge/views/contests.py:314
msgid "Contest not ongoing"
msgstr "Concurso no permanente"
-#: judge/views/contests.py:302
+#: judge/views/contests.py:315
#, python-format
msgid "\"%s\" is not currently ongoing."
msgstr "\"%s\" no esta actualmente en curso."
-#: judge/views/contests.py:306
+#: judge/views/contests.py:319
msgid "Already in contest"
msgstr "Ya en el concurso"
-#: judge/views/contests.py:307
+#: judge/views/contests.py:320
#, python-format
msgid "You are already in a contest: \"%s\"."
msgstr "Ya estas en el concurso: \"%s\"."
-#: judge/views/contests.py:310
+#: judge/views/contests.py:323
msgid "Banned from joining"
msgstr "PUM Baneado"
-#: judge/views/contests.py:311
+#: judge/views/contests.py:324
msgid "You have been declared persona non grata for this contest. You are permanently barred from joining this contest."
msgstr "Has sido declarado persona non grata para este concurso. Quedas desterrado para siempre"
-#: judge/views/contests.py:372
+#: judge/views/contests.py:385
#, python-format
msgid "Enter access code for \"%s\""
msgstr "Ingrese el código de acceso para \"%s\""
-#: judge/views/contests.py:383
+#: judge/views/contests.py:396
#, python-format
msgid "You are not in contest \"%s\"."
msgstr "Tu no estas concursando \"%s\"."
-#: judge/views/contests.py:402
+#: judge/views/contests.py:415
msgid "ContestCalendar requires integer year and month"
msgstr "ContestCalendar necesita un año y mes enteros"
-#: judge/views/contests.py:442
+#: judge/views/contests.py:455
#, python-format
msgid "Contests in %(month)s"
msgstr "Concursos en %(month)s"
-#: judge/views/contests.py:442
+#: judge/views/contests.py:455
msgid "F Y"
msgstr "F Y"
-#: judge/views/contests.py:489
+#: judge/views/contests.py:502
#, python-format
msgid "%s Statistics"
msgstr "%s Estadísticas"
-#: judge/views/contests.py:662
+#: judge/views/contests.py:675
#, python-format
msgid "%s Rankings"
msgstr "%s Clasificaciones"
-#: judge/views/contests.py:670
+#: judge/views/contests.py:683
msgid "???"
msgstr "???"
-#: judge/views/contests.py:686
+#: judge/views/contests.py:699
#, python-format
msgid "Your participation in %s"
msgstr "Su participación en %s"
-#: judge/views/contests.py:687
+#: judge/views/contests.py:700
#, python-format
msgid "%s's participation in %s"
msgstr "participación de %s en %s"
-#: judge/views/contests.py:694
+#: judge/views/contests.py:707
msgid "Live"
msgstr "En Vivo"
-#: judge/views/contests.py:706 templates/contest/contest-tabs.html:13
+#: judge/views/contests.py:719 templates/contest/contest-tabs.html:13
msgid "Participation"
msgstr "Participación"
-#: judge/views/contests.py:750
+#: judge/views/contests.py:763
#, python-format
msgid "%s MOSS Results"
msgstr "%s Resultados del Sistema antiplagio MOSS"
-#: judge/views/contests.py:777
+#: judge/views/contests.py:790
#, python-format
msgid "Running MOSS for %s..."
msgstr "Ejecutando Sistema antiplagio MOSS para %s"
-#: judge/views/contests.py:800
+#: judge/views/contests.py:813
#, python-format
msgid "Contest tag: %s"
msgstr "Etiqueta de Concurso: %s"
@@ -2661,163 +2695,177 @@ msgstr "página corrupta %s"
msgid "Runtimes"
msgstr "Tiempo de ejecución"
-#: judge/views/organization.py:44 judge/views/organization.py:47
+#: judge/views/organization.py:43 judge/views/organization.py:46
msgid "No such organization"
msgstr "Ninguna organización"
-#: judge/views/organization.py:45
+#: judge/views/organization.py:44
#, python-format
msgid "Could not find an organization with the key \"%s\"."
msgstr "No se encontró una organización con la clave \"%s\"."
-#: judge/views/organization.py:48
+#: judge/views/organization.py:47
msgid "Could not find such organization."
msgstr "No se pudo encontrar tal organización."
-#: judge/views/organization.py:72 judge/views/register.py:34
+#: judge/views/organization.py:71 judge/views/register.py:33
#: templates/organization/list.html:15 templates/user/user-list-tabs.html:5
msgid "Organizations"
msgstr "Organizaciones"
-#: judge/views/organization.py:93
+#: judge/views/organization.py:92
#, python-format
msgid "%s Members"
msgstr "%s miembros"
-#: judge/views/organization.py:118 judge/views/organization.py:121
-#: judge/views/organization.py:126
+#: judge/views/organization.py:117 judge/views/organization.py:120
+#: judge/views/organization.py:125
msgid "Joining organization"
msgstr "Unirse a la organización"
-#: judge/views/organization.py:118
+#: judge/views/organization.py:117
msgid "You are already in the organization."
msgstr "Ya estas en esta organización."
-#: judge/views/organization.py:121
+#: judge/views/organization.py:120
msgid "This organization is not open."
msgstr "Esta organización no está abierta."
-#: judge/views/organization.py:138
+#: judge/views/organization.py:137
msgid "Leaving organization"
msgstr "Abandonar organización"
-#: judge/views/organization.py:138
+#: judge/views/organization.py:137
#, python-format
msgid "You are not in \"%s\"."
msgstr "No estás en \"%s\"."
-#: judge/views/organization.py:162
+#: judge/views/organization.py:161
#, python-format
msgid "Request to join %s"
msgstr "Solicitar para unirse %s"
-#: judge/views/organization.py:180
+#: judge/views/organization.py:179
msgid "Join request detail"
msgstr "Únete a detalle de la solicitud"
-#: judge/views/organization.py:208
+#: judge/views/organization.py:207
#, python-format
msgid "Managing join requests for %s"
msgstr "Gestionar solicitudes de unirse para %s"
-#: judge/views/organization.py:239
+#: judge/views/organization.py:238
#, python-format
msgid "Your organization can only receive %d more members. You cannot approve %d users."
msgstr "Su organización solo puede recibir %d miembros más. No puede aprobar %d usuarios."
-#: judge/views/organization.py:251
+#: judge/views/organization.py:250
#, python-format
msgid "Approved %d user."
msgid_plural "Approved %d users."
msgstr[0] "%d usuarios aprobados."
msgstr[1] "Usuarios aprobados \"%d\"."
-#: judge/views/organization.py:252
+#: judge/views/organization.py:251
#, python-format
msgid "Rejected %d user."
msgid_plural "Rejected %d users."
msgstr[0] "%d usuarios rechazados."
msgstr[1] "Usuarios rechazados \"%d\"."
-#: judge/views/organization.py:282
+#: judge/views/organization.py:281
#, python-format
msgid "Editing %s"
msgstr "Editando %s"
-#: judge/views/organization.py:306 judge/views/organization.py:314
+#: judge/views/organization.py:305 judge/views/organization.py:313
msgid "Can't edit organization"
msgstr "No se puede editar la organización"
-#: judge/views/organization.py:307
+#: judge/views/organization.py:306
msgid "You are not allowed to edit this organization."
msgstr "No tiene permitido editar esta organización."
-#: judge/views/organization.py:315
+#: judge/views/organization.py:314
msgid "You are not allowed to kick people from this organization."
msgstr "No tiene permitido expulsar a personas de esta organización."
-#: judge/views/organization.py:320 judge/views/organization.py:324
+#: judge/views/organization.py:319 judge/views/organization.py:323
msgid "Can't kick user"
msgstr "No se puede reaccionar en contra del usuario"
-#: judge/views/organization.py:321
+#: judge/views/organization.py:320
msgid "The user you are trying to kick does not exist!"
msgstr "¡El usuario que estás tratando de poner no existe!"
-#: judge/views/organization.py:325
+#: judge/views/organization.py:324
#, python-format
msgid "The user you are trying to kick is not in organization: %s."
msgstr "El usuario que estás tratando poner no está en la organización: %s."
-#: judge/views/problem.py:67
+#: judge/views/problem.py:68
msgid "No such problem"
msgstr "No existe ese problema"
-#: judge/views/problem.py:68
+#: judge/views/problem.py:69
#, python-format
msgid "Could not find a problem with the code \"%s\"."
msgstr "No se pudo encontrar el problema con el código \"%s\"."
-#: judge/views/problem.py:110
+#: judge/views/problem.py:111
#, python-brace-format
msgid "Editorial for {0}"
msgstr "Editorial de{0}"
-#: judge/views/problem.py:113
+#: judge/views/problem.py:114
#, python-brace-format
msgid "Editorial for {0}"
msgstr "Editorial de {0}"
-#: judge/views/problem.py:283 templates/contest/contest.html:79
+#: judge/views/problem.py:133
+msgid "No such editorial"
+msgstr ""
+
+#: judge/views/problem.py:134
+#, python-format
+msgid "Could not find an editorial with the code \"%s\"."
+msgstr ""
+
+#: judge/views/problem.py:289 templates/contest/contest.html:79
#: templates/user/user-tabs.html:5 templates/user/users-table.html:23
msgid "Problems"
msgstr "Problemas"
-#: judge/views/problem.py:556 judge/views/problem.py:564
+#: judge/views/problem.py:562 judge/views/problem.py:570
#, python-format
msgid "Submit to %s"
msgstr "Enviar a %s"
-#: judge/views/problem.py:613
+#: judge/views/problem.py:619
msgid "Banned from submitting"
msgstr "Esta prohibido enviarlo"
-#: judge/views/problem.py:614
+#: judge/views/problem.py:620
msgid "You have been declared persona non grata for this problem. You are permanently barred from submitting this problem."
msgstr "Usted ha sido declarado persona no grata por este problema. Usted está permanentemente impedido en presentar este problema."
-#: judge/views/problem.py:618
+#: judge/views/problem.py:624
msgid "Too many submissions"
msgstr "Muchos envíos"
-#: judge/views/problem.py:619
+#: judge/views/problem.py:625
msgid "You have exceeded the submission limit for this problem."
msgstr "Usted ha excedido el límite de presentaciones de este problema."
-#: judge/views/problem.py:681
+#: judge/views/problem.py:693
msgid "Clone Problem"
msgstr "Clonar Problema"
+#: judge/views/problem.py:720
+#, python-format
+msgid "Cloned problem from %s"
+msgstr ""
+
#: judge/views/problem_data.py:37
msgid "Checker arguments must be a JSON object"
msgstr "Los argumentos del inspector deben ser un objeto JSON"
@@ -2887,52 +2935,52 @@ msgstr "Las mejores soluciones para %s"
msgid "Best solutions for {0}"
msgstr "Las mejores soluciones para {0}"
-#: judge/views/ranked_submission.py:80
+#: judge/views/ranked_submission.py:82
#, python-format
msgid "Best solutions for %(problem)s in %(contest)s"
msgstr "Las mejores soluciones para %(problem)s en %(contest)s"
-#: judge/views/ranked_submission.py:83
+#: judge/views/ranked_submission.py:85
#, python-format
msgid "Best solutions for problem %(number)s in %(contest)s"
msgstr "Las mejores soluciones para el problema %(number)s en %(contest)s"
-#: judge/views/ranked_submission.py:89
+#: judge/views/ranked_submission.py:91
#, python-brace-format
msgid "Best solutions for {0} in {2}"
msgstr "Las mejores soluciones para {0} en {2}"
-#: judge/views/ranked_submission.py:92
+#: judge/views/ranked_submission.py:94
#, python-brace-format
msgid "Best solutions for problem {0} in {1}"
msgstr "Las mejores soluciones para el problema {0} en {1}"
-#: judge/views/register.py:27
+#: judge/views/register.py:26
msgid "A username must contain letters, numbers, or underscores"
msgstr "El nombre de usuario debe contener letras, números o guiones bajos"
-#: judge/views/register.py:31
+#: judge/views/register.py:30
msgid "Preferred language"
msgstr "Lenguaje preferido"
-#: judge/views/register.py:38
+#: judge/views/register.py:37
msgid "Subscribe to newsletter?"
msgstr "¿suscribete en el boletín de noticias?"
-#: judge/views/register.py:45
+#: judge/views/register.py:44
#, python-format
msgid "The email address \"%s\" is already taken. Only one registration is allowed per address."
msgstr "La dirección de email \"%s\" ya ha sido tomada. Sólo un registro es permitido por dirección."
-#: judge/views/register.py:51
+#: judge/views/register.py:50
msgid "Your email provider is not allowed due to history of abuse. Please use a reputable email provider."
msgstr "Su proveedor de correo electrónico no esta permitido debido a el historial de abuso. Por favor utilice un proveedor de correo con buena reputación."
-#: judge/views/register.py:57 judge/views/register.py:95
+#: judge/views/register.py:56 judge/views/register.py:94
msgid "Registration"
msgstr "Registro de usuarios"
-#: judge/views/register.py:106
+#: judge/views/register.py:105
msgid "Authentication failure"
msgstr "Error de autenticación"
@@ -2940,7 +2988,7 @@ msgstr "Error de autenticación"
msgid "Language statistics"
msgstr "Estadísticas del lenguaje"
-#: judge/views/status.py:24 templates/submission/list.html:311
+#: judge/views/status.py:24 templates/submission/list.html:310
msgid "Status"
msgstr "Estado"
@@ -2948,74 +2996,74 @@ msgstr "Estado"
msgid "Version matrix"
msgstr "Versión matriz"
-#: judge/views/submission.py:53 judge/views/submission.py:60
+#: judge/views/submission.py:55 judge/views/submission.py:62
#, python-format
msgid "Submission of %(problem)s by %(user)s"
msgstr "Presentación de %(problem)s por %(user)s"
-#: judge/views/submission.py:203 judge/views/submission.py:204
+#: judge/views/submission.py:205 judge/views/submission.py:206
#: templates/problem/problem.html:127
msgid "All submissions"
msgstr "Todos los envíos"
-#: judge/views/submission.py:349
+#: judge/views/submission.py:355
msgid "All my submissions"
msgstr "Todos mis envíos"
-#: judge/views/submission.py:350
+#: judge/views/submission.py:356
#, python-format
msgid "All submissions by %s"
msgstr "Todos las presentaciones por %s"
-#: judge/views/submission.py:381
+#: judge/views/submission.py:387
#, python-format
msgid "All submissions for %s"
msgstr "Todas las presentaciones por %s"
-#: judge/views/submission.py:400
+#: judge/views/submission.py:410
msgid "Must pass a problem"
msgstr "Debe pasar un problema"
-#: judge/views/submission.py:439
+#: judge/views/submission.py:449
#, python-format
msgid "My submissions for %(problem)s"
msgstr "Mis presentaciones de %(problem)s"
-#: judge/views/submission.py:440
+#: judge/views/submission.py:450
#, python-format
msgid "%(user)s's submissions for %(problem)s"
msgstr "%(user)s's presentaciones para %(problem)s"
-#: judge/views/submission.py:536
+#: judge/views/submission.py:546
msgid "Must pass a contest"
msgstr "Debe pasar un concurso"
-#: judge/views/submission.py:544
+#: judge/views/submission.py:554
#, python-format
msgid "My submissions in %(contest)s"
msgstr "Mis envíos en %(contest)s"
-#: judge/views/submission.py:545
+#: judge/views/submission.py:555
#, python-format
msgid "%(user)s's submissions in %(contest)s"
msgstr "Envíos de %(user)s en %(contest)s"
-#: judge/views/submission.py:559
+#: judge/views/submission.py:569
#, python-brace-format
msgid "My submissions in {0}"
msgstr "Mis envíos en {0}"
-#: judge/views/submission.py:561
+#: judge/views/submission.py:571
#, python-brace-format
msgid "{0}'s submissions in {2}"
msgstr "envíos de {0} en {2}"
-#: judge/views/submission.py:585
+#: judge/views/submission.py:597
#, python-brace-format
msgid "{0}'s submissions for {2} in {4}"
msgstr "{0} envíos de {2} en {4}"
-#: judge/views/submission.py:590
+#: judge/views/submission.py:602
#, python-brace-format
msgid "{0}'s submissions for problem {2} in {3}"
msgstr "{0} envíos de problema {2} en {3}"
@@ -3032,40 +3080,40 @@ msgstr "Descripción del problema"
msgid "You must solve at least one problem before you can create a ticket."
msgstr ""
-#: judge/views/ticket.py:87 judge/views/ticket.py:90
+#: judge/views/ticket.py:91 judge/views/ticket.py:94
#, python-format
msgid "New ticket for %s"
msgstr "Nuevo ticket de %s"
-#: judge/views/ticket.py:144
+#: judge/views/ticket.py:148
#, python-format
msgid "%(title)s - Ticket %(id)d"
msgstr "%(title)s - Ticket %(id)d"
-#: judge/views/ticket.py:249
+#: judge/views/ticket.py:253
#, python-format
msgid "Tickets - Page %(number)d of %(total)d"
msgstr "Tickets - Página %(number)d de %(total)d"
-#: judge/views/ticket.py:298
+#: judge/views/ticket.py:302
#, python-format
msgid "New Ticket: %s"
msgstr "Tickets nuevos: %s"
-#: judge/views/ticket.py:299
+#: judge/views/ticket.py:303
#, python-format
msgid "#%(id)d, assigned to: %(users)s"
msgstr "#%(id)d asignado para: %(users)s"
-#: judge/views/ticket.py:301
+#: judge/views/ticket.py:305
msgid ", "
msgstr ", "
-#: judge/views/ticket.py:301
+#: judge/views/ticket.py:305
msgid "no one"
msgstr "ninguno"
-#: judge/views/ticket.py:321
+#: judge/views/ticket.py:325
#, python-format
msgid "New Ticket Message For: %s"
msgstr "Nuevo Mensaje para: %s"
@@ -3074,87 +3122,91 @@ msgstr "Nuevo Mensaje para: %s"
msgid "Enable Two-factor Authentication"
msgstr "Habilitar autenticación en dos pasos"
-#: judge/views/two_factor.py:99
+#: judge/views/two_factor.py:108
+msgid "Refresh Two-factor Authentication"
+msgstr ""
+
+#: judge/views/two_factor.py:116
msgid "Disable Two-factor Authentication"
msgstr "Deshabilitar autenticación en dos pasos"
-#: judge/views/two_factor.py:148
+#: judge/views/two_factor.py:165
msgid "Invalid WebAuthn response"
msgstr "Respuesta WebAuthn inválida"
-#: judge/views/two_factor.py:151
+#: judge/views/two_factor.py:168
msgid "Invalid name"
msgstr "Nombre inválido"
-#: judge/views/two_factor.py:204
+#: judge/views/two_factor.py:221
msgid "Staff may not disable 2FA"
msgstr "El personal con permisos elevados en la página no puede desactivar la Autenticación en dos pasos"
-#: judge/views/two_factor.py:216
+#: judge/views/two_factor.py:229
msgid "Perform Two-factor Authentication"
msgstr "Realizar autenticación en dos pasos"
-#: judge/views/user.py:79
+#: judge/views/user.py:78
msgid "No such user"
msgstr "No existe este usuario"
-#: judge/views/user.py:79
+#: judge/views/user.py:78
#, python-format
msgid "No user handle \"%s\"."
msgstr "Ningún usuario se encarga de \"%s\"."
-#: judge/views/user.py:83
+#: judge/views/user.py:82
msgid "My account"
msgstr "Mi cuenta"
-#: judge/views/user.py:84
+#: judge/views/user.py:83
#, python-format
msgid "User %s"
msgstr "Usuario %s"
-#: judge/views/user.py:132
+#: judge/views/user.py:131
msgid "Login"
msgstr "Iniciar sesión"
-#: judge/views/user.py:173
+#: judge/views/user.py:172
msgid "M j, Y, G:i"
msgstr "M j, Y, G:i"
-#: judge/views/user.py:307
+#: judge/views/user.py:306
msgid "Preparing your data..."
msgstr "Preparando tus datos..."
-#: judge/views/user.py:311 templates/user/edit-profile.html:348
+#: judge/views/user.py:310 templates/user/edit-profile.html:352
msgid "Download your data"
msgstr "Descargar tus datos"
-#: judge/views/user.py:367
+#: judge/views/user.py:366
msgid "Updated on site"
msgstr "Actualizado en el sitio"
-#: judge/views/user.py:400 templates/admin/auth/user/change_form.html:14
+#: judge/views/user.py:399 templates/admin/auth/user/change_form.html:14
#: templates/admin/auth/user/change_form.html:17 templates/base.html:222
#: templates/user/user-tabs.html:16
msgid "Edit profile"
msgstr "Modificar perfil"
-#: judge/views/user.py:415
+#: judge/views/user.py:414
msgid "Generated API token for user"
msgstr "Token API generado para el usuario"
-#: judge/views/user.py:427
+#: judge/views/user.py:426
msgid "Removed API token for user"
msgstr "Token API eliminado para el usuario"
-#: judge/views/user.py:437
+#: judge/views/user.py:436
msgid "Generated scratch codes for user"
msgstr "Códigos de scratch generados para el usuario"
-#: judge/views/user.py:443 templates/user/user-list-tabs.html:4
+#: judge/views/user.py:442 templates/user/user-list-tabs.html:4
msgid "Leaderboard"
msgstr "Tabla de calificación"
-#: judge/views/user.py:504
+#: judge/views/user.py:503
msgid "You have been successfully logged out."
msgstr ""
@@ -3283,11 +3335,11 @@ msgstr "Noticias"
msgid "posted on {time}"
msgstr "publicado en {time}"
-#: templates/blog/list.html:130 templates/problem/problem.html:309
+#: templates/blog/list.html:130 templates/problem/problem.html:311
msgid "Clarifications"
msgstr "Aclaraciones"
-#: templates/blog/list.html:146 templates/problem/problem.html:320
+#: templates/blog/list.html:146 templates/problem/problem.html:322
msgid "No clarifications have been made at this time."
msgstr "No se han hecho aclaraciones en este momento."
@@ -3483,7 +3535,7 @@ msgid "Info"
msgstr "Información"
#: templates/contest/contest-tabs.html:6 templates/stats/base.html:9
-#: templates/submission/list.html:337
+#: templates/submission/list.html:336
msgid "Statistics"
msgstr "Estadística"
@@ -3686,19 +3738,19 @@ msgstr "Cancelar Descalificación"
msgid "Disqualify"
msgstr "Descalificar"
-#: templates/contest/ranking.html:169
+#: templates/contest/ranking.html:173
msgid "Are you sure you want to disqualify this participation?"
msgstr "¿Estás seguro que quieres descalificar a esta participación?"
-#: templates/contest/ranking.html:174
+#: templates/contest/ranking.html:178
msgid "Are you sure you want to un-disqualify this participation?"
msgstr "¿Estás seguro que quieres cancelar la descalificación de esta participación?"
-#: templates/contest/ranking.html:246
+#: templates/contest/ranking.html:250
msgid "View user participation"
msgstr "Ver la participación del usuario"
-#: templates/contest/ranking.html:250
+#: templates/contest/ranking.html:254
msgid "Show organizations"
msgstr "Mostrar organizaciones"
@@ -3973,7 +4025,7 @@ msgstr ""
msgid "Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence."
msgstr "Recuerde utilizar esta editorial solo cuando esté bloqueada, y no copiar y pegar código de él. Por favor sea respetuoso con el autor del problema y el editorialista.
Presentar una solución oficial antes de resolver el problema usted mismo es una infracción banneable. b>"
-#: templates/problem/editorial.html:27 templates/problem/problem.html:209
+#: templates/problem/editorial.html:27 templates/problem/problem.html:210
msgid "Author:"
msgid_plural "Authors:"
msgstr[0] "Autor:"
@@ -4140,36 +4192,36 @@ msgstr "Tiempo límite:"
msgid "Memory limit:"
msgstr "Límite de memoria:"
-#: templates/problem/problem.html:224
+#: templates/problem/problem.html:226
msgid "Problem type"
msgid_plural "Problem types"
msgstr[0] "Tipo de problema"
msgstr[1] "Tipos de problema"
-#: templates/problem/problem.html:237
+#: templates/problem/problem.html:239
msgid "Allowed languages"
msgstr "Lenguajes permitidos"
-#: templates/problem/problem.html:245
+#: templates/problem/problem.html:247
#, python-format
msgid "No %(lang)s judge online"
msgstr "No hay jueces online para %(lang)s"
-#: templates/problem/problem.html:256
+#: templates/problem/problem.html:258
msgid "Judge:"
msgid_plural "Judges:"
msgstr[0] "Juez"
msgstr[1] "Jueces"
-#: templates/problem/problem.html:273
+#: templates/problem/problem.html:275
msgid "none available"
msgstr "ninguno disponible"
-#: templates/problem/problem.html:298
+#: templates/problem/problem.html:300
msgid "Request clarification"
msgstr "Solicitar aclaración"
-#: templates/problem/problem.html:300
+#: templates/problem/problem.html:302
msgid "Report an issue"
msgstr "Reportar un problema"
@@ -4214,7 +4266,7 @@ msgstr "Tipos de problema"
msgid "Point range"
msgstr "Rango de Puntos"
-#: templates/problem/search-form.html:63 templates/submission/list.html:329
+#: templates/problem/search-form.html:63 templates/submission/list.html:328
#: templates/ticket/list.html:248
msgid "Go"
msgstr "Ir"
@@ -4261,7 +4313,7 @@ msgid "Invalid username or password."
msgstr "Usuario o contraseña inválida."
#: templates/registration/login.html:53
-#: templates/registration/two_factor_auth.html:86
+#: templates/registration/two_factor_auth.html:92
msgid "Login!"
msgstr "¡Iniciar sesión!"
@@ -4381,12 +4433,12 @@ msgid "Default language"
msgstr "Lenguaje por defecto"
#: templates/registration/registration_form.html:184
-#: templates/user/edit-profile.html:310
+#: templates/user/edit-profile.html:314
msgid "Affiliated organizations"
msgstr "Organizaciones afiliadas"
#: templates/registration/registration_form.html:190
-#: templates/user/edit-profile.html:324
+#: templates/user/edit-profile.html:328
msgid "Notify me about upcoming contests"
msgstr "Notificarme sobre próximas competencias"
@@ -4402,57 +4454,93 @@ msgstr "Términos y condiciones"
msgid "Register!"
msgstr "¡Registrarse!"
-#: templates/registration/totp_disable.html:38
+#: templates/registration/totp_disable.html:31
msgid "To protect your account, you must first authenticate before you can disable Two Factor Authentication."
msgstr "Para proteger tu cuenta, debes autenticarte antes de que puedas desactivar el Two Factor Authentication"
-#: templates/registration/totp_disable.html:45
+#: templates/registration/totp_disable.html:38
msgid "Enter the 6-digit code generated by your app or one of your 16-digit scratch codes:"
msgstr "Introduzca el código de 6 dígitos generado por su aplicación o uno de sus códigos Scratch de 16 dígitos:"
-#: templates/registration/totp_disable.html:48
+#: templates/registration/totp_disable.html:41
msgid "Disable Two Factor Authentication"
msgstr "Desactivar Two Factor Authentication"
-#: templates/registration/totp_enable.html:75
+#: templates/registration/totp_enable.html:72
msgid "Scan this code with your authenticator app:"
msgstr "Escanea este código con tu app de autenticación"
-#: templates/registration/totp_enable.html:76
+#: templates/registration/totp_enable.html:73
msgid "QR code"
msgstr "código QR"
-#: templates/registration/totp_enable.html:77
+#: templates/registration/totp_enable.html:74
msgid "Or enter this code manually:"
msgstr "O entra este código manualmente"
-#: templates/registration/totp_enable.html:88
+#: templates/registration/totp_enable.html:85
msgid "Enter the 6-digit code generated by your app:"
msgstr "Entra el código de 6 dígitos generado por tu app"
-#: templates/registration/totp_enable.html:91
+#: templates/registration/totp_enable.html:90
+msgid "Refresh Two Factor Authentication"
+msgstr ""
+
+#: templates/registration/totp_enable.html:92
msgid "Enable Two Factor Authentication"
msgstr "Activar Two Factor Authentication"
+#: templates/registration/totp_enable.html:98
+msgid "Below is a list of one-time use scratch codes."
+msgstr ""
+
+#: templates/registration/totp_enable.html:99
+msgid "These codes can only be used once and are for emergency use."
+msgstr ""
+
+#: templates/registration/totp_enable.html:100
+msgid "You can use these codes to login to your account or disable two-factor authentication."
+msgstr ""
+
+#: templates/registration/totp_enable.html:101
+msgid "If you ever need more scratch codes, you can regenerate them on the edit profile tab."
+msgstr ""
+
+#: templates/registration/totp_enable.html:102
+msgid "Please write these down and keep them in a secure location."
+msgstr ""
+
+#: templates/registration/totp_enable.html:103
+msgid "These codes will never be shown again after you enable two-factor authentication."
+msgstr ""
+
#: templates/registration/two_factor_auth.html:33
-#: templates/user/edit-profile.html:161
+#: templates/user/edit-profile.html:165
msgid "WebAuthn is not supported by your browser."
msgstr "WebAuthn no es compatible con su navegador."
#: templates/registration/two_factor_auth.html:54
-#: templates/user/edit-profile.html:185
+#: templates/user/edit-profile.html:189
msgid "Failed to contact server."
msgstr "Error al contactar con el servidor."
-#: templates/registration/two_factor_auth.html:77
+#: templates/registration/two_factor_auth.html:79
msgid "Enter the 6-digit code generated by your app or one of your 16-character scratch codes:"
msgstr "Introduce el código de 6 dígitos generado por tu aplicación o uno de tus códigos Scratch de 16 caracteres:"
-#: templates/registration/two_factor_auth.html:83
+#: templates/registration/two_factor_auth.html:81
+msgid "Enter one of your 16-character scratch codes:"
+msgstr ""
+
+#: templates/registration/two_factor_auth.html:89
msgid "Use security key"
msgstr "Usar clave de seguridad"
-#: templates/registration/two_factor_auth.html:89
+#: templates/registration/two_factor_auth.html:94
+msgid "Use scratch code"
+msgstr ""
+
+#: templates/registration/two_factor_auth.html:97
#, python-format
msgid "If you lost your authentication device and are unable to use your scratch codes, please contact us at %(email)s."
msgstr "Si perdiste tu dispositivo de autenticación y no puedes usar tus códigos de scratch, ponte en contacto con nosotros en %(email)s."
@@ -4533,15 +4621,15 @@ msgstr "Filtrar por estatus..."
msgid "Filter by language..."
msgstr "Filtrar por lenguaje..."
-#: templates/submission/list.html:307
+#: templates/submission/list.html:306
msgid "Filter submissions"
msgstr "Filtrar envíos"
-#: templates/submission/list.html:343
+#: templates/submission/list.html:342
msgid "Total:"
msgstr "Total"
-#: templates/submission/list.html:353
+#: templates/submission/list.html:352
msgid "You were disconnected. Refresh to show latest updates."
msgstr "Estuviste desconectado. Actualiza para mostrar las últimas actualizaciones."
@@ -4757,121 +4845,125 @@ msgstr "Puesto"
msgid "Search by handle..."
msgstr "Buscar por manejo..."
-#: templates/user/edit-profile.html:109
+#: templates/user/edit-profile.html:113
msgid "Are you sure you want to generate or regenerate your API token?"
msgstr "¿Estás seguro de que quieres generar o regenerar tu token API?"
-#: templates/user/edit-profile.html:110
+#: templates/user/edit-profile.html:114
msgid "This will invalidate any previous API tokens."
msgstr "Esto invalidará cualquier token de API anterior."
-#: templates/user/edit-profile.html:111
+#: templates/user/edit-profile.html:115
msgid "It also allows access to your account without Two-factor Authentication."
msgstr "También permite el acceso a su cuenta sin autenticación de dos pasos."
-#: templates/user/edit-profile.html:112
+#: templates/user/edit-profile.html:116
msgid "You will not be able to view your api token after you leave this page!"
msgstr "¡No podrás ver tu token api después de salir de esta página!"
-#: templates/user/edit-profile.html:113 templates/user/edit-profile.html:207
+#: templates/user/edit-profile.html:117 templates/user/edit-profile.html:211
msgid "Generating..."
msgstr "Generando..."
-#: templates/user/edit-profile.html:121 templates/user/edit-profile.html:243
-#: templates/user/edit-profile.html:371 templates/user/edit-profile.html:390
+#: templates/user/edit-profile.html:125 templates/user/edit-profile.html:247
+#: templates/user/edit-profile.html:373 templates/user/edit-profile.html:395
msgid "Regenerate"
msgstr "Regenerar"
-#: templates/user/edit-profile.html:127 templates/user/edit-profile.html:392
+#: templates/user/edit-profile.html:131 templates/user/edit-profile.html:397
msgid "Remove"
msgstr "Eliminar"
-#: templates/user/edit-profile.html:137
+#: templates/user/edit-profile.html:141
msgid "Are you sure you want to remove your API token?"
msgstr "¿Estás seguro de que quieres eliminar tu token de API?"
-#: templates/user/edit-profile.html:144 templates/user/edit-profile.html:375
-#: templates/user/edit-profile.html:396
+#: templates/user/edit-profile.html:148 templates/user/edit-profile.html:377
+#: templates/user/edit-profile.html:401
msgid "Generate"
msgstr "Generar"
-#: templates/user/edit-profile.html:190
+#: templates/user/edit-profile.html:194
msgid "Are you sure you want to delete this security key?"
msgstr "¿Está seguro que desea eliminar esta clave de seguridad?"
-#: templates/user/edit-profile.html:280
+#: templates/user/edit-profile.html:284
msgid "Self-description"
msgstr "Descripción propia"
-#: templates/user/edit-profile.html:287
+#: templates/user/edit-profile.html:291
msgid "Select your closest major city"
msgstr "Seleccione la ciudad importante más cercana"
-#: templates/user/edit-profile.html:296
+#: templates/user/edit-profile.html:300
msgid "Editor theme"
msgstr "Tema editor"
-#: templates/user/edit-profile.html:301
+#: templates/user/edit-profile.html:305
msgid "Math engine"
msgstr "Motor de matemáticas"
-#: templates/user/edit-profile.html:335 templates/user/edit-profile.html:337
+#: templates/user/edit-profile.html:339 templates/user/edit-profile.html:341
msgid "Change your avatar"
msgstr "Cambiar tu avatar"
-#: templates/user/edit-profile.html:342
+#: templates/user/edit-profile.html:346
msgid "Change your password"
msgstr "Cambiar tu contraseña"
-#: templates/user/edit-profile.html:356
+#: templates/user/edit-profile.html:359
msgid "Two-factor Authentication is enabled"
msgstr "Autenticación en dos pasos habilitada"
-#: templates/user/edit-profile.html:358
-msgid "Two-factor Authentication is disabled"
-msgstr "Autenticación en dos pasos deshabilitada"
-
-#: templates/user/edit-profile.html:363 templates/user/edit-profile.html:365
+#: templates/user/edit-profile.html:362 templates/user/edit-profile.html:365
msgid "Disable"
msgstr "Desactivar"
-#: templates/user/edit-profile.html:368
+#: templates/user/edit-profile.html:367
+msgid "Refresh"
+msgstr ""
+
+#: templates/user/edit-profile.html:370
msgid "Scratch Codes:"
msgstr "Códigos Scratch:"
-#: templates/user/edit-profile.html:372 templates/user/edit-profile.html:393
+#: templates/user/edit-profile.html:374 templates/user/edit-profile.html:398
msgid "Hidden"
msgstr "Oculto"
-#: templates/user/edit-profile.html:381
+#: templates/user/edit-profile.html:384
+msgid "Two-factor Authentication is disabled"
+msgstr "Autenticación en dos pasos deshabilitada"
+
+#: templates/user/edit-profile.html:385
msgid "Enable"
msgstr "Activar"
-#: templates/user/edit-profile.html:387
+#: templates/user/edit-profile.html:392
msgid "API Token"
msgstr "Token de la API"
-#: templates/user/edit-profile.html:404
+#: templates/user/edit-profile.html:409
msgid "Security keys"
msgstr "Claves de seguridad"
-#: templates/user/edit-profile.html:414
+#: templates/user/edit-profile.html:419
msgid "Delete"
msgstr "Eliminar"
-#: templates/user/edit-profile.html:421
+#: templates/user/edit-profile.html:426
msgid "Enter a name for this key"
msgstr "Introduzca un nombre para esta clave"
-#: templates/user/edit-profile.html:422
+#: templates/user/edit-profile.html:427
msgid "Add"
msgstr "Añadir"
-#: templates/user/edit-profile.html:430
+#: templates/user/edit-profile.html:435
msgid "User-script"
msgstr "Script de usuario"
-#: templates/user/edit-profile.html:434
+#: templates/user/edit-profile.html:439
msgid "Update profile"
msgstr "Actualizar perfil"
diff --git a/locale/es/LC_MESSAGES/djangojs.po b/locale/es/LC_MESSAGES/djangojs.po
index eba0c2ff75..971810a238 100644
--- a/locale/es/LC_MESSAGES/djangojs.po
+++ b/locale/es/LC_MESSAGES/djangojs.po
@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: dmoj\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-10-01 23:12+0000\n"
-"PO-Revision-Date: 2021-04-25 00:08\n"
+"PO-Revision-Date: 2021-07-07 00:27\n"
"Last-Translator: \n"
"Language-Team: Spanish\n"
"Language: es_ES\n"
diff --git a/locale/fr/LC_MESSAGES/django.po b/locale/fr/LC_MESSAGES/django.po
index 4973bf9928..f747d2eac7 100644
--- a/locale/fr/LC_MESSAGES/django.po
+++ b/locale/fr/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: dmoj\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-24 19:15+0000\n"
-"PO-Revision-Date: 2021-04-25 00:08\n"
+"POT-Creation-Date: 2021-06-17 01:38+0000\n"
+"PO-Revision-Date: 2021-07-07 00:27\n"
"Last-Translator: \n"
"Language-Team: French\n"
"Language: fr_FR\n"
@@ -17,75 +17,75 @@ msgstr ""
"X-Crowdin-File: django.po\n"
"X-Crowdin-File-ID: 10\n"
-#: dmoj/settings.py:364
+#: dmoj/settings.py:365
msgid "Catalan"
msgstr "Catalane"
-#: dmoj/settings.py:365
+#: dmoj/settings.py:366
msgid "German"
msgstr "Allemand"
-#: dmoj/settings.py:366
+#: dmoj/settings.py:367
msgid "English"
msgstr "Anglais"
-#: dmoj/settings.py:367
+#: dmoj/settings.py:368
msgid "Spanish"
msgstr "Espagnol"
-#: dmoj/settings.py:368
+#: dmoj/settings.py:369
msgid "French"
msgstr "Français"
-#: dmoj/settings.py:369
+#: dmoj/settings.py:370
msgid "Croatian"
msgstr "Croate"
-#: dmoj/settings.py:370
+#: dmoj/settings.py:371
msgid "Hungarian"
msgstr "Hongrois"
-#: dmoj/settings.py:371
+#: dmoj/settings.py:372
msgid "Japanese"
msgstr "Japonais"
-#: dmoj/settings.py:372
+#: dmoj/settings.py:373
msgid "Korean"
msgstr "Coréen"
-#: dmoj/settings.py:373
+#: dmoj/settings.py:374
msgid "Brazilian Portuguese"
msgstr "Portugais Brazilien"
-#: dmoj/settings.py:374
+#: dmoj/settings.py:375
msgid "Romanian"
msgstr "Roumain"
-#: dmoj/settings.py:375
+#: dmoj/settings.py:376
msgid "Russian"
msgstr "Russe"
-#: dmoj/settings.py:376
+#: dmoj/settings.py:377
msgid "Serbian (Latin)"
msgstr "Serbe (Latin)"
-#: dmoj/settings.py:377
+#: dmoj/settings.py:378
msgid "Turkish"
msgstr "Turque"
-#: dmoj/settings.py:378
+#: dmoj/settings.py:379
msgid "Vietnamese"
msgstr "Vietnamien"
-#: dmoj/settings.py:379
+#: dmoj/settings.py:380
msgid "Simplified Chinese"
msgstr "Chinois simplifié"
-#: dmoj/settings.py:380
+#: dmoj/settings.py:381
msgid "Traditional Chinese"
msgstr "Chinois Traditionel"
-#: dmoj/urls.py:103 templates/base.html:190
+#: dmoj/urls.py:104 templates/base.html:190
msgid "Home"
msgstr "Accueil"
@@ -115,112 +115,112 @@ msgstr "Montrer les commentaires"
msgid "Associated page"
msgstr "Page associée"
-#: judge/admin/contest.py:31
+#: judge/admin/contest.py:32
msgid "Included contests"
msgstr "Concours inclus"
-#: judge/admin/contest.py:65 templates/contest/contest.html:83
+#: judge/admin/contest.py:66 templates/contest/contest.html:83
#: templates/contest/moss.html:43 templates/problem/list.html:204
#: templates/problem/list.html:219 templates/user/user-problems.html:58
#: templates/user/user-problems.html:100
msgid "Problem"
msgstr "Problème"
-#: judge/admin/contest.py:114
+#: judge/admin/contest.py:117
msgid "Settings"
msgstr "Réglages"
-#: judge/admin/contest.py:116
+#: judge/admin/contest.py:120
msgid "Scheduling"
msgstr "Planification"
-#: judge/admin/contest.py:117
+#: judge/admin/contest.py:121
msgid "Details"
msgstr "Détails"
-#: judge/admin/contest.py:118
+#: judge/admin/contest.py:122
msgid "Format"
msgstr "Format"
-#: judge/admin/contest.py:119 templates/contest/ranking-table.html:5
+#: judge/admin/contest.py:123 templates/contest/ranking-table.html:5
msgid "Rating"
msgstr "Valeur"
-#: judge/admin/contest.py:120
+#: judge/admin/contest.py:124
msgid "Access"
msgstr "Accès"
-#: judge/admin/contest.py:122 judge/admin/problem.py:134
+#: judge/admin/contest.py:126 judge/admin/problem.py:135
msgid "Justice"
msgstr "Justice"
-#: judge/admin/contest.py:211
+#: judge/admin/contest.py:215
#, python-format
msgid "%d contest successfully marked as visible."
msgid_plural "%d contests successfully marked as visible."
msgstr[0] "%d concours marqué visible avec succès."
msgstr[1] "%d concours marqué visible avec succès."
-#: judge/admin/contest.py:214
+#: judge/admin/contest.py:218
msgid "Mark contests as visible"
msgstr "Marquer concours comme visible"
-#: judge/admin/contest.py:220
+#: judge/admin/contest.py:224
#, python-format
msgid "%d contest successfully marked as hidden."
msgid_plural "%d contests successfully marked as hidden."
msgstr[0] "%d concours marqué invisible avec succès."
msgstr[1] "%d concours marqué invisible avec succès."
-#: judge/admin/contest.py:223
+#: judge/admin/contest.py:227
msgid "Mark contests as hidden"
msgstr "Marquer concours invisible"
-#: judge/admin/contest.py:229
+#: judge/admin/contest.py:233
#, python-format
msgid "%d contest successfully locked."
msgid_plural "%d contests successfully locked."
msgstr[0] "%d les concours ont été verrouillés avec succès"
msgstr[1] "%d concours ont été verrouillés avec succès."
-#: judge/admin/contest.py:232
+#: judge/admin/contest.py:236
msgid "Lock contest submissions"
msgstr "Verrouiller les soumissions au concours"
-#: judge/admin/contest.py:238
+#: judge/admin/contest.py:242
#, python-format
msgid "%d contest successfully unlocked."
msgid_plural "%d contests successfully unlocked."
msgstr[0] "%d concour ont été déverrouiller avec succès."
msgstr[1] "%d concours ont été déverrouiller avec succès."
-#: judge/admin/contest.py:241
+#: judge/admin/contest.py:245
msgid "Unlock contest submissions"
msgstr "Déverrouiller les soumissions au concours"
-#: judge/admin/contest.py:262 judge/admin/submission.py:170
+#: judge/admin/contest.py:266 judge/admin/submission.py:170
#, python-format
msgid "%d submission was successfully scheduled for rejudging."
msgid_plural "%d submissions were successfully scheduled for rejudging."
msgstr[0] "%d soumission a été programmée pour être réjugée avec succès."
msgstr[1] "%d soumissions ont été programmées pour être réjugées avec succès."
-#: judge/admin/contest.py:337
+#: judge/admin/contest.py:341
#, python-format
msgid "%d participation recalculated."
msgid_plural "%d participations recalculated."
msgstr[0] "%d participation récalculée."
msgstr[1] "%d participations récalculées."
-#: judge/admin/contest.py:340
+#: judge/admin/contest.py:344
msgid "Recalculate results"
msgstr "Récalculer résultats"
-#: judge/admin/contest.py:344 judge/admin/organization.py:63
+#: judge/admin/contest.py:348 judge/admin/organization.py:63
msgid "username"
msgstr "nom d'utilisateur"
-#: judge/admin/contest.py:349 templates/base.html:258
+#: judge/admin/contest.py:353 templates/base.html:258
msgid "virtual"
msgstr "virtuel"
@@ -236,9 +236,9 @@ msgstr "Contenu"
msgid "Summary"
msgstr "Résumé"
-#: judge/admin/interface.py:113 judge/models/contest.py:383
-#: judge/models/contest.py:509 judge/models/profile.py:244
-#: judge/models/profile.py:268
+#: judge/admin/interface.py:113 judge/models/contest.py:419
+#: judge/models/contest.py:546 judge/models/profile.py:261
+#: judge/models/profile.py:292
msgid "user"
msgstr "utilisateur"
@@ -246,8 +246,8 @@ msgstr "utilisateur"
msgid "object"
msgstr "objet"
-#: judge/admin/organization.py:32 judge/admin/problem.py:181
-#: judge/admin/profile.py:82
+#: judge/admin/organization.py:32 judge/admin/problem.py:182
+#: judge/admin/profile.py:92
msgid "View on site"
msgstr "Sur le site"
@@ -255,69 +255,69 @@ msgstr "Sur le site"
msgid "Describe the changes you made (optional)"
msgstr "Décrire les modifications apportées (optionnel)"
-#: judge/admin/problem.py:129
+#: judge/admin/problem.py:130
msgid "Social Media"
msgstr "Médias Sociaux"
-#: judge/admin/problem.py:130
+#: judge/admin/problem.py:131
msgid "Taxonomy"
msgstr "Taxonomie"
-#: judge/admin/problem.py:131 templates/contest/contest.html:84
+#: judge/admin/problem.py:132 templates/contest/contest.html:84
#: templates/problem/data.html:385 templates/problem/list.html:209
#: templates/problem/list.html:230 templates/user/base-users-table.html:10
#: templates/user/user-problems.html:60
msgid "Points"
msgstr "Points "
-#: judge/admin/problem.py:132
+#: judge/admin/problem.py:133
msgid "Limits"
msgstr "Limites"
-#: judge/admin/problem.py:133 judge/admin/submission.py:238
-#: templates/stats/base.html:14 templates/submission/list.html:320
-#: templates/user/edit-profile.html:292
+#: judge/admin/problem.py:134 judge/admin/submission.py:238
+#: templates/stats/base.html:14 templates/submission/list.html:319
+#: templates/user/edit-profile.html:296
msgid "Language"
msgstr "Langue"
-#: judge/admin/problem.py:135
+#: judge/admin/problem.py:136
msgid "History"
msgstr "Histoire"
-#: judge/admin/problem.py:178
+#: judge/admin/problem.py:179
msgid "Authors"
msgstr "Auteurs"
-#: judge/admin/problem.py:191
+#: judge/admin/problem.py:192
#, python-format
msgid "%d problem's publish date successfully updated."
msgid_plural "%d problems' publish date successfully updated."
msgstr[0] "La date de publication de %d problème a été mise à jour avec succès."
msgstr[1] "La date de publication de %d problèmes a été mise à jour avec succès."
-#: judge/admin/problem.py:195
+#: judge/admin/problem.py:196
msgid "Set publish date to now"
msgstr "Définir la date de publication à maintenant"
-#: judge/admin/problem.py:201
+#: judge/admin/problem.py:202
#, python-format
msgid "%d problem successfully marked as public."
msgid_plural "%d problems successfully marked as public."
msgstr[0] "Le problème %d a été marqué comme publique."
msgstr[1] "%d problèmes ont été marqué comme publique."
-#: judge/admin/problem.py:205
+#: judge/admin/problem.py:206
msgid "Mark problems as public"
msgstr "Rendre ces problèmes publique"
-#: judge/admin/problem.py:211
+#: judge/admin/problem.py:212
#, python-format
msgid "%d problem successfully marked as private."
msgid_plural "%d problems successfully marked as private."
msgstr[0] "%d problème marqué privé avec succès."
msgstr[1] "%d problèmes marqués privés avec succès."
-#: judge/admin/problem.py:215
+#: judge/admin/problem.py:216
msgid "Mark problems as private"
msgstr "Marquer les problèmes comme privés"
@@ -325,35 +325,35 @@ msgstr "Marquer les problèmes comme privés"
msgid "timezone"
msgstr "fuseau horaire"
-#: judge/admin/profile.py:88 judge/admin/submission.py:217
+#: judge/admin/profile.py:98 judge/admin/submission.py:217
#: templates/organization/requests/log.html:9
#: templates/organization/requests/pending.html:12
#: templates/ticket/list.html:261
msgid "User"
msgstr "Utilisateur"
-#: judge/admin/profile.py:93 templates/registration/registration_form.html:143
+#: judge/admin/profile.py:103 templates/registration/registration_form.html:143
msgid "Email"
msgstr "Courriel"
-#: judge/admin/profile.py:98 judge/views/register.py:29
+#: judge/admin/profile.py:108 judge/views/register.py:28
#: templates/registration/registration_form.html:171
-#: templates/user/edit-profile.html:288
+#: templates/user/edit-profile.html:292
msgid "Timezone"
msgstr "Fuseau horaire"
-#: judge/admin/profile.py:103
+#: judge/admin/profile.py:113
msgid "date joined"
msgstr "date d'adhésion"
-#: judge/admin/profile.py:110
+#: judge/admin/profile.py:120
#, python-format
msgid "%d user have scores recalculated."
msgid_plural "%d users have scores recalculated."
msgstr[0] "%d l'utilisateur a des notes récalculées."
msgstr[1] "%d les utilisateurs ont des notes récalculées."
-#: judge/admin/profile.py:113
+#: judge/admin/profile.py:123
msgid "Recalculate scores"
msgstr "Recalculer les scores"
@@ -506,115 +506,116 @@ msgstr "IOI"
msgid "IOI (pre-2016)"
msgstr "IOI (avant 2016)"
-#: judge/forms.py:26
-msgid "Two-factor authentication tokens must be 6 decimal digits."
-msgstr "Les jetons d'authentification à deux facteurs doivent être de 6 chiffres décimaux."
+#: judge/forms.py:27
+#, python-brace-format
+msgid "Two-factor authentication tokens must be {TOTP_CODE_LENGTH} decimal digits."
+msgstr ""
-#: judge/forms.py:29
+#: judge/forms.py:30
msgid "Invalid two-factor authentication token."
msgstr "Code d´authentification à deux facteurs invalide"
-#: judge/forms.py:32
+#: judge/forms.py:33
msgid "Scratch codes must be 16 base32 characters."
msgstr "Les codes Scratch doivent être 16 caractères de base 32."
-#: judge/forms.py:34
+#: judge/forms.py:35 judge/forms.py:264
msgid "Invalid scratch code."
msgstr "Code scratch non valide"
-#: judge/forms.py:45
+#: judge/forms.py:46
msgid "Subscribe to contest updates"
-msgstr ""
+msgstr "S'abonner aux nouvelles du concours"
-#: judge/forms.py:46
+#: judge/forms.py:47
msgid "Enable experimental features"
msgstr ""
-#: judge/forms.py:71
+#: judge/forms.py:72
msgid "You must solve at least one problem before you can update your profile."
-msgstr ""
+msgstr "Vous devez résoudre au moins un problème avant de pouvoir modifier votre profil."
-#: judge/forms.py:80 judge/views/organization.py:127
+#: judge/forms.py:81 judge/views/organization.py:126
#, python-brace-format
msgid "You may not be part of more than {count} public organizations."
-msgstr ""
+msgstr "Vous ne pouvez pas faire partie de plus de {count} organisations publiques."
-#: judge/forms.py:96
+#: judge/forms.py:97
msgid "Download comments?"
-msgstr ""
+msgstr "Télécharger les commentaires ?"
-#: judge/forms.py:97
+#: judge/forms.py:98
msgid "Download submissions?"
-msgstr ""
+msgstr "Télécharger les soumissions?"
-#: judge/forms.py:98
+#: judge/forms.py:99
msgid "Filter by problem code glob:"
-msgstr ""
+msgstr "Filtrer par code de problème glob :"
-#: judge/forms.py:102
+#: judge/forms.py:103
msgid "Leave empty to include all submissions"
-msgstr ""
+msgstr "Laisser vide pour inclure toutes les soumissions"
-#: judge/forms.py:105 templates/problem/manage_submission.html:142
+#: judge/forms.py:106 templates/problem/manage_submission.html:142
msgid "Filter by result:"
-msgstr ""
+msgstr "Filtrer par résultat:"
-#: judge/forms.py:111
+#: judge/forms.py:112
msgid "Please select at least one thing to download."
-msgstr ""
+msgstr "Veuillez sélectionner au moins une chose à télécharger."
-#: judge/forms.py:137
+#: judge/forms.py:138
msgid "Any judge"
-msgstr ""
+msgstr "N'importe quel juge"
-#: judge/forms.py:167 judge/views/register.py:26
+#: judge/forms.py:159 judge/views/register.py:25
#: templates/registration/registration_form.html:137
#: templates/user/base-users-table.html:5
msgid "Username"
msgstr "Nom d'utilisateur"
-#: judge/forms.py:168 templates/registration/registration_form.html:149
+#: judge/forms.py:160 templates/registration/registration_form.html:149
#: templates/registration/registration_form.html:163
msgid "Password"
msgstr "Mot de passe "
-#: judge/forms.py:201
+#: judge/forms.py:192
msgid "Invalid code length."
-msgstr ""
+msgstr "Longueur de code invalide."
-#: judge/forms.py:219
+#: judge/forms.py:223
msgid "Invalid WebAuthn response."
msgstr ""
-#: judge/forms.py:222
+#: judge/forms.py:226
msgid "No WebAuthn challenge issued."
msgstr ""
-#: judge/forms.py:228
+#: judge/forms.py:232
msgid "Invalid WebAuthn credential ID."
msgstr ""
-#: judge/forms.py:257
+#: judge/forms.py:262
msgid "Invalid two-factor authentication token or scratch code."
msgstr ""
-#: judge/forms.py:259
+#: judge/forms.py:266
msgid "Must specify either totp_token or webauthn_response."
msgstr ""
-#: judge/forms.py:263 judge/models/problem.py:105
+#: judge/forms.py:270 judge/models/problem.py:119
msgid "Problem code must be ^[a-z0-9]+$"
msgstr ""
-#: judge/forms.py:268
+#: judge/forms.py:275
msgid "Problem with code already exists."
msgstr ""
-#: judge/forms.py:273 judge/models/contest.py:66
+#: judge/forms.py:280 judge/models/contest.py:66
msgid "Contest id must be ^[a-z0-9]+$"
msgstr ""
-#: judge/forms.py:278
+#: judge/forms.py:285
msgid "Contest with key already exists."
msgstr ""
@@ -626,20 +627,20 @@ msgstr ""
#: judge/jinja2/datetime.py:26
#, python-brace-format
msgid "{time}"
-msgstr ""
+msgstr "{time}"
#: judge/jinja2/datetime.py:26
#, python-brace-format
msgid "on {time}"
-msgstr ""
+msgstr "à {time}"
#: judge/models/choices.py:59
msgid "Leave as LaTeX"
-msgstr ""
+msgstr "Laisser en tant que LaTeX"
#: judge/models/choices.py:60
msgid "SVG with PNG fallback"
-msgstr ""
+msgstr "SVG avec repli PNG"
#: judge/models/choices.py:61
msgid "MathML only"
@@ -647,27 +648,27 @@ msgstr "MathML seulement"
#: judge/models/choices.py:62
msgid "MathJax with SVG/PNG fallback"
-msgstr ""
+msgstr "MathJax avec repli SVG/PNG"
#: judge/models/choices.py:63
msgid "Detect best quality"
-msgstr ""
+msgstr "Détecter la meilleure qualité"
#: judge/models/comment.py:25
msgid "Page code must be ^[pcs]:[a-z0-9]+$|^b:\\d+$"
-msgstr ""
+msgstr "Le code de la page doit être ^[pcs]:[a-z0-9]+$|^b:\\d+$"
#: judge/models/comment.py:41
msgid "commenter"
-msgstr ""
+msgstr "commentateur"
#: judge/models/comment.py:42
msgid "posted time"
-msgstr ""
+msgstr "date de publication"
#: judge/models/comment.py:43 judge/models/comment.py:196
msgid "associated page"
-msgstr ""
+msgstr "page associée"
#: judge/models/comment.py:45
msgid "votes"
@@ -675,11 +676,11 @@ msgstr "votes"
#: judge/models/comment.py:46
msgid "body of comment"
-msgstr ""
+msgstr "le corps du commentaire"
#: judge/models/comment.py:47
msgid "hide the comment"
-msgstr ""
+msgstr "Masquer le commentaire"
#: judge/models/comment.py:48
msgid "parent"
@@ -694,7 +695,7 @@ msgid "comments"
msgstr "commentaires"
#: judge/models/comment.py:89 judge/models/comment.py:141
-#: judge/models/problem.py:484
+#: judge/models/problem.py:511
#, python-format
msgid "Editorial for %s"
msgstr "Editorial for %s"
@@ -735,7 +736,7 @@ msgstr ""
msgid "contest tag"
msgstr ""
-#: judge/models/contest.py:53 judge/models/contest.py:117
+#: judge/models/contest.py:53 judge/models/contest.py:126
msgid "contest tags"
msgstr ""
@@ -745,11 +746,11 @@ msgstr ""
#: judge/models/contest.py:62
msgid "Hidden for duration of contest"
-msgstr ""
+msgstr "Caché pour la durée du concours"
#: judge/models/contest.py:63
msgid "Hidden for duration of participation"
-msgstr ""
+msgstr "Caché pour la durée de la participation"
#: judge/models/contest.py:65
msgid "contest id"
@@ -760,410 +761,426 @@ msgid "contest name"
msgstr "nom du concours"
#: judge/models/contest.py:68
-msgid "These people will be able to edit the contest."
+msgid "These users will be able to edit the contest."
msgstr ""
-#: judge/models/contest.py:70 judge/models/runtime.py:136
-msgid "description"
+#: judge/models/contest.py:70
+msgid "These users will be able to edit the contest, but will not be listed as authors."
+msgstr ""
+
+#: judge/models/contest.py:73
+msgid "These users will be able to view the contest, but not edit it."
msgstr ""
-#: judge/models/contest.py:71 judge/models/problem.py:431
+#: judge/models/contest.py:76 judge/models/runtime.py:136
+msgid "description"
+msgstr "Description"
+
+#: judge/models/contest.py:77 judge/models/problem.py:458
#: judge/models/runtime.py:138
msgid "problems"
msgstr "problèmes"
-#: judge/models/contest.py:72 judge/models/contest.py:384
+#: judge/models/contest.py:78 judge/models/contest.py:420
msgid "start time"
msgstr "heure de début"
-#: judge/models/contest.py:73
+#: judge/models/contest.py:79
msgid "end time"
msgstr "heure de fin"
-#: judge/models/contest.py:74 judge/models/problem.py:126
-#: judge/models/problem.py:455
+#: judge/models/contest.py:80 judge/models/problem.py:140
+#: judge/models/problem.py:482
msgid "time limit"
msgstr "limite de Temps"
-#: judge/models/contest.py:75 judge/models/problem.py:144
+#: judge/models/contest.py:81 judge/models/problem.py:158
msgid "publicly visible"
msgstr "visible publiquement"
-#: judge/models/contest.py:76
+#: judge/models/contest.py:82
msgid "Should be set even for organization-private contests, where it determines whether the contest is visible to members of the specified organizations."
msgstr ""
-#: judge/models/contest.py:79
+#: judge/models/contest.py:85
msgid "contest rated"
-msgstr ""
+msgstr "concours évalué"
-#: judge/models/contest.py:79
+#: judge/models/contest.py:85
msgid "Whether this contest can be rated."
-msgstr ""
+msgstr "Si ce concours peut être évalué."
-#: judge/models/contest.py:81
+#: judge/models/contest.py:87
msgid "view contest scoreboard"
msgstr ""
-#: judge/models/contest.py:83
+#: judge/models/contest.py:89
msgid "These users will be able to view the scoreboard."
msgstr ""
-#: judge/models/contest.py:84
+#: judge/models/contest.py:90
msgid "scoreboard visibility"
msgstr ""
-#: judge/models/contest.py:85
+#: judge/models/contest.py:91
msgid "Scoreboard visibility through the duration of the contest"
msgstr ""
-#: judge/models/contest.py:87
+#: judge/models/contest.py:93
msgid "no comments"
-msgstr ""
+msgstr "aucun commentaire"
-#: judge/models/contest.py:88
+#: judge/models/contest.py:94
msgid "Use clarification system instead of comments."
-msgstr ""
+msgstr "Utiliser le système de clarification au lieu de commentaires."
-#: judge/models/contest.py:90
+#: judge/models/contest.py:96
msgid "Rating floor for contest"
-msgstr ""
+msgstr "Plancher de classement pour le concours"
-#: judge/models/contest.py:92
+#: judge/models/contest.py:98
msgid "Rating ceiling for contest"
-msgstr ""
+msgstr "Plafond de classement pour le concours"
-#: judge/models/contest.py:94
+#: judge/models/contest.py:100
msgid "rate all"
-msgstr ""
+msgstr "évaluer tout"
-#: judge/models/contest.py:94
+#: judge/models/contest.py:100
msgid "Rate all users who joined."
-msgstr ""
+msgstr "Évaluer tous les utilisateurs qui se sont inscrits."
-#: judge/models/contest.py:95
+#: judge/models/contest.py:101
msgid "exclude from ratings"
-msgstr ""
+msgstr "exclure des évaluations"
-#: judge/models/contest.py:97
+#: judge/models/contest.py:103
msgid "private to specific users"
-msgstr ""
+msgstr "privé à des utilisateurs spécifiques"
-#: judge/models/contest.py:98
+#: judge/models/contest.py:104
msgid "private contestants"
msgstr ""
-#: judge/models/contest.py:99
+#: judge/models/contest.py:105
msgid "If private, only these users may see the contest"
-msgstr ""
+msgstr "Si privé, seuls ces utilisateurs peuvent voir le concours"
-#: judge/models/contest.py:101
+#: judge/models/contest.py:107
msgid "hide problem tags"
msgstr ""
-#: judge/models/contest.py:102
+#: judge/models/contest.py:108
msgid "Whether problem tags should be hidden by default."
msgstr ""
-#: judge/models/contest.py:104
-msgid "run pretests only"
+#: judge/models/contest.py:110
+msgid "hide problem authors"
msgstr ""
-#: judge/models/contest.py:105
-msgid "Whether judges should grade pretests only, versus all testcases. Commonly set during a contest, then unset prior to rejudging user submissions when the contest ends."
+#: judge/models/contest.py:111
+msgid "Whether problem authors should be hidden by default."
msgstr ""
-#: judge/models/contest.py:109 judge/models/problem.py:166
+#: judge/models/contest.py:113
+msgid "run pretests only"
+msgstr "exécuter uniquement les prétests"
+
+#: judge/models/contest.py:114
+msgid "Whether judges should grade pretests only, versus all testcases. Commonly set during a contest, then unset prior to rejudging user submissions when the contest ends."
+msgstr "Si les juges ne devraient évaluer que les prétests, par opposition à tous les cas de test. Généralement coché pendant un concours, puis annulé avant de réévaluer les soumissions des utilisateurs à la fin du concours."
+
+#: judge/models/contest.py:118 judge/models/problem.py:183
msgid "private to organizations"
-msgstr ""
+msgstr "privés aux organisations"
-#: judge/models/contest.py:110 judge/models/problem.py:164
-#: judge/models/profile.py:83
+#: judge/models/contest.py:119 judge/models/problem.py:181
+#: judge/models/profile.py:86
msgid "organizations"
msgstr "organisations"
-#: judge/models/contest.py:111
+#: judge/models/contest.py:120
msgid "If private, only these organizations may see the contest"
-msgstr ""
+msgstr "Si privé, seules ces organisations peuvent voir le concours"
-#: judge/models/contest.py:112 judge/models/problem.py:153
+#: judge/models/contest.py:121 judge/models/problem.py:167
msgid "OpenGraph image"
-msgstr ""
+msgstr "Image OpenGraph"
-#: judge/models/contest.py:113 judge/models/profile.py:54
+#: judge/models/contest.py:122 judge/models/profile.py:57
msgid "Logo override image"
-msgstr ""
+msgstr "Image de remplacement du logo"
-#: judge/models/contest.py:115
+#: judge/models/contest.py:124
msgid "This image will replace the default site logo for users inside the contest."
-msgstr ""
+msgstr "Cette image remplacera le logo par défaut du site pour les utilisateurs à l'intérieur du concours."
-#: judge/models/contest.py:118
+#: judge/models/contest.py:127
msgid "the amount of live participants"
-msgstr ""
+msgstr "le nombre de participants en direct"
-#: judge/models/contest.py:119
+#: judge/models/contest.py:128
msgid "contest summary"
-msgstr ""
+msgstr "Résumé du concours"
-#: judge/models/contest.py:120 judge/models/problem.py:155
+#: judge/models/contest.py:129 judge/models/problem.py:169
msgid "Plain-text, shown in meta description tag, e.g. for social media."
-msgstr ""
+msgstr "Texte simple, affiché dans la meta description, par exemple pour les réseaux sociaux."
-#: judge/models/contest.py:121 judge/models/profile.py:53
+#: judge/models/contest.py:130 judge/models/profile.py:56
msgid "access code"
-msgstr ""
+msgstr "code d'accès"
-#: judge/models/contest.py:122
+#: judge/models/contest.py:131
msgid "An optional code to prompt contestants before they are allowed to join the contest. Leave it blank to disable."
msgstr ""
-#: judge/models/contest.py:124 judge/models/problem.py:149
+#: judge/models/contest.py:133 judge/models/problem.py:163
msgid "personae non gratae"
-msgstr ""
+msgstr "personae non gratae"
-#: judge/models/contest.py:125
+#: judge/models/contest.py:134
msgid "Bans the selected users from joining this contest."
-msgstr ""
+msgstr "Banni les utilisateurs sélectionnés de rejoindre ce concours."
-#: judge/models/contest.py:126
+#: judge/models/contest.py:135
msgid "contest format"
-msgstr ""
+msgstr "format de concours"
-#: judge/models/contest.py:127
+#: judge/models/contest.py:136
msgid "The contest format module to use."
-msgstr ""
+msgstr "Le module de format du concours à utiliser."
-#: judge/models/contest.py:128
+#: judge/models/contest.py:137
msgid "contest format configuration"
msgstr ""
-#: judge/models/contest.py:129
+#: judge/models/contest.py:138
msgid "A JSON object to serve as the configuration for the chosen contest format module. Leave empty to use None. Exact format depends on the contest format selected."
-msgstr ""
+msgstr "Un objet JSON pour servir de configuration pour le module de format de concours choisi. Laisser vide pour utiliser Aucune. Le format exact dépend du format du concours sélectionné."
-#: judge/models/contest.py:136
+#: judge/models/contest.py:145
msgid "contest lock"
msgstr ""
-#: judge/models/contest.py:137
-msgid "Prevent submissions from this contest from being rejudged."
+#: judge/models/contest.py:146
+msgid "Prevent submissions from this contest from being rejudged after this date."
msgstr ""
-#: judge/models/contest.py:138
+#: judge/models/contest.py:148
msgid "precision points"
-msgstr ""
+msgstr "points de précision"
-#: judge/models/contest.py:140
+#: judge/models/contest.py:150
msgid "Number of digits to round points to."
-msgstr ""
+msgstr "Nombre de chiffres vers lesquels arrondir les points."
-#: judge/models/contest.py:362
+#: judge/models/contest.py:398
msgid "See private contests"
-msgstr ""
+msgstr "Voir les concours privés"
-#: judge/models/contest.py:363
+#: judge/models/contest.py:399
msgid "Edit own contests"
msgstr "Modifier vos propres concours"
-#: judge/models/contest.py:364
+#: judge/models/contest.py:400
msgid "Edit all contests"
-msgstr ""
+msgstr "Modifier tous les concours"
-#: judge/models/contest.py:365
+#: judge/models/contest.py:401
msgid "Clone contest"
-msgstr ""
+msgstr "Cloner concours"
-#: judge/models/contest.py:366 templates/contest/moss.html:74
+#: judge/models/contest.py:402 templates/contest/moss.html:74
msgid "MOSS contest"
msgstr ""
-#: judge/models/contest.py:367
+#: judge/models/contest.py:403
msgid "Rate contests"
-msgstr ""
+msgstr "Évaluer les concours"
-#: judge/models/contest.py:368
+#: judge/models/contest.py:404
msgid "Contest access codes"
msgstr ""
-#: judge/models/contest.py:369
+#: judge/models/contest.py:405
msgid "Create private contests"
-msgstr ""
+msgstr "Créer des concours privés"
-#: judge/models/contest.py:370
+#: judge/models/contest.py:406
msgid "Change contest visibility"
-msgstr ""
+msgstr "Modifier la visibilité des concours"
-#: judge/models/contest.py:371
+#: judge/models/contest.py:407
msgid "Edit contest problem label script"
-msgstr ""
+msgstr "Modifier le script d'étiquette du problème du concours"
-#: judge/models/contest.py:372
+#: judge/models/contest.py:408
msgid "Change lock status of contest"
-msgstr ""
+msgstr "Changer le statut de verrouillage du concours"
-#: judge/models/contest.py:374 judge/models/contest.py:472
-#: judge/models/contest.py:510 judge/models/contest.py:532
-#: judge/models/submission.py:84
+#: judge/models/contest.py:410 judge/models/contest.py:508
+#: judge/models/contest.py:547 judge/models/contest.py:569
+#: judge/models/submission.py:85
msgid "contest"
msgstr "concours"
-#: judge/models/contest.py:375
+#: judge/models/contest.py:411
msgid "contests"
msgstr "concours"
-#: judge/models/contest.py:382
+#: judge/models/contest.py:418
msgid "associated contest"
-msgstr ""
+msgstr "concours associé"
-#: judge/models/contest.py:385
+#: judge/models/contest.py:421
msgid "score"
msgstr "score"
-#: judge/models/contest.py:386
+#: judge/models/contest.py:422
msgid "cumulative time"
-msgstr ""
+msgstr "temps cumulé"
-#: judge/models/contest.py:387
+#: judge/models/contest.py:423
msgid "is disqualified"
-msgstr ""
+msgstr "Disqualifiée"
-#: judge/models/contest.py:388
+#: judge/models/contest.py:424
msgid "Whether this participation is disqualified."
-msgstr ""
+msgstr "Si cette participation est disqualifiée."
-#: judge/models/contest.py:389
+#: judge/models/contest.py:425
msgid "tie-breaking field"
msgstr ""
-#: judge/models/contest.py:390
+#: judge/models/contest.py:426
msgid "virtual participation id"
-msgstr ""
+msgstr "id de participation virtuelle"
-#: judge/models/contest.py:391
+#: judge/models/contest.py:427
msgid "0 means non-virtual, otherwise the n-th virtual participation."
-msgstr ""
+msgstr "0 signifie non virtuel, sinon la n-ème participation virtuelle."
-#: judge/models/contest.py:392
+#: judge/models/contest.py:428
msgid "contest format specific data"
-msgstr ""
+msgstr "données spécifiques au format du concours"
-#: judge/models/contest.py:458
+#: judge/models/contest.py:494
#, python-format
msgid "%s spectating in %s"
-msgstr ""
+msgstr "%s spectateur dans %s"
-#: judge/models/contest.py:460
+#: judge/models/contest.py:496
#, python-format
msgid "%s in %s, v%d"
msgstr ""
-#: judge/models/contest.py:461
+#: judge/models/contest.py:497
#, python-format
msgid "%s in %s"
-msgstr ""
+msgstr "%s dans %s"
-#: judge/models/contest.py:464
+#: judge/models/contest.py:500
msgid "contest participation"
msgstr ""
-#: judge/models/contest.py:465
+#: judge/models/contest.py:501
msgid "contest participations"
msgstr ""
-#: judge/models/contest.py:471 judge/models/contest.py:494
-#: judge/models/contest.py:533 judge/models/problem.py:430
-#: judge/models/problem.py:435 judge/models/problem.py:453
+#: judge/models/contest.py:507 judge/models/contest.py:531
+#: judge/models/contest.py:570 judge/models/problem.py:457
+#: judge/models/problem.py:462 judge/models/problem.py:480
#: judge/models/problem_data.py:35
msgid "problem"
msgstr "problème"
-#: judge/models/contest.py:473 judge/models/contest.py:498
-#: judge/models/problem.py:137
+#: judge/models/contest.py:509 judge/models/contest.py:535
+#: judge/models/problem.py:151
msgid "points"
msgstr "points"
-#: judge/models/contest.py:474
+#: judge/models/contest.py:510
msgid "partial"
msgstr "partiel"
-#: judge/models/contest.py:475 judge/models/contest.py:499
+#: judge/models/contest.py:511 judge/models/contest.py:536
msgid "is pretested"
-msgstr ""
+msgstr "est prétesté"
-#: judge/models/contest.py:476 judge/models/interface.py:43
+#: judge/models/contest.py:512 judge/models/interface.py:43
msgid "order"
-msgstr ""
+msgstr "ordre"
-#: judge/models/contest.py:477
+#: judge/models/contest.py:513
msgid "output prefix length override"
msgstr ""
-#: judge/models/contest.py:479
+#: judge/models/contest.py:515
msgid "Maximum number of submissions for this problem, or leave blank for no limit."
-msgstr ""
+msgstr "Nombre maximum de soumissions pour ce problème, ou laisser vide pour aucune limite."
-#: judge/models/contest.py:482
+#: judge/models/contest.py:518
msgid "Why include a problem you can't submit to?"
msgstr ""
-#: judge/models/contest.py:487
+#: judge/models/contest.py:523
msgid "contest problem"
msgstr ""
-#: judge/models/contest.py:488
+#: judge/models/contest.py:524
msgid "contest problems"
msgstr ""
-#: judge/models/contest.py:492 judge/models/submission.py:207
+#: judge/models/contest.py:529 judge/models/submission.py:218
msgid "submission"
msgstr "soumission"
-#: judge/models/contest.py:496 judge/models/contest.py:511
+#: judge/models/contest.py:533 judge/models/contest.py:548
msgid "participation"
-msgstr ""
+msgstr "Participation"
-#: judge/models/contest.py:500
+#: judge/models/contest.py:537
msgid "Whether this submission was ran only on pretests."
-msgstr ""
+msgstr "Si cette soumission a été exécutée uniquement sur les pré-tests."
-#: judge/models/contest.py:504
+#: judge/models/contest.py:541
msgid "contest submission"
msgstr ""
-#: judge/models/contest.py:505
+#: judge/models/contest.py:542
msgid "contest submissions"
-msgstr ""
+msgstr "soumissions de concours"
-#: judge/models/contest.py:513
+#: judge/models/contest.py:550
msgid "rank"
-msgstr ""
+msgstr "classement"
-#: judge/models/contest.py:514
+#: judge/models/contest.py:551
msgid "rating"
msgstr "évaluation"
-#: judge/models/contest.py:515
+#: judge/models/contest.py:552
msgid "volatility"
-msgstr ""
+msgstr "Volatilité"
-#: judge/models/contest.py:516
+#: judge/models/contest.py:553
msgid "last rated"
-msgstr ""
+msgstr "dernière évaluation"
-#: judge/models/contest.py:520
+#: judge/models/contest.py:557
msgid "contest rating"
msgstr ""
-#: judge/models/contest.py:521
+#: judge/models/contest.py:558
msgid "contest ratings"
msgstr ""
-#: judge/models/contest.py:540
+#: judge/models/contest.py:577
msgid "contest moss result"
msgstr ""
-#: judge/models/contest.py:541
+#: judge/models/contest.py:578
msgid "contest moss results"
msgstr ""
@@ -1203,7 +1220,7 @@ msgstr ""
msgid "post title"
msgstr ""
-#: judge/models/interface.py:67 judge/models/problem.py:473
+#: judge/models/interface.py:67 judge/models/problem.py:500
msgid "authors"
msgstr "auteurs"
@@ -1211,7 +1228,7 @@ msgstr "auteurs"
msgid "slug"
msgstr ""
-#: judge/models/interface.py:69 judge/models/problem.py:471
+#: judge/models/interface.py:69 judge/models/problem.py:498
msgid "public visibility"
msgstr ""
@@ -1247,34 +1264,6 @@ msgstr ""
msgid "blog posts"
msgstr ""
-#: judge/models/message.py:11
-msgid "message title"
-msgstr ""
-
-#: judge/models/message.py:12 judge/models/ticket.py:30
-msgid "message body"
-msgstr ""
-
-#: judge/models/message.py:13
-msgid "sender"
-msgstr ""
-
-#: judge/models/message.py:14
-msgid "target"
-msgstr ""
-
-#: judge/models/message.py:15
-msgid "message timestamp"
-msgstr ""
-
-#: judge/models/message.py:16
-msgid "read"
-msgstr ""
-
-#: judge/models/message.py:20
-msgid "messages in the thread"
-msgstr ""
-
#: judge/models/problem.py:30
#, python-format
msgid "Disallowed characters: %(value)s"
@@ -1292,7 +1281,7 @@ msgstr ""
msgid "problem type"
msgstr "type de problème"
-#: judge/models/problem.py:44 judge/models/problem.py:121
+#: judge/models/problem.py:44 judge/models/problem.py:135
msgid "problem types"
msgstr ""
@@ -1304,7 +1293,7 @@ msgstr ""
msgid "problem group name"
msgstr ""
-#: judge/models/problem.py:56 judge/models/problem.py:124
+#: judge/models/problem.py:56 judge/models/problem.py:138
msgid "problem group"
msgstr ""
@@ -1324,7 +1313,7 @@ msgstr ""
msgid "full name"
msgstr "nom complet"
-#: judge/models/problem.py:65 judge/models/profile.py:41
+#: judge/models/problem.py:65 judge/models/profile.py:44
#: judge/models/runtime.py:24
msgid "short name"
msgstr ""
@@ -1353,232 +1342,252 @@ msgstr "licence"
msgid "licenses"
msgstr "licenses"
-#: judge/models/problem.py:104
+#: judge/models/problem.py:112
+msgid "Follow global setting"
+msgstr ""
+
+#: judge/models/problem.py:113
+msgid "Always visible"
+msgstr ""
+
+#: judge/models/problem.py:114
+msgid "Visible if problem solved"
+msgstr ""
+
+#: judge/models/problem.py:115
+msgid "Only own submissions"
+msgstr ""
+
+#: judge/models/problem.py:118
msgid "problem code"
msgstr ""
-#: judge/models/problem.py:106
+#: judge/models/problem.py:120
msgid "A short, unique code for the problem, used in the url after /problem/"
msgstr ""
-#: judge/models/problem.py:108
+#: judge/models/problem.py:122
msgid "problem name"
msgstr ""
-#: judge/models/problem.py:109
+#: judge/models/problem.py:123
msgid "The full name of the problem, as shown in the problem list."
msgstr ""
-#: judge/models/problem.py:111
+#: judge/models/problem.py:125
msgid "problem body"
msgstr ""
-#: judge/models/problem.py:112
+#: judge/models/problem.py:126
msgid "creators"
msgstr ""
-#: judge/models/problem.py:113
+#: judge/models/problem.py:127
msgid "These users will be able to edit the problem, and be listed as authors."
msgstr ""
-#: judge/models/problem.py:115
+#: judge/models/problem.py:129
msgid "curators"
msgstr ""
-#: judge/models/problem.py:116
+#: judge/models/problem.py:130
msgid "These users will be able to edit the problem, but not be listed as authors."
msgstr ""
-#: judge/models/problem.py:118
+#: judge/models/problem.py:132
msgid "testers"
msgstr ""
-#: judge/models/problem.py:120
+#: judge/models/problem.py:134
msgid "These users will be able to view the private problem, but not edit it."
msgstr ""
-#: judge/models/problem.py:122
+#: judge/models/problem.py:136
msgid "The type of problem, as shown on the problem's page."
msgstr ""
-#: judge/models/problem.py:125
+#: judge/models/problem.py:139
msgid "The group of problem, shown under Category in the problem list."
msgstr ""
-#: judge/models/problem.py:127
+#: judge/models/problem.py:141
msgid "The time limit for this problem, in seconds. Fractional seconds (e.g. 1.5) are supported."
msgstr ""
-#: judge/models/problem.py:131 judge/models/problem.py:458
+#: judge/models/problem.py:145 judge/models/problem.py:485
msgid "memory limit"
msgstr "limite de mémoire"
-#: judge/models/problem.py:132
+#: judge/models/problem.py:146
msgid "The memory limit for this problem, in kilobytes (e.g. 64mb = 65536 kilobytes)."
msgstr ""
-#: judge/models/problem.py:138
+#: judge/models/problem.py:152
msgid "Points awarded for problem completion. Points are displayed with a 'p' suffix if partial."
msgstr ""
-#: judge/models/problem.py:141
+#: judge/models/problem.py:155
msgid "allows partial points"
msgstr ""
-#: judge/models/problem.py:142
+#: judge/models/problem.py:156
msgid "allowed languages"
msgstr "langages autorisées"
-#: judge/models/problem.py:143
+#: judge/models/problem.py:157
msgid "List of allowed submission languages."
msgstr ""
-#: judge/models/problem.py:145
+#: judge/models/problem.py:159
msgid "manually managed"
msgstr ""
-#: judge/models/problem.py:146
+#: judge/models/problem.py:160
msgid "Whether judges should be allowed to manage data or not."
msgstr ""
-#: judge/models/problem.py:147
+#: judge/models/problem.py:161
msgid "date of publishing"
msgstr ""
-#: judge/models/problem.py:148
+#: judge/models/problem.py:162
msgid "Doesn't have magic ability to auto-publish due to backward compatibility"
msgstr ""
-#: judge/models/problem.py:150
+#: judge/models/problem.py:164
msgid "Bans the selected users from submitting to this problem."
msgstr ""
-#: judge/models/problem.py:152
+#: judge/models/problem.py:166
msgid "The license under which this problem is published."
msgstr ""
-#: judge/models/problem.py:154
+#: judge/models/problem.py:168
msgid "problem summary"
msgstr ""
-#: judge/models/problem.py:156
+#: judge/models/problem.py:170
msgid "number of users"
msgstr ""
-#: judge/models/problem.py:157
+#: judge/models/problem.py:171
msgid "The number of users who solved the problem."
msgstr ""
-#: judge/models/problem.py:158
+#: judge/models/problem.py:172
msgid "solve rate"
msgstr ""
-#: judge/models/problem.py:159
+#: judge/models/problem.py:173
msgid "allow full markdown access"
msgstr ""
-#: judge/models/problem.py:165
+#: judge/models/problem.py:174
+msgid "submission source visibility"
+msgstr ""
+
+#: judge/models/problem.py:182
msgid "If private, only these organizations may see the problem."
msgstr ""
-#: judge/models/problem.py:420
+#: judge/models/problem.py:447
msgid "See hidden problems"
msgstr ""
-#: judge/models/problem.py:421
+#: judge/models/problem.py:448
msgid "Edit own problems"
msgstr ""
-#: judge/models/problem.py:422
+#: judge/models/problem.py:449
msgid "Edit all problems"
msgstr ""
-#: judge/models/problem.py:423
+#: judge/models/problem.py:450
msgid "Edit all public problems"
msgstr ""
-#: judge/models/problem.py:424
+#: judge/models/problem.py:451
msgid "Edit problems with full markup"
msgstr ""
-#: judge/models/problem.py:425 templates/problem/problem.html:161
+#: judge/models/problem.py:452 templates/problem/problem.html:161
msgid "Clone problem"
msgstr ""
-#: judge/models/problem.py:426
+#: judge/models/problem.py:453
msgid "Change is_public field"
msgstr ""
-#: judge/models/problem.py:427
+#: judge/models/problem.py:454
msgid "Change is_manually_managed field"
msgstr ""
-#: judge/models/problem.py:428
+#: judge/models/problem.py:455
msgid "See organization-private problems"
msgstr ""
-#: judge/models/problem.py:436 judge/models/problem.py:454
+#: judge/models/problem.py:463 judge/models/problem.py:481
#: judge/models/runtime.py:111
msgid "language"
msgstr "langue"
-#: judge/models/problem.py:437
+#: judge/models/problem.py:464
msgid "translated name"
msgstr ""
-#: judge/models/problem.py:438
+#: judge/models/problem.py:465
msgid "translated description"
msgstr ""
-#: judge/models/problem.py:442
+#: judge/models/problem.py:469
msgid "problem translation"
msgstr ""
-#: judge/models/problem.py:443
+#: judge/models/problem.py:470
msgid "problem translations"
msgstr ""
-#: judge/models/problem.py:447
+#: judge/models/problem.py:474
msgid "clarified problem"
msgstr ""
-#: judge/models/problem.py:448
+#: judge/models/problem.py:475
msgid "clarification body"
msgstr ""
-#: judge/models/problem.py:449
+#: judge/models/problem.py:476
msgid "clarification timestamp"
msgstr ""
-#: judge/models/problem.py:464
+#: judge/models/problem.py:491
msgid "language-specific resource limit"
msgstr "limite de ressources spécifiques à un language"
-#: judge/models/problem.py:465
+#: judge/models/problem.py:492
msgid "language-specific resource limits"
msgstr "limites de ressources spécifiques à un language"
-#: judge/models/problem.py:469
+#: judge/models/problem.py:496
msgid "associated problem"
msgstr ""
-#: judge/models/problem.py:472
+#: judge/models/problem.py:499
msgid "publish date"
msgstr ""
-#: judge/models/problem.py:474
+#: judge/models/problem.py:501
msgid "editorial content"
msgstr ""
-#: judge/models/problem.py:497
+#: judge/models/problem.py:524
msgid "See hidden solutions"
msgstr ""
-#: judge/models/problem.py:499
+#: judge/models/problem.py:526
msgid "solution"
msgstr "solution"
-#: judge/models/problem.py:500
+#: judge/models/problem.py:527
msgid "solutions"
msgstr "solutions"
@@ -1690,112 +1699,112 @@ msgstr ""
msgid "case is pretest?"
msgstr ""
-#: judge/models/profile.py:38
+#: judge/models/profile.py:41
msgid "organization title"
msgstr ""
-#: judge/models/profile.py:39
+#: judge/models/profile.py:42
msgid "organization slug"
msgstr ""
-#: judge/models/profile.py:40
+#: judge/models/profile.py:43
msgid "Organization name shown in URL"
msgstr ""
-#: judge/models/profile.py:42
+#: judge/models/profile.py:45
msgid "Displayed beside user name during contests"
msgstr ""
-#: judge/models/profile.py:43
+#: judge/models/profile.py:46
msgid "organization description"
msgstr ""
-#: judge/models/profile.py:44
+#: judge/models/profile.py:47
msgid "administrators"
msgstr ""
-#: judge/models/profile.py:45
+#: judge/models/profile.py:48
msgid "Those who can edit this organization"
msgstr "Ceux qui peuvent modifier cette organisation"
-#: judge/models/profile.py:46
+#: judge/models/profile.py:49
msgid "creation date"
msgstr "date de création"
-#: judge/models/profile.py:47
+#: judge/models/profile.py:50
msgid "is open organization?"
msgstr ""
-#: judge/models/profile.py:48
+#: judge/models/profile.py:51
msgid "Allow joining organization"
msgstr "Permettre de rejoindre l'Organisation"
-#: judge/models/profile.py:49
+#: judge/models/profile.py:52
msgid "maximum size"
msgstr "taille maximum"
-#: judge/models/profile.py:50
+#: judge/models/profile.py:53
msgid "Maximum amount of users in this organization, only applicable to private organizations"
msgstr ""
-#: judge/models/profile.py:52
+#: judge/models/profile.py:55
msgid "Student access code"
msgstr ""
-#: judge/models/profile.py:56
+#: judge/models/profile.py:59
msgid "This image will replace the default site logo for users viewing the organization."
msgstr ""
-#: judge/models/profile.py:79
+#: judge/models/profile.py:82
msgid "Administer organizations"
msgstr ""
-#: judge/models/profile.py:80
+#: judge/models/profile.py:83
msgid "Edit all organizations"
msgstr ""
-#: judge/models/profile.py:82 judge/models/profile.py:99
-#: judge/models/profile.py:269
+#: judge/models/profile.py:85 judge/models/profile.py:102
+#: judge/models/profile.py:293
msgid "organization"
msgstr "organisation"
-#: judge/models/profile.py:87
+#: judge/models/profile.py:90
msgid "user associated"
msgstr ""
-#: judge/models/profile.py:88
+#: judge/models/profile.py:91
msgid "self-description"
msgstr ""
-#: judge/models/profile.py:89
+#: judge/models/profile.py:92
msgid "location"
msgstr ""
-#: judge/models/profile.py:91
+#: judge/models/profile.py:94
msgid "preferred language"
msgstr "langage préféré"
-#: judge/models/profile.py:97
+#: judge/models/profile.py:100
msgid "last access time"
msgstr ""
-#: judge/models/profile.py:98
+#: judge/models/profile.py:101
msgid "last IP"
msgstr ""
-#: judge/models/profile.py:101
+#: judge/models/profile.py:104
msgid "display rank"
msgstr ""
-#: judge/models/profile.py:103
+#: judge/models/profile.py:106
msgid "Normal User"
msgstr ""
-#: judge/models/profile.py:104
+#: judge/models/profile.py:107
msgid "Problem Setter"
msgstr ""
-#: judge/models/profile.py:105 templates/base.html:220
+#: judge/models/profile.py:108 templates/base.html:220
#: templates/comments/list.html:99 templates/contest/contest-list-tabs.html:24
#: templates/contest/ranking-table.html:49
#: templates/problem/problem-list-tabs.html:6
@@ -1804,155 +1813,167 @@ msgstr ""
msgid "Admin"
msgstr "Admin"
-#: judge/models/profile.py:106
+#: judge/models/profile.py:109
msgid "comment mute"
msgstr ""
-#: judge/models/profile.py:106
+#: judge/models/profile.py:109
msgid "Some users are at their best when silent."
msgstr ""
-#: judge/models/profile.py:108
+#: judge/models/profile.py:111
msgid "unlisted user"
msgstr ""
-#: judge/models/profile.py:108
+#: judge/models/profile.py:111
msgid "User will not be ranked."
msgstr ""
-#: judge/models/profile.py:111
+#: judge/models/profile.py:114
msgid "user script"
msgstr ""
-#: judge/models/profile.py:112
+#: judge/models/profile.py:115
msgid "User-defined JavaScript for site customization."
msgstr ""
-#: judge/models/profile.py:113
+#: judge/models/profile.py:116
msgid "current contest"
msgstr ""
-#: judge/models/profile.py:115
+#: judge/models/profile.py:118
msgid "math engine"
msgstr ""
-#: judge/models/profile.py:117
+#: judge/models/profile.py:120
msgid "the rendering engine used to render math"
msgstr ""
-#: judge/models/profile.py:118
+#: judge/models/profile.py:121
msgid "TOTP 2FA enabled"
msgstr ""
-#: judge/models/profile.py:119
+#: judge/models/profile.py:122
msgid "check to enable TOTP-based two-factor authentication"
msgstr ""
-#: judge/models/profile.py:120
+#: judge/models/profile.py:123
msgid "WebAuthn 2FA enabled"
msgstr ""
-#: judge/models/profile.py:121
+#: judge/models/profile.py:124
msgid "check to enable WebAuthn-based two-factor authentication"
msgstr ""
-#: judge/models/profile.py:122
+#: judge/models/profile.py:125
msgid "TOTP key"
msgstr ""
-#: judge/models/profile.py:123
+#: judge/models/profile.py:126
msgid "32 character base32-encoded key for TOTP"
msgstr ""
-#: judge/models/profile.py:125
+#: judge/models/profile.py:128
msgid "TOTP key must be empty or base32"
msgstr ""
-#: judge/models/profile.py:126
+#: judge/models/profile.py:129
msgid "scratch codes"
msgstr ""
-#: judge/models/profile.py:127
+#: judge/models/profile.py:130
msgid "JSON array of 16 character base32-encoded codes for scratch codes"
msgstr ""
-#: judge/models/profile.py:131
+#: judge/models/profile.py:134
msgid "Scratch codes must be empty or a JSON array of 16-character base32 codes"
msgstr ""
-#: judge/models/profile.py:133
+#: judge/models/profile.py:136
+msgid "last TOTP timecode"
+msgstr ""
+
+#: judge/models/profile.py:137
msgid "API token"
msgstr ""
-#: judge/models/profile.py:134
+#: judge/models/profile.py:138
msgid "64 character hex-encoded API access token"
msgstr ""
-#: judge/models/profile.py:136
+#: judge/models/profile.py:140
msgid "API token must be None or hexadecimal"
msgstr ""
-#: judge/models/profile.py:137
+#: judge/models/profile.py:141
msgid "internal notes"
msgstr ""
-#: judge/models/profile.py:138
+#: judge/models/profile.py:142
msgid "Notes for administrators regarding this user."
msgstr ""
-#: judge/models/profile.py:139
+#: judge/models/profile.py:143
msgid "last data download time"
msgstr ""
-#: judge/models/profile.py:236
+#: judge/models/profile.py:253
msgid "Shows in-progress development stuff"
msgstr ""
-#: judge/models/profile.py:237
+#: judge/models/profile.py:254
msgid "Edit TOTP settings"
msgstr ""
-#: judge/models/profile.py:239
+#: judge/models/profile.py:256
msgid "user profile"
msgstr "profil utilisateur"
-#: judge/models/profile.py:240
+#: judge/models/profile.py:257
msgid "user profiles"
msgstr ""
-#: judge/models/profile.py:246
+#: judge/models/profile.py:263
msgid "device name"
msgstr ""
-#: judge/models/profile.py:247
+#: judge/models/profile.py:264
msgid "credential ID"
msgstr ""
-#: judge/models/profile.py:248
+#: judge/models/profile.py:265
msgid "public key"
msgstr ""
-#: judge/models/profile.py:249
+#: judge/models/profile.py:266
msgid "sign counter"
msgstr ""
-#: judge/models/profile.py:271
+#: judge/models/profile.py:287
+msgid "WebAuthn credential"
+msgstr ""
+
+#: judge/models/profile.py:288
+msgid "WebAuthn credentials"
+msgstr ""
+
+#: judge/models/profile.py:295
msgid "request time"
msgstr ""
-#: judge/models/profile.py:272
+#: judge/models/profile.py:296
msgid "state"
msgstr ""
-#: judge/models/profile.py:277
+#: judge/models/profile.py:301
msgid "reason"
msgstr "raison"
-#: judge/models/profile.py:280
+#: judge/models/profile.py:304
msgid "organization join request"
msgstr ""
-#: judge/models/profile.py:281
+#: judge/models/profile.py:305
msgid "organization join requests"
msgstr ""
@@ -2108,210 +2129,210 @@ msgstr ""
msgid "judge"
msgstr ""
-#: judge/models/submission.py:20 judge/models/submission.py:47
+#: judge/models/submission.py:21 judge/models/submission.py:48
#: judge/utils/problems.py:74
msgid "Accepted"
msgstr "Accepté"
-#: judge/models/submission.py:21 judge/models/submission.py:48
+#: judge/models/submission.py:22 judge/models/submission.py:49
msgid "Wrong Answer"
msgstr "Mauvaise réponse"
-#: judge/models/submission.py:22 judge/models/submission.py:50
+#: judge/models/submission.py:23 judge/models/submission.py:51
msgid "Time Limit Exceeded"
msgstr "Limite temps dépassée"
-#: judge/models/submission.py:23 judge/models/submission.py:51
+#: judge/models/submission.py:24 judge/models/submission.py:52
msgid "Memory Limit Exceeded"
msgstr "Limite mémoire dépassée"
-#: judge/models/submission.py:24 judge/models/submission.py:52
+#: judge/models/submission.py:25 judge/models/submission.py:53
msgid "Output Limit Exceeded"
msgstr ""
-#: judge/models/submission.py:25 judge/models/submission.py:53
+#: judge/models/submission.py:26 judge/models/submission.py:54
msgid "Invalid Return"
msgstr "Retour invalide"
-#: judge/models/submission.py:26 judge/models/submission.py:54
+#: judge/models/submission.py:27 judge/models/submission.py:55
msgid "Runtime Error"
msgstr "Erreur d'exécution"
-#: judge/models/submission.py:27 judge/models/submission.py:41
-#: judge/models/submission.py:55 judge/utils/problems.py:76
+#: judge/models/submission.py:28 judge/models/submission.py:42
+#: judge/models/submission.py:56 judge/utils/problems.py:76
msgid "Compile Error"
msgstr "Erreur de compilation"
-#: judge/models/submission.py:28 judge/models/submission.py:40
+#: judge/models/submission.py:29 judge/models/submission.py:41
msgid "Internal Error"
msgstr "Erreur interne"
-#: judge/models/submission.py:29
+#: judge/models/submission.py:30
msgid "Short circuit"
msgstr "Court circuit"
-#: judge/models/submission.py:30 judge/models/submission.py:42
-#: judge/models/submission.py:61
+#: judge/models/submission.py:31 judge/models/submission.py:43
+#: judge/models/submission.py:62
msgid "Aborted"
msgstr "Abandonné"
-#: judge/models/submission.py:36 judge/models/submission.py:57
+#: judge/models/submission.py:37 judge/models/submission.py:58
msgid "Queued"
msgstr "En file d'attente"
-#: judge/models/submission.py:37 judge/models/submission.py:58
+#: judge/models/submission.py:38 judge/models/submission.py:59
msgid "Processing"
msgstr "En cours de traitement"
-#: judge/models/submission.py:38 judge/models/submission.py:59
+#: judge/models/submission.py:39 judge/models/submission.py:60
msgid "Grading"
msgstr "En cours de notation"
-#: judge/models/submission.py:39 judge/models/submission.py:60
+#: judge/models/submission.py:40 judge/models/submission.py:61
msgid "Completed"
msgstr "Terminé"
-#: judge/models/submission.py:56
+#: judge/models/submission.py:57
msgid "Internal Error (judging server error)"
msgstr ""
-#: judge/models/submission.py:66
+#: judge/models/submission.py:67
msgid "submission time"
msgstr ""
-#: judge/models/submission.py:67 judge/models/submission.py:227
+#: judge/models/submission.py:68 judge/models/submission.py:238
msgid "execution time"
msgstr ""
-#: judge/models/submission.py:68 judge/models/submission.py:228
+#: judge/models/submission.py:69 judge/models/submission.py:239
msgid "memory usage"
msgstr ""
-#: judge/models/submission.py:69 judge/models/submission.py:229
+#: judge/models/submission.py:70 judge/models/submission.py:240
msgid "points granted"
msgstr ""
-#: judge/models/submission.py:70
+#: judge/models/submission.py:71
msgid "submission language"
msgstr ""
-#: judge/models/submission.py:71
+#: judge/models/submission.py:72
msgid "status"
msgstr ""
-#: judge/models/submission.py:72
+#: judge/models/submission.py:73
msgid "result"
msgstr ""
-#: judge/models/submission.py:74
+#: judge/models/submission.py:75
msgid "compile errors"
msgstr ""
-#: judge/models/submission.py:76
+#: judge/models/submission.py:77
msgid "batched cases"
msgstr ""
-#: judge/models/submission.py:77
+#: judge/models/submission.py:78
msgid "test case points"
msgstr ""
-#: judge/models/submission.py:78
+#: judge/models/submission.py:79
msgid "test case total points"
msgstr ""
-#: judge/models/submission.py:79
+#: judge/models/submission.py:80
msgid "judged on"
msgstr ""
-#: judge/models/submission.py:81
+#: judge/models/submission.py:82
msgid "submission judge time"
msgstr ""
-#: judge/models/submission.py:82
-msgid "was rejudged by admin"
+#: judge/models/submission.py:83
+msgid "last rejudge date by admin"
msgstr ""
-#: judge/models/submission.py:83
+#: judge/models/submission.py:84
msgid "was ran on pretests only"
msgstr ""
-#: judge/models/submission.py:86
-msgid "lock submission"
+#: judge/models/submission.py:87
+msgid "submission lock"
msgstr ""
-#: judge/models/submission.py:199
+#: judge/models/submission.py:210
msgid "Abort any submission"
msgstr ""
-#: judge/models/submission.py:200
+#: judge/models/submission.py:211
msgid "Rejudge the submission"
msgstr ""
-#: judge/models/submission.py:201
+#: judge/models/submission.py:212
msgid "Rejudge a lot of submissions"
msgstr ""
-#: judge/models/submission.py:202
+#: judge/models/submission.py:213
msgid "Submit without limit"
msgstr ""
-#: judge/models/submission.py:203
+#: judge/models/submission.py:214
msgid "View all submission"
msgstr ""
-#: judge/models/submission.py:204
+#: judge/models/submission.py:215
msgid "Resubmit others' submission"
msgstr ""
-#: judge/models/submission.py:205
+#: judge/models/submission.py:216
msgid "Change lock status of submission"
msgstr ""
-#: judge/models/submission.py:208 templates/contest/moss.html:58
+#: judge/models/submission.py:219 templates/contest/moss.html:58
msgid "submissions"
msgstr "soumissions"
-#: judge/models/submission.py:212 judge/models/submission.py:223
+#: judge/models/submission.py:223 judge/models/submission.py:234
msgid "associated submission"
msgstr ""
-#: judge/models/submission.py:214
+#: judge/models/submission.py:225
msgid "source code"
msgstr ""
-#: judge/models/submission.py:225
+#: judge/models/submission.py:236
msgid "test case ID"
msgstr ""
-#: judge/models/submission.py:226
+#: judge/models/submission.py:237
msgid "status flag"
msgstr ""
-#: judge/models/submission.py:230
+#: judge/models/submission.py:241
msgid "points possible"
msgstr ""
-#: judge/models/submission.py:231
+#: judge/models/submission.py:242
msgid "batch number"
msgstr ""
-#: judge/models/submission.py:232
+#: judge/models/submission.py:243
msgid "judging feedback"
msgstr ""
-#: judge/models/submission.py:233
+#: judge/models/submission.py:244
msgid "extended judging feedback"
msgstr ""
-#: judge/models/submission.py:234
+#: judge/models/submission.py:245
msgid "program output"
msgstr ""
-#: judge/models/submission.py:242
+#: judge/models/submission.py:253
msgid "submission test case"
msgstr ""
-#: judge/models/submission.py:243
+#: judge/models/submission.py:254
msgid "submission test cases"
msgstr ""
@@ -2359,6 +2380,10 @@ msgstr ""
msgid "poster"
msgstr ""
+#: judge/models/ticket.py:30
+msgid "message body"
+msgstr ""
+
#: judge/models/ticket.py:31
msgid "message time"
msgstr ""
@@ -2381,19 +2406,23 @@ msgstr ""
msgid "Running MOSS"
msgstr ""
-#: judge/tasks/submission.py:43
+#: judge/tasks/submission.py:45
msgid "Modifying submissions"
msgstr ""
-#: judge/tasks/submission.py:56
+#: judge/tasks/submission.py:58
msgid "Recalculating user points"
msgstr ""
-#: judge/tasks/user.py:50
+#: judge/tasks/user.py:49
+msgid "Applying filters"
+msgstr ""
+
+#: judge/tasks/user.py:64
msgid "Preparing your submission data"
msgstr ""
-#: judge/tasks/user.py:81
+#: judge/tasks/user.py:95
msgid "Preparing your comment data"
msgstr ""
@@ -2506,7 +2535,7 @@ msgstr ""
msgid "You already voted."
msgstr ""
-#: judge/views/comment.py:129 judge/views/organization.py:298
+#: judge/views/comment.py:129 judge/views/organization.py:297
msgid "Edited from site"
msgstr ""
@@ -2514,125 +2543,130 @@ msgstr ""
msgid "Editing comment"
msgstr ""
-#: judge/views/contests.py:56 judge/views/contests.py:201
-#: judge/views/contests.py:204 judge/views/contests.py:382
+#: judge/views/contests.py:57 judge/views/contests.py:210
+#: judge/views/contests.py:213 judge/views/contests.py:395
msgid "No such contest"
msgstr ""
-#: judge/views/contests.py:57 judge/views/contests.py:202
+#: judge/views/contests.py:58 judge/views/contests.py:211
#, python-format
msgid "Could not find a contest with the key \"%s\"."
msgstr ""
-#: judge/views/contests.py:70
+#: judge/views/contests.py:71
msgid "Contests"
msgstr "Concours"
-#: judge/views/contests.py:205
+#: judge/views/contests.py:214
msgid "Could not find such contest."
msgstr ""
-#: judge/views/contests.py:208
+#: judge/views/contests.py:217
#, python-format
msgid "Access to contest \"%s\" denied"
msgstr ""
-#: judge/views/contests.py:235
+#: judge/views/contests.py:244
msgid "Clone Contest"
msgstr ""
-#: judge/views/contests.py:301
+#: judge/views/contests.py:278
+#, python-format
+msgid "Cloned contest from %s"
+msgstr ""
+
+#: judge/views/contests.py:314
msgid "Contest not ongoing"
msgstr ""
-#: judge/views/contests.py:302
+#: judge/views/contests.py:315
#, python-format
msgid "\"%s\" is not currently ongoing."
msgstr ""
-#: judge/views/contests.py:306
+#: judge/views/contests.py:319
msgid "Already in contest"
msgstr ""
-#: judge/views/contests.py:307
+#: judge/views/contests.py:320
#, python-format
msgid "You are already in a contest: \"%s\"."
msgstr ""
-#: judge/views/contests.py:310
+#: judge/views/contests.py:323
msgid "Banned from joining"
msgstr ""
-#: judge/views/contests.py:311
+#: judge/views/contests.py:324
msgid "You have been declared persona non grata for this contest. You are permanently barred from joining this contest."
msgstr ""
-#: judge/views/contests.py:372
+#: judge/views/contests.py:385
#, python-format
msgid "Enter access code for \"%s\""
msgstr ""
-#: judge/views/contests.py:383
+#: judge/views/contests.py:396
#, python-format
msgid "You are not in contest \"%s\"."
msgstr ""
-#: judge/views/contests.py:402
+#: judge/views/contests.py:415
msgid "ContestCalendar requires integer year and month"
msgstr ""
-#: judge/views/contests.py:442
+#: judge/views/contests.py:455
#, python-format
msgid "Contests in %(month)s"
msgstr ""
-#: judge/views/contests.py:442
+#: judge/views/contests.py:455
msgid "F Y"
msgstr ""
-#: judge/views/contests.py:489
+#: judge/views/contests.py:502
#, python-format
msgid "%s Statistics"
msgstr ""
-#: judge/views/contests.py:662
+#: judge/views/contests.py:675
#, python-format
msgid "%s Rankings"
msgstr ""
-#: judge/views/contests.py:670
+#: judge/views/contests.py:683
msgid "???"
msgstr ""
-#: judge/views/contests.py:686
+#: judge/views/contests.py:699
#, python-format
msgid "Your participation in %s"
msgstr ""
-#: judge/views/contests.py:687
+#: judge/views/contests.py:700
#, python-format
msgid "%s's participation in %s"
msgstr ""
-#: judge/views/contests.py:694
+#: judge/views/contests.py:707
msgid "Live"
msgstr ""
-#: judge/views/contests.py:706 templates/contest/contest-tabs.html:13
+#: judge/views/contests.py:719 templates/contest/contest-tabs.html:13
msgid "Participation"
msgstr ""
-#: judge/views/contests.py:750
+#: judge/views/contests.py:763
#, python-format
msgid "%s MOSS Results"
msgstr ""
-#: judge/views/contests.py:777
+#: judge/views/contests.py:790
#, python-format
msgid "Running MOSS for %s..."
msgstr ""
-#: judge/views/contests.py:800
+#: judge/views/contests.py:813
#, python-format
msgid "Contest tag: %s"
msgstr ""
@@ -2661,163 +2695,177 @@ msgstr ""
msgid "Runtimes"
msgstr ""
-#: judge/views/organization.py:44 judge/views/organization.py:47
+#: judge/views/organization.py:43 judge/views/organization.py:46
msgid "No such organization"
msgstr ""
-#: judge/views/organization.py:45
+#: judge/views/organization.py:44
#, python-format
msgid "Could not find an organization with the key \"%s\"."
msgstr ""
-#: judge/views/organization.py:48
+#: judge/views/organization.py:47
msgid "Could not find such organization."
msgstr ""
-#: judge/views/organization.py:72 judge/views/register.py:34
+#: judge/views/organization.py:71 judge/views/register.py:33
#: templates/organization/list.html:15 templates/user/user-list-tabs.html:5
msgid "Organizations"
msgstr ""
-#: judge/views/organization.py:93
+#: judge/views/organization.py:92
#, python-format
msgid "%s Members"
msgstr ""
-#: judge/views/organization.py:118 judge/views/organization.py:121
-#: judge/views/organization.py:126
+#: judge/views/organization.py:117 judge/views/organization.py:120
+#: judge/views/organization.py:125
msgid "Joining organization"
msgstr ""
-#: judge/views/organization.py:118
+#: judge/views/organization.py:117
msgid "You are already in the organization."
msgstr ""
-#: judge/views/organization.py:121
+#: judge/views/organization.py:120
msgid "This organization is not open."
msgstr ""
-#: judge/views/organization.py:138
+#: judge/views/organization.py:137
msgid "Leaving organization"
msgstr ""
-#: judge/views/organization.py:138
+#: judge/views/organization.py:137
#, python-format
msgid "You are not in \"%s\"."
msgstr ""
-#: judge/views/organization.py:162
+#: judge/views/organization.py:161
#, python-format
msgid "Request to join %s"
msgstr ""
-#: judge/views/organization.py:180
+#: judge/views/organization.py:179
msgid "Join request detail"
msgstr ""
-#: judge/views/organization.py:208
+#: judge/views/organization.py:207
#, python-format
msgid "Managing join requests for %s"
msgstr ""
-#: judge/views/organization.py:239
+#: judge/views/organization.py:238
#, python-format
msgid "Your organization can only receive %d more members. You cannot approve %d users."
msgstr ""
-#: judge/views/organization.py:251
+#: judge/views/organization.py:250
#, python-format
msgid "Approved %d user."
msgid_plural "Approved %d users."
msgstr[0] ""
msgstr[1] ""
-#: judge/views/organization.py:252
+#: judge/views/organization.py:251
#, python-format
msgid "Rejected %d user."
msgid_plural "Rejected %d users."
msgstr[0] ""
msgstr[1] ""
-#: judge/views/organization.py:282
+#: judge/views/organization.py:281
#, python-format
msgid "Editing %s"
msgstr ""
-#: judge/views/organization.py:306 judge/views/organization.py:314
+#: judge/views/organization.py:305 judge/views/organization.py:313
msgid "Can't edit organization"
msgstr ""
-#: judge/views/organization.py:307
+#: judge/views/organization.py:306
msgid "You are not allowed to edit this organization."
msgstr ""
-#: judge/views/organization.py:315
+#: judge/views/organization.py:314
msgid "You are not allowed to kick people from this organization."
msgstr ""
-#: judge/views/organization.py:320 judge/views/organization.py:324
+#: judge/views/organization.py:319 judge/views/organization.py:323
msgid "Can't kick user"
msgstr ""
-#: judge/views/organization.py:321
+#: judge/views/organization.py:320
msgid "The user you are trying to kick does not exist!"
msgstr ""
-#: judge/views/organization.py:325
+#: judge/views/organization.py:324
#, python-format
msgid "The user you are trying to kick is not in organization: %s."
msgstr ""
-#: judge/views/problem.py:67
+#: judge/views/problem.py:68
msgid "No such problem"
msgstr ""
-#: judge/views/problem.py:68
+#: judge/views/problem.py:69
#, python-format
msgid "Could not find a problem with the code \"%s\"."
msgstr ""
-#: judge/views/problem.py:110
+#: judge/views/problem.py:111
#, python-brace-format
msgid "Editorial for {0}"
msgstr ""
-#: judge/views/problem.py:113
+#: judge/views/problem.py:114
#, python-brace-format
msgid "Editorial for {0}"
msgstr ""
-#: judge/views/problem.py:283 templates/contest/contest.html:79
+#: judge/views/problem.py:133
+msgid "No such editorial"
+msgstr ""
+
+#: judge/views/problem.py:134
+#, python-format
+msgid "Could not find an editorial with the code \"%s\"."
+msgstr ""
+
+#: judge/views/problem.py:289 templates/contest/contest.html:79
#: templates/user/user-tabs.html:5 templates/user/users-table.html:23
msgid "Problems"
msgstr "Problèmes"
-#: judge/views/problem.py:556 judge/views/problem.py:564
+#: judge/views/problem.py:562 judge/views/problem.py:570
#, python-format
msgid "Submit to %s"
msgstr ""
-#: judge/views/problem.py:613
+#: judge/views/problem.py:619
msgid "Banned from submitting"
msgstr ""
-#: judge/views/problem.py:614
+#: judge/views/problem.py:620
msgid "You have been declared persona non grata for this problem. You are permanently barred from submitting this problem."
msgstr ""
-#: judge/views/problem.py:618
+#: judge/views/problem.py:624
msgid "Too many submissions"
msgstr ""
-#: judge/views/problem.py:619
+#: judge/views/problem.py:625
msgid "You have exceeded the submission limit for this problem."
msgstr ""
-#: judge/views/problem.py:681
+#: judge/views/problem.py:693
msgid "Clone Problem"
msgstr ""
+#: judge/views/problem.py:720
+#, python-format
+msgid "Cloned problem from %s"
+msgstr ""
+
#: judge/views/problem_data.py:37
msgid "Checker arguments must be a JSON object"
msgstr ""
@@ -2887,52 +2935,52 @@ msgstr "Les meilleures solutions pour %s"
msgid "Best solutions for {0}"
msgstr "Les meilleures solutions pour {0}"
-#: judge/views/ranked_submission.py:80
+#: judge/views/ranked_submission.py:82
#, python-format
msgid "Best solutions for %(problem)s in %(contest)s"
msgstr ""
-#: judge/views/ranked_submission.py:83
+#: judge/views/ranked_submission.py:85
#, python-format
msgid "Best solutions for problem %(number)s in %(contest)s"
msgstr ""
-#: judge/views/ranked_submission.py:89
+#: judge/views/ranked_submission.py:91
#, python-brace-format
msgid "Best solutions for {0} in {2}"
msgstr ""
-#: judge/views/ranked_submission.py:92
+#: judge/views/ranked_submission.py:94
#, python-brace-format
msgid "Best solutions for problem {0} in {1}"
msgstr ""
-#: judge/views/register.py:27
+#: judge/views/register.py:26
msgid "A username must contain letters, numbers, or underscores"
msgstr ""
-#: judge/views/register.py:31
+#: judge/views/register.py:30
msgid "Preferred language"
msgstr "Langue préférée"
-#: judge/views/register.py:38
+#: judge/views/register.py:37
msgid "Subscribe to newsletter?"
msgstr ""
-#: judge/views/register.py:45
+#: judge/views/register.py:44
#, python-format
msgid "The email address \"%s\" is already taken. Only one registration is allowed per address."
msgstr "Il y a déjà un compte avec cette adresse: \"%s\". Qu’une seule compte est autorisée par adresse."
-#: judge/views/register.py:51
+#: judge/views/register.py:50
msgid "Your email provider is not allowed due to history of abuse. Please use a reputable email provider."
msgstr ""
-#: judge/views/register.py:57 judge/views/register.py:95
+#: judge/views/register.py:56 judge/views/register.py:94
msgid "Registration"
msgstr ""
-#: judge/views/register.py:106
+#: judge/views/register.py:105
msgid "Authentication failure"
msgstr ""
@@ -2940,7 +2988,7 @@ msgstr ""
msgid "Language statistics"
msgstr ""
-#: judge/views/status.py:24 templates/submission/list.html:311
+#: judge/views/status.py:24 templates/submission/list.html:310
msgid "Status"
msgstr "Etat"
@@ -2948,74 +2996,74 @@ msgstr "Etat"
msgid "Version matrix"
msgstr ""
-#: judge/views/submission.py:53 judge/views/submission.py:60
+#: judge/views/submission.py:55 judge/views/submission.py:62
#, python-format
msgid "Submission of %(problem)s by %(user)s"
msgstr ""
-#: judge/views/submission.py:203 judge/views/submission.py:204
+#: judge/views/submission.py:205 judge/views/submission.py:206
#: templates/problem/problem.html:127
msgid "All submissions"
msgstr ""
-#: judge/views/submission.py:349
+#: judge/views/submission.py:355
msgid "All my submissions"
msgstr ""
-#: judge/views/submission.py:350
+#: judge/views/submission.py:356
#, python-format
msgid "All submissions by %s"
msgstr ""
-#: judge/views/submission.py:381
+#: judge/views/submission.py:387
#, python-format
msgid "All submissions for %s"
msgstr ""
-#: judge/views/submission.py:400
+#: judge/views/submission.py:410
msgid "Must pass a problem"
msgstr ""
-#: judge/views/submission.py:439
+#: judge/views/submission.py:449
#, python-format
msgid "My submissions for %(problem)s"
msgstr ""
-#: judge/views/submission.py:440
+#: judge/views/submission.py:450
#, python-format
msgid "%(user)s's submissions for %(problem)s"
msgstr ""
-#: judge/views/submission.py:536
+#: judge/views/submission.py:546
msgid "Must pass a contest"
msgstr ""
-#: judge/views/submission.py:544
+#: judge/views/submission.py:554
#, python-format
msgid "My submissions in %(contest)s"
msgstr ""
-#: judge/views/submission.py:545
+#: judge/views/submission.py:555
#, python-format
msgid "%(user)s's submissions in %(contest)s"
msgstr ""
-#: judge/views/submission.py:559
+#: judge/views/submission.py:569
#, python-brace-format
msgid "My submissions in {0}"
msgstr ""
-#: judge/views/submission.py:561
+#: judge/views/submission.py:571
#, python-brace-format
msgid "{0}'s submissions in {2}"
msgstr ""
-#: judge/views/submission.py:585
+#: judge/views/submission.py:597
#, python-brace-format
msgid "{0}'s submissions for {2} in {4}"
msgstr ""
-#: judge/views/submission.py:590
+#: judge/views/submission.py:602
#, python-brace-format
msgid "{0}'s submissions for problem {2} in {3}"
msgstr ""
@@ -3032,40 +3080,40 @@ msgstr ""
msgid "You must solve at least one problem before you can create a ticket."
msgstr ""
-#: judge/views/ticket.py:87 judge/views/ticket.py:90
+#: judge/views/ticket.py:91 judge/views/ticket.py:94
#, python-format
msgid "New ticket for %s"
msgstr ""
-#: judge/views/ticket.py:144
+#: judge/views/ticket.py:148
#, python-format
msgid "%(title)s - Ticket %(id)d"
msgstr ""
-#: judge/views/ticket.py:249
+#: judge/views/ticket.py:253
#, python-format
msgid "Tickets - Page %(number)d of %(total)d"
msgstr ""
-#: judge/views/ticket.py:298
+#: judge/views/ticket.py:302
#, python-format
msgid "New Ticket: %s"
msgstr ""
-#: judge/views/ticket.py:299
+#: judge/views/ticket.py:303
#, python-format
msgid "#%(id)d, assigned to: %(users)s"
msgstr ""
-#: judge/views/ticket.py:301
+#: judge/views/ticket.py:305
msgid ", "
msgstr ""
-#: judge/views/ticket.py:301
+#: judge/views/ticket.py:305
msgid "no one"
msgstr ""
-#: judge/views/ticket.py:321
+#: judge/views/ticket.py:325
#, python-format
msgid "New Ticket Message For: %s"
msgstr ""
@@ -3074,87 +3122,91 @@ msgstr ""
msgid "Enable Two-factor Authentication"
msgstr ""
-#: judge/views/two_factor.py:99
+#: judge/views/two_factor.py:108
+msgid "Refresh Two-factor Authentication"
+msgstr ""
+
+#: judge/views/two_factor.py:116
msgid "Disable Two-factor Authentication"
msgstr ""
-#: judge/views/two_factor.py:148
+#: judge/views/two_factor.py:165
msgid "Invalid WebAuthn response"
msgstr ""
-#: judge/views/two_factor.py:151
+#: judge/views/two_factor.py:168
msgid "Invalid name"
msgstr ""
-#: judge/views/two_factor.py:204
+#: judge/views/two_factor.py:221
msgid "Staff may not disable 2FA"
msgstr ""
-#: judge/views/two_factor.py:216
+#: judge/views/two_factor.py:229
msgid "Perform Two-factor Authentication"
msgstr ""
-#: judge/views/user.py:79
+#: judge/views/user.py:78
msgid "No such user"
msgstr ""
-#: judge/views/user.py:79
+#: judge/views/user.py:78
#, python-format
msgid "No user handle \"%s\"."
msgstr ""
-#: judge/views/user.py:83
+#: judge/views/user.py:82
msgid "My account"
msgstr ""
-#: judge/views/user.py:84
+#: judge/views/user.py:83
#, python-format
msgid "User %s"
msgstr ""
-#: judge/views/user.py:132
+#: judge/views/user.py:131
msgid "Login"
-msgstr "Se connecter"
+msgstr "Entrer"
-#: judge/views/user.py:173
+#: judge/views/user.py:172
msgid "M j, Y, G:i"
msgstr ""
-#: judge/views/user.py:307
+#: judge/views/user.py:306
msgid "Preparing your data..."
msgstr ""
-#: judge/views/user.py:311 templates/user/edit-profile.html:348
+#: judge/views/user.py:310 templates/user/edit-profile.html:352
msgid "Download your data"
msgstr ""
-#: judge/views/user.py:367
+#: judge/views/user.py:366
msgid "Updated on site"
msgstr ""
-#: judge/views/user.py:400 templates/admin/auth/user/change_form.html:14
+#: judge/views/user.py:399 templates/admin/auth/user/change_form.html:14
#: templates/admin/auth/user/change_form.html:17 templates/base.html:222
#: templates/user/user-tabs.html:16
msgid "Edit profile"
msgstr "Modifier le profile"
-#: judge/views/user.py:415
+#: judge/views/user.py:414
msgid "Generated API token for user"
msgstr ""
-#: judge/views/user.py:427
+#: judge/views/user.py:426
msgid "Removed API token for user"
msgstr ""
-#: judge/views/user.py:437
+#: judge/views/user.py:436
msgid "Generated scratch codes for user"
msgstr ""
-#: judge/views/user.py:443 templates/user/user-list-tabs.html:4
+#: judge/views/user.py:442 templates/user/user-list-tabs.html:4
msgid "Leaderboard"
msgstr ""
-#: judge/views/user.py:504
+#: judge/views/user.py:503
msgid "You have been successfully logged out."
msgstr ""
@@ -3279,11 +3331,11 @@ msgstr ""
msgid "posted on {time}"
msgstr ""
-#: templates/blog/list.html:130 templates/problem/problem.html:309
+#: templates/blog/list.html:130 templates/problem/problem.html:311
msgid "Clarifications"
msgstr ""
-#: templates/blog/list.html:146 templates/problem/problem.html:320
+#: templates/blog/list.html:146 templates/problem/problem.html:322
msgid "No clarifications have been made at this time."
msgstr ""
@@ -3476,7 +3528,7 @@ msgid "Info"
msgstr ""
#: templates/contest/contest-tabs.html:6 templates/stats/base.html:9
-#: templates/submission/list.html:337
+#: templates/submission/list.html:336
msgid "Statistics"
msgstr ""
@@ -3679,19 +3731,19 @@ msgstr ""
msgid "Disqualify"
msgstr ""
-#: templates/contest/ranking.html:169
+#: templates/contest/ranking.html:173
msgid "Are you sure you want to disqualify this participation?"
msgstr ""
-#: templates/contest/ranking.html:174
+#: templates/contest/ranking.html:178
msgid "Are you sure you want to un-disqualify this participation?"
msgstr ""
-#: templates/contest/ranking.html:246
+#: templates/contest/ranking.html:250
msgid "View user participation"
msgstr ""
-#: templates/contest/ranking.html:250
+#: templates/contest/ranking.html:254
msgid "Show organizations"
msgstr ""
@@ -3966,7 +4018,7 @@ msgstr ""
msgid "Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence."
msgstr ""
-#: templates/problem/editorial.html:27 templates/problem/problem.html:209
+#: templates/problem/editorial.html:27 templates/problem/problem.html:210
msgid "Author:"
msgid_plural "Authors:"
msgstr[0] ""
@@ -4133,36 +4185,36 @@ msgstr ""
msgid "Memory limit:"
msgstr ""
-#: templates/problem/problem.html:224
+#: templates/problem/problem.html:226
msgid "Problem type"
msgid_plural "Problem types"
msgstr[0] ""
msgstr[1] ""
-#: templates/problem/problem.html:237
+#: templates/problem/problem.html:239
msgid "Allowed languages"
msgstr "Languages autorisés"
-#: templates/problem/problem.html:245
+#: templates/problem/problem.html:247
#, python-format
msgid "No %(lang)s judge online"
msgstr ""
-#: templates/problem/problem.html:256
+#: templates/problem/problem.html:258
msgid "Judge:"
msgid_plural "Judges:"
msgstr[0] ""
msgstr[1] ""
-#: templates/problem/problem.html:273
+#: templates/problem/problem.html:275
msgid "none available"
msgstr ""
-#: templates/problem/problem.html:298
+#: templates/problem/problem.html:300
msgid "Request clarification"
msgstr "Demander une clarification"
-#: templates/problem/problem.html:300
+#: templates/problem/problem.html:302
msgid "Report an issue"
msgstr "Reporter un problème"
@@ -4207,7 +4259,7 @@ msgstr ""
msgid "Point range"
msgstr ""
-#: templates/problem/search-form.html:63 templates/submission/list.html:329
+#: templates/problem/search-form.html:63 templates/submission/list.html:328
#: templates/ticket/list.html:248
msgid "Go"
msgstr ""
@@ -4254,7 +4306,7 @@ msgid "Invalid username or password."
msgstr ""
#: templates/registration/login.html:53
-#: templates/registration/two_factor_auth.html:86
+#: templates/registration/two_factor_auth.html:92
msgid "Login!"
msgstr ""
@@ -4374,12 +4426,12 @@ msgid "Default language"
msgstr ""
#: templates/registration/registration_form.html:184
-#: templates/user/edit-profile.html:310
+#: templates/user/edit-profile.html:314
msgid "Affiliated organizations"
msgstr ""
#: templates/registration/registration_form.html:190
-#: templates/user/edit-profile.html:324
+#: templates/user/edit-profile.html:328
msgid "Notify me about upcoming contests"
msgstr ""
@@ -4395,57 +4447,93 @@ msgstr ""
msgid "Register!"
msgstr ""
-#: templates/registration/totp_disable.html:38
+#: templates/registration/totp_disable.html:31
msgid "To protect your account, you must first authenticate before you can disable Two Factor Authentication."
msgstr ""
-#: templates/registration/totp_disable.html:45
+#: templates/registration/totp_disable.html:38
msgid "Enter the 6-digit code generated by your app or one of your 16-digit scratch codes:"
msgstr ""
-#: templates/registration/totp_disable.html:48
+#: templates/registration/totp_disable.html:41
msgid "Disable Two Factor Authentication"
msgstr ""
-#: templates/registration/totp_enable.html:75
+#: templates/registration/totp_enable.html:72
msgid "Scan this code with your authenticator app:"
msgstr ""
-#: templates/registration/totp_enable.html:76
+#: templates/registration/totp_enable.html:73
msgid "QR code"
msgstr ""
-#: templates/registration/totp_enable.html:77
+#: templates/registration/totp_enable.html:74
msgid "Or enter this code manually:"
msgstr ""
-#: templates/registration/totp_enable.html:88
+#: templates/registration/totp_enable.html:85
msgid "Enter the 6-digit code generated by your app:"
msgstr ""
-#: templates/registration/totp_enable.html:91
+#: templates/registration/totp_enable.html:90
+msgid "Refresh Two Factor Authentication"
+msgstr ""
+
+#: templates/registration/totp_enable.html:92
msgid "Enable Two Factor Authentication"
msgstr ""
+#: templates/registration/totp_enable.html:98
+msgid "Below is a list of one-time use scratch codes."
+msgstr ""
+
+#: templates/registration/totp_enable.html:99
+msgid "These codes can only be used once and are for emergency use."
+msgstr ""
+
+#: templates/registration/totp_enable.html:100
+msgid "You can use these codes to login to your account or disable two-factor authentication."
+msgstr ""
+
+#: templates/registration/totp_enable.html:101
+msgid "If you ever need more scratch codes, you can regenerate them on the edit profile tab."
+msgstr ""
+
+#: templates/registration/totp_enable.html:102
+msgid "Please write these down and keep them in a secure location."
+msgstr ""
+
+#: templates/registration/totp_enable.html:103
+msgid "These codes will never be shown again after you enable two-factor authentication."
+msgstr ""
+
#: templates/registration/two_factor_auth.html:33
-#: templates/user/edit-profile.html:161
+#: templates/user/edit-profile.html:165
msgid "WebAuthn is not supported by your browser."
msgstr ""
#: templates/registration/two_factor_auth.html:54
-#: templates/user/edit-profile.html:185
+#: templates/user/edit-profile.html:189
msgid "Failed to contact server."
msgstr ""
-#: templates/registration/two_factor_auth.html:77
+#: templates/registration/two_factor_auth.html:79
msgid "Enter the 6-digit code generated by your app or one of your 16-character scratch codes:"
msgstr ""
-#: templates/registration/two_factor_auth.html:83
-msgid "Use security key"
+#: templates/registration/two_factor_auth.html:81
+msgid "Enter one of your 16-character scratch codes:"
msgstr ""
#: templates/registration/two_factor_auth.html:89
+msgid "Use security key"
+msgstr ""
+
+#: templates/registration/two_factor_auth.html:94
+msgid "Use scratch code"
+msgstr ""
+
+#: templates/registration/two_factor_auth.html:97
#, python-format
msgid "If you lost your authentication device and are unable to use your scratch codes, please contact us at %(email)s."
msgstr ""
@@ -4526,15 +4614,15 @@ msgstr ""
msgid "Filter by language..."
msgstr ""
-#: templates/submission/list.html:307
+#: templates/submission/list.html:306
msgid "Filter submissions"
msgstr ""
-#: templates/submission/list.html:343
+#: templates/submission/list.html:342
msgid "Total:"
msgstr ""
-#: templates/submission/list.html:353
+#: templates/submission/list.html:352
msgid "You were disconnected. Refresh to show latest updates."
msgstr ""
@@ -4750,121 +4838,125 @@ msgstr "Classement"
msgid "Search by handle..."
msgstr ""
-#: templates/user/edit-profile.html:109
+#: templates/user/edit-profile.html:113
msgid "Are you sure you want to generate or regenerate your API token?"
msgstr ""
-#: templates/user/edit-profile.html:110
+#: templates/user/edit-profile.html:114
msgid "This will invalidate any previous API tokens."
msgstr ""
-#: templates/user/edit-profile.html:111
+#: templates/user/edit-profile.html:115
msgid "It also allows access to your account without Two-factor Authentication."
msgstr ""
-#: templates/user/edit-profile.html:112
+#: templates/user/edit-profile.html:116
msgid "You will not be able to view your api token after you leave this page!"
msgstr ""
-#: templates/user/edit-profile.html:113 templates/user/edit-profile.html:207
+#: templates/user/edit-profile.html:117 templates/user/edit-profile.html:211
msgid "Generating..."
msgstr ""
-#: templates/user/edit-profile.html:121 templates/user/edit-profile.html:243
-#: templates/user/edit-profile.html:371 templates/user/edit-profile.html:390
+#: templates/user/edit-profile.html:125 templates/user/edit-profile.html:247
+#: templates/user/edit-profile.html:373 templates/user/edit-profile.html:395
msgid "Regenerate"
msgstr ""
-#: templates/user/edit-profile.html:127 templates/user/edit-profile.html:392
+#: templates/user/edit-profile.html:131 templates/user/edit-profile.html:397
msgid "Remove"
msgstr ""
-#: templates/user/edit-profile.html:137
+#: templates/user/edit-profile.html:141
msgid "Are you sure you want to remove your API token?"
msgstr ""
-#: templates/user/edit-profile.html:144 templates/user/edit-profile.html:375
-#: templates/user/edit-profile.html:396
+#: templates/user/edit-profile.html:148 templates/user/edit-profile.html:377
+#: templates/user/edit-profile.html:401
msgid "Generate"
msgstr ""
-#: templates/user/edit-profile.html:190
+#: templates/user/edit-profile.html:194
msgid "Are you sure you want to delete this security key?"
msgstr ""
-#: templates/user/edit-profile.html:280
+#: templates/user/edit-profile.html:284
msgid "Self-description"
msgstr ""
-#: templates/user/edit-profile.html:287
+#: templates/user/edit-profile.html:291
msgid "Select your closest major city"
msgstr ""
-#: templates/user/edit-profile.html:296
+#: templates/user/edit-profile.html:300
msgid "Editor theme"
msgstr ""
-#: templates/user/edit-profile.html:301
+#: templates/user/edit-profile.html:305
msgid "Math engine"
msgstr ""
-#: templates/user/edit-profile.html:335 templates/user/edit-profile.html:337
+#: templates/user/edit-profile.html:339 templates/user/edit-profile.html:341
msgid "Change your avatar"
msgstr "Changer votre avatar"
-#: templates/user/edit-profile.html:342
+#: templates/user/edit-profile.html:346
msgid "Change your password"
msgstr ""
-#: templates/user/edit-profile.html:356
+#: templates/user/edit-profile.html:359
msgid "Two-factor Authentication is enabled"
msgstr ""
-#: templates/user/edit-profile.html:358
-msgid "Two-factor Authentication is disabled"
+#: templates/user/edit-profile.html:362 templates/user/edit-profile.html:365
+msgid "Disable"
msgstr ""
-#: templates/user/edit-profile.html:363 templates/user/edit-profile.html:365
-msgid "Disable"
+#: templates/user/edit-profile.html:367
+msgid "Refresh"
msgstr ""
-#: templates/user/edit-profile.html:368
+#: templates/user/edit-profile.html:370
msgid "Scratch Codes:"
msgstr ""
-#: templates/user/edit-profile.html:372 templates/user/edit-profile.html:393
+#: templates/user/edit-profile.html:374 templates/user/edit-profile.html:398
msgid "Hidden"
msgstr ""
-#: templates/user/edit-profile.html:381
+#: templates/user/edit-profile.html:384
+msgid "Two-factor Authentication is disabled"
+msgstr ""
+
+#: templates/user/edit-profile.html:385
msgid "Enable"
msgstr ""
-#: templates/user/edit-profile.html:387
+#: templates/user/edit-profile.html:392
msgid "API Token"
msgstr ""
-#: templates/user/edit-profile.html:404
+#: templates/user/edit-profile.html:409
msgid "Security keys"
msgstr ""
-#: templates/user/edit-profile.html:414
+#: templates/user/edit-profile.html:419
msgid "Delete"
msgstr ""
-#: templates/user/edit-profile.html:421
+#: templates/user/edit-profile.html:426
msgid "Enter a name for this key"
msgstr ""
-#: templates/user/edit-profile.html:422
+#: templates/user/edit-profile.html:427
msgid "Add"
msgstr ""
-#: templates/user/edit-profile.html:430
+#: templates/user/edit-profile.html:435
msgid "User-script"
msgstr ""
-#: templates/user/edit-profile.html:434
+#: templates/user/edit-profile.html:439
msgid "Update profile"
msgstr ""
@@ -5021,15 +5113,15 @@ msgstr "Classement :"
#: templates/user/user-base.html:77
msgid "Volatility:"
-msgstr ""
+msgstr "Volatilité:"
#: templates/user/user-base.html:78
msgid "Min. rating:"
-msgstr ""
+msgstr "Classement minimum :"
#: templates/user/user-base.html:79
msgid "Max rating:"
-msgstr ""
+msgstr "Classement maximale:"
#: templates/user/user-problems.html:37
msgid "Points breakdown"
@@ -5037,7 +5129,7 @@ msgstr ""
#: templates/user/user-problems.html:43
msgid "Load more..."
-msgstr ""
+msgstr "Charger plus..."
#: templates/user/user-problems.html:47
msgid "This user has not yet solved any problems."
@@ -5059,11 +5151,11 @@ msgstr ""
#: templates/user/user-problems.html:112
#, python-format
msgid "%(points)s / %(total)s"
-msgstr ""
+msgstr "%(points)s / %(total)s"
#: templates/user/user-tabs.html:7
msgid "Impersonate"
-msgstr ""
+msgstr "Imiter"
#: templates/user/user-tabs.html:10
msgid "Admin User"
diff --git a/locale/fr/LC_MESSAGES/djangojs.po b/locale/fr/LC_MESSAGES/djangojs.po
index 9887ed77ca..eba84ef04c 100644
--- a/locale/fr/LC_MESSAGES/djangojs.po
+++ b/locale/fr/LC_MESSAGES/djangojs.po
@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: dmoj\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-10-01 23:12+0000\n"
-"PO-Revision-Date: 2021-04-25 00:08\n"
+"PO-Revision-Date: 2021-07-07 00:27\n"
"Last-Translator: \n"
"Language-Team: French\n"
"Language: fr_FR\n"
diff --git a/locale/hr/LC_MESSAGES/django.po b/locale/hr/LC_MESSAGES/django.po
index 116c240499..81e5bdb88f 100644
--- a/locale/hr/LC_MESSAGES/django.po
+++ b/locale/hr/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: dmoj\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-24 19:15+0000\n"
-"PO-Revision-Date: 2021-04-25 00:08\n"
+"POT-Creation-Date: 2021-06-17 01:38+0000\n"
+"PO-Revision-Date: 2021-07-07 00:27\n"
"Last-Translator: \n"
"Language-Team: Croatian\n"
"Language: hr_HR\n"
@@ -17,75 +17,75 @@ msgstr ""
"X-Crowdin-File: django.po\n"
"X-Crowdin-File-ID: 10\n"
-#: dmoj/settings.py:364
+#: dmoj/settings.py:365
msgid "Catalan"
msgstr ""
-#: dmoj/settings.py:365
+#: dmoj/settings.py:366
msgid "German"
msgstr "Njemački"
-#: dmoj/settings.py:366
+#: dmoj/settings.py:367
msgid "English"
msgstr "Engleski"
-#: dmoj/settings.py:367
+#: dmoj/settings.py:368
msgid "Spanish"
msgstr "Španjolski"
-#: dmoj/settings.py:368
+#: dmoj/settings.py:369
msgid "French"
msgstr "Francuski"
-#: dmoj/settings.py:369
+#: dmoj/settings.py:370
msgid "Croatian"
msgstr "Hrvatski"
-#: dmoj/settings.py:370
+#: dmoj/settings.py:371
msgid "Hungarian"
msgstr "Mađarski"
-#: dmoj/settings.py:371
+#: dmoj/settings.py:372
msgid "Japanese"
msgstr ""
-#: dmoj/settings.py:372
+#: dmoj/settings.py:373
msgid "Korean"
msgstr "Korejski"
-#: dmoj/settings.py:373
+#: dmoj/settings.py:374
msgid "Brazilian Portuguese"
msgstr ""
-#: dmoj/settings.py:374
+#: dmoj/settings.py:375
msgid "Romanian"
msgstr "Rumunjski"
-#: dmoj/settings.py:375
+#: dmoj/settings.py:376
msgid "Russian"
msgstr "Ruski"
-#: dmoj/settings.py:376
+#: dmoj/settings.py:377
msgid "Serbian (Latin)"
msgstr "Srpski (Latinica)"
-#: dmoj/settings.py:377
+#: dmoj/settings.py:378
msgid "Turkish"
msgstr "Turski"
-#: dmoj/settings.py:378
+#: dmoj/settings.py:379
msgid "Vietnamese"
msgstr "Vijetnamski"
-#: dmoj/settings.py:379
+#: dmoj/settings.py:380
msgid "Simplified Chinese"
msgstr "Pojednostavljeni kineski"
-#: dmoj/settings.py:380
+#: dmoj/settings.py:381
msgid "Traditional Chinese"
msgstr ""
-#: dmoj/urls.py:103 templates/base.html:190
+#: dmoj/urls.py:104 templates/base.html:190
msgid "Home"
msgstr "Početna"
@@ -117,46 +117,46 @@ msgstr "Otkrij komentare"
msgid "Associated page"
msgstr "Povezana stranica"
-#: judge/admin/contest.py:31
+#: judge/admin/contest.py:32
msgid "Included contests"
msgstr "Uključena natjecanja"
-#: judge/admin/contest.py:65 templates/contest/contest.html:83
+#: judge/admin/contest.py:66 templates/contest/contest.html:83
#: templates/contest/moss.html:43 templates/problem/list.html:204
#: templates/problem/list.html:219 templates/user/user-problems.html:58
#: templates/user/user-problems.html:100
msgid "Problem"
msgstr "Zadatak"
-#: judge/admin/contest.py:114
+#: judge/admin/contest.py:117
msgid "Settings"
msgstr ""
-#: judge/admin/contest.py:116
+#: judge/admin/contest.py:120
msgid "Scheduling"
msgstr "Raspoređivanje"
-#: judge/admin/contest.py:117
+#: judge/admin/contest.py:121
msgid "Details"
msgstr "Pojedinosti"
-#: judge/admin/contest.py:118
+#: judge/admin/contest.py:122
msgid "Format"
msgstr ""
-#: judge/admin/contest.py:119 templates/contest/ranking-table.html:5
+#: judge/admin/contest.py:123 templates/contest/ranking-table.html:5
msgid "Rating"
msgstr "Bodovi"
-#: judge/admin/contest.py:120
+#: judge/admin/contest.py:124
msgid "Access"
msgstr ""
-#: judge/admin/contest.py:122 judge/admin/problem.py:134
+#: judge/admin/contest.py:126 judge/admin/problem.py:135
msgid "Justice"
msgstr "Pravda"
-#: judge/admin/contest.py:211
+#: judge/admin/contest.py:215
#, python-format
msgid "%d contest successfully marked as visible."
msgid_plural "%d contests successfully marked as visible."
@@ -164,11 +164,11 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-#: judge/admin/contest.py:214
+#: judge/admin/contest.py:218
msgid "Mark contests as visible"
msgstr ""
-#: judge/admin/contest.py:220
+#: judge/admin/contest.py:224
#, python-format
msgid "%d contest successfully marked as hidden."
msgid_plural "%d contests successfully marked as hidden."
@@ -176,11 +176,11 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-#: judge/admin/contest.py:223
+#: judge/admin/contest.py:227
msgid "Mark contests as hidden"
msgstr ""
-#: judge/admin/contest.py:229
+#: judge/admin/contest.py:233
#, python-format
msgid "%d contest successfully locked."
msgid_plural "%d contests successfully locked."
@@ -188,11 +188,11 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-#: judge/admin/contest.py:232
+#: judge/admin/contest.py:236
msgid "Lock contest submissions"
msgstr ""
-#: judge/admin/contest.py:238
+#: judge/admin/contest.py:242
#, python-format
msgid "%d contest successfully unlocked."
msgid_plural "%d contests successfully unlocked."
@@ -200,11 +200,11 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-#: judge/admin/contest.py:241
+#: judge/admin/contest.py:245
msgid "Unlock contest submissions"
msgstr ""
-#: judge/admin/contest.py:262 judge/admin/submission.py:170
+#: judge/admin/contest.py:266 judge/admin/submission.py:170
#, python-format
msgid "%d submission was successfully scheduled for rejudging."
msgid_plural "%d submissions were successfully scheduled for rejudging."
@@ -212,7 +212,7 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-#: judge/admin/contest.py:337
+#: judge/admin/contest.py:341
#, python-format
msgid "%d participation recalculated."
msgid_plural "%d participations recalculated."
@@ -220,15 +220,15 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-#: judge/admin/contest.py:340
+#: judge/admin/contest.py:344
msgid "Recalculate results"
msgstr ""
-#: judge/admin/contest.py:344 judge/admin/organization.py:63
+#: judge/admin/contest.py:348 judge/admin/organization.py:63
msgid "username"
msgstr "korisničko ime"
-#: judge/admin/contest.py:349 templates/base.html:258
+#: judge/admin/contest.py:353 templates/base.html:258
msgid "virtual"
msgstr "virtualno"
@@ -244,9 +244,9 @@ msgstr "Sadržaj"
msgid "Summary"
msgstr "Sažetak"
-#: judge/admin/interface.py:113 judge/models/contest.py:383
-#: judge/models/contest.py:509 judge/models/profile.py:244
-#: judge/models/profile.py:268
+#: judge/admin/interface.py:113 judge/models/contest.py:419
+#: judge/models/contest.py:546 judge/models/profile.py:261
+#: judge/models/profile.py:292
msgid "user"
msgstr "korisnik"
@@ -254,8 +254,8 @@ msgstr "korisnik"
msgid "object"
msgstr ""
-#: judge/admin/organization.py:32 judge/admin/problem.py:181
-#: judge/admin/profile.py:82
+#: judge/admin/organization.py:32 judge/admin/problem.py:182
+#: judge/admin/profile.py:92
msgid "View on site"
msgstr "Prikaži na stranici"
@@ -263,40 +263,40 @@ msgstr "Prikaži na stranici"
msgid "Describe the changes you made (optional)"
msgstr "Opišite promjene koje ste napravili (neobavezno)"
-#: judge/admin/problem.py:129
+#: judge/admin/problem.py:130
msgid "Social Media"
msgstr "Društveni mediji"
-#: judge/admin/problem.py:130
+#: judge/admin/problem.py:131
msgid "Taxonomy"
msgstr "Taksonomija"
-#: judge/admin/problem.py:131 templates/contest/contest.html:84
+#: judge/admin/problem.py:132 templates/contest/contest.html:84
#: templates/problem/data.html:385 templates/problem/list.html:209
#: templates/problem/list.html:230 templates/user/base-users-table.html:10
#: templates/user/user-problems.html:60
msgid "Points"
msgstr "Bodovi"
-#: judge/admin/problem.py:132
+#: judge/admin/problem.py:133
msgid "Limits"
msgstr "Ograničenja"
-#: judge/admin/problem.py:133 judge/admin/submission.py:238
-#: templates/stats/base.html:14 templates/submission/list.html:320
-#: templates/user/edit-profile.html:292
+#: judge/admin/problem.py:134 judge/admin/submission.py:238
+#: templates/stats/base.html:14 templates/submission/list.html:319
+#: templates/user/edit-profile.html:296
msgid "Language"
msgstr "Jezik"
-#: judge/admin/problem.py:135
+#: judge/admin/problem.py:136
msgid "History"
msgstr "Povijest"
-#: judge/admin/problem.py:178
+#: judge/admin/problem.py:179
msgid "Authors"
msgstr "Autori"
-#: judge/admin/problem.py:191
+#: judge/admin/problem.py:192
#, python-format
msgid "%d problem's publish date successfully updated."
msgid_plural "%d problems' publish date successfully updated."
@@ -304,11 +304,11 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-#: judge/admin/problem.py:195
+#: judge/admin/problem.py:196
msgid "Set publish date to now"
msgstr ""
-#: judge/admin/problem.py:201
+#: judge/admin/problem.py:202
#, python-format
msgid "%d problem successfully marked as public."
msgid_plural "%d problems successfully marked as public."
@@ -316,11 +316,11 @@ msgstr[0] "%d zadatak uspješno postavljen kao javno."
msgstr[1] "%d zadataka uspješno postavljeno kao javni."
msgstr[2] "%d zadataka uspješno postavljeno kao javni."
-#: judge/admin/problem.py:205
+#: judge/admin/problem.py:206
msgid "Mark problems as public"
msgstr "Označi zadatke javnima"
-#: judge/admin/problem.py:211
+#: judge/admin/problem.py:212
#, python-format
msgid "%d problem successfully marked as private."
msgid_plural "%d problems successfully marked as private."
@@ -328,7 +328,7 @@ msgstr[0] "%d zadatak uspješno postavljen kao privatan."
msgstr[1] "%d zadataka uspješno postavljeno kao privatni."
msgstr[2] "%d zadataka uspješno postavljeno kao privatni."
-#: judge/admin/problem.py:215
+#: judge/admin/problem.py:216
msgid "Mark problems as private"
msgstr "Označi zadatke privatnima"
@@ -336,28 +336,28 @@ msgstr "Označi zadatke privatnima"
msgid "timezone"
msgstr ""
-#: judge/admin/profile.py:88 judge/admin/submission.py:217
+#: judge/admin/profile.py:98 judge/admin/submission.py:217
#: templates/organization/requests/log.html:9
#: templates/organization/requests/pending.html:12
#: templates/ticket/list.html:261
msgid "User"
msgstr "Korisnik"
-#: judge/admin/profile.py:93 templates/registration/registration_form.html:143
+#: judge/admin/profile.py:103 templates/registration/registration_form.html:143
msgid "Email"
msgstr "E-mail"
-#: judge/admin/profile.py:98 judge/views/register.py:29
+#: judge/admin/profile.py:108 judge/views/register.py:28
#: templates/registration/registration_form.html:171
-#: templates/user/edit-profile.html:288
+#: templates/user/edit-profile.html:292
msgid "Timezone"
msgstr "Vremenska zona"
-#: judge/admin/profile.py:103
+#: judge/admin/profile.py:113
msgid "date joined"
msgstr "datum registracije"
-#: judge/admin/profile.py:110
+#: judge/admin/profile.py:120
#, python-format
msgid "%d user have scores recalculated."
msgid_plural "%d users have scores recalculated."
@@ -365,7 +365,7 @@ msgstr[0] "%d korisnik je ponovno izračunao bodove."
msgstr[1] "%d korisnika je ponovno izračunalo bodove."
msgstr[2] "%d korisnika je ponovno izračunalo bodove."
-#: judge/admin/profile.py:113
+#: judge/admin/profile.py:123
msgid "Recalculate scores"
msgstr "Ponovno izračunavanje rezultata"
@@ -519,115 +519,116 @@ msgstr "IOI"
msgid "IOI (pre-2016)"
msgstr "IOI (prije 2016)"
-#: judge/forms.py:26
-msgid "Two-factor authentication tokens must be 6 decimal digits."
-msgstr "Token autentikacije u dva koraka mora biti duljine 6."
+#: judge/forms.py:27
+#, python-brace-format
+msgid "Two-factor authentication tokens must be {TOTP_CODE_LENGTH} decimal digits."
+msgstr ""
-#: judge/forms.py:29
+#: judge/forms.py:30
msgid "Invalid two-factor authentication token."
msgstr "Pogrešan token autentikacije u dva koraka."
-#: judge/forms.py:32
+#: judge/forms.py:33
msgid "Scratch codes must be 16 base32 characters."
msgstr ""
-#: judge/forms.py:34
+#: judge/forms.py:35 judge/forms.py:264
msgid "Invalid scratch code."
msgstr ""
-#: judge/forms.py:45
+#: judge/forms.py:46
msgid "Subscribe to contest updates"
msgstr "Pretplati se na novosti na natjecanju"
-#: judge/forms.py:46
+#: judge/forms.py:47
msgid "Enable experimental features"
msgstr "Uključi eksperimentalne opcije"
-#: judge/forms.py:71
+#: judge/forms.py:72
msgid "You must solve at least one problem before you can update your profile."
msgstr ""
-#: judge/forms.py:80 judge/views/organization.py:127
+#: judge/forms.py:81 judge/views/organization.py:126
#, python-brace-format
msgid "You may not be part of more than {count} public organizations."
msgstr "Ne možete biti član više od {count} javnih organizacija."
-#: judge/forms.py:96
+#: judge/forms.py:97
msgid "Download comments?"
msgstr "Preuzmi komentare?"
-#: judge/forms.py:97
+#: judge/forms.py:98
msgid "Download submissions?"
msgstr "Preuzmi predana rješenja?"
-#: judge/forms.py:98
+#: judge/forms.py:99
msgid "Filter by problem code glob:"
msgstr ""
-#: judge/forms.py:102
+#: judge/forms.py:103
msgid "Leave empty to include all submissions"
msgstr ""
-#: judge/forms.py:105 templates/problem/manage_submission.html:142
+#: judge/forms.py:106 templates/problem/manage_submission.html:142
msgid "Filter by result:"
msgstr "Filtriraj prema rezultatu:"
-#: judge/forms.py:111
+#: judge/forms.py:112
msgid "Please select at least one thing to download."
msgstr "Molimo označite barem jednu stavku za preuzimanje."
-#: judge/forms.py:137
+#: judge/forms.py:138
msgid "Any judge"
msgstr "Bilo koji evaluator"
-#: judge/forms.py:167 judge/views/register.py:26
+#: judge/forms.py:159 judge/views/register.py:25
#: templates/registration/registration_form.html:137
#: templates/user/base-users-table.html:5
msgid "Username"
msgstr "Korisničko ime"
-#: judge/forms.py:168 templates/registration/registration_form.html:149
+#: judge/forms.py:160 templates/registration/registration_form.html:149
#: templates/registration/registration_form.html:163
msgid "Password"
msgstr "Lozinka"
-#: judge/forms.py:201
+#: judge/forms.py:192
msgid "Invalid code length."
msgstr ""
-#: judge/forms.py:219
+#: judge/forms.py:223
msgid "Invalid WebAuthn response."
msgstr "Pogrešan WebAuthn odgovor."
-#: judge/forms.py:222
+#: judge/forms.py:226
msgid "No WebAuthn challenge issued."
msgstr ""
-#: judge/forms.py:228
+#: judge/forms.py:232
msgid "Invalid WebAuthn credential ID."
msgstr ""
-#: judge/forms.py:257
+#: judge/forms.py:262
msgid "Invalid two-factor authentication token or scratch code."
msgstr ""
-#: judge/forms.py:259
+#: judge/forms.py:266
msgid "Must specify either totp_token or webauthn_response."
msgstr ""
-#: judge/forms.py:263 judge/models/problem.py:105
+#: judge/forms.py:270 judge/models/problem.py:119
msgid "Problem code must be ^[a-z0-9]+$"
msgstr "ID zadatka mora biti ^[a-z0-9]+$"
-#: judge/forms.py:268
+#: judge/forms.py:275
msgid "Problem with code already exists."
msgstr "Već postoji zadatak koji koristi taj ID."
-#: judge/forms.py:273 judge/models/contest.py:66
+#: judge/forms.py:280 judge/models/contest.py:66
msgid "Contest id must be ^[a-z0-9]+$"
msgstr "ID natjecanja mora biti ^[a-z0-9]+$"
-#: judge/forms.py:278
+#: judge/forms.py:285
msgid "Contest with key already exists."
msgstr "Već postoji natjecanje koje koristi taj ID."
@@ -707,7 +708,7 @@ msgid "comments"
msgstr "komentari"
#: judge/models/comment.py:89 judge/models/comment.py:141
-#: judge/models/problem.py:484
+#: judge/models/problem.py:511
#, python-format
msgid "Editorial for %s"
msgstr "Objašnjenje za %s"
@@ -748,7 +749,7 @@ msgstr "opis oznake"
msgid "contest tag"
msgstr "oznaka natjecanja"
-#: judge/models/contest.py:53 judge/models/contest.py:117
+#: judge/models/contest.py:53 judge/models/contest.py:126
msgid "contest tags"
msgstr "oznake natjecanja"
@@ -773,410 +774,426 @@ msgid "contest name"
msgstr "naziv natjecanja"
#: judge/models/contest.py:68
-msgid "These people will be able to edit the contest."
-msgstr "Ove osobe će moći uređivati natjecanje."
+msgid "These users will be able to edit the contest."
+msgstr ""
+
+#: judge/models/contest.py:70
+msgid "These users will be able to edit the contest, but will not be listed as authors."
+msgstr ""
-#: judge/models/contest.py:70 judge/models/runtime.py:136
+#: judge/models/contest.py:73
+msgid "These users will be able to view the contest, but not edit it."
+msgstr ""
+
+#: judge/models/contest.py:76 judge/models/runtime.py:136
msgid "description"
msgstr "opis"
-#: judge/models/contest.py:71 judge/models/problem.py:431
+#: judge/models/contest.py:77 judge/models/problem.py:458
#: judge/models/runtime.py:138
msgid "problems"
msgstr "zadaci"
-#: judge/models/contest.py:72 judge/models/contest.py:384
+#: judge/models/contest.py:78 judge/models/contest.py:420
msgid "start time"
msgstr "vrijeme početka"
-#: judge/models/contest.py:73
+#: judge/models/contest.py:79
msgid "end time"
msgstr "vrijeme kraja"
-#: judge/models/contest.py:74 judge/models/problem.py:126
-#: judge/models/problem.py:455
+#: judge/models/contest.py:80 judge/models/problem.py:140
+#: judge/models/problem.py:482
msgid "time limit"
msgstr "vremensko ograničenje"
-#: judge/models/contest.py:75 judge/models/problem.py:144
+#: judge/models/contest.py:81 judge/models/problem.py:158
msgid "publicly visible"
msgstr "javno vidljivo"
-#: judge/models/contest.py:76
+#: judge/models/contest.py:82
msgid "Should be set even for organization-private contests, where it determines whether the contest is visible to members of the specified organizations."
msgstr ""
-#: judge/models/contest.py:79
+#: judge/models/contest.py:85
msgid "contest rated"
msgstr "bodovanje natjecanja"
-#: judge/models/contest.py:79
+#: judge/models/contest.py:85
msgid "Whether this contest can be rated."
msgstr "Može li ovo natjecanje biti bodovano."
-#: judge/models/contest.py:81
+#: judge/models/contest.py:87
msgid "view contest scoreboard"
msgstr ""
-#: judge/models/contest.py:83
+#: judge/models/contest.py:89
msgid "These users will be able to view the scoreboard."
msgstr ""
-#: judge/models/contest.py:84
+#: judge/models/contest.py:90
msgid "scoreboard visibility"
msgstr ""
-#: judge/models/contest.py:85
+#: judge/models/contest.py:91
msgid "Scoreboard visibility through the duration of the contest"
msgstr ""
-#: judge/models/contest.py:87
+#: judge/models/contest.py:93
msgid "no comments"
msgstr "bez komentara"
-#: judge/models/contest.py:88
+#: judge/models/contest.py:94
msgid "Use clarification system instead of comments."
msgstr "Koristite sustav za pojašnjenja umjesto komentara."
-#: judge/models/contest.py:90
+#: judge/models/contest.py:96
msgid "Rating floor for contest"
msgstr ""
-#: judge/models/contest.py:92
+#: judge/models/contest.py:98
msgid "Rating ceiling for contest"
msgstr ""
-#: judge/models/contest.py:94
+#: judge/models/contest.py:100
msgid "rate all"
msgstr "boduj sve"
-#: judge/models/contest.py:94
+#: judge/models/contest.py:100
msgid "Rate all users who joined."
msgstr "Boduj sve korisnike koji su se pridružili."
-#: judge/models/contest.py:95
+#: judge/models/contest.py:101
msgid "exclude from ratings"
msgstr "izostavi iz bodovanja"
-#: judge/models/contest.py:97
+#: judge/models/contest.py:103
msgid "private to specific users"
msgstr ""
-#: judge/models/contest.py:98
+#: judge/models/contest.py:104
msgid "private contestants"
msgstr ""
-#: judge/models/contest.py:99
+#: judge/models/contest.py:105
msgid "If private, only these users may see the contest"
msgstr ""
-#: judge/models/contest.py:101
+#: judge/models/contest.py:107
msgid "hide problem tags"
msgstr "sakrij oznake zadataka"
-#: judge/models/contest.py:102
+#: judge/models/contest.py:108
msgid "Whether problem tags should be hidden by default."
msgstr "Trebaju li oznake zadataka biti zadano skrivene."
-#: judge/models/contest.py:104
+#: judge/models/contest.py:110
+msgid "hide problem authors"
+msgstr ""
+
+#: judge/models/contest.py:111
+msgid "Whether problem authors should be hidden by default."
+msgstr ""
+
+#: judge/models/contest.py:113
msgid "run pretests only"
msgstr "pokreni samo predtestiranje"
-#: judge/models/contest.py:105
+#: judge/models/contest.py:114
msgid "Whether judges should grade pretests only, versus all testcases. Commonly set during a contest, then unset prior to rejudging user submissions when the contest ends."
msgstr ""
-#: judge/models/contest.py:109 judge/models/problem.py:166
+#: judge/models/contest.py:118 judge/models/problem.py:183
msgid "private to organizations"
msgstr "privatno za organizacije"
-#: judge/models/contest.py:110 judge/models/problem.py:164
-#: judge/models/profile.py:83
+#: judge/models/contest.py:119 judge/models/problem.py:181
+#: judge/models/profile.py:86
msgid "organizations"
msgstr ""
-#: judge/models/contest.py:111
+#: judge/models/contest.py:120
msgid "If private, only these organizations may see the contest"
msgstr ""
-#: judge/models/contest.py:112 judge/models/problem.py:153
+#: judge/models/contest.py:121 judge/models/problem.py:167
msgid "OpenGraph image"
msgstr "OpenGraph slika"
-#: judge/models/contest.py:113 judge/models/profile.py:54
+#: judge/models/contest.py:122 judge/models/profile.py:57
msgid "Logo override image"
msgstr ""
-#: judge/models/contest.py:115
+#: judge/models/contest.py:124
msgid "This image will replace the default site logo for users inside the contest."
msgstr ""
-#: judge/models/contest.py:118
+#: judge/models/contest.py:127
msgid "the amount of live participants"
msgstr "trenutni broj natjecatelja"
-#: judge/models/contest.py:119
+#: judge/models/contest.py:128
msgid "contest summary"
msgstr "sažetak natjecanja"
-#: judge/models/contest.py:120 judge/models/problem.py:155
+#: judge/models/contest.py:129 judge/models/problem.py:169
msgid "Plain-text, shown in meta description tag, e.g. for social media."
msgstr ""
-#: judge/models/contest.py:121 judge/models/profile.py:53
+#: judge/models/contest.py:130 judge/models/profile.py:56
msgid "access code"
msgstr ""
-#: judge/models/contest.py:122
+#: judge/models/contest.py:131
msgid "An optional code to prompt contestants before they are allowed to join the contest. Leave it blank to disable."
msgstr ""
-#: judge/models/contest.py:124 judge/models/problem.py:149
+#: judge/models/contest.py:133 judge/models/problem.py:163
msgid "personae non gratae"
msgstr "persona non grata"
-#: judge/models/contest.py:125
+#: judge/models/contest.py:134
msgid "Bans the selected users from joining this contest."
msgstr "Zabranjuje označenom korisniku pridruživanje natjecanju."
-#: judge/models/contest.py:126
+#: judge/models/contest.py:135
msgid "contest format"
msgstr "oblik natjecanja"
-#: judge/models/contest.py:127
+#: judge/models/contest.py:136
msgid "The contest format module to use."
msgstr ""
-#: judge/models/contest.py:128
+#: judge/models/contest.py:137
msgid "contest format configuration"
msgstr ""
-#: judge/models/contest.py:129
+#: judge/models/contest.py:138
msgid "A JSON object to serve as the configuration for the chosen contest format module. Leave empty to use None. Exact format depends on the contest format selected."
msgstr ""
-#: judge/models/contest.py:136
+#: judge/models/contest.py:145
msgid "contest lock"
msgstr ""
-#: judge/models/contest.py:137
-msgid "Prevent submissions from this contest from being rejudged."
+#: judge/models/contest.py:146
+msgid "Prevent submissions from this contest from being rejudged after this date."
msgstr ""
-#: judge/models/contest.py:138
+#: judge/models/contest.py:148
msgid "precision points"
msgstr ""
-#: judge/models/contest.py:140
+#: judge/models/contest.py:150
msgid "Number of digits to round points to."
msgstr ""
-#: judge/models/contest.py:362
+#: judge/models/contest.py:398
msgid "See private contests"
msgstr "Pregledaj privatna natjecanja"
-#: judge/models/contest.py:363
+#: judge/models/contest.py:399
msgid "Edit own contests"
msgstr "Uredi vlastita natjecanja"
-#: judge/models/contest.py:364
+#: judge/models/contest.py:400
msgid "Edit all contests"
msgstr "Uredi sva natjecanja"
-#: judge/models/contest.py:365
+#: judge/models/contest.py:401
msgid "Clone contest"
msgstr "Kloniraj natjecanje"
-#: judge/models/contest.py:366 templates/contest/moss.html:74
+#: judge/models/contest.py:402 templates/contest/moss.html:74
msgid "MOSS contest"
msgstr "MOSS natjecanje"
-#: judge/models/contest.py:367
+#: judge/models/contest.py:403
msgid "Rate contests"
msgstr ""
-#: judge/models/contest.py:368
+#: judge/models/contest.py:404
msgid "Contest access codes"
msgstr ""
-#: judge/models/contest.py:369
+#: judge/models/contest.py:405
msgid "Create private contests"
msgstr ""
-#: judge/models/contest.py:370
+#: judge/models/contest.py:406
msgid "Change contest visibility"
msgstr ""
-#: judge/models/contest.py:371
+#: judge/models/contest.py:407
msgid "Edit contest problem label script"
msgstr ""
-#: judge/models/contest.py:372
+#: judge/models/contest.py:408
msgid "Change lock status of contest"
msgstr ""
-#: judge/models/contest.py:374 judge/models/contest.py:472
-#: judge/models/contest.py:510 judge/models/contest.py:532
-#: judge/models/submission.py:84
+#: judge/models/contest.py:410 judge/models/contest.py:508
+#: judge/models/contest.py:547 judge/models/contest.py:569
+#: judge/models/submission.py:85
msgid "contest"
msgstr "natjecanje"
-#: judge/models/contest.py:375
+#: judge/models/contest.py:411
msgid "contests"
msgstr "natjecanja"
-#: judge/models/contest.py:382
+#: judge/models/contest.py:418
msgid "associated contest"
msgstr ""
-#: judge/models/contest.py:385
+#: judge/models/contest.py:421
msgid "score"
msgstr "bodovi"
-#: judge/models/contest.py:386
+#: judge/models/contest.py:422
msgid "cumulative time"
msgstr ""
-#: judge/models/contest.py:387
+#: judge/models/contest.py:423
msgid "is disqualified"
msgstr ""
-#: judge/models/contest.py:388
+#: judge/models/contest.py:424
msgid "Whether this participation is disqualified."
msgstr ""
-#: judge/models/contest.py:389
+#: judge/models/contest.py:425
msgid "tie-breaking field"
msgstr ""
-#: judge/models/contest.py:390
+#: judge/models/contest.py:426
msgid "virtual participation id"
msgstr ""
-#: judge/models/contest.py:391
+#: judge/models/contest.py:427
msgid "0 means non-virtual, otherwise the n-th virtual participation."
msgstr ""
-#: judge/models/contest.py:392
+#: judge/models/contest.py:428
msgid "contest format specific data"
msgstr ""
-#: judge/models/contest.py:458
+#: judge/models/contest.py:494
#, python-format
msgid "%s spectating in %s"
msgstr ""
-#: judge/models/contest.py:460
+#: judge/models/contest.py:496
#, python-format
msgid "%s in %s, v%d"
msgstr ""
-#: judge/models/contest.py:461
+#: judge/models/contest.py:497
#, python-format
msgid "%s in %s"
msgstr ""
-#: judge/models/contest.py:464
+#: judge/models/contest.py:500
msgid "contest participation"
msgstr ""
-#: judge/models/contest.py:465
+#: judge/models/contest.py:501
msgid "contest participations"
msgstr ""
-#: judge/models/contest.py:471 judge/models/contest.py:494
-#: judge/models/contest.py:533 judge/models/problem.py:430
-#: judge/models/problem.py:435 judge/models/problem.py:453
+#: judge/models/contest.py:507 judge/models/contest.py:531
+#: judge/models/contest.py:570 judge/models/problem.py:457
+#: judge/models/problem.py:462 judge/models/problem.py:480
#: judge/models/problem_data.py:35
msgid "problem"
msgstr ""
-#: judge/models/contest.py:473 judge/models/contest.py:498
-#: judge/models/problem.py:137
+#: judge/models/contest.py:509 judge/models/contest.py:535
+#: judge/models/problem.py:151
msgid "points"
msgstr ""
-#: judge/models/contest.py:474
+#: judge/models/contest.py:510
msgid "partial"
msgstr ""
-#: judge/models/contest.py:475 judge/models/contest.py:499
+#: judge/models/contest.py:511 judge/models/contest.py:536
msgid "is pretested"
msgstr ""
-#: judge/models/contest.py:476 judge/models/interface.py:43
+#: judge/models/contest.py:512 judge/models/interface.py:43
msgid "order"
msgstr "redoslijed"
-#: judge/models/contest.py:477
+#: judge/models/contest.py:513
msgid "output prefix length override"
msgstr ""
-#: judge/models/contest.py:479
+#: judge/models/contest.py:515
msgid "Maximum number of submissions for this problem, or leave blank for no limit."
msgstr ""
-#: judge/models/contest.py:482
+#: judge/models/contest.py:518
msgid "Why include a problem you can't submit to?"
msgstr ""
-#: judge/models/contest.py:487
+#: judge/models/contest.py:523
msgid "contest problem"
msgstr ""
-#: judge/models/contest.py:488
+#: judge/models/contest.py:524
msgid "contest problems"
msgstr ""
-#: judge/models/contest.py:492 judge/models/submission.py:207
+#: judge/models/contest.py:529 judge/models/submission.py:218
msgid "submission"
msgstr "predano rješenje"
-#: judge/models/contest.py:496 judge/models/contest.py:511
+#: judge/models/contest.py:533 judge/models/contest.py:548
msgid "participation"
msgstr "sudjelovanje"
-#: judge/models/contest.py:500
+#: judge/models/contest.py:537
msgid "Whether this submission was ran only on pretests."
msgstr ""
-#: judge/models/contest.py:504
+#: judge/models/contest.py:541
msgid "contest submission"
msgstr ""
-#: judge/models/contest.py:505
+#: judge/models/contest.py:542
msgid "contest submissions"
msgstr ""
-#: judge/models/contest.py:513
+#: judge/models/contest.py:550
msgid "rank"
msgstr ""
-#: judge/models/contest.py:514
+#: judge/models/contest.py:551
msgid "rating"
msgstr ""
-#: judge/models/contest.py:515
+#: judge/models/contest.py:552
msgid "volatility"
msgstr ""
-#: judge/models/contest.py:516
+#: judge/models/contest.py:553
msgid "last rated"
msgstr ""
-#: judge/models/contest.py:520
+#: judge/models/contest.py:557
msgid "contest rating"
msgstr ""
-#: judge/models/contest.py:521
+#: judge/models/contest.py:558
msgid "contest ratings"
msgstr ""
-#: judge/models/contest.py:540
+#: judge/models/contest.py:577
msgid "contest moss result"
msgstr ""
-#: judge/models/contest.py:541
+#: judge/models/contest.py:578
msgid "contest moss results"
msgstr ""
@@ -1216,7 +1233,7 @@ msgstr ""
msgid "post title"
msgstr ""
-#: judge/models/interface.py:67 judge/models/problem.py:473
+#: judge/models/interface.py:67 judge/models/problem.py:500
msgid "authors"
msgstr ""
@@ -1224,7 +1241,7 @@ msgstr ""
msgid "slug"
msgstr ""
-#: judge/models/interface.py:69 judge/models/problem.py:471
+#: judge/models/interface.py:69 judge/models/problem.py:498
msgid "public visibility"
msgstr ""
@@ -1260,34 +1277,6 @@ msgstr ""
msgid "blog posts"
msgstr ""
-#: judge/models/message.py:11
-msgid "message title"
-msgstr ""
-
-#: judge/models/message.py:12 judge/models/ticket.py:30
-msgid "message body"
-msgstr ""
-
-#: judge/models/message.py:13
-msgid "sender"
-msgstr ""
-
-#: judge/models/message.py:14
-msgid "target"
-msgstr ""
-
-#: judge/models/message.py:15
-msgid "message timestamp"
-msgstr ""
-
-#: judge/models/message.py:16
-msgid "read"
-msgstr ""
-
-#: judge/models/message.py:20
-msgid "messages in the thread"
-msgstr ""
-
#: judge/models/problem.py:30
#, python-format
msgid "Disallowed characters: %(value)s"
@@ -1305,7 +1294,7 @@ msgstr ""
msgid "problem type"
msgstr ""
-#: judge/models/problem.py:44 judge/models/problem.py:121
+#: judge/models/problem.py:44 judge/models/problem.py:135
msgid "problem types"
msgstr ""
@@ -1317,7 +1306,7 @@ msgstr ""
msgid "problem group name"
msgstr ""
-#: judge/models/problem.py:56 judge/models/problem.py:124
+#: judge/models/problem.py:56 judge/models/problem.py:138
msgid "problem group"
msgstr ""
@@ -1337,7 +1326,7 @@ msgstr ""
msgid "full name"
msgstr ""
-#: judge/models/problem.py:65 judge/models/profile.py:41
+#: judge/models/problem.py:65 judge/models/profile.py:44
#: judge/models/runtime.py:24
msgid "short name"
msgstr ""
@@ -1366,232 +1355,252 @@ msgstr ""
msgid "licenses"
msgstr ""
-#: judge/models/problem.py:104
+#: judge/models/problem.py:112
+msgid "Follow global setting"
+msgstr ""
+
+#: judge/models/problem.py:113
+msgid "Always visible"
+msgstr ""
+
+#: judge/models/problem.py:114
+msgid "Visible if problem solved"
+msgstr ""
+
+#: judge/models/problem.py:115
+msgid "Only own submissions"
+msgstr ""
+
+#: judge/models/problem.py:118
msgid "problem code"
msgstr ""
-#: judge/models/problem.py:106
+#: judge/models/problem.py:120
msgid "A short, unique code for the problem, used in the url after /problem/"
msgstr ""
-#: judge/models/problem.py:108
+#: judge/models/problem.py:122
msgid "problem name"
msgstr ""
-#: judge/models/problem.py:109
+#: judge/models/problem.py:123
msgid "The full name of the problem, as shown in the problem list."
msgstr ""
-#: judge/models/problem.py:111
+#: judge/models/problem.py:125
msgid "problem body"
msgstr ""
-#: judge/models/problem.py:112
+#: judge/models/problem.py:126
msgid "creators"
msgstr ""
-#: judge/models/problem.py:113
+#: judge/models/problem.py:127
msgid "These users will be able to edit the problem, and be listed as authors."
msgstr ""
-#: judge/models/problem.py:115
+#: judge/models/problem.py:129
msgid "curators"
msgstr ""
-#: judge/models/problem.py:116
+#: judge/models/problem.py:130
msgid "These users will be able to edit the problem, but not be listed as authors."
msgstr ""
-#: judge/models/problem.py:118
+#: judge/models/problem.py:132
msgid "testers"
msgstr ""
-#: judge/models/problem.py:120
+#: judge/models/problem.py:134
msgid "These users will be able to view the private problem, but not edit it."
msgstr ""
-#: judge/models/problem.py:122
+#: judge/models/problem.py:136
msgid "The type of problem, as shown on the problem's page."
msgstr ""
-#: judge/models/problem.py:125
+#: judge/models/problem.py:139
msgid "The group of problem, shown under Category in the problem list."
msgstr ""
-#: judge/models/problem.py:127
+#: judge/models/problem.py:141
msgid "The time limit for this problem, in seconds. Fractional seconds (e.g. 1.5) are supported."
msgstr ""
-#: judge/models/problem.py:131 judge/models/problem.py:458
+#: judge/models/problem.py:145 judge/models/problem.py:485
msgid "memory limit"
msgstr "memorijsko ograničenje"
-#: judge/models/problem.py:132
+#: judge/models/problem.py:146
msgid "The memory limit for this problem, in kilobytes (e.g. 64mb = 65536 kilobytes)."
msgstr "Memorijsko ograničenje za ovaj zadatak, u kilobajtima (npr. 64mb = 65536 kilobajta)."
-#: judge/models/problem.py:138
+#: judge/models/problem.py:152
msgid "Points awarded for problem completion. Points are displayed with a 'p' suffix if partial."
msgstr ""
-#: judge/models/problem.py:141
+#: judge/models/problem.py:155
msgid "allows partial points"
msgstr "dopušteno djelomično bodovanje"
-#: judge/models/problem.py:142
+#: judge/models/problem.py:156
msgid "allowed languages"
msgstr "dopušteni programski jezici"
-#: judge/models/problem.py:143
+#: judge/models/problem.py:157
msgid "List of allowed submission languages."
msgstr ""
-#: judge/models/problem.py:145
+#: judge/models/problem.py:159
msgid "manually managed"
msgstr "ručno upravljano"
-#: judge/models/problem.py:146
+#: judge/models/problem.py:160
msgid "Whether judges should be allowed to manage data or not."
msgstr ""
-#: judge/models/problem.py:147
+#: judge/models/problem.py:161
msgid "date of publishing"
msgstr "datum objave"
-#: judge/models/problem.py:148
+#: judge/models/problem.py:162
msgid "Doesn't have magic ability to auto-publish due to backward compatibility"
msgstr ""
-#: judge/models/problem.py:150
+#: judge/models/problem.py:164
msgid "Bans the selected users from submitting to this problem."
msgstr ""
-#: judge/models/problem.py:152
+#: judge/models/problem.py:166
msgid "The license under which this problem is published."
msgstr ""
-#: judge/models/problem.py:154
+#: judge/models/problem.py:168
msgid "problem summary"
msgstr "sažetak zadatka"
-#: judge/models/problem.py:156
+#: judge/models/problem.py:170
msgid "number of users"
msgstr ""
-#: judge/models/problem.py:157
+#: judge/models/problem.py:171
msgid "The number of users who solved the problem."
msgstr ""
-#: judge/models/problem.py:158
+#: judge/models/problem.py:172
msgid "solve rate"
msgstr ""
-#: judge/models/problem.py:159
+#: judge/models/problem.py:173
msgid "allow full markdown access"
msgstr ""
-#: judge/models/problem.py:165
+#: judge/models/problem.py:174
+msgid "submission source visibility"
+msgstr ""
+
+#: judge/models/problem.py:182
msgid "If private, only these organizations may see the problem."
msgstr ""
-#: judge/models/problem.py:420
+#: judge/models/problem.py:447
msgid "See hidden problems"
msgstr ""
-#: judge/models/problem.py:421
+#: judge/models/problem.py:448
msgid "Edit own problems"
msgstr ""
-#: judge/models/problem.py:422
+#: judge/models/problem.py:449
msgid "Edit all problems"
msgstr ""
-#: judge/models/problem.py:423
+#: judge/models/problem.py:450
msgid "Edit all public problems"
msgstr ""
-#: judge/models/problem.py:424
+#: judge/models/problem.py:451
msgid "Edit problems with full markup"
msgstr ""
-#: judge/models/problem.py:425 templates/problem/problem.html:161
+#: judge/models/problem.py:452 templates/problem/problem.html:161
msgid "Clone problem"
msgstr ""
-#: judge/models/problem.py:426
+#: judge/models/problem.py:453
msgid "Change is_public field"
msgstr ""
-#: judge/models/problem.py:427
+#: judge/models/problem.py:454
msgid "Change is_manually_managed field"
msgstr ""
-#: judge/models/problem.py:428
+#: judge/models/problem.py:455
msgid "See organization-private problems"
msgstr ""
-#: judge/models/problem.py:436 judge/models/problem.py:454
+#: judge/models/problem.py:463 judge/models/problem.py:481
#: judge/models/runtime.py:111
msgid "language"
msgstr ""
-#: judge/models/problem.py:437
+#: judge/models/problem.py:464
msgid "translated name"
msgstr ""
-#: judge/models/problem.py:438
+#: judge/models/problem.py:465
msgid "translated description"
msgstr ""
-#: judge/models/problem.py:442
+#: judge/models/problem.py:469
msgid "problem translation"
msgstr ""
-#: judge/models/problem.py:443
+#: judge/models/problem.py:470
msgid "problem translations"
msgstr ""
-#: judge/models/problem.py:447
+#: judge/models/problem.py:474
msgid "clarified problem"
msgstr ""
-#: judge/models/problem.py:448
+#: judge/models/problem.py:475
msgid "clarification body"
msgstr ""
-#: judge/models/problem.py:449
+#: judge/models/problem.py:476
msgid "clarification timestamp"
msgstr ""
-#: judge/models/problem.py:464
+#: judge/models/problem.py:491
msgid "language-specific resource limit"
msgstr ""
-#: judge/models/problem.py:465
+#: judge/models/problem.py:492
msgid "language-specific resource limits"
msgstr ""
-#: judge/models/problem.py:469
+#: judge/models/problem.py:496
msgid "associated problem"
msgstr ""
-#: judge/models/problem.py:472
+#: judge/models/problem.py:499
msgid "publish date"
msgstr ""
-#: judge/models/problem.py:474
+#: judge/models/problem.py:501
msgid "editorial content"
msgstr ""
-#: judge/models/problem.py:497
+#: judge/models/problem.py:524
msgid "See hidden solutions"
msgstr ""
-#: judge/models/problem.py:499
+#: judge/models/problem.py:526
msgid "solution"
msgstr ""
-#: judge/models/problem.py:500
+#: judge/models/problem.py:527
msgid "solutions"
msgstr ""
@@ -1703,112 +1712,112 @@ msgstr ""
msgid "case is pretest?"
msgstr ""
-#: judge/models/profile.py:38
+#: judge/models/profile.py:41
msgid "organization title"
msgstr ""
-#: judge/models/profile.py:39
+#: judge/models/profile.py:42
msgid "organization slug"
msgstr ""
-#: judge/models/profile.py:40
+#: judge/models/profile.py:43
msgid "Organization name shown in URL"
msgstr ""
-#: judge/models/profile.py:42
+#: judge/models/profile.py:45
msgid "Displayed beside user name during contests"
msgstr ""
-#: judge/models/profile.py:43
+#: judge/models/profile.py:46
msgid "organization description"
msgstr ""
-#: judge/models/profile.py:44
+#: judge/models/profile.py:47
msgid "administrators"
msgstr ""
-#: judge/models/profile.py:45
+#: judge/models/profile.py:48
msgid "Those who can edit this organization"
msgstr ""
-#: judge/models/profile.py:46
+#: judge/models/profile.py:49
msgid "creation date"
msgstr ""
-#: judge/models/profile.py:47
+#: judge/models/profile.py:50
msgid "is open organization?"
msgstr ""
-#: judge/models/profile.py:48
+#: judge/models/profile.py:51
msgid "Allow joining organization"
msgstr ""
-#: judge/models/profile.py:49
+#: judge/models/profile.py:52
msgid "maximum size"
msgstr ""
-#: judge/models/profile.py:50
+#: judge/models/profile.py:53
msgid "Maximum amount of users in this organization, only applicable to private organizations"
msgstr ""
-#: judge/models/profile.py:52
+#: judge/models/profile.py:55
msgid "Student access code"
msgstr ""
-#: judge/models/profile.py:56
+#: judge/models/profile.py:59
msgid "This image will replace the default site logo for users viewing the organization."
msgstr ""
-#: judge/models/profile.py:79
+#: judge/models/profile.py:82
msgid "Administer organizations"
msgstr ""
-#: judge/models/profile.py:80
+#: judge/models/profile.py:83
msgid "Edit all organizations"
msgstr ""
-#: judge/models/profile.py:82 judge/models/profile.py:99
-#: judge/models/profile.py:269
+#: judge/models/profile.py:85 judge/models/profile.py:102
+#: judge/models/profile.py:293
msgid "organization"
msgstr ""
-#: judge/models/profile.py:87
+#: judge/models/profile.py:90
msgid "user associated"
msgstr ""
-#: judge/models/profile.py:88
+#: judge/models/profile.py:91
msgid "self-description"
msgstr ""
-#: judge/models/profile.py:89
+#: judge/models/profile.py:92
msgid "location"
msgstr ""
-#: judge/models/profile.py:91
+#: judge/models/profile.py:94
msgid "preferred language"
msgstr ""
-#: judge/models/profile.py:97
+#: judge/models/profile.py:100
msgid "last access time"
msgstr ""
-#: judge/models/profile.py:98
+#: judge/models/profile.py:101
msgid "last IP"
msgstr ""
-#: judge/models/profile.py:101
+#: judge/models/profile.py:104
msgid "display rank"
msgstr ""
-#: judge/models/profile.py:103
+#: judge/models/profile.py:106
msgid "Normal User"
msgstr ""
-#: judge/models/profile.py:104
+#: judge/models/profile.py:107
msgid "Problem Setter"
msgstr ""
-#: judge/models/profile.py:105 templates/base.html:220
+#: judge/models/profile.py:108 templates/base.html:220
#: templates/comments/list.html:99 templates/contest/contest-list-tabs.html:24
#: templates/contest/ranking-table.html:49
#: templates/problem/problem-list-tabs.html:6
@@ -1817,155 +1826,167 @@ msgstr ""
msgid "Admin"
msgstr ""
-#: judge/models/profile.py:106
+#: judge/models/profile.py:109
msgid "comment mute"
msgstr ""
-#: judge/models/profile.py:106
+#: judge/models/profile.py:109
msgid "Some users are at their best when silent."
msgstr ""
-#: judge/models/profile.py:108
+#: judge/models/profile.py:111
msgid "unlisted user"
msgstr ""
-#: judge/models/profile.py:108
+#: judge/models/profile.py:111
msgid "User will not be ranked."
msgstr ""
-#: judge/models/profile.py:111
+#: judge/models/profile.py:114
msgid "user script"
msgstr ""
-#: judge/models/profile.py:112
+#: judge/models/profile.py:115
msgid "User-defined JavaScript for site customization."
msgstr ""
-#: judge/models/profile.py:113
+#: judge/models/profile.py:116
msgid "current contest"
msgstr ""
-#: judge/models/profile.py:115
+#: judge/models/profile.py:118
msgid "math engine"
msgstr ""
-#: judge/models/profile.py:117
+#: judge/models/profile.py:120
msgid "the rendering engine used to render math"
msgstr ""
-#: judge/models/profile.py:118
+#: judge/models/profile.py:121
msgid "TOTP 2FA enabled"
msgstr ""
-#: judge/models/profile.py:119
+#: judge/models/profile.py:122
msgid "check to enable TOTP-based two-factor authentication"
msgstr ""
-#: judge/models/profile.py:120
+#: judge/models/profile.py:123
msgid "WebAuthn 2FA enabled"
msgstr ""
-#: judge/models/profile.py:121
+#: judge/models/profile.py:124
msgid "check to enable WebAuthn-based two-factor authentication"
msgstr ""
-#: judge/models/profile.py:122
+#: judge/models/profile.py:125
msgid "TOTP key"
msgstr ""
-#: judge/models/profile.py:123
+#: judge/models/profile.py:126
msgid "32 character base32-encoded key for TOTP"
msgstr ""
-#: judge/models/profile.py:125
+#: judge/models/profile.py:128
msgid "TOTP key must be empty or base32"
msgstr ""
-#: judge/models/profile.py:126
+#: judge/models/profile.py:129
msgid "scratch codes"
msgstr ""
-#: judge/models/profile.py:127
+#: judge/models/profile.py:130
msgid "JSON array of 16 character base32-encoded codes for scratch codes"
msgstr ""
-#: judge/models/profile.py:131
+#: judge/models/profile.py:134
msgid "Scratch codes must be empty or a JSON array of 16-character base32 codes"
msgstr ""
-#: judge/models/profile.py:133
+#: judge/models/profile.py:136
+msgid "last TOTP timecode"
+msgstr ""
+
+#: judge/models/profile.py:137
msgid "API token"
msgstr ""
-#: judge/models/profile.py:134
+#: judge/models/profile.py:138
msgid "64 character hex-encoded API access token"
msgstr ""
-#: judge/models/profile.py:136
+#: judge/models/profile.py:140
msgid "API token must be None or hexadecimal"
msgstr ""
-#: judge/models/profile.py:137
+#: judge/models/profile.py:141
msgid "internal notes"
msgstr ""
-#: judge/models/profile.py:138
+#: judge/models/profile.py:142
msgid "Notes for administrators regarding this user."
msgstr ""
-#: judge/models/profile.py:139
+#: judge/models/profile.py:143
msgid "last data download time"
msgstr ""
-#: judge/models/profile.py:236
+#: judge/models/profile.py:253
msgid "Shows in-progress development stuff"
msgstr ""
-#: judge/models/profile.py:237
+#: judge/models/profile.py:254
msgid "Edit TOTP settings"
msgstr ""
-#: judge/models/profile.py:239
+#: judge/models/profile.py:256
msgid "user profile"
msgstr ""
-#: judge/models/profile.py:240
+#: judge/models/profile.py:257
msgid "user profiles"
msgstr ""
-#: judge/models/profile.py:246
+#: judge/models/profile.py:263
msgid "device name"
msgstr ""
-#: judge/models/profile.py:247
+#: judge/models/profile.py:264
msgid "credential ID"
msgstr ""
-#: judge/models/profile.py:248
+#: judge/models/profile.py:265
msgid "public key"
msgstr ""
-#: judge/models/profile.py:249
+#: judge/models/profile.py:266
msgid "sign counter"
msgstr ""
-#: judge/models/profile.py:271
+#: judge/models/profile.py:287
+msgid "WebAuthn credential"
+msgstr ""
+
+#: judge/models/profile.py:288
+msgid "WebAuthn credentials"
+msgstr ""
+
+#: judge/models/profile.py:295
msgid "request time"
msgstr ""
-#: judge/models/profile.py:272
+#: judge/models/profile.py:296
msgid "state"
msgstr ""
-#: judge/models/profile.py:277
+#: judge/models/profile.py:301
msgid "reason"
msgstr ""
-#: judge/models/profile.py:280
+#: judge/models/profile.py:304
msgid "organization join request"
msgstr ""
-#: judge/models/profile.py:281
+#: judge/models/profile.py:305
msgid "organization join requests"
msgstr ""
@@ -2121,210 +2142,210 @@ msgstr ""
msgid "judge"
msgstr ""
-#: judge/models/submission.py:20 judge/models/submission.py:47
+#: judge/models/submission.py:21 judge/models/submission.py:48
#: judge/utils/problems.py:74
msgid "Accepted"
msgstr ""
-#: judge/models/submission.py:21 judge/models/submission.py:48
+#: judge/models/submission.py:22 judge/models/submission.py:49
msgid "Wrong Answer"
msgstr ""
-#: judge/models/submission.py:22 judge/models/submission.py:50
+#: judge/models/submission.py:23 judge/models/submission.py:51
msgid "Time Limit Exceeded"
msgstr ""
-#: judge/models/submission.py:23 judge/models/submission.py:51
+#: judge/models/submission.py:24 judge/models/submission.py:52
msgid "Memory Limit Exceeded"
msgstr ""
-#: judge/models/submission.py:24 judge/models/submission.py:52
+#: judge/models/submission.py:25 judge/models/submission.py:53
msgid "Output Limit Exceeded"
msgstr ""
-#: judge/models/submission.py:25 judge/models/submission.py:53
+#: judge/models/submission.py:26 judge/models/submission.py:54
msgid "Invalid Return"
msgstr ""
-#: judge/models/submission.py:26 judge/models/submission.py:54
+#: judge/models/submission.py:27 judge/models/submission.py:55
msgid "Runtime Error"
msgstr ""
-#: judge/models/submission.py:27 judge/models/submission.py:41
-#: judge/models/submission.py:55 judge/utils/problems.py:76
+#: judge/models/submission.py:28 judge/models/submission.py:42
+#: judge/models/submission.py:56 judge/utils/problems.py:76
msgid "Compile Error"
msgstr ""
-#: judge/models/submission.py:28 judge/models/submission.py:40
+#: judge/models/submission.py:29 judge/models/submission.py:41
msgid "Internal Error"
msgstr ""
-#: judge/models/submission.py:29
+#: judge/models/submission.py:30
msgid "Short circuit"
msgstr ""
-#: judge/models/submission.py:30 judge/models/submission.py:42
-#: judge/models/submission.py:61
+#: judge/models/submission.py:31 judge/models/submission.py:43
+#: judge/models/submission.py:62
msgid "Aborted"
msgstr ""
-#: judge/models/submission.py:36 judge/models/submission.py:57
+#: judge/models/submission.py:37 judge/models/submission.py:58
msgid "Queued"
msgstr ""
-#: judge/models/submission.py:37 judge/models/submission.py:58
+#: judge/models/submission.py:38 judge/models/submission.py:59
msgid "Processing"
msgstr ""
-#: judge/models/submission.py:38 judge/models/submission.py:59
+#: judge/models/submission.py:39 judge/models/submission.py:60
msgid "Grading"
msgstr ""
-#: judge/models/submission.py:39 judge/models/submission.py:60
+#: judge/models/submission.py:40 judge/models/submission.py:61
msgid "Completed"
msgstr ""
-#: judge/models/submission.py:56
+#: judge/models/submission.py:57
msgid "Internal Error (judging server error)"
msgstr ""
-#: judge/models/submission.py:66
+#: judge/models/submission.py:67
msgid "submission time"
msgstr ""
-#: judge/models/submission.py:67 judge/models/submission.py:227
+#: judge/models/submission.py:68 judge/models/submission.py:238
msgid "execution time"
msgstr ""
-#: judge/models/submission.py:68 judge/models/submission.py:228
+#: judge/models/submission.py:69 judge/models/submission.py:239
msgid "memory usage"
msgstr ""
-#: judge/models/submission.py:69 judge/models/submission.py:229
+#: judge/models/submission.py:70 judge/models/submission.py:240
msgid "points granted"
msgstr ""
-#: judge/models/submission.py:70
+#: judge/models/submission.py:71
msgid "submission language"
msgstr ""
-#: judge/models/submission.py:71
+#: judge/models/submission.py:72
msgid "status"
msgstr ""
-#: judge/models/submission.py:72
+#: judge/models/submission.py:73
msgid "result"
msgstr ""
-#: judge/models/submission.py:74
+#: judge/models/submission.py:75
msgid "compile errors"
msgstr ""
-#: judge/models/submission.py:76
+#: judge/models/submission.py:77
msgid "batched cases"
msgstr ""
-#: judge/models/submission.py:77
+#: judge/models/submission.py:78
msgid "test case points"
msgstr ""
-#: judge/models/submission.py:78
+#: judge/models/submission.py:79
msgid "test case total points"
msgstr ""
-#: judge/models/submission.py:79
+#: judge/models/submission.py:80
msgid "judged on"
msgstr ""
-#: judge/models/submission.py:81
+#: judge/models/submission.py:82
msgid "submission judge time"
msgstr ""
-#: judge/models/submission.py:82
-msgid "was rejudged by admin"
+#: judge/models/submission.py:83
+msgid "last rejudge date by admin"
msgstr ""
-#: judge/models/submission.py:83
+#: judge/models/submission.py:84
msgid "was ran on pretests only"
msgstr ""
-#: judge/models/submission.py:86
-msgid "lock submission"
+#: judge/models/submission.py:87
+msgid "submission lock"
msgstr ""
-#: judge/models/submission.py:199
+#: judge/models/submission.py:210
msgid "Abort any submission"
msgstr ""
-#: judge/models/submission.py:200
+#: judge/models/submission.py:211
msgid "Rejudge the submission"
msgstr ""
-#: judge/models/submission.py:201
+#: judge/models/submission.py:212
msgid "Rejudge a lot of submissions"
msgstr ""
-#: judge/models/submission.py:202
+#: judge/models/submission.py:213
msgid "Submit without limit"
msgstr ""
-#: judge/models/submission.py:203
+#: judge/models/submission.py:214
msgid "View all submission"
msgstr ""
-#: judge/models/submission.py:204
+#: judge/models/submission.py:215
msgid "Resubmit others' submission"
msgstr ""
-#: judge/models/submission.py:205
+#: judge/models/submission.py:216
msgid "Change lock status of submission"
msgstr ""
-#: judge/models/submission.py:208 templates/contest/moss.html:58
+#: judge/models/submission.py:219 templates/contest/moss.html:58
msgid "submissions"
msgstr ""
-#: judge/models/submission.py:212 judge/models/submission.py:223
+#: judge/models/submission.py:223 judge/models/submission.py:234
msgid "associated submission"
msgstr ""
-#: judge/models/submission.py:214
+#: judge/models/submission.py:225
msgid "source code"
msgstr ""
-#: judge/models/submission.py:225
+#: judge/models/submission.py:236
msgid "test case ID"
msgstr ""
-#: judge/models/submission.py:226
+#: judge/models/submission.py:237
msgid "status flag"
msgstr ""
-#: judge/models/submission.py:230
+#: judge/models/submission.py:241
msgid "points possible"
msgstr ""
-#: judge/models/submission.py:231
+#: judge/models/submission.py:242
msgid "batch number"
msgstr ""
-#: judge/models/submission.py:232
+#: judge/models/submission.py:243
msgid "judging feedback"
msgstr ""
-#: judge/models/submission.py:233
+#: judge/models/submission.py:244
msgid "extended judging feedback"
msgstr ""
-#: judge/models/submission.py:234
+#: judge/models/submission.py:245
msgid "program output"
msgstr ""
-#: judge/models/submission.py:242
+#: judge/models/submission.py:253
msgid "submission test case"
msgstr ""
-#: judge/models/submission.py:243
+#: judge/models/submission.py:254
msgid "submission test cases"
msgstr ""
@@ -2372,6 +2393,10 @@ msgstr ""
msgid "poster"
msgstr ""
+#: judge/models/ticket.py:30
+msgid "message body"
+msgstr ""
+
#: judge/models/ticket.py:31
msgid "message time"
msgstr ""
@@ -2394,19 +2419,23 @@ msgstr ""
msgid "Running MOSS"
msgstr ""
-#: judge/tasks/submission.py:43
+#: judge/tasks/submission.py:45
msgid "Modifying submissions"
msgstr ""
-#: judge/tasks/submission.py:56
+#: judge/tasks/submission.py:58
msgid "Recalculating user points"
msgstr ""
-#: judge/tasks/user.py:50
+#: judge/tasks/user.py:49
+msgid "Applying filters"
+msgstr ""
+
+#: judge/tasks/user.py:64
msgid "Preparing your submission data"
msgstr ""
-#: judge/tasks/user.py:81
+#: judge/tasks/user.py:95
msgid "Preparing your comment data"
msgstr ""
@@ -2522,7 +2551,7 @@ msgstr ""
msgid "You already voted."
msgstr ""
-#: judge/views/comment.py:129 judge/views/organization.py:298
+#: judge/views/comment.py:129 judge/views/organization.py:297
msgid "Edited from site"
msgstr ""
@@ -2530,125 +2559,130 @@ msgstr ""
msgid "Editing comment"
msgstr ""
-#: judge/views/contests.py:56 judge/views/contests.py:201
-#: judge/views/contests.py:204 judge/views/contests.py:382
+#: judge/views/contests.py:57 judge/views/contests.py:210
+#: judge/views/contests.py:213 judge/views/contests.py:395
msgid "No such contest"
msgstr ""
-#: judge/views/contests.py:57 judge/views/contests.py:202
+#: judge/views/contests.py:58 judge/views/contests.py:211
#, python-format
msgid "Could not find a contest with the key \"%s\"."
msgstr ""
-#: judge/views/contests.py:70
+#: judge/views/contests.py:71
msgid "Contests"
msgstr ""
-#: judge/views/contests.py:205
+#: judge/views/contests.py:214
msgid "Could not find such contest."
msgstr ""
-#: judge/views/contests.py:208
+#: judge/views/contests.py:217
#, python-format
msgid "Access to contest \"%s\" denied"
msgstr ""
-#: judge/views/contests.py:235
+#: judge/views/contests.py:244
msgid "Clone Contest"
msgstr ""
-#: judge/views/contests.py:301
+#: judge/views/contests.py:278
+#, python-format
+msgid "Cloned contest from %s"
+msgstr ""
+
+#: judge/views/contests.py:314
msgid "Contest not ongoing"
msgstr ""
-#: judge/views/contests.py:302
+#: judge/views/contests.py:315
#, python-format
msgid "\"%s\" is not currently ongoing."
msgstr ""
-#: judge/views/contests.py:306
+#: judge/views/contests.py:319
msgid "Already in contest"
msgstr ""
-#: judge/views/contests.py:307
+#: judge/views/contests.py:320
#, python-format
msgid "You are already in a contest: \"%s\"."
msgstr ""
-#: judge/views/contests.py:310
+#: judge/views/contests.py:323
msgid "Banned from joining"
msgstr ""
-#: judge/views/contests.py:311
+#: judge/views/contests.py:324
msgid "You have been declared persona non grata for this contest. You are permanently barred from joining this contest."
msgstr ""
-#: judge/views/contests.py:372
+#: judge/views/contests.py:385
#, python-format
msgid "Enter access code for \"%s\""
msgstr ""
-#: judge/views/contests.py:383
+#: judge/views/contests.py:396
#, python-format
msgid "You are not in contest \"%s\"."
msgstr ""
-#: judge/views/contests.py:402
+#: judge/views/contests.py:415
msgid "ContestCalendar requires integer year and month"
msgstr ""
-#: judge/views/contests.py:442
+#: judge/views/contests.py:455
#, python-format
msgid "Contests in %(month)s"
msgstr ""
-#: judge/views/contests.py:442
+#: judge/views/contests.py:455
msgid "F Y"
msgstr ""
-#: judge/views/contests.py:489
+#: judge/views/contests.py:502
#, python-format
msgid "%s Statistics"
msgstr ""
-#: judge/views/contests.py:662
+#: judge/views/contests.py:675
#, python-format
msgid "%s Rankings"
msgstr ""
-#: judge/views/contests.py:670
+#: judge/views/contests.py:683
msgid "???"
msgstr ""
-#: judge/views/contests.py:686
+#: judge/views/contests.py:699
#, python-format
msgid "Your participation in %s"
msgstr ""
-#: judge/views/contests.py:687
+#: judge/views/contests.py:700
#, python-format
msgid "%s's participation in %s"
msgstr ""
-#: judge/views/contests.py:694
+#: judge/views/contests.py:707
msgid "Live"
msgstr ""
-#: judge/views/contests.py:706 templates/contest/contest-tabs.html:13
+#: judge/views/contests.py:719 templates/contest/contest-tabs.html:13
msgid "Participation"
msgstr ""
-#: judge/views/contests.py:750
+#: judge/views/contests.py:763
#, python-format
msgid "%s MOSS Results"
msgstr ""
-#: judge/views/contests.py:777
+#: judge/views/contests.py:790
#, python-format
msgid "Running MOSS for %s..."
msgstr ""
-#: judge/views/contests.py:800
+#: judge/views/contests.py:813
#, python-format
msgid "Contest tag: %s"
msgstr ""
@@ -2677,71 +2711,71 @@ msgstr ""
msgid "Runtimes"
msgstr ""
-#: judge/views/organization.py:44 judge/views/organization.py:47
+#: judge/views/organization.py:43 judge/views/organization.py:46
msgid "No such organization"
msgstr ""
-#: judge/views/organization.py:45
+#: judge/views/organization.py:44
#, python-format
msgid "Could not find an organization with the key \"%s\"."
msgstr ""
-#: judge/views/organization.py:48
+#: judge/views/organization.py:47
msgid "Could not find such organization."
msgstr ""
-#: judge/views/organization.py:72 judge/views/register.py:34
+#: judge/views/organization.py:71 judge/views/register.py:33
#: templates/organization/list.html:15 templates/user/user-list-tabs.html:5
msgid "Organizations"
msgstr ""
-#: judge/views/organization.py:93
+#: judge/views/organization.py:92
#, python-format
msgid "%s Members"
msgstr ""
-#: judge/views/organization.py:118 judge/views/organization.py:121
-#: judge/views/organization.py:126
+#: judge/views/organization.py:117 judge/views/organization.py:120
+#: judge/views/organization.py:125
msgid "Joining organization"
msgstr ""
-#: judge/views/organization.py:118
+#: judge/views/organization.py:117
msgid "You are already in the organization."
msgstr ""
-#: judge/views/organization.py:121
+#: judge/views/organization.py:120
msgid "This organization is not open."
msgstr ""
-#: judge/views/organization.py:138
+#: judge/views/organization.py:137
msgid "Leaving organization"
msgstr ""
-#: judge/views/organization.py:138
+#: judge/views/organization.py:137
#, python-format
msgid "You are not in \"%s\"."
msgstr ""
-#: judge/views/organization.py:162
+#: judge/views/organization.py:161
#, python-format
msgid "Request to join %s"
msgstr "Zahtjev za pridruživanje %s"
-#: judge/views/organization.py:180
+#: judge/views/organization.py:179
msgid "Join request detail"
msgstr ""
-#: judge/views/organization.py:208
+#: judge/views/organization.py:207
#, python-format
msgid "Managing join requests for %s"
msgstr ""
-#: judge/views/organization.py:239
+#: judge/views/organization.py:238
#, python-format
msgid "Your organization can only receive %d more members. You cannot approve %d users."
msgstr ""
-#: judge/views/organization.py:251
+#: judge/views/organization.py:250
#, python-format
msgid "Approved %d user."
msgid_plural "Approved %d users."
@@ -2749,7 +2783,7 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-#: judge/views/organization.py:252
+#: judge/views/organization.py:251
#, python-format
msgid "Rejected %d user."
msgid_plural "Rejected %d users."
@@ -2757,85 +2791,99 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-#: judge/views/organization.py:282
+#: judge/views/organization.py:281
#, python-format
msgid "Editing %s"
msgstr "Uređivanje %s"
-#: judge/views/organization.py:306 judge/views/organization.py:314
+#: judge/views/organization.py:305 judge/views/organization.py:313
msgid "Can't edit organization"
msgstr "Nije moguće urediti organizaciju"
-#: judge/views/organization.py:307
+#: judge/views/organization.py:306
msgid "You are not allowed to edit this organization."
msgstr "Nemate ovlasti za uređivanje ove organizacije."
-#: judge/views/organization.py:315
+#: judge/views/organization.py:314
msgid "You are not allowed to kick people from this organization."
msgstr "Nemate ovlasti za izbacivanje ljudi iz ove organizacije."
-#: judge/views/organization.py:320 judge/views/organization.py:324
+#: judge/views/organization.py:319 judge/views/organization.py:323
msgid "Can't kick user"
msgstr "Nije moguće izbaciti korisnika"
-#: judge/views/organization.py:321
+#: judge/views/organization.py:320
msgid "The user you are trying to kick does not exist!"
msgstr "Korisnik kojeg pokušavate izbaciti ne postoji!"
-#: judge/views/organization.py:325
+#: judge/views/organization.py:324
#, python-format
msgid "The user you are trying to kick is not in organization: %s."
msgstr "Korisnik kojeg pokušavate izbaciti nije u organizaciji: %s."
-#: judge/views/problem.py:67
+#: judge/views/problem.py:68
msgid "No such problem"
msgstr ""
-#: judge/views/problem.py:68
+#: judge/views/problem.py:69
#, python-format
msgid "Could not find a problem with the code \"%s\"."
msgstr ""
-#: judge/views/problem.py:110
+#: judge/views/problem.py:111
#, python-brace-format
msgid "Editorial for {0}"
msgstr ""
-#: judge/views/problem.py:113
+#: judge/views/problem.py:114
#, python-brace-format
msgid "Editorial for {0}"
msgstr ""
-#: judge/views/problem.py:283 templates/contest/contest.html:79
+#: judge/views/problem.py:133
+msgid "No such editorial"
+msgstr ""
+
+#: judge/views/problem.py:134
+#, python-format
+msgid "Could not find an editorial with the code \"%s\"."
+msgstr ""
+
+#: judge/views/problem.py:289 templates/contest/contest.html:79
#: templates/user/user-tabs.html:5 templates/user/users-table.html:23
msgid "Problems"
msgstr "Zadaci"
-#: judge/views/problem.py:556 judge/views/problem.py:564
+#: judge/views/problem.py:562 judge/views/problem.py:570
#, python-format
msgid "Submit to %s"
msgstr ""
-#: judge/views/problem.py:613
+#: judge/views/problem.py:619
msgid "Banned from submitting"
msgstr ""
-#: judge/views/problem.py:614
+#: judge/views/problem.py:620
msgid "You have been declared persona non grata for this problem. You are permanently barred from submitting this problem."
msgstr ""
-#: judge/views/problem.py:618
+#: judge/views/problem.py:624
msgid "Too many submissions"
msgstr "Previše poslanih rješenja"
-#: judge/views/problem.py:619
+#: judge/views/problem.py:625
msgid "You have exceeded the submission limit for this problem."
msgstr ""
-#: judge/views/problem.py:681
+#: judge/views/problem.py:693
msgid "Clone Problem"
msgstr ""
+#: judge/views/problem.py:720
+#, python-format
+msgid "Cloned problem from %s"
+msgstr ""
+
#: judge/views/problem_data.py:37
msgid "Checker arguments must be a JSON object"
msgstr ""
@@ -2906,52 +2954,52 @@ msgstr ""
msgid "Best solutions for {0}"
msgstr ""
-#: judge/views/ranked_submission.py:80
+#: judge/views/ranked_submission.py:82
#, python-format
msgid "Best solutions for %(problem)s in %(contest)s"
msgstr ""
-#: judge/views/ranked_submission.py:83
+#: judge/views/ranked_submission.py:85
#, python-format
msgid "Best solutions for problem %(number)s in %(contest)s"
msgstr ""
-#: judge/views/ranked_submission.py:89
+#: judge/views/ranked_submission.py:91
#, python-brace-format
msgid "Best solutions for {0} in {2}"
msgstr ""
-#: judge/views/ranked_submission.py:92
+#: judge/views/ranked_submission.py:94
#, python-brace-format
msgid "Best solutions for problem {0} in {1}"
msgstr ""
-#: judge/views/register.py:27
+#: judge/views/register.py:26
msgid "A username must contain letters, numbers, or underscores"
msgstr ""
-#: judge/views/register.py:31
+#: judge/views/register.py:30
msgid "Preferred language"
msgstr ""
-#: judge/views/register.py:38
+#: judge/views/register.py:37
msgid "Subscribe to newsletter?"
msgstr "Pretplatite se na naš newsletter?"
-#: judge/views/register.py:45
+#: judge/views/register.py:44
#, python-format
msgid "The email address \"%s\" is already taken. Only one registration is allowed per address."
msgstr "Vaša adresa e-pošte \"%s\" je već zauzeta. Dopuštena je isključivo jedna registracija za jednu adresu e-pošte."
-#: judge/views/register.py:51
+#: judge/views/register.py:50
msgid "Your email provider is not allowed due to history of abuse. Please use a reputable email provider."
msgstr ""
-#: judge/views/register.py:57 judge/views/register.py:95
+#: judge/views/register.py:56 judge/views/register.py:94
msgid "Registration"
msgstr "Registracija"
-#: judge/views/register.py:106
+#: judge/views/register.py:105
msgid "Authentication failure"
msgstr ""
@@ -2959,7 +3007,7 @@ msgstr ""
msgid "Language statistics"
msgstr ""
-#: judge/views/status.py:24 templates/submission/list.html:311
+#: judge/views/status.py:24 templates/submission/list.html:310
msgid "Status"
msgstr "Status predanog rješenja"
@@ -2967,74 +3015,74 @@ msgstr "Status predanog rješenja"
msgid "Version matrix"
msgstr ""
-#: judge/views/submission.py:53 judge/views/submission.py:60
+#: judge/views/submission.py:55 judge/views/submission.py:62
#, python-format
msgid "Submission of %(problem)s by %(user)s"
msgstr "Predano rješenje za zadatak %(problem)s od korisnika %(user)s"
-#: judge/views/submission.py:203 judge/views/submission.py:204
+#: judge/views/submission.py:205 judge/views/submission.py:206
#: templates/problem/problem.html:127
msgid "All submissions"
msgstr "Sva predana rješenja"
-#: judge/views/submission.py:349
+#: judge/views/submission.py:355
msgid "All my submissions"
msgstr "Sva moja predana rješenja"
-#: judge/views/submission.py:350
+#: judge/views/submission.py:356
#, python-format
msgid "All submissions by %s"
msgstr "Sva predana rješenja od korisnika %s"
-#: judge/views/submission.py:381
+#: judge/views/submission.py:387
#, python-format
msgid "All submissions for %s"
msgstr "Sva predana rješenja za korisnika %s"
-#: judge/views/submission.py:400
+#: judge/views/submission.py:410
msgid "Must pass a problem"
msgstr ""
-#: judge/views/submission.py:439
+#: judge/views/submission.py:449
#, python-format
msgid "My submissions for %(problem)s"
msgstr ""
-#: judge/views/submission.py:440
+#: judge/views/submission.py:450
#, python-format
msgid "%(user)s's submissions for %(problem)s"
msgstr ""
-#: judge/views/submission.py:536
+#: judge/views/submission.py:546
msgid "Must pass a contest"
msgstr ""
-#: judge/views/submission.py:544
+#: judge/views/submission.py:554
#, python-format
msgid "My submissions in %(contest)s"
msgstr ""
-#: judge/views/submission.py:545
+#: judge/views/submission.py:555
#, python-format
msgid "%(user)s's submissions in %(contest)s"
msgstr ""
-#: judge/views/submission.py:559
+#: judge/views/submission.py:569
#, python-brace-format
msgid "My submissions in {0}"
msgstr ""
-#: judge/views/submission.py:561
+#: judge/views/submission.py:571
#, python-brace-format
msgid "{0}'s submissions in {2}"
msgstr ""
-#: judge/views/submission.py:585
+#: judge/views/submission.py:597
#, python-brace-format
msgid "{0}'s submissions for {2} in {4}"
msgstr ""
-#: judge/views/submission.py:590
+#: judge/views/submission.py:602
#, python-brace-format
msgid "{0}'s submissions for problem {2} in {3}"
msgstr ""
@@ -3051,40 +3099,40 @@ msgstr ""
msgid "You must solve at least one problem before you can create a ticket."
msgstr ""
-#: judge/views/ticket.py:87 judge/views/ticket.py:90
+#: judge/views/ticket.py:91 judge/views/ticket.py:94
#, python-format
msgid "New ticket for %s"
msgstr ""
-#: judge/views/ticket.py:144
+#: judge/views/ticket.py:148
#, python-format
msgid "%(title)s - Ticket %(id)d"
msgstr ""
-#: judge/views/ticket.py:249
+#: judge/views/ticket.py:253
#, python-format
msgid "Tickets - Page %(number)d of %(total)d"
msgstr ""
-#: judge/views/ticket.py:298
+#: judge/views/ticket.py:302
#, python-format
msgid "New Ticket: %s"
msgstr ""
-#: judge/views/ticket.py:299
+#: judge/views/ticket.py:303
#, python-format
msgid "#%(id)d, assigned to: %(users)s"
msgstr ""
-#: judge/views/ticket.py:301
+#: judge/views/ticket.py:305
msgid ", "
msgstr ""
-#: judge/views/ticket.py:301
+#: judge/views/ticket.py:305
msgid "no one"
msgstr ""
-#: judge/views/ticket.py:321
+#: judge/views/ticket.py:325
#, python-format
msgid "New Ticket Message For: %s"
msgstr ""
@@ -3093,87 +3141,91 @@ msgstr ""
msgid "Enable Two-factor Authentication"
msgstr ""
-#: judge/views/two_factor.py:99
+#: judge/views/two_factor.py:108
+msgid "Refresh Two-factor Authentication"
+msgstr ""
+
+#: judge/views/two_factor.py:116
msgid "Disable Two-factor Authentication"
msgstr ""
-#: judge/views/two_factor.py:148
+#: judge/views/two_factor.py:165
msgid "Invalid WebAuthn response"
msgstr ""
-#: judge/views/two_factor.py:151
+#: judge/views/two_factor.py:168
msgid "Invalid name"
msgstr ""
-#: judge/views/two_factor.py:204
+#: judge/views/two_factor.py:221
msgid "Staff may not disable 2FA"
msgstr ""
-#: judge/views/two_factor.py:216
+#: judge/views/two_factor.py:229
msgid "Perform Two-factor Authentication"
msgstr ""
-#: judge/views/user.py:79
+#: judge/views/user.py:78
msgid "No such user"
msgstr ""
-#: judge/views/user.py:79
+#: judge/views/user.py:78
#, python-format
msgid "No user handle \"%s\"."
msgstr ""
-#: judge/views/user.py:83
+#: judge/views/user.py:82
msgid "My account"
msgstr ""
-#: judge/views/user.py:84
+#: judge/views/user.py:83
#, python-format
msgid "User %s"
msgstr ""
-#: judge/views/user.py:132
+#: judge/views/user.py:131
msgid "Login"
msgstr "Prijava"
-#: judge/views/user.py:173
+#: judge/views/user.py:172
msgid "M j, Y, G:i"
msgstr ""
-#: judge/views/user.py:307
+#: judge/views/user.py:306
msgid "Preparing your data..."
msgstr ""
-#: judge/views/user.py:311 templates/user/edit-profile.html:348
+#: judge/views/user.py:310 templates/user/edit-profile.html:352
msgid "Download your data"
msgstr ""
-#: judge/views/user.py:367
+#: judge/views/user.py:366
msgid "Updated on site"
msgstr ""
-#: judge/views/user.py:400 templates/admin/auth/user/change_form.html:14
+#: judge/views/user.py:399 templates/admin/auth/user/change_form.html:14
#: templates/admin/auth/user/change_form.html:17 templates/base.html:222
#: templates/user/user-tabs.html:16
msgid "Edit profile"
msgstr ""
-#: judge/views/user.py:415
+#: judge/views/user.py:414
msgid "Generated API token for user"
msgstr ""
-#: judge/views/user.py:427
+#: judge/views/user.py:426
msgid "Removed API token for user"
msgstr ""
-#: judge/views/user.py:437
+#: judge/views/user.py:436
msgid "Generated scratch codes for user"
msgstr ""
-#: judge/views/user.py:443 templates/user/user-list-tabs.html:4
+#: judge/views/user.py:442 templates/user/user-list-tabs.html:4
msgid "Leaderboard"
msgstr ""
-#: judge/views/user.py:504
+#: judge/views/user.py:503
msgid "You have been successfully logged out."
msgstr ""
@@ -3298,11 +3350,11 @@ msgstr ""
msgid "posted on {time}"
msgstr ""
-#: templates/blog/list.html:130 templates/problem/problem.html:309
+#: templates/blog/list.html:130 templates/problem/problem.html:311
msgid "Clarifications"
msgstr ""
-#: templates/blog/list.html:146 templates/problem/problem.html:320
+#: templates/blog/list.html:146 templates/problem/problem.html:322
msgid "No clarifications have been made at this time."
msgstr ""
@@ -3495,7 +3547,7 @@ msgid "Info"
msgstr ""
#: templates/contest/contest-tabs.html:6 templates/stats/base.html:9
-#: templates/submission/list.html:337
+#: templates/submission/list.html:336
msgid "Statistics"
msgstr ""
@@ -3698,19 +3750,19 @@ msgstr ""
msgid "Disqualify"
msgstr ""
-#: templates/contest/ranking.html:169
+#: templates/contest/ranking.html:173
msgid "Are you sure you want to disqualify this participation?"
msgstr ""
-#: templates/contest/ranking.html:174
+#: templates/contest/ranking.html:178
msgid "Are you sure you want to un-disqualify this participation?"
msgstr ""
-#: templates/contest/ranking.html:246
+#: templates/contest/ranking.html:250
msgid "View user participation"
msgstr ""
-#: templates/contest/ranking.html:250
+#: templates/contest/ranking.html:254
msgid "Show organizations"
msgstr ""
@@ -3985,7 +4037,7 @@ msgstr ""
msgid "Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence."
msgstr ""
-#: templates/problem/editorial.html:27 templates/problem/problem.html:209
+#: templates/problem/editorial.html:27 templates/problem/problem.html:210
msgid "Author:"
msgid_plural "Authors:"
msgstr[0] ""
@@ -4154,38 +4206,38 @@ msgstr ""
msgid "Memory limit:"
msgstr ""
-#: templates/problem/problem.html:224
+#: templates/problem/problem.html:226
msgid "Problem type"
msgid_plural "Problem types"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-#: templates/problem/problem.html:237
+#: templates/problem/problem.html:239
msgid "Allowed languages"
msgstr ""
-#: templates/problem/problem.html:245
+#: templates/problem/problem.html:247
#, python-format
msgid "No %(lang)s judge online"
msgstr ""
-#: templates/problem/problem.html:256
+#: templates/problem/problem.html:258
msgid "Judge:"
msgid_plural "Judges:"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-#: templates/problem/problem.html:273
+#: templates/problem/problem.html:275
msgid "none available"
msgstr ""
-#: templates/problem/problem.html:298
+#: templates/problem/problem.html:300
msgid "Request clarification"
msgstr ""
-#: templates/problem/problem.html:300
+#: templates/problem/problem.html:302
msgid "Report an issue"
msgstr ""
@@ -4230,7 +4282,7 @@ msgstr ""
msgid "Point range"
msgstr ""
-#: templates/problem/search-form.html:63 templates/submission/list.html:329
+#: templates/problem/search-form.html:63 templates/submission/list.html:328
#: templates/ticket/list.html:248
msgid "Go"
msgstr ""
@@ -4278,7 +4330,7 @@ msgid "Invalid username or password."
msgstr ""
#: templates/registration/login.html:53
-#: templates/registration/two_factor_auth.html:86
+#: templates/registration/two_factor_auth.html:92
msgid "Login!"
msgstr ""
@@ -4398,12 +4450,12 @@ msgid "Default language"
msgstr ""
#: templates/registration/registration_form.html:184
-#: templates/user/edit-profile.html:310
+#: templates/user/edit-profile.html:314
msgid "Affiliated organizations"
msgstr ""
#: templates/registration/registration_form.html:190
-#: templates/user/edit-profile.html:324
+#: templates/user/edit-profile.html:328
msgid "Notify me about upcoming contests"
msgstr ""
@@ -4419,57 +4471,93 @@ msgstr ""
msgid "Register!"
msgstr ""
-#: templates/registration/totp_disable.html:38
+#: templates/registration/totp_disable.html:31
msgid "To protect your account, you must first authenticate before you can disable Two Factor Authentication."
msgstr ""
-#: templates/registration/totp_disable.html:45
+#: templates/registration/totp_disable.html:38
msgid "Enter the 6-digit code generated by your app or one of your 16-digit scratch codes:"
msgstr ""
-#: templates/registration/totp_disable.html:48
+#: templates/registration/totp_disable.html:41
msgid "Disable Two Factor Authentication"
msgstr ""
-#: templates/registration/totp_enable.html:75
+#: templates/registration/totp_enable.html:72
msgid "Scan this code with your authenticator app:"
msgstr ""
-#: templates/registration/totp_enable.html:76
+#: templates/registration/totp_enable.html:73
msgid "QR code"
msgstr ""
-#: templates/registration/totp_enable.html:77
+#: templates/registration/totp_enable.html:74
msgid "Or enter this code manually:"
msgstr ""
-#: templates/registration/totp_enable.html:88
+#: templates/registration/totp_enable.html:85
msgid "Enter the 6-digit code generated by your app:"
msgstr ""
-#: templates/registration/totp_enable.html:91
+#: templates/registration/totp_enable.html:90
+msgid "Refresh Two Factor Authentication"
+msgstr ""
+
+#: templates/registration/totp_enable.html:92
msgid "Enable Two Factor Authentication"
msgstr ""
+#: templates/registration/totp_enable.html:98
+msgid "Below is a list of one-time use scratch codes."
+msgstr ""
+
+#: templates/registration/totp_enable.html:99
+msgid "These codes can only be used once and are for emergency use."
+msgstr ""
+
+#: templates/registration/totp_enable.html:100
+msgid "You can use these codes to login to your account or disable two-factor authentication."
+msgstr ""
+
+#: templates/registration/totp_enable.html:101
+msgid "If you ever need more scratch codes, you can regenerate them on the edit profile tab."
+msgstr ""
+
+#: templates/registration/totp_enable.html:102
+msgid "Please write these down and keep them in a secure location."
+msgstr ""
+
+#: templates/registration/totp_enable.html:103
+msgid "These codes will never be shown again after you enable two-factor authentication."
+msgstr ""
+
#: templates/registration/two_factor_auth.html:33
-#: templates/user/edit-profile.html:161
+#: templates/user/edit-profile.html:165
msgid "WebAuthn is not supported by your browser."
msgstr ""
#: templates/registration/two_factor_auth.html:54
-#: templates/user/edit-profile.html:185
+#: templates/user/edit-profile.html:189
msgid "Failed to contact server."
msgstr ""
-#: templates/registration/two_factor_auth.html:77
+#: templates/registration/two_factor_auth.html:79
msgid "Enter the 6-digit code generated by your app or one of your 16-character scratch codes:"
msgstr ""
-#: templates/registration/two_factor_auth.html:83
-msgid "Use security key"
+#: templates/registration/two_factor_auth.html:81
+msgid "Enter one of your 16-character scratch codes:"
msgstr ""
#: templates/registration/two_factor_auth.html:89
+msgid "Use security key"
+msgstr ""
+
+#: templates/registration/two_factor_auth.html:94
+msgid "Use scratch code"
+msgstr ""
+
+#: templates/registration/two_factor_auth.html:97
#, python-format
msgid "If you lost your authentication device and are unable to use your scratch codes, please contact us at %(email)s."
msgstr ""
@@ -4550,15 +4638,15 @@ msgstr ""
msgid "Filter by language..."
msgstr ""
-#: templates/submission/list.html:307
+#: templates/submission/list.html:306
msgid "Filter submissions"
msgstr ""
-#: templates/submission/list.html:343
+#: templates/submission/list.html:342
msgid "Total:"
msgstr ""
-#: templates/submission/list.html:353
+#: templates/submission/list.html:352
msgid "You were disconnected. Refresh to show latest updates."
msgstr ""
@@ -4775,121 +4863,125 @@ msgstr ""
msgid "Search by handle..."
msgstr ""
-#: templates/user/edit-profile.html:109
+#: templates/user/edit-profile.html:113
msgid "Are you sure you want to generate or regenerate your API token?"
msgstr ""
-#: templates/user/edit-profile.html:110
+#: templates/user/edit-profile.html:114
msgid "This will invalidate any previous API tokens."
msgstr ""
-#: templates/user/edit-profile.html:111
+#: templates/user/edit-profile.html:115
msgid "It also allows access to your account without Two-factor Authentication."
msgstr ""
-#: templates/user/edit-profile.html:112
+#: templates/user/edit-profile.html:116
msgid "You will not be able to view your api token after you leave this page!"
msgstr ""
-#: templates/user/edit-profile.html:113 templates/user/edit-profile.html:207
+#: templates/user/edit-profile.html:117 templates/user/edit-profile.html:211
msgid "Generating..."
msgstr ""
-#: templates/user/edit-profile.html:121 templates/user/edit-profile.html:243
-#: templates/user/edit-profile.html:371 templates/user/edit-profile.html:390
+#: templates/user/edit-profile.html:125 templates/user/edit-profile.html:247
+#: templates/user/edit-profile.html:373 templates/user/edit-profile.html:395
msgid "Regenerate"
msgstr ""
-#: templates/user/edit-profile.html:127 templates/user/edit-profile.html:392
+#: templates/user/edit-profile.html:131 templates/user/edit-profile.html:397
msgid "Remove"
msgstr ""
-#: templates/user/edit-profile.html:137
+#: templates/user/edit-profile.html:141
msgid "Are you sure you want to remove your API token?"
msgstr ""
-#: templates/user/edit-profile.html:144 templates/user/edit-profile.html:375
-#: templates/user/edit-profile.html:396
+#: templates/user/edit-profile.html:148 templates/user/edit-profile.html:377
+#: templates/user/edit-profile.html:401
msgid "Generate"
msgstr ""
-#: templates/user/edit-profile.html:190
+#: templates/user/edit-profile.html:194
msgid "Are you sure you want to delete this security key?"
msgstr ""
-#: templates/user/edit-profile.html:280
+#: templates/user/edit-profile.html:284
msgid "Self-description"
msgstr ""
-#: templates/user/edit-profile.html:287
+#: templates/user/edit-profile.html:291
msgid "Select your closest major city"
msgstr ""
-#: templates/user/edit-profile.html:296
+#: templates/user/edit-profile.html:300
msgid "Editor theme"
msgstr ""
-#: templates/user/edit-profile.html:301
+#: templates/user/edit-profile.html:305
msgid "Math engine"
msgstr ""
-#: templates/user/edit-profile.html:335 templates/user/edit-profile.html:337
+#: templates/user/edit-profile.html:339 templates/user/edit-profile.html:341
msgid "Change your avatar"
msgstr ""
-#: templates/user/edit-profile.html:342
+#: templates/user/edit-profile.html:346
msgid "Change your password"
msgstr ""
-#: templates/user/edit-profile.html:356
+#: templates/user/edit-profile.html:359
msgid "Two-factor Authentication is enabled"
msgstr ""
-#: templates/user/edit-profile.html:358
-msgid "Two-factor Authentication is disabled"
+#: templates/user/edit-profile.html:362 templates/user/edit-profile.html:365
+msgid "Disable"
msgstr ""
-#: templates/user/edit-profile.html:363 templates/user/edit-profile.html:365
-msgid "Disable"
+#: templates/user/edit-profile.html:367
+msgid "Refresh"
msgstr ""
-#: templates/user/edit-profile.html:368
+#: templates/user/edit-profile.html:370
msgid "Scratch Codes:"
msgstr ""
-#: templates/user/edit-profile.html:372 templates/user/edit-profile.html:393
+#: templates/user/edit-profile.html:374 templates/user/edit-profile.html:398
msgid "Hidden"
msgstr ""
-#: templates/user/edit-profile.html:381
+#: templates/user/edit-profile.html:384
+msgid "Two-factor Authentication is disabled"
+msgstr ""
+
+#: templates/user/edit-profile.html:385
msgid "Enable"
msgstr ""
-#: templates/user/edit-profile.html:387
+#: templates/user/edit-profile.html:392
msgid "API Token"
msgstr ""
-#: templates/user/edit-profile.html:404
+#: templates/user/edit-profile.html:409
msgid "Security keys"
msgstr ""
-#: templates/user/edit-profile.html:414
+#: templates/user/edit-profile.html:419
msgid "Delete"
msgstr ""
-#: templates/user/edit-profile.html:421
+#: templates/user/edit-profile.html:426
msgid "Enter a name for this key"
msgstr ""
-#: templates/user/edit-profile.html:422
+#: templates/user/edit-profile.html:427
msgid "Add"
msgstr ""
-#: templates/user/edit-profile.html:430
+#: templates/user/edit-profile.html:435
msgid "User-script"
msgstr ""
-#: templates/user/edit-profile.html:434
+#: templates/user/edit-profile.html:439
msgid "Update profile"
msgstr ""
diff --git a/locale/hr/LC_MESSAGES/djangojs.po b/locale/hr/LC_MESSAGES/djangojs.po
index d8638c6ee2..41911e5977 100644
--- a/locale/hr/LC_MESSAGES/djangojs.po
+++ b/locale/hr/LC_MESSAGES/djangojs.po
@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: dmoj\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-10-01 23:12+0000\n"
-"PO-Revision-Date: 2021-04-25 00:08\n"
+"PO-Revision-Date: 2021-07-07 00:27\n"
"Last-Translator: \n"
"Language-Team: Croatian\n"
"Language: hr_HR\n"
diff --git a/locale/hu/LC_MESSAGES/django.po b/locale/hu/LC_MESSAGES/django.po
index 804d142c96..ddbbde75e6 100644
--- a/locale/hu/LC_MESSAGES/django.po
+++ b/locale/hu/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: dmoj\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-24 19:15+0000\n"
-"PO-Revision-Date: 2021-04-25 00:08\n"
+"POT-Creation-Date: 2021-06-17 01:38+0000\n"
+"PO-Revision-Date: 2021-07-07 00:27\n"
"Last-Translator: \n"
"Language-Team: Hungarian\n"
"Language: hu_HU\n"
@@ -17,75 +17,75 @@ msgstr ""
"X-Crowdin-File: django.po\n"
"X-Crowdin-File-ID: 10\n"
-#: dmoj/settings.py:364
+#: dmoj/settings.py:365
msgid "Catalan"
msgstr ""
-#: dmoj/settings.py:365
+#: dmoj/settings.py:366
msgid "German"
msgstr "Német"
-#: dmoj/settings.py:366
+#: dmoj/settings.py:367
msgid "English"
msgstr "Angol"
-#: dmoj/settings.py:367
+#: dmoj/settings.py:368
msgid "Spanish"
msgstr "Spanyol"
-#: dmoj/settings.py:368
+#: dmoj/settings.py:369
msgid "French"
msgstr "Francia"
-#: dmoj/settings.py:369
+#: dmoj/settings.py:370
msgid "Croatian"
msgstr "Horvát"
-#: dmoj/settings.py:370
+#: dmoj/settings.py:371
msgid "Hungarian"
msgstr ""
-#: dmoj/settings.py:371
+#: dmoj/settings.py:372
msgid "Japanese"
msgstr ""
-#: dmoj/settings.py:372
+#: dmoj/settings.py:373
msgid "Korean"
msgstr "Koreai"
-#: dmoj/settings.py:373
+#: dmoj/settings.py:374
msgid "Brazilian Portuguese"
msgstr ""
-#: dmoj/settings.py:374
+#: dmoj/settings.py:375
msgid "Romanian"
msgstr "Román"
-#: dmoj/settings.py:375
+#: dmoj/settings.py:376
msgid "Russian"
msgstr "Orosz"
-#: dmoj/settings.py:376
+#: dmoj/settings.py:377
msgid "Serbian (Latin)"
msgstr "Szerb (latin)"
-#: dmoj/settings.py:377
+#: dmoj/settings.py:378
msgid "Turkish"
msgstr ""
-#: dmoj/settings.py:378
+#: dmoj/settings.py:379
msgid "Vietnamese"
msgstr "Vietnami"
-#: dmoj/settings.py:379
+#: dmoj/settings.py:380
msgid "Simplified Chinese"
msgstr "Egyszerűsített kínai"
-#: dmoj/settings.py:380
+#: dmoj/settings.py:381
msgid "Traditional Chinese"
msgstr ""
-#: dmoj/urls.py:103 templates/base.html:190
+#: dmoj/urls.py:104 templates/base.html:190
msgid "Home"
msgstr "Nyitólap"
@@ -115,112 +115,112 @@ msgstr "Kommentek megjelenítése"
msgid "Associated page"
msgstr "Kapcsolódó lap"
-#: judge/admin/contest.py:31
+#: judge/admin/contest.py:32
msgid "Included contests"
msgstr "Hozzárendelt versenyek"
-#: judge/admin/contest.py:65 templates/contest/contest.html:83
+#: judge/admin/contest.py:66 templates/contest/contest.html:83
#: templates/contest/moss.html:43 templates/problem/list.html:204
#: templates/problem/list.html:219 templates/user/user-problems.html:58
#: templates/user/user-problems.html:100
msgid "Problem"
msgstr "Feladat"
-#: judge/admin/contest.py:114
+#: judge/admin/contest.py:117
msgid "Settings"
msgstr ""
-#: judge/admin/contest.py:116
+#: judge/admin/contest.py:120
msgid "Scheduling"
msgstr "Időbeosztás"
-#: judge/admin/contest.py:117
+#: judge/admin/contest.py:121
msgid "Details"
msgstr "Részletek"
-#: judge/admin/contest.py:118
+#: judge/admin/contest.py:122
msgid "Format"
msgstr ""
-#: judge/admin/contest.py:119 templates/contest/ranking-table.html:5
+#: judge/admin/contest.py:123 templates/contest/ranking-table.html:5
msgid "Rating"
msgstr "Értékelés"
-#: judge/admin/contest.py:120
+#: judge/admin/contest.py:124
msgid "Access"
msgstr ""
-#: judge/admin/contest.py:122 judge/admin/problem.py:134
+#: judge/admin/contest.py:126 judge/admin/problem.py:135
msgid "Justice"
msgstr "Igazságszolgáltatás"
-#: judge/admin/contest.py:211
+#: judge/admin/contest.py:215
#, python-format
msgid "%d contest successfully marked as visible."
msgid_plural "%d contests successfully marked as visible."
msgstr[0] ""
msgstr[1] ""
-#: judge/admin/contest.py:214
+#: judge/admin/contest.py:218
msgid "Mark contests as visible"
msgstr ""
-#: judge/admin/contest.py:220
+#: judge/admin/contest.py:224
#, python-format
msgid "%d contest successfully marked as hidden."
msgid_plural "%d contests successfully marked as hidden."
msgstr[0] ""
msgstr[1] ""
-#: judge/admin/contest.py:223
+#: judge/admin/contest.py:227
msgid "Mark contests as hidden"
msgstr ""
-#: judge/admin/contest.py:229
+#: judge/admin/contest.py:233
#, python-format
msgid "%d contest successfully locked."
msgid_plural "%d contests successfully locked."
msgstr[0] ""
msgstr[1] ""
-#: judge/admin/contest.py:232
+#: judge/admin/contest.py:236
msgid "Lock contest submissions"
msgstr ""
-#: judge/admin/contest.py:238
+#: judge/admin/contest.py:242
#, python-format
msgid "%d contest successfully unlocked."
msgid_plural "%d contests successfully unlocked."
msgstr[0] ""
msgstr[1] ""
-#: judge/admin/contest.py:241
+#: judge/admin/contest.py:245
msgid "Unlock contest submissions"
msgstr ""
-#: judge/admin/contest.py:262 judge/admin/submission.py:170
+#: judge/admin/contest.py:266 judge/admin/submission.py:170
#, python-format
msgid "%d submission was successfully scheduled for rejudging."
msgid_plural "%d submissions were successfully scheduled for rejudging."
msgstr[0] ""
msgstr[1] ""
-#: judge/admin/contest.py:337
+#: judge/admin/contest.py:341
#, python-format
msgid "%d participation recalculated."
msgid_plural "%d participations recalculated."
msgstr[0] ""
msgstr[1] ""
-#: judge/admin/contest.py:340
+#: judge/admin/contest.py:344
msgid "Recalculate results"
msgstr ""
-#: judge/admin/contest.py:344 judge/admin/organization.py:63
+#: judge/admin/contest.py:348 judge/admin/organization.py:63
msgid "username"
msgstr "felhasználónév"
-#: judge/admin/contest.py:349 templates/base.html:258
+#: judge/admin/contest.py:353 templates/base.html:258
msgid "virtual"
msgstr "virtuális"
@@ -236,9 +236,9 @@ msgstr "Tartalom"
msgid "Summary"
msgstr "Összefoglalás"
-#: judge/admin/interface.py:113 judge/models/contest.py:383
-#: judge/models/contest.py:509 judge/models/profile.py:244
-#: judge/models/profile.py:268
+#: judge/admin/interface.py:113 judge/models/contest.py:419
+#: judge/models/contest.py:546 judge/models/profile.py:261
+#: judge/models/profile.py:292
msgid "user"
msgstr "felhasználó"
@@ -246,8 +246,8 @@ msgstr "felhasználó"
msgid "object"
msgstr ""
-#: judge/admin/organization.py:32 judge/admin/problem.py:181
-#: judge/admin/profile.py:82
+#: judge/admin/organization.py:32 judge/admin/problem.py:182
+#: judge/admin/profile.py:92
msgid "View on site"
msgstr "Nézd meg élesben"
@@ -255,69 +255,69 @@ msgstr "Nézd meg élesben"
msgid "Describe the changes you made (optional)"
msgstr "Ismertesd a módosításokat (opcionális)"
-#: judge/admin/problem.py:129
+#: judge/admin/problem.py:130
msgid "Social Media"
msgstr "Közösségi média"
-#: judge/admin/problem.py:130
+#: judge/admin/problem.py:131
msgid "Taxonomy"
msgstr "Rendszerezés"
-#: judge/admin/problem.py:131 templates/contest/contest.html:84
+#: judge/admin/problem.py:132 templates/contest/contest.html:84
#: templates/problem/data.html:385 templates/problem/list.html:209
#: templates/problem/list.html:230 templates/user/base-users-table.html:10
#: templates/user/user-problems.html:60
msgid "Points"
msgstr "Pontok"
-#: judge/admin/problem.py:132
+#: judge/admin/problem.py:133
msgid "Limits"
msgstr "Limitek"
-#: judge/admin/problem.py:133 judge/admin/submission.py:238
-#: templates/stats/base.html:14 templates/submission/list.html:320
-#: templates/user/edit-profile.html:292
+#: judge/admin/problem.py:134 judge/admin/submission.py:238
+#: templates/stats/base.html:14 templates/submission/list.html:319
+#: templates/user/edit-profile.html:296
msgid "Language"
msgstr "Nyelv"
-#: judge/admin/problem.py:135
+#: judge/admin/problem.py:136
msgid "History"
msgstr "Előzmények"
-#: judge/admin/problem.py:178
+#: judge/admin/problem.py:179
msgid "Authors"
msgstr "Szerzők"
-#: judge/admin/problem.py:191
+#: judge/admin/problem.py:192
#, python-format
msgid "%d problem's publish date successfully updated."
msgid_plural "%d problems' publish date successfully updated."
msgstr[0] ""
msgstr[1] ""
-#: judge/admin/problem.py:195
+#: judge/admin/problem.py:196
msgid "Set publish date to now"
msgstr ""
-#: judge/admin/problem.py:201
+#: judge/admin/problem.py:202
#, python-format
msgid "%d problem successfully marked as public."
msgid_plural "%d problems successfully marked as public."
msgstr[0] "%d probléma sikeresen publikusnak jelölve."
msgstr[1] "%d probléma sikeresen publikusnak jelölve."
-#: judge/admin/problem.py:205
+#: judge/admin/problem.py:206
msgid "Mark problems as public"
msgstr "Jelöld publikusnak a problémákat"
-#: judge/admin/problem.py:211
+#: judge/admin/problem.py:212
#, python-format
msgid "%d problem successfully marked as private."
msgid_plural "%d problems successfully marked as private."
msgstr[0] "%d probléma sikeresen privátnak jelölve."
msgstr[1] "%d probléma sikeresen privátnak jelölve."
-#: judge/admin/problem.py:215
+#: judge/admin/problem.py:216
msgid "Mark problems as private"
msgstr "Jelöld a problémákat privátnak"
@@ -325,35 +325,35 @@ msgstr "Jelöld a problémákat privátnak"
msgid "timezone"
msgstr "időzóna"
-#: judge/admin/profile.py:88 judge/admin/submission.py:217
+#: judge/admin/profile.py:98 judge/admin/submission.py:217
#: templates/organization/requests/log.html:9
#: templates/organization/requests/pending.html:12
#: templates/ticket/list.html:261
msgid "User"
msgstr "Felhasználó"
-#: judge/admin/profile.py:93 templates/registration/registration_form.html:143
+#: judge/admin/profile.py:103 templates/registration/registration_form.html:143
msgid "Email"
msgstr "Email"
-#: judge/admin/profile.py:98 judge/views/register.py:29
+#: judge/admin/profile.py:108 judge/views/register.py:28
#: templates/registration/registration_form.html:171
-#: templates/user/edit-profile.html:288
+#: templates/user/edit-profile.html:292
msgid "Timezone"
msgstr "Időzóna"
-#: judge/admin/profile.py:103
+#: judge/admin/profile.py:113
msgid "date joined"
msgstr "csatlakozás dátuma"
-#: judge/admin/profile.py:110
+#: judge/admin/profile.py:120
#, python-format
msgid "%d user have scores recalculated."
msgid_plural "%d users have scores recalculated."
msgstr[0] "%d felhasználó pontja újraszámolva."
msgstr[1] "%d felhasználó pontja újraszámolva."
-#: judge/admin/profile.py:113
+#: judge/admin/profile.py:123
msgid "Recalculate scores"
msgstr "Pontok újraszámítása"
@@ -506,115 +506,116 @@ msgstr ""
msgid "IOI (pre-2016)"
msgstr ""
-#: judge/forms.py:26
-msgid "Two-factor authentication tokens must be 6 decimal digits."
+#: judge/forms.py:27
+#, python-brace-format
+msgid "Two-factor authentication tokens must be {TOTP_CODE_LENGTH} decimal digits."
msgstr ""
-#: judge/forms.py:29
+#: judge/forms.py:30
msgid "Invalid two-factor authentication token."
msgstr ""
-#: judge/forms.py:32
+#: judge/forms.py:33
msgid "Scratch codes must be 16 base32 characters."
msgstr ""
-#: judge/forms.py:34
+#: judge/forms.py:35 judge/forms.py:264
msgid "Invalid scratch code."
msgstr ""
-#: judge/forms.py:45
+#: judge/forms.py:46
msgid "Subscribe to contest updates"
msgstr "Iratkozz fel hírlevelünkre"
-#: judge/forms.py:46
+#: judge/forms.py:47
msgid "Enable experimental features"
msgstr "Kísérleti funkciók engedélyezése"
-#: judge/forms.py:71
+#: judge/forms.py:72
msgid "You must solve at least one problem before you can update your profile."
msgstr ""
-#: judge/forms.py:80 judge/views/organization.py:127
+#: judge/forms.py:81 judge/views/organization.py:126
#, python-brace-format
msgid "You may not be part of more than {count} public organizations."
msgstr "Nem lehetsz tagja több mint {count} nyilvános csoportnak."
-#: judge/forms.py:96
+#: judge/forms.py:97
msgid "Download comments?"
msgstr ""
-#: judge/forms.py:97
+#: judge/forms.py:98
msgid "Download submissions?"
msgstr ""
-#: judge/forms.py:98
+#: judge/forms.py:99
msgid "Filter by problem code glob:"
msgstr ""
-#: judge/forms.py:102
+#: judge/forms.py:103
msgid "Leave empty to include all submissions"
msgstr ""
-#: judge/forms.py:105 templates/problem/manage_submission.html:142
+#: judge/forms.py:106 templates/problem/manage_submission.html:142
msgid "Filter by result:"
msgstr ""
-#: judge/forms.py:111
+#: judge/forms.py:112
msgid "Please select at least one thing to download."
msgstr ""
-#: judge/forms.py:137
+#: judge/forms.py:138
msgid "Any judge"
msgstr ""
-#: judge/forms.py:167 judge/views/register.py:26
+#: judge/forms.py:159 judge/views/register.py:25
#: templates/registration/registration_form.html:137
#: templates/user/base-users-table.html:5
msgid "Username"
msgstr "Felhasználóinév"
-#: judge/forms.py:168 templates/registration/registration_form.html:149
+#: judge/forms.py:160 templates/registration/registration_form.html:149
#: templates/registration/registration_form.html:163
msgid "Password"
msgstr "Jelszó"
-#: judge/forms.py:201
+#: judge/forms.py:192
msgid "Invalid code length."
msgstr ""
-#: judge/forms.py:219
+#: judge/forms.py:223
msgid "Invalid WebAuthn response."
msgstr ""
-#: judge/forms.py:222
+#: judge/forms.py:226
msgid "No WebAuthn challenge issued."
msgstr ""
-#: judge/forms.py:228
+#: judge/forms.py:232
msgid "Invalid WebAuthn credential ID."
msgstr ""
-#: judge/forms.py:257
+#: judge/forms.py:262
msgid "Invalid two-factor authentication token or scratch code."
msgstr ""
-#: judge/forms.py:259
+#: judge/forms.py:266
msgid "Must specify either totp_token or webauthn_response."
msgstr ""
-#: judge/forms.py:263 judge/models/problem.py:105
+#: judge/forms.py:270 judge/models/problem.py:119
msgid "Problem code must be ^[a-z0-9]+$"
msgstr "A feladat azonosítónak ^[a-z0-9]+$ kell lennie"
-#: judge/forms.py:268
+#: judge/forms.py:275
msgid "Problem with code already exists."
msgstr ""
-#: judge/forms.py:273 judge/models/contest.py:66
+#: judge/forms.py:280 judge/models/contest.py:66
msgid "Contest id must be ^[a-z0-9]+$"
msgstr "A verseny azonosítójának ^[a-z0-9]+$ kell lennie"
-#: judge/forms.py:278
+#: judge/forms.py:285
msgid "Contest with key already exists."
msgstr ""
@@ -694,7 +695,7 @@ msgid "comments"
msgstr "hozzászólások"
#: judge/models/comment.py:89 judge/models/comment.py:141
-#: judge/models/problem.py:484
+#: judge/models/problem.py:511
#, python-format
msgid "Editorial for %s"
msgstr "Megoldási útmutató %s-hez"
@@ -735,7 +736,7 @@ msgstr "címke leírása"
msgid "contest tag"
msgstr "verseny címkéje"
-#: judge/models/contest.py:53 judge/models/contest.py:117
+#: judge/models/contest.py:53 judge/models/contest.py:126
msgid "contest tags"
msgstr "verseny cimkéi"
@@ -760,410 +761,426 @@ msgid "contest name"
msgstr "verseny neve"
#: judge/models/contest.py:68
-msgid "These people will be able to edit the contest."
-msgstr "Ezek az emberek szerkeszthetik a versenyt."
+msgid "These users will be able to edit the contest."
+msgstr ""
+
+#: judge/models/contest.py:70
+msgid "These users will be able to edit the contest, but will not be listed as authors."
+msgstr ""
-#: judge/models/contest.py:70 judge/models/runtime.py:136
+#: judge/models/contest.py:73
+msgid "These users will be able to view the contest, but not edit it."
+msgstr ""
+
+#: judge/models/contest.py:76 judge/models/runtime.py:136
msgid "description"
msgstr "leírás"
-#: judge/models/contest.py:71 judge/models/problem.py:431
+#: judge/models/contest.py:77 judge/models/problem.py:458
#: judge/models/runtime.py:138
msgid "problems"
msgstr "feladatok"
-#: judge/models/contest.py:72 judge/models/contest.py:384
+#: judge/models/contest.py:78 judge/models/contest.py:420
msgid "start time"
msgstr "kezdés"
-#: judge/models/contest.py:73
+#: judge/models/contest.py:79
msgid "end time"
msgstr "befejezés"
-#: judge/models/contest.py:74 judge/models/problem.py:126
-#: judge/models/problem.py:455
+#: judge/models/contest.py:80 judge/models/problem.py:140
+#: judge/models/problem.py:482
msgid "time limit"
msgstr "időkorlát"
-#: judge/models/contest.py:75 judge/models/problem.py:144
+#: judge/models/contest.py:81 judge/models/problem.py:158
msgid "publicly visible"
msgstr "nyilvánosan látható"
-#: judge/models/contest.py:76
+#: judge/models/contest.py:82
msgid "Should be set even for organization-private contests, where it determines whether the contest is visible to members of the specified organizations."
msgstr "Azt határozza meg, hogy a verseny a megadott szervezetek tagjai számára látható-e. Célszerű meghatározni még szervezeten belüli-privát versenyeken is."
-#: judge/models/contest.py:79
+#: judge/models/contest.py:85
msgid "contest rated"
msgstr "értékelt verseny"
-#: judge/models/contest.py:79
+#: judge/models/contest.py:85
msgid "Whether this contest can be rated."
msgstr "Hogy ez a verseny értékelhető-e."
-#: judge/models/contest.py:81
+#: judge/models/contest.py:87
msgid "view contest scoreboard"
msgstr ""
-#: judge/models/contest.py:83
+#: judge/models/contest.py:89
msgid "These users will be able to view the scoreboard."
msgstr ""
-#: judge/models/contest.py:84
+#: judge/models/contest.py:90
msgid "scoreboard visibility"
msgstr ""
-#: judge/models/contest.py:85
+#: judge/models/contest.py:91
msgid "Scoreboard visibility through the duration of the contest"
msgstr ""
-#: judge/models/contest.py:87
+#: judge/models/contest.py:93
msgid "no comments"
msgstr "nincsenek hozzászólások"
-#: judge/models/contest.py:88
+#: judge/models/contest.py:94
msgid "Use clarification system instead of comments."
msgstr "A pontosítási rendszer használata hozzászólások helyett."
-#: judge/models/contest.py:90
+#: judge/models/contest.py:96
msgid "Rating floor for contest"
msgstr ""
-#: judge/models/contest.py:92
+#: judge/models/contest.py:98
msgid "Rating ceiling for contest"
msgstr ""
-#: judge/models/contest.py:94
+#: judge/models/contest.py:100
msgid "rate all"
msgstr "összes értékelése"
-#: judge/models/contest.py:94
+#: judge/models/contest.py:100
msgid "Rate all users who joined."
msgstr "Értékelése az összes felhasználónak, aki csatlakozott."
-#: judge/models/contest.py:95
+#: judge/models/contest.py:101
msgid "exclude from ratings"
msgstr "kizárás a értékelésből"
-#: judge/models/contest.py:97
+#: judge/models/contest.py:103
msgid "private to specific users"
msgstr ""
-#: judge/models/contest.py:98
+#: judge/models/contest.py:104
msgid "private contestants"
msgstr ""
-#: judge/models/contest.py:99
+#: judge/models/contest.py:105
msgid "If private, only these users may see the contest"
msgstr ""
-#: judge/models/contest.py:101
+#: judge/models/contest.py:107
msgid "hide problem tags"
msgstr "feladat címkék elrejtése"
-#: judge/models/contest.py:102
+#: judge/models/contest.py:108
msgid "Whether problem tags should be hidden by default."
msgstr ""
-#: judge/models/contest.py:104
+#: judge/models/contest.py:110
+msgid "hide problem authors"
+msgstr ""
+
+#: judge/models/contest.py:111
+msgid "Whether problem authors should be hidden by default."
+msgstr ""
+
+#: judge/models/contest.py:113
msgid "run pretests only"
msgstr "csak pretesztek futtatása"
-#: judge/models/contest.py:105
+#: judge/models/contest.py:114
msgid "Whether judges should grade pretests only, versus all testcases. Commonly set during a contest, then unset prior to rejudging user submissions when the contest ends."
msgstr ""
-#: judge/models/contest.py:109 judge/models/problem.py:166
+#: judge/models/contest.py:118 judge/models/problem.py:183
msgid "private to organizations"
msgstr "privát a csoport számára"
-#: judge/models/contest.py:110 judge/models/problem.py:164
-#: judge/models/profile.py:83
+#: judge/models/contest.py:119 judge/models/problem.py:181
+#: judge/models/profile.py:86
msgid "organizations"
msgstr "csoportok"
-#: judge/models/contest.py:111
+#: judge/models/contest.py:120
msgid "If private, only these organizations may see the contest"
msgstr "Ha privát, csak ezek a csoportok láthatják a versenyt"
-#: judge/models/contest.py:112 judge/models/problem.py:153
+#: judge/models/contest.py:121 judge/models/problem.py:167
msgid "OpenGraph image"
msgstr "OpenGraph kép"
-#: judge/models/contest.py:113 judge/models/profile.py:54
+#: judge/models/contest.py:122 judge/models/profile.py:57
msgid "Logo override image"
msgstr ""
-#: judge/models/contest.py:115
+#: judge/models/contest.py:124
msgid "This image will replace the default site logo for users inside the contest."
msgstr ""
-#: judge/models/contest.py:118
+#: judge/models/contest.py:127
msgid "the amount of live participants"
msgstr "az éles résztvevők száma"
-#: judge/models/contest.py:119
+#: judge/models/contest.py:128
msgid "contest summary"
msgstr "verseny összefoglaló"
-#: judge/models/contest.py:120 judge/models/problem.py:155
+#: judge/models/contest.py:129 judge/models/problem.py:169
msgid "Plain-text, shown in meta description tag, e.g. for social media."
msgstr ""
-#: judge/models/contest.py:121 judge/models/profile.py:53
+#: judge/models/contest.py:130 judge/models/profile.py:56
msgid "access code"
msgstr "hozzáférési kód"
-#: judge/models/contest.py:122
+#: judge/models/contest.py:131
msgid "An optional code to prompt contestants before they are allowed to join the contest. Leave it blank to disable."
msgstr ""
-#: judge/models/contest.py:124 judge/models/problem.py:149
+#: judge/models/contest.py:133 judge/models/problem.py:163
msgid "personae non gratae"
msgstr "nemkívánatos személy"
-#: judge/models/contest.py:125
+#: judge/models/contest.py:134
msgid "Bans the selected users from joining this contest."
msgstr ""
-#: judge/models/contest.py:126
+#: judge/models/contest.py:135
msgid "contest format"
msgstr ""
-#: judge/models/contest.py:127
+#: judge/models/contest.py:136
msgid "The contest format module to use."
msgstr ""
-#: judge/models/contest.py:128
+#: judge/models/contest.py:137
msgid "contest format configuration"
msgstr ""
-#: judge/models/contest.py:129
+#: judge/models/contest.py:138
msgid "A JSON object to serve as the configuration for the chosen contest format module. Leave empty to use None. Exact format depends on the contest format selected."
msgstr ""
-#: judge/models/contest.py:136
+#: judge/models/contest.py:145
msgid "contest lock"
msgstr ""
-#: judge/models/contest.py:137
-msgid "Prevent submissions from this contest from being rejudged."
+#: judge/models/contest.py:146
+msgid "Prevent submissions from this contest from being rejudged after this date."
msgstr ""
-#: judge/models/contest.py:138
+#: judge/models/contest.py:148
msgid "precision points"
msgstr ""
-#: judge/models/contest.py:140
+#: judge/models/contest.py:150
msgid "Number of digits to round points to."
msgstr ""
-#: judge/models/contest.py:362
+#: judge/models/contest.py:398
msgid "See private contests"
msgstr "Privát versenyek mutatása"
-#: judge/models/contest.py:363
+#: judge/models/contest.py:399
msgid "Edit own contests"
msgstr "Saját versenyek szerkesztése"
-#: judge/models/contest.py:364
+#: judge/models/contest.py:400
msgid "Edit all contests"
msgstr "Az összes verseny szerkesztése"
-#: judge/models/contest.py:365
+#: judge/models/contest.py:401
msgid "Clone contest"
msgstr ""
-#: judge/models/contest.py:366 templates/contest/moss.html:74
+#: judge/models/contest.py:402 templates/contest/moss.html:74
msgid "MOSS contest"
msgstr ""
-#: judge/models/contest.py:367
+#: judge/models/contest.py:403
msgid "Rate contests"
msgstr "Versenyek értékelése"
-#: judge/models/contest.py:368
+#: judge/models/contest.py:404
msgid "Contest access codes"
msgstr "Verseny hozzáférési kódok"
-#: judge/models/contest.py:369
+#: judge/models/contest.py:405
msgid "Create private contests"
msgstr ""
-#: judge/models/contest.py:370
+#: judge/models/contest.py:406
msgid "Change contest visibility"
msgstr ""
-#: judge/models/contest.py:371
+#: judge/models/contest.py:407
msgid "Edit contest problem label script"
msgstr ""
-#: judge/models/contest.py:372
+#: judge/models/contest.py:408
msgid "Change lock status of contest"
msgstr ""
-#: judge/models/contest.py:374 judge/models/contest.py:472
-#: judge/models/contest.py:510 judge/models/contest.py:532
-#: judge/models/submission.py:84
+#: judge/models/contest.py:410 judge/models/contest.py:508
+#: judge/models/contest.py:547 judge/models/contest.py:569
+#: judge/models/submission.py:85
msgid "contest"
msgstr "verseny"
-#: judge/models/contest.py:375
+#: judge/models/contest.py:411
msgid "contests"
msgstr "versenyek"
-#: judge/models/contest.py:382
+#: judge/models/contest.py:418
msgid "associated contest"
msgstr ""
-#: judge/models/contest.py:385
+#: judge/models/contest.py:421
msgid "score"
msgstr "pontszám"
-#: judge/models/contest.py:386
+#: judge/models/contest.py:422
msgid "cumulative time"
msgstr "összes idő"
-#: judge/models/contest.py:387
+#: judge/models/contest.py:423
msgid "is disqualified"
msgstr ""
-#: judge/models/contest.py:388
+#: judge/models/contest.py:424
msgid "Whether this participation is disqualified."
msgstr ""
-#: judge/models/contest.py:389
+#: judge/models/contest.py:425
msgid "tie-breaking field"
msgstr ""
-#: judge/models/contest.py:390
+#: judge/models/contest.py:426
msgid "virtual participation id"
msgstr "virtuális részvételi azonosító"
-#: judge/models/contest.py:391
+#: judge/models/contest.py:427
msgid "0 means non-virtual, otherwise the n-th virtual participation."
msgstr ""
-#: judge/models/contest.py:392
+#: judge/models/contest.py:428
msgid "contest format specific data"
msgstr ""
-#: judge/models/contest.py:458
+#: judge/models/contest.py:494
#, python-format
msgid "%s spectating in %s"
msgstr "%s megfigyel %s-ben"
-#: judge/models/contest.py:460
+#: judge/models/contest.py:496
#, python-format
msgid "%s in %s, v%d"
msgstr "%s en %s, v%d"
-#: judge/models/contest.py:461
+#: judge/models/contest.py:497
#, python-format
msgid "%s in %s"
msgstr "%s %s-ben"
-#: judge/models/contest.py:464
+#: judge/models/contest.py:500
msgid "contest participation"
msgstr "verseny részvétel"
-#: judge/models/contest.py:465
+#: judge/models/contest.py:501
msgid "contest participations"
msgstr "verseny részvételek"
-#: judge/models/contest.py:471 judge/models/contest.py:494
-#: judge/models/contest.py:533 judge/models/problem.py:430
-#: judge/models/problem.py:435 judge/models/problem.py:453
+#: judge/models/contest.py:507 judge/models/contest.py:531
+#: judge/models/contest.py:570 judge/models/problem.py:457
+#: judge/models/problem.py:462 judge/models/problem.py:480
#: judge/models/problem_data.py:35
msgid "problem"
msgstr "feladat"
-#: judge/models/contest.py:473 judge/models/contest.py:498
-#: judge/models/problem.py:137
+#: judge/models/contest.py:509 judge/models/contest.py:535
+#: judge/models/problem.py:151
msgid "points"
msgstr "pontok"
-#: judge/models/contest.py:474
+#: judge/models/contest.py:510
msgid "partial"
msgstr "részleges"
-#: judge/models/contest.py:475 judge/models/contest.py:499
+#: judge/models/contest.py:511 judge/models/contest.py:536
msgid "is pretested"
msgstr "pretesztes-e"
-#: judge/models/contest.py:476 judge/models/interface.py:43
+#: judge/models/contest.py:512 judge/models/interface.py:43
msgid "order"
msgstr "sorrend"
-#: judge/models/contest.py:477
+#: judge/models/contest.py:513
msgid "output prefix length override"
msgstr ""
-#: judge/models/contest.py:479
+#: judge/models/contest.py:515
msgid "Maximum number of submissions for this problem, or leave blank for no limit."
msgstr ""
-#: judge/models/contest.py:482
+#: judge/models/contest.py:518
msgid "Why include a problem you can't submit to?"
msgstr ""
-#: judge/models/contest.py:487
+#: judge/models/contest.py:523
msgid "contest problem"
msgstr "versenyfeladat"
-#: judge/models/contest.py:488
+#: judge/models/contest.py:524
msgid "contest problems"
msgstr "versenyfeladatok"
-#: judge/models/contest.py:492 judge/models/submission.py:207
+#: judge/models/contest.py:529 judge/models/submission.py:218
msgid "submission"
msgstr "feltöltés"
-#: judge/models/contest.py:496 judge/models/contest.py:511
+#: judge/models/contest.py:533 judge/models/contest.py:548
msgid "participation"
msgstr "részvétel"
-#: judge/models/contest.py:500
+#: judge/models/contest.py:537
msgid "Whether this submission was ran only on pretests."
msgstr ""
-#: judge/models/contest.py:504
+#: judge/models/contest.py:541
msgid "contest submission"
msgstr "verseny feltöltés"
-#: judge/models/contest.py:505
+#: judge/models/contest.py:542
msgid "contest submissions"
msgstr "verseny feltöltések"
-#: judge/models/contest.py:513
+#: judge/models/contest.py:550
msgid "rank"
msgstr "helyezés"
-#: judge/models/contest.py:514
+#: judge/models/contest.py:551
msgid "rating"
msgstr "értékelés"
-#: judge/models/contest.py:515
+#: judge/models/contest.py:552
msgid "volatility"
msgstr "volatilitás"
-#: judge/models/contest.py:516
+#: judge/models/contest.py:553
msgid "last rated"
msgstr "utolsó értékelt"
-#: judge/models/contest.py:520
+#: judge/models/contest.py:557
msgid "contest rating"
msgstr "verseny értékelés"
-#: judge/models/contest.py:521
+#: judge/models/contest.py:558
msgid "contest ratings"
msgstr "verseny értékelések"
-#: judge/models/contest.py:540
+#: judge/models/contest.py:577
msgid "contest moss result"
msgstr ""
-#: judge/models/contest.py:541
+#: judge/models/contest.py:578
msgid "contest moss results"
msgstr ""
@@ -1203,7 +1220,7 @@ msgstr "szülő elem"
msgid "post title"
msgstr "bejegyzés címe"
-#: judge/models/interface.py:67 judge/models/problem.py:473
+#: judge/models/interface.py:67 judge/models/problem.py:500
msgid "authors"
msgstr "szerzők"
@@ -1211,7 +1228,7 @@ msgstr "szerzők"
msgid "slug"
msgstr "csonk"
-#: judge/models/interface.py:69 judge/models/problem.py:471
+#: judge/models/interface.py:69 judge/models/problem.py:498
msgid "public visibility"
msgstr "láthatóság"
@@ -1247,34 +1264,6 @@ msgstr "blog poszt"
msgid "blog posts"
msgstr "blog posztok"
-#: judge/models/message.py:11
-msgid "message title"
-msgstr "üzenet címe"
-
-#: judge/models/message.py:12 judge/models/ticket.py:30
-msgid "message body"
-msgstr "üzenet törzse"
-
-#: judge/models/message.py:13
-msgid "sender"
-msgstr "küldő"
-
-#: judge/models/message.py:14
-msgid "target"
-msgstr "címzett"
-
-#: judge/models/message.py:15
-msgid "message timestamp"
-msgstr "üzenet időbélyege"
-
-#: judge/models/message.py:16
-msgid "read"
-msgstr "olvas"
-
-#: judge/models/message.py:20
-msgid "messages in the thread"
-msgstr "üzenetek a szálban"
-
#: judge/models/problem.py:30
#, python-format
msgid "Disallowed characters: %(value)s"
@@ -1292,7 +1281,7 @@ msgstr "feladat kategória név"
msgid "problem type"
msgstr "feladat típus"
-#: judge/models/problem.py:44 judge/models/problem.py:121
+#: judge/models/problem.py:44 judge/models/problem.py:135
msgid "problem types"
msgstr "feladat típusok"
@@ -1304,7 +1293,7 @@ msgstr "feladat csoport azonosító"
msgid "problem group name"
msgstr "feladat csoport név"
-#: judge/models/problem.py:56 judge/models/problem.py:124
+#: judge/models/problem.py:56 judge/models/problem.py:138
msgid "problem group"
msgstr "feladat csoport"
@@ -1324,7 +1313,7 @@ msgstr "link"
msgid "full name"
msgstr "teljes név"
-#: judge/models/problem.py:65 judge/models/profile.py:41
+#: judge/models/problem.py:65 judge/models/profile.py:44
#: judge/models/runtime.py:24
msgid "short name"
msgstr "rövid név"
@@ -1353,232 +1342,252 @@ msgstr "licenc"
msgid "licenses"
msgstr "licencek"
-#: judge/models/problem.py:104
+#: judge/models/problem.py:112
+msgid "Follow global setting"
+msgstr ""
+
+#: judge/models/problem.py:113
+msgid "Always visible"
+msgstr ""
+
+#: judge/models/problem.py:114
+msgid "Visible if problem solved"
+msgstr ""
+
+#: judge/models/problem.py:115
+msgid "Only own submissions"
+msgstr ""
+
+#: judge/models/problem.py:118
msgid "problem code"
msgstr "feladat azonosító"
-#: judge/models/problem.py:106
+#: judge/models/problem.py:120
msgid "A short, unique code for the problem, used in the url after /problem/"
msgstr ""
-#: judge/models/problem.py:108
+#: judge/models/problem.py:122
msgid "problem name"
msgstr "feladat név"
-#: judge/models/problem.py:109
+#: judge/models/problem.py:123
msgid "The full name of the problem, as shown in the problem list."
msgstr ""
-#: judge/models/problem.py:111
+#: judge/models/problem.py:125
msgid "problem body"
msgstr "feladat törzs"
-#: judge/models/problem.py:112
+#: judge/models/problem.py:126
msgid "creators"
msgstr "szerzők"
-#: judge/models/problem.py:113
+#: judge/models/problem.py:127
msgid "These users will be able to edit the problem, and be listed as authors."
msgstr ""
-#: judge/models/problem.py:115
+#: judge/models/problem.py:129
msgid "curators"
msgstr "kurátorok"
-#: judge/models/problem.py:116
+#: judge/models/problem.py:130
msgid "These users will be able to edit the problem, but not be listed as authors."
msgstr ""
-#: judge/models/problem.py:118
+#: judge/models/problem.py:132
msgid "testers"
msgstr "tesztelők"
-#: judge/models/problem.py:120
+#: judge/models/problem.py:134
msgid "These users will be able to view the private problem, but not edit it."
msgstr ""
-#: judge/models/problem.py:122
+#: judge/models/problem.py:136
msgid "The type of problem, as shown on the problem's page."
msgstr ""
-#: judge/models/problem.py:125
+#: judge/models/problem.py:139
msgid "The group of problem, shown under Category in the problem list."
msgstr ""
-#: judge/models/problem.py:127
+#: judge/models/problem.py:141
msgid "The time limit for this problem, in seconds. Fractional seconds (e.g. 1.5) are supported."
msgstr "A feladat időlimitje másodpercekben. Tört másodperceket (pl. 1.5) is írhatunk."
-#: judge/models/problem.py:131 judge/models/problem.py:458
+#: judge/models/problem.py:145 judge/models/problem.py:485
msgid "memory limit"
msgstr "memória korlát"
-#: judge/models/problem.py:132
+#: judge/models/problem.py:146
msgid "The memory limit for this problem, in kilobytes (e.g. 64mb = 65536 kilobytes)."
msgstr "A feladat memória limitje kilobyte-okban (pl. 64mb = 65536 kilobyte)."
-#: judge/models/problem.py:138
+#: judge/models/problem.py:152
msgid "Points awarded for problem completion. Points are displayed with a 'p' suffix if partial."
msgstr ""
-#: judge/models/problem.py:141
+#: judge/models/problem.py:155
msgid "allows partial points"
msgstr "részleges pontok engedélyezése"
-#: judge/models/problem.py:142
+#: judge/models/problem.py:156
msgid "allowed languages"
msgstr "engedélyezett nyelvek"
-#: judge/models/problem.py:143
+#: judge/models/problem.py:157
msgid "List of allowed submission languages."
msgstr ""
-#: judge/models/problem.py:145
+#: judge/models/problem.py:159
msgid "manually managed"
msgstr "manuáisan kezelt"
-#: judge/models/problem.py:146
+#: judge/models/problem.py:160
msgid "Whether judges should be allowed to manage data or not."
msgstr ""
-#: judge/models/problem.py:147
+#: judge/models/problem.py:161
msgid "date of publishing"
msgstr "publikálás ideje"
-#: judge/models/problem.py:148
+#: judge/models/problem.py:162
msgid "Doesn't have magic ability to auto-publish due to backward compatibility"
msgstr ""
-#: judge/models/problem.py:150
+#: judge/models/problem.py:164
msgid "Bans the selected users from submitting to this problem."
msgstr ""
-#: judge/models/problem.py:152
+#: judge/models/problem.py:166
msgid "The license under which this problem is published."
msgstr ""
-#: judge/models/problem.py:154
+#: judge/models/problem.py:168
msgid "problem summary"
msgstr "feladat összefoglaló"
-#: judge/models/problem.py:156
+#: judge/models/problem.py:170
msgid "number of users"
msgstr ""
-#: judge/models/problem.py:157
+#: judge/models/problem.py:171
msgid "The number of users who solved the problem."
msgstr ""
-#: judge/models/problem.py:158
+#: judge/models/problem.py:172
msgid "solve rate"
msgstr ""
-#: judge/models/problem.py:159
+#: judge/models/problem.py:173
msgid "allow full markdown access"
msgstr ""
-#: judge/models/problem.py:165
+#: judge/models/problem.py:174
+msgid "submission source visibility"
+msgstr ""
+
+#: judge/models/problem.py:182
msgid "If private, only these organizations may see the problem."
msgstr ""
-#: judge/models/problem.py:420
+#: judge/models/problem.py:447
msgid "See hidden problems"
msgstr ""
-#: judge/models/problem.py:421
+#: judge/models/problem.py:448
msgid "Edit own problems"
msgstr ""
-#: judge/models/problem.py:422
+#: judge/models/problem.py:449
msgid "Edit all problems"
msgstr ""
-#: judge/models/problem.py:423
+#: judge/models/problem.py:450
msgid "Edit all public problems"
msgstr ""
-#: judge/models/problem.py:424
+#: judge/models/problem.py:451
msgid "Edit problems with full markup"
msgstr ""
-#: judge/models/problem.py:425 templates/problem/problem.html:161
+#: judge/models/problem.py:452 templates/problem/problem.html:161
msgid "Clone problem"
msgstr "Feladat klónozása"
-#: judge/models/problem.py:426
+#: judge/models/problem.py:453
msgid "Change is_public field"
msgstr ""
-#: judge/models/problem.py:427
+#: judge/models/problem.py:454
msgid "Change is_manually_managed field"
msgstr ""
-#: judge/models/problem.py:428
+#: judge/models/problem.py:455
msgid "See organization-private problems"
msgstr ""
-#: judge/models/problem.py:436 judge/models/problem.py:454
+#: judge/models/problem.py:463 judge/models/problem.py:481
#: judge/models/runtime.py:111
msgid "language"
msgstr "nyelv"
-#: judge/models/problem.py:437
+#: judge/models/problem.py:464
msgid "translated name"
msgstr "lefordított név"
-#: judge/models/problem.py:438
+#: judge/models/problem.py:465
msgid "translated description"
msgstr "lefordított leírás"
-#: judge/models/problem.py:442
+#: judge/models/problem.py:469
msgid "problem translation"
msgstr "feladat fordítás"
-#: judge/models/problem.py:443
+#: judge/models/problem.py:470
msgid "problem translations"
msgstr "feladat fordítások"
-#: judge/models/problem.py:447
+#: judge/models/problem.py:474
msgid "clarified problem"
msgstr "pontosított feladat"
-#: judge/models/problem.py:448
+#: judge/models/problem.py:475
msgid "clarification body"
msgstr "pontosítás törzse"
-#: judge/models/problem.py:449
+#: judge/models/problem.py:476
msgid "clarification timestamp"
msgstr "pontosítás időbélyege"
-#: judge/models/problem.py:464
+#: judge/models/problem.py:491
msgid "language-specific resource limit"
msgstr "nyelv specifikus erőforrás korlát"
-#: judge/models/problem.py:465
+#: judge/models/problem.py:492
msgid "language-specific resource limits"
msgstr "nyelv specifikus erőforrás korlátok"
-#: judge/models/problem.py:469
+#: judge/models/problem.py:496
msgid "associated problem"
msgstr "hozzárendelt probléma"
-#: judge/models/problem.py:472
+#: judge/models/problem.py:499
msgid "publish date"
msgstr "publikálás dátuma"
-#: judge/models/problem.py:474
+#: judge/models/problem.py:501
msgid "editorial content"
msgstr "megoldási útmutató tartalom"
-#: judge/models/problem.py:497
+#: judge/models/problem.py:524
msgid "See hidden solutions"
msgstr ""
-#: judge/models/problem.py:499
+#: judge/models/problem.py:526
msgid "solution"
msgstr "megoldás"
-#: judge/models/problem.py:500
+#: judge/models/problem.py:527
msgid "solutions"
msgstr "megoldások"
@@ -1690,112 +1699,112 @@ msgstr "pont érték"
msgid "case is pretest?"
msgstr "ez az eset preteszt?"
-#: judge/models/profile.py:38
+#: judge/models/profile.py:41
msgid "organization title"
msgstr "csoport neve"
-#: judge/models/profile.py:39
+#: judge/models/profile.py:42
msgid "organization slug"
msgstr ""
-#: judge/models/profile.py:40
+#: judge/models/profile.py:43
msgid "Organization name shown in URL"
msgstr ""
-#: judge/models/profile.py:42
+#: judge/models/profile.py:45
msgid "Displayed beside user name during contests"
msgstr "A felhasználóinév mellett van a versenyek alatt"
-#: judge/models/profile.py:43
+#: judge/models/profile.py:46
msgid "organization description"
msgstr "csoport leírás"
-#: judge/models/profile.py:44
+#: judge/models/profile.py:47
msgid "administrators"
msgstr "adminisztrátorok"
-#: judge/models/profile.py:45
+#: judge/models/profile.py:48
msgid "Those who can edit this organization"
msgstr "Azok, akik szerkeszteni tudják ezt a csoportot"
-#: judge/models/profile.py:46
+#: judge/models/profile.py:49
msgid "creation date"
msgstr "létrehozás dátuma"
-#: judge/models/profile.py:47
+#: judge/models/profile.py:50
msgid "is open organization?"
msgstr "nyílt-e a csoport?"
-#: judge/models/profile.py:48
+#: judge/models/profile.py:51
msgid "Allow joining organization"
msgstr "A csoportba való belépés engedélyezése"
-#: judge/models/profile.py:49
+#: judge/models/profile.py:52
msgid "maximum size"
msgstr "maximális méret"
-#: judge/models/profile.py:50
+#: judge/models/profile.py:53
msgid "Maximum amount of users in this organization, only applicable to private organizations"
msgstr "Maximális felhasználó szám ebben a csoportban, csak privát csoportokra érvényes"
-#: judge/models/profile.py:52
+#: judge/models/profile.py:55
msgid "Student access code"
msgstr "Tanulói hozzáférési kódok"
-#: judge/models/profile.py:56
+#: judge/models/profile.py:59
msgid "This image will replace the default site logo for users viewing the organization."
msgstr ""
-#: judge/models/profile.py:79
+#: judge/models/profile.py:82
msgid "Administer organizations"
msgstr ""
-#: judge/models/profile.py:80
+#: judge/models/profile.py:83
msgid "Edit all organizations"
msgstr ""
-#: judge/models/profile.py:82 judge/models/profile.py:99
-#: judge/models/profile.py:269
+#: judge/models/profile.py:85 judge/models/profile.py:102
+#: judge/models/profile.py:293
msgid "organization"
msgstr "csoport"
-#: judge/models/profile.py:87
+#: judge/models/profile.py:90
msgid "user associated"
msgstr "felhasználóhoz társult"
-#: judge/models/profile.py:88
+#: judge/models/profile.py:91
msgid "self-description"
msgstr "önleírás"
-#: judge/models/profile.py:89
+#: judge/models/profile.py:92
msgid "location"
msgstr "helyszín"
-#: judge/models/profile.py:91
+#: judge/models/profile.py:94
msgid "preferred language"
msgstr "preferált nyelv"
-#: judge/models/profile.py:97
+#: judge/models/profile.py:100
msgid "last access time"
msgstr "utolsó belépés ideje"
-#: judge/models/profile.py:98
+#: judge/models/profile.py:101
msgid "last IP"
msgstr "utolsó IP"
-#: judge/models/profile.py:101
+#: judge/models/profile.py:104
msgid "display rank"
msgstr "megjelenített rang"
-#: judge/models/profile.py:103
+#: judge/models/profile.py:106
msgid "Normal User"
msgstr ""
-#: judge/models/profile.py:104
+#: judge/models/profile.py:107
msgid "Problem Setter"
msgstr ""
-#: judge/models/profile.py:105 templates/base.html:220
+#: judge/models/profile.py:108 templates/base.html:220
#: templates/comments/list.html:99 templates/contest/contest-list-tabs.html:24
#: templates/contest/ranking-table.html:49
#: templates/problem/problem-list-tabs.html:6
@@ -1804,155 +1813,167 @@ msgstr ""
msgid "Admin"
msgstr "Admin"
-#: judge/models/profile.py:106
+#: judge/models/profile.py:109
msgid "comment mute"
msgstr "hozzászólás lenémítása"
-#: judge/models/profile.py:106
+#: judge/models/profile.py:109
msgid "Some users are at their best when silent."
msgstr "Néhány felhasználó a legjobb amikor csendesek."
-#: judge/models/profile.py:108
+#: judge/models/profile.py:111
msgid "unlisted user"
msgstr ""
-#: judge/models/profile.py:108
+#: judge/models/profile.py:111
msgid "User will not be ranked."
msgstr ""
-#: judge/models/profile.py:111
+#: judge/models/profile.py:114
msgid "user script"
msgstr "felhasználói szkript"
-#: judge/models/profile.py:112
+#: judge/models/profile.py:115
msgid "User-defined JavaScript for site customization."
msgstr "Felhasználó által meghatározott JavaScript a webhely testreszabásához."
-#: judge/models/profile.py:113
+#: judge/models/profile.py:116
msgid "current contest"
msgstr "jelenlegi verseny"
-#: judge/models/profile.py:115
+#: judge/models/profile.py:118
msgid "math engine"
msgstr "matek motor"
-#: judge/models/profile.py:117
+#: judge/models/profile.py:120
msgid "the rendering engine used to render math"
msgstr "a matek ábrákat renderelő motor"
-#: judge/models/profile.py:118
+#: judge/models/profile.py:121
msgid "TOTP 2FA enabled"
msgstr ""
-#: judge/models/profile.py:119
+#: judge/models/profile.py:122
msgid "check to enable TOTP-based two-factor authentication"
msgstr ""
-#: judge/models/profile.py:120
+#: judge/models/profile.py:123
msgid "WebAuthn 2FA enabled"
msgstr ""
-#: judge/models/profile.py:121
+#: judge/models/profile.py:124
msgid "check to enable WebAuthn-based two-factor authentication"
msgstr ""
-#: judge/models/profile.py:122
+#: judge/models/profile.py:125
msgid "TOTP key"
msgstr ""
-#: judge/models/profile.py:123
+#: judge/models/profile.py:126
msgid "32 character base32-encoded key for TOTP"
msgstr ""
-#: judge/models/profile.py:125
+#: judge/models/profile.py:128
msgid "TOTP key must be empty or base32"
msgstr ""
-#: judge/models/profile.py:126
+#: judge/models/profile.py:129
msgid "scratch codes"
msgstr ""
-#: judge/models/profile.py:127
+#: judge/models/profile.py:130
msgid "JSON array of 16 character base32-encoded codes for scratch codes"
msgstr ""
-#: judge/models/profile.py:131
+#: judge/models/profile.py:134
msgid "Scratch codes must be empty or a JSON array of 16-character base32 codes"
msgstr ""
-#: judge/models/profile.py:133
+#: judge/models/profile.py:136
+msgid "last TOTP timecode"
+msgstr ""
+
+#: judge/models/profile.py:137
msgid "API token"
msgstr ""
-#: judge/models/profile.py:134
+#: judge/models/profile.py:138
msgid "64 character hex-encoded API access token"
msgstr ""
-#: judge/models/profile.py:136
+#: judge/models/profile.py:140
msgid "API token must be None or hexadecimal"
msgstr ""
-#: judge/models/profile.py:137
+#: judge/models/profile.py:141
msgid "internal notes"
msgstr ""
-#: judge/models/profile.py:138
+#: judge/models/profile.py:142
msgid "Notes for administrators regarding this user."
msgstr ""
-#: judge/models/profile.py:139
+#: judge/models/profile.py:143
msgid "last data download time"
msgstr ""
-#: judge/models/profile.py:236
+#: judge/models/profile.py:253
msgid "Shows in-progress development stuff"
msgstr ""
-#: judge/models/profile.py:237
+#: judge/models/profile.py:254
msgid "Edit TOTP settings"
msgstr ""
-#: judge/models/profile.py:239
+#: judge/models/profile.py:256
msgid "user profile"
msgstr "felhasználói profil"
-#: judge/models/profile.py:240
+#: judge/models/profile.py:257
msgid "user profiles"
msgstr "felhasználói profilok"
-#: judge/models/profile.py:246
+#: judge/models/profile.py:263
msgid "device name"
msgstr ""
-#: judge/models/profile.py:247
+#: judge/models/profile.py:264
msgid "credential ID"
msgstr ""
-#: judge/models/profile.py:248
+#: judge/models/profile.py:265
msgid "public key"
msgstr ""
-#: judge/models/profile.py:249
+#: judge/models/profile.py:266
msgid "sign counter"
msgstr ""
-#: judge/models/profile.py:271
+#: judge/models/profile.py:287
+msgid "WebAuthn credential"
+msgstr ""
+
+#: judge/models/profile.py:288
+msgid "WebAuthn credentials"
+msgstr ""
+
+#: judge/models/profile.py:295
msgid "request time"
msgstr "kérési idő"
-#: judge/models/profile.py:272
+#: judge/models/profile.py:296
msgid "state"
msgstr "állapot"
-#: judge/models/profile.py:277
+#: judge/models/profile.py:301
msgid "reason"
msgstr "ok"
-#: judge/models/profile.py:280
+#: judge/models/profile.py:304
msgid "organization join request"
msgstr "csoport belépési kérelem"
-#: judge/models/profile.py:281
+#: judge/models/profile.py:305
msgid "organization join requests"
msgstr "csoport belépési kérelmek"
@@ -2108,210 +2129,210 @@ msgstr "bírók"
msgid "judge"
msgstr "bíró"
-#: judge/models/submission.py:20 judge/models/submission.py:47
+#: judge/models/submission.py:21 judge/models/submission.py:48
#: judge/utils/problems.py:74
msgid "Accepted"
msgstr "Elfogadva"
-#: judge/models/submission.py:21 judge/models/submission.py:48
+#: judge/models/submission.py:22 judge/models/submission.py:49
msgid "Wrong Answer"
msgstr "Rossz válasz"
-#: judge/models/submission.py:22 judge/models/submission.py:50
+#: judge/models/submission.py:23 judge/models/submission.py:51
msgid "Time Limit Exceeded"
msgstr "Időlimit túllépés"
-#: judge/models/submission.py:23 judge/models/submission.py:51
+#: judge/models/submission.py:24 judge/models/submission.py:52
msgid "Memory Limit Exceeded"
msgstr "Memórialimit túllépés"
-#: judge/models/submission.py:24 judge/models/submission.py:52
+#: judge/models/submission.py:25 judge/models/submission.py:53
msgid "Output Limit Exceeded"
msgstr "Kimenetlimint túllépés"
-#: judge/models/submission.py:25 judge/models/submission.py:53
+#: judge/models/submission.py:26 judge/models/submission.py:54
msgid "Invalid Return"
msgstr "Érvénytelen visszatérés"
-#: judge/models/submission.py:26 judge/models/submission.py:54
+#: judge/models/submission.py:27 judge/models/submission.py:55
msgid "Runtime Error"
msgstr "Futási hiba"
-#: judge/models/submission.py:27 judge/models/submission.py:41
-#: judge/models/submission.py:55 judge/utils/problems.py:76
+#: judge/models/submission.py:28 judge/models/submission.py:42
+#: judge/models/submission.py:56 judge/utils/problems.py:76
msgid "Compile Error"
msgstr "Fordítási hiba"
-#: judge/models/submission.py:28 judge/models/submission.py:40
+#: judge/models/submission.py:29 judge/models/submission.py:41
msgid "Internal Error"
msgstr "Belső hiba"
-#: judge/models/submission.py:29
+#: judge/models/submission.py:30
msgid "Short circuit"
msgstr ""
-#: judge/models/submission.py:30 judge/models/submission.py:42
-#: judge/models/submission.py:61
+#: judge/models/submission.py:31 judge/models/submission.py:43
+#: judge/models/submission.py:62
msgid "Aborted"
msgstr "Megszakítva"
-#: judge/models/submission.py:36 judge/models/submission.py:57
+#: judge/models/submission.py:37 judge/models/submission.py:58
msgid "Queued"
msgstr "Sorba állítva"
-#: judge/models/submission.py:37 judge/models/submission.py:58
+#: judge/models/submission.py:38 judge/models/submission.py:59
msgid "Processing"
msgstr "Feldolgozás alatt"
-#: judge/models/submission.py:38 judge/models/submission.py:59
+#: judge/models/submission.py:39 judge/models/submission.py:60
msgid "Grading"
msgstr "Pontozás"
-#: judge/models/submission.py:39 judge/models/submission.py:60
+#: judge/models/submission.py:40 judge/models/submission.py:61
msgid "Completed"
msgstr ""
-#: judge/models/submission.py:56
+#: judge/models/submission.py:57
msgid "Internal Error (judging server error)"
msgstr "Belső hiba (tesztelő szerver hiba)"
-#: judge/models/submission.py:66
+#: judge/models/submission.py:67
msgid "submission time"
msgstr ""
-#: judge/models/submission.py:67 judge/models/submission.py:227
+#: judge/models/submission.py:68 judge/models/submission.py:238
msgid "execution time"
msgstr "futási idő"
-#: judge/models/submission.py:68 judge/models/submission.py:228
+#: judge/models/submission.py:69 judge/models/submission.py:239
msgid "memory usage"
msgstr "memória használat"
-#: judge/models/submission.py:69 judge/models/submission.py:229
+#: judge/models/submission.py:70 judge/models/submission.py:240
msgid "points granted"
msgstr ""
-#: judge/models/submission.py:70
+#: judge/models/submission.py:71
msgid "submission language"
msgstr ""
-#: judge/models/submission.py:71
+#: judge/models/submission.py:72
msgid "status"
msgstr "állapot"
-#: judge/models/submission.py:72
+#: judge/models/submission.py:73
msgid "result"
msgstr "eredmény"
-#: judge/models/submission.py:74
+#: judge/models/submission.py:75
msgid "compile errors"
msgstr "fordítási hibák"
-#: judge/models/submission.py:76
+#: judge/models/submission.py:77
msgid "batched cases"
msgstr ""
-#: judge/models/submission.py:77
+#: judge/models/submission.py:78
msgid "test case points"
msgstr "teszteset pontjai"
-#: judge/models/submission.py:78
+#: judge/models/submission.py:79
msgid "test case total points"
msgstr ""
-#: judge/models/submission.py:79
+#: judge/models/submission.py:80
msgid "judged on"
msgstr "ezen tesztelve"
-#: judge/models/submission.py:81
+#: judge/models/submission.py:82
msgid "submission judge time"
msgstr ""
-#: judge/models/submission.py:82
-msgid "was rejudged by admin"
+#: judge/models/submission.py:83
+msgid "last rejudge date by admin"
msgstr ""
-#: judge/models/submission.py:83
+#: judge/models/submission.py:84
msgid "was ran on pretests only"
msgstr ""
-#: judge/models/submission.py:86
-msgid "lock submission"
+#: judge/models/submission.py:87
+msgid "submission lock"
msgstr ""
-#: judge/models/submission.py:199
+#: judge/models/submission.py:210
msgid "Abort any submission"
msgstr ""
-#: judge/models/submission.py:200
+#: judge/models/submission.py:211
msgid "Rejudge the submission"
msgstr ""
-#: judge/models/submission.py:201
+#: judge/models/submission.py:212
msgid "Rejudge a lot of submissions"
msgstr ""
-#: judge/models/submission.py:202
+#: judge/models/submission.py:213
msgid "Submit without limit"
msgstr ""
-#: judge/models/submission.py:203
+#: judge/models/submission.py:214
msgid "View all submission"
msgstr ""
-#: judge/models/submission.py:204
+#: judge/models/submission.py:215
msgid "Resubmit others' submission"
msgstr ""
-#: judge/models/submission.py:205
+#: judge/models/submission.py:216
msgid "Change lock status of submission"
msgstr ""
-#: judge/models/submission.py:208 templates/contest/moss.html:58
+#: judge/models/submission.py:219 templates/contest/moss.html:58
msgid "submissions"
msgstr ""
-#: judge/models/submission.py:212 judge/models/submission.py:223
+#: judge/models/submission.py:223 judge/models/submission.py:234
msgid "associated submission"
msgstr ""
-#: judge/models/submission.py:214
+#: judge/models/submission.py:225
msgid "source code"
msgstr "forráskód"
-#: judge/models/submission.py:225
+#: judge/models/submission.py:236
msgid "test case ID"
msgstr "teszteset azonosító"
-#: judge/models/submission.py:226
+#: judge/models/submission.py:237
msgid "status flag"
msgstr ""
-#: judge/models/submission.py:230
+#: judge/models/submission.py:241
msgid "points possible"
msgstr ""
-#: judge/models/submission.py:231
+#: judge/models/submission.py:242
msgid "batch number"
msgstr ""
-#: judge/models/submission.py:232
+#: judge/models/submission.py:243
msgid "judging feedback"
msgstr "tesztelési visszajelzés"
-#: judge/models/submission.py:233
+#: judge/models/submission.py:244
msgid "extended judging feedback"
msgstr ""
-#: judge/models/submission.py:234
+#: judge/models/submission.py:245
msgid "program output"
msgstr "program kimenet"
-#: judge/models/submission.py:242
+#: judge/models/submission.py:253
msgid "submission test case"
msgstr ""
-#: judge/models/submission.py:243
+#: judge/models/submission.py:254
msgid "submission test cases"
msgstr ""
@@ -2359,6 +2380,10 @@ msgstr "hibajegy"
msgid "poster"
msgstr ""
+#: judge/models/ticket.py:30
+msgid "message body"
+msgstr "üzenet törzse"
+
#: judge/models/ticket.py:31
msgid "message time"
msgstr ""
@@ -2381,19 +2406,23 @@ msgstr ""
msgid "Running MOSS"
msgstr ""
-#: judge/tasks/submission.py:43
+#: judge/tasks/submission.py:45
msgid "Modifying submissions"
msgstr ""
-#: judge/tasks/submission.py:56
+#: judge/tasks/submission.py:58
msgid "Recalculating user points"
msgstr ""
-#: judge/tasks/user.py:50
+#: judge/tasks/user.py:49
+msgid "Applying filters"
+msgstr ""
+
+#: judge/tasks/user.py:64
msgid "Preparing your submission data"
msgstr ""
-#: judge/tasks/user.py:81
+#: judge/tasks/user.py:95
msgid "Preparing your comment data"
msgstr ""
@@ -2506,7 +2535,7 @@ msgstr ""
msgid "You already voted."
msgstr "Már szavaztál."
-#: judge/views/comment.py:129 judge/views/organization.py:298
+#: judge/views/comment.py:129 judge/views/organization.py:297
msgid "Edited from site"
msgstr "Szerkesztve az oldalról"
@@ -2514,125 +2543,130 @@ msgstr "Szerkesztve az oldalról"
msgid "Editing comment"
msgstr "Hozzászólás szerkesztése"
-#: judge/views/contests.py:56 judge/views/contests.py:201
-#: judge/views/contests.py:204 judge/views/contests.py:382
+#: judge/views/contests.py:57 judge/views/contests.py:210
+#: judge/views/contests.py:213 judge/views/contests.py:395
msgid "No such contest"
msgstr "Nincs ilyen verseny"
-#: judge/views/contests.py:57 judge/views/contests.py:202
+#: judge/views/contests.py:58 judge/views/contests.py:211
#, python-format
msgid "Could not find a contest with the key \"%s\"."
msgstr "Nem található verseny a \"%s\" kulccsal."
-#: judge/views/contests.py:70
+#: judge/views/contests.py:71
msgid "Contests"
msgstr "Versenyek"
-#: judge/views/contests.py:205
+#: judge/views/contests.py:214
msgid "Could not find such contest."
msgstr "Nem található ilyen verseny."
-#: judge/views/contests.py:208
+#: judge/views/contests.py:217
#, python-format
msgid "Access to contest \"%s\" denied"
msgstr "Hozzáférés a \"%s\" versenyhez megtagadva"
-#: judge/views/contests.py:235
+#: judge/views/contests.py:244
msgid "Clone Contest"
msgstr ""
-#: judge/views/contests.py:301
+#: judge/views/contests.py:278
+#, python-format
+msgid "Cloned contest from %s"
+msgstr ""
+
+#: judge/views/contests.py:314
msgid "Contest not ongoing"
msgstr "A verseny nincs folyamatban"
-#: judge/views/contests.py:302
+#: judge/views/contests.py:315
#, python-format
msgid "\"%s\" is not currently ongoing."
msgstr "\"%s\" nincs folyamatban."
-#: judge/views/contests.py:306
+#: judge/views/contests.py:319
msgid "Already in contest"
msgstr "Már a versenyben vagy"
-#: judge/views/contests.py:307
+#: judge/views/contests.py:320
#, python-format
msgid "You are already in a contest: \"%s\"."
msgstr "Már a \"%s\" versenyben vagy."
-#: judge/views/contests.py:310
+#: judge/views/contests.py:323
msgid "Banned from joining"
msgstr ""
-#: judge/views/contests.py:311
+#: judge/views/contests.py:324
msgid "You have been declared persona non grata for this contest. You are permanently barred from joining this contest."
msgstr ""
-#: judge/views/contests.py:372
+#: judge/views/contests.py:385
#, python-format
msgid "Enter access code for \"%s\""
msgstr "Add meg a hozzáférési kódot a \"%s\"-hoz"
-#: judge/views/contests.py:383
+#: judge/views/contests.py:396
#, python-format
msgid "You are not in contest \"%s\"."
msgstr "Nem vagy a \"%s\" versenyben."
-#: judge/views/contests.py:402
+#: judge/views/contests.py:415
msgid "ContestCalendar requires integer year and month"
msgstr ""
-#: judge/views/contests.py:442
+#: judge/views/contests.py:455
#, python-format
msgid "Contests in %(month)s"
msgstr ""
-#: judge/views/contests.py:442
+#: judge/views/contests.py:455
msgid "F Y"
msgstr ""
-#: judge/views/contests.py:489
+#: judge/views/contests.py:502
#, python-format
msgid "%s Statistics"
msgstr ""
-#: judge/views/contests.py:662
+#: judge/views/contests.py:675
#, python-format
msgid "%s Rankings"
msgstr ""
-#: judge/views/contests.py:670
+#: judge/views/contests.py:683
msgid "???"
msgstr "???"
-#: judge/views/contests.py:686
+#: judge/views/contests.py:699
#, python-format
msgid "Your participation in %s"
msgstr ""
-#: judge/views/contests.py:687
+#: judge/views/contests.py:700
#, python-format
msgid "%s's participation in %s"
msgstr ""
-#: judge/views/contests.py:694
+#: judge/views/contests.py:707
msgid "Live"
msgstr ""
-#: judge/views/contests.py:706 templates/contest/contest-tabs.html:13
+#: judge/views/contests.py:719 templates/contest/contest-tabs.html:13
msgid "Participation"
msgstr ""
-#: judge/views/contests.py:750
+#: judge/views/contests.py:763
#, python-format
msgid "%s MOSS Results"
msgstr ""
-#: judge/views/contests.py:777
+#: judge/views/contests.py:790
#, python-format
msgid "Running MOSS for %s..."
msgstr ""
-#: judge/views/contests.py:800
+#: judge/views/contests.py:813
#, python-format
msgid "Contest tag: %s"
msgstr ""
@@ -2661,163 +2695,177 @@ msgstr ""
msgid "Runtimes"
msgstr ""
-#: judge/views/organization.py:44 judge/views/organization.py:47
+#: judge/views/organization.py:43 judge/views/organization.py:46
msgid "No such organization"
msgstr "Nincs ilyen csoport"
-#: judge/views/organization.py:45
+#: judge/views/organization.py:44
#, python-format
msgid "Could not find an organization with the key \"%s\"."
msgstr "Nem található csoport a \"%s\" kulccsal."
-#: judge/views/organization.py:48
+#: judge/views/organization.py:47
msgid "Could not find such organization."
msgstr "Nem található ilyen csoport."
-#: judge/views/organization.py:72 judge/views/register.py:34
+#: judge/views/organization.py:71 judge/views/register.py:33
#: templates/organization/list.html:15 templates/user/user-list-tabs.html:5
msgid "Organizations"
msgstr "Csoportok"
-#: judge/views/organization.py:93
+#: judge/views/organization.py:92
#, python-format
msgid "%s Members"
msgstr "%s Tagok"
-#: judge/views/organization.py:118 judge/views/organization.py:121
-#: judge/views/organization.py:126
+#: judge/views/organization.py:117 judge/views/organization.py:120
+#: judge/views/organization.py:125
msgid "Joining organization"
msgstr "Belépés a csoportba"
-#: judge/views/organization.py:118
+#: judge/views/organization.py:117
msgid "You are already in the organization."
msgstr "Már benne vagy a csoportba."
-#: judge/views/organization.py:121
+#: judge/views/organization.py:120
msgid "This organization is not open."
msgstr "Ez a csoport nem nyílt."
-#: judge/views/organization.py:138
+#: judge/views/organization.py:137
msgid "Leaving organization"
msgstr "Csoport elhagyása"
-#: judge/views/organization.py:138
+#: judge/views/organization.py:137
#, python-format
msgid "You are not in \"%s\"."
msgstr "Nem vagy \"%s\"-ben."
-#: judge/views/organization.py:162
+#: judge/views/organization.py:161
#, python-format
msgid "Request to join %s"
msgstr "Kérés a \"%s\"-hez való csatlakozásra"
-#: judge/views/organization.py:180
+#: judge/views/organization.py:179
msgid "Join request detail"
msgstr "Belépési kérés részletei"
-#: judge/views/organization.py:208
+#: judge/views/organization.py:207
#, python-format
msgid "Managing join requests for %s"
msgstr "%s belépési kéréseinek kezelése"
-#: judge/views/organization.py:239
+#: judge/views/organization.py:238
#, python-format
msgid "Your organization can only receive %d more members. You cannot approve %d users."
msgstr "A csoportod csak %d további tagot tud fogadni. Nem tudsz felvenni %d felhasználót."
-#: judge/views/organization.py:251
+#: judge/views/organization.py:250
#, python-format
msgid "Approved %d user."
msgid_plural "Approved %d users."
msgstr[0] "%d darab felhasználó jóváhagyva."
msgstr[1] "%d darab felhasználó jóváhagyva."
-#: judge/views/organization.py:252
+#: judge/views/organization.py:251
#, python-format
msgid "Rejected %d user."
msgid_plural "Rejected %d users."
msgstr[0] "%d darab felhasználó elutasítva."
msgstr[1] "%d darab felhasználó elutasítva."
-#: judge/views/organization.py:282
+#: judge/views/organization.py:281
#, python-format
msgid "Editing %s"
msgstr "%s szerkesztése"
-#: judge/views/organization.py:306 judge/views/organization.py:314
+#: judge/views/organization.py:305 judge/views/organization.py:313
msgid "Can't edit organization"
msgstr "Nem lehet szerkeszteni a csoportot"
-#: judge/views/organization.py:307
+#: judge/views/organization.py:306
msgid "You are not allowed to edit this organization."
msgstr "Nincs jogosultságod szerkeszteni ezt a csoportot."
-#: judge/views/organization.py:315
+#: judge/views/organization.py:314
msgid "You are not allowed to kick people from this organization."
msgstr "Nincs jogosultságod embereket kirúgni ebből a csoportból."
-#: judge/views/organization.py:320 judge/views/organization.py:324
+#: judge/views/organization.py:319 judge/views/organization.py:323
msgid "Can't kick user"
msgstr "Nem lehet kirúgni a felhasználót"
-#: judge/views/organization.py:321
+#: judge/views/organization.py:320
msgid "The user you are trying to kick does not exist!"
msgstr "A felhasználó akit megpróbálsz kirúgni nem létezik!"
-#: judge/views/organization.py:325
+#: judge/views/organization.py:324
#, python-format
msgid "The user you are trying to kick is not in organization: %s."
msgstr "A felhasználó akit ki akarsz rúgni nincs a csoportban: %s."
-#: judge/views/problem.py:67
+#: judge/views/problem.py:68
msgid "No such problem"
msgstr "Nincs ilyen feladat"
-#: judge/views/problem.py:68
+#: judge/views/problem.py:69
#, python-format
msgid "Could not find a problem with the code \"%s\"."
msgstr ""
-#: judge/views/problem.py:110
+#: judge/views/problem.py:111
#, python-brace-format
msgid "Editorial for {0}"
msgstr "Megoldás útmutató {0}-hez"
-#: judge/views/problem.py:113
+#: judge/views/problem.py:114
#, python-brace-format
msgid "Editorial for {0}"
msgstr "Megoldási útmutató {0}-hez"
-#: judge/views/problem.py:283 templates/contest/contest.html:79
+#: judge/views/problem.py:133
+msgid "No such editorial"
+msgstr ""
+
+#: judge/views/problem.py:134
+#, python-format
+msgid "Could not find an editorial with the code \"%s\"."
+msgstr ""
+
+#: judge/views/problem.py:289 templates/contest/contest.html:79
#: templates/user/user-tabs.html:5 templates/user/users-table.html:23
msgid "Problems"
msgstr "Feladatok"
-#: judge/views/problem.py:556 judge/views/problem.py:564
+#: judge/views/problem.py:562 judge/views/problem.py:570
#, python-format
msgid "Submit to %s"
msgstr ""
-#: judge/views/problem.py:613
+#: judge/views/problem.py:619
msgid "Banned from submitting"
msgstr "Feltöltéstől eltiltott"
-#: judge/views/problem.py:614
+#: judge/views/problem.py:620
msgid "You have been declared persona non grata for this problem. You are permanently barred from submitting this problem."
msgstr "Nemkívánatos személy vagy ennél a feladatnál, így örökre el vagy tiltva a feltöltéstől."
-#: judge/views/problem.py:618
+#: judge/views/problem.py:624
msgid "Too many submissions"
msgstr "Túl sok feltöltés"
-#: judge/views/problem.py:619
+#: judge/views/problem.py:625
msgid "You have exceeded the submission limit for this problem."
msgstr ""
-#: judge/views/problem.py:681
+#: judge/views/problem.py:693
msgid "Clone Problem"
msgstr ""
+#: judge/views/problem.py:720
+#, python-format
+msgid "Cloned problem from %s"
+msgstr ""
+
#: judge/views/problem_data.py:37
msgid "Checker arguments must be a JSON object"
msgstr ""
@@ -2887,52 +2935,52 @@ msgstr "Legjobb megoldások %s-hez"
msgid "Best solutions for {0}"
msgstr "Legjobb megoldások {0}-hez"
-#: judge/views/ranked_submission.py:80
+#: judge/views/ranked_submission.py:82
#, python-format
msgid "Best solutions for %(problem)s in %(contest)s"
msgstr "Legjobb megoldások %(problem)s %(contest)s-ben"
-#: judge/views/ranked_submission.py:83
+#: judge/views/ranked_submission.py:85
#, python-format
msgid "Best solutions for problem %(number)s in %(contest)s"
msgstr ""
-#: judge/views/ranked_submission.py:89
+#: judge/views/ranked_submission.py:91
#, python-brace-format
msgid "Best solutions for {0} in {2}"
msgstr ""
-#: judge/views/ranked_submission.py:92
+#: judge/views/ranked_submission.py:94
#, python-brace-format
msgid "Best solutions for problem {0} in {1}"
msgstr ""
-#: judge/views/register.py:27
+#: judge/views/register.py:26
msgid "A username must contain letters, numbers, or underscores"
msgstr ""
-#: judge/views/register.py:31
+#: judge/views/register.py:30
msgid "Preferred language"
msgstr "Preferált nyelv"
-#: judge/views/register.py:38
+#: judge/views/register.py:37
msgid "Subscribe to newsletter?"
msgstr "Feliratkozol a hírlevélre?"
-#: judge/views/register.py:45
+#: judge/views/register.py:44
#, python-format
msgid "The email address \"%s\" is already taken. Only one registration is allowed per address."
msgstr "A \"%s\" email cím már foglalt. Csak egy regisztráció engedélyezett címenként."
-#: judge/views/register.py:51
+#: judge/views/register.py:50
msgid "Your email provider is not allowed due to history of abuse. Please use a reputable email provider."
msgstr ""
-#: judge/views/register.py:57 judge/views/register.py:95
+#: judge/views/register.py:56 judge/views/register.py:94
msgid "Registration"
msgstr "Regisztráció"
-#: judge/views/register.py:106
+#: judge/views/register.py:105
msgid "Authentication failure"
msgstr "Azonosítási hiba"
@@ -2940,7 +2988,7 @@ msgstr "Azonosítási hiba"
msgid "Language statistics"
msgstr ""
-#: judge/views/status.py:24 templates/submission/list.html:311
+#: judge/views/status.py:24 templates/submission/list.html:310
msgid "Status"
msgstr "Státusz"
@@ -2948,74 +2996,74 @@ msgstr "Státusz"
msgid "Version matrix"
msgstr "Verzió mátrix"
-#: judge/views/submission.py:53 judge/views/submission.py:60
+#: judge/views/submission.py:55 judge/views/submission.py:62
#, python-format
msgid "Submission of %(problem)s by %(user)s"
msgstr ""
-#: judge/views/submission.py:203 judge/views/submission.py:204
+#: judge/views/submission.py:205 judge/views/submission.py:206
#: templates/problem/problem.html:127
msgid "All submissions"
msgstr "Összes beküldés"
-#: judge/views/submission.py:349
+#: judge/views/submission.py:355
msgid "All my submissions"
msgstr "Összes beküldésem"
-#: judge/views/submission.py:350
+#: judge/views/submission.py:356
#, python-format
msgid "All submissions by %s"
msgstr ""
-#: judge/views/submission.py:381
+#: judge/views/submission.py:387
#, python-format
msgid "All submissions for %s"
msgstr ""
-#: judge/views/submission.py:400
+#: judge/views/submission.py:410
msgid "Must pass a problem"
msgstr ""
-#: judge/views/submission.py:439
+#: judge/views/submission.py:449
#, python-format
msgid "My submissions for %(problem)s"
msgstr ""
-#: judge/views/submission.py:440
+#: judge/views/submission.py:450
#, python-format
msgid "%(user)s's submissions for %(problem)s"
msgstr ""
-#: judge/views/submission.py:536
+#: judge/views/submission.py:546
msgid "Must pass a contest"
msgstr ""
-#: judge/views/submission.py:544
+#: judge/views/submission.py:554
#, python-format
msgid "My submissions in %(contest)s"
msgstr ""
-#: judge/views/submission.py:545
+#: judge/views/submission.py:555
#, python-format
msgid "%(user)s's submissions in %(contest)s"
msgstr ""
-#: judge/views/submission.py:559
+#: judge/views/submission.py:569
#, python-brace-format
msgid "My submissions in {0}"
msgstr ""
-#: judge/views/submission.py:561
+#: judge/views/submission.py:571
#, python-brace-format
msgid "{0}'s submissions in {2}"
msgstr ""
-#: judge/views/submission.py:585
+#: judge/views/submission.py:597
#, python-brace-format
msgid "{0}'s submissions for {2} in {4}"
msgstr ""
-#: judge/views/submission.py:590
+#: judge/views/submission.py:602
#, python-brace-format
msgid "{0}'s submissions for problem {2} in {3}"
msgstr ""
@@ -3032,40 +3080,40 @@ msgstr "Probléma leírása"
msgid "You must solve at least one problem before you can create a ticket."
msgstr ""
-#: judge/views/ticket.py:87 judge/views/ticket.py:90
+#: judge/views/ticket.py:91 judge/views/ticket.py:94
#, python-format
msgid "New ticket for %s"
msgstr "Új hibajegy %s-hez"
-#: judge/views/ticket.py:144
+#: judge/views/ticket.py:148
#, python-format
msgid "%(title)s - Ticket %(id)d"
msgstr ""
-#: judge/views/ticket.py:249
+#: judge/views/ticket.py:253
#, python-format
msgid "Tickets - Page %(number)d of %(total)d"
msgstr ""
-#: judge/views/ticket.py:298
+#: judge/views/ticket.py:302
#, python-format
msgid "New Ticket: %s"
msgstr "Új Hibajegy: %s"
-#: judge/views/ticket.py:299
+#: judge/views/ticket.py:303
#, python-format
msgid "#%(id)d, assigned to: %(users)s"
msgstr ""
-#: judge/views/ticket.py:301
+#: judge/views/ticket.py:305
msgid ", "
msgstr ", "
-#: judge/views/ticket.py:301
+#: judge/views/ticket.py:305
msgid "no one"
msgstr ""
-#: judge/views/ticket.py:321
+#: judge/views/ticket.py:325
#, python-format
msgid "New Ticket Message For: %s"
msgstr ""
@@ -3074,87 +3122,91 @@ msgstr ""
msgid "Enable Two-factor Authentication"
msgstr ""
-#: judge/views/two_factor.py:99
+#: judge/views/two_factor.py:108
+msgid "Refresh Two-factor Authentication"
+msgstr ""
+
+#: judge/views/two_factor.py:116
msgid "Disable Two-factor Authentication"
msgstr ""
-#: judge/views/two_factor.py:148
+#: judge/views/two_factor.py:165
msgid "Invalid WebAuthn response"
msgstr ""
-#: judge/views/two_factor.py:151
+#: judge/views/two_factor.py:168
msgid "Invalid name"
msgstr ""
-#: judge/views/two_factor.py:204
+#: judge/views/two_factor.py:221
msgid "Staff may not disable 2FA"
msgstr ""
-#: judge/views/two_factor.py:216
+#: judge/views/two_factor.py:229
msgid "Perform Two-factor Authentication"
msgstr ""
-#: judge/views/user.py:79
+#: judge/views/user.py:78
msgid "No such user"
msgstr "Nincs ilyen felhasználó"
-#: judge/views/user.py:79
+#: judge/views/user.py:78
#, python-format
msgid "No user handle \"%s\"."
msgstr ""
-#: judge/views/user.py:83
+#: judge/views/user.py:82
msgid "My account"
msgstr "Saját fiók"
-#: judge/views/user.py:84
+#: judge/views/user.py:83
#, python-format
msgid "User %s"
msgstr "Felhasználó %s"
-#: judge/views/user.py:132
+#: judge/views/user.py:131
msgid "Login"
msgstr "Belépés"
-#: judge/views/user.py:173
+#: judge/views/user.py:172
msgid "M j, Y, G:i"
msgstr "M j, Y, G:i"
-#: judge/views/user.py:307
+#: judge/views/user.py:306
msgid "Preparing your data..."
msgstr ""
-#: judge/views/user.py:311 templates/user/edit-profile.html:348
+#: judge/views/user.py:310 templates/user/edit-profile.html:352
msgid "Download your data"
msgstr ""
-#: judge/views/user.py:367
+#: judge/views/user.py:366
msgid "Updated on site"
msgstr "Frissítve az oldalon"
-#: judge/views/user.py:400 templates/admin/auth/user/change_form.html:14
+#: judge/views/user.py:399 templates/admin/auth/user/change_form.html:14
#: templates/admin/auth/user/change_form.html:17 templates/base.html:222
#: templates/user/user-tabs.html:16
msgid "Edit profile"
msgstr "Profil szerkesztése"
-#: judge/views/user.py:415
+#: judge/views/user.py:414
msgid "Generated API token for user"
msgstr ""
-#: judge/views/user.py:427
+#: judge/views/user.py:426
msgid "Removed API token for user"
msgstr ""
-#: judge/views/user.py:437
+#: judge/views/user.py:436
msgid "Generated scratch codes for user"
msgstr ""
-#: judge/views/user.py:443 templates/user/user-list-tabs.html:4
+#: judge/views/user.py:442 templates/user/user-list-tabs.html:4
msgid "Leaderboard"
msgstr "Ranglista"
-#: judge/views/user.py:504
+#: judge/views/user.py:503
msgid "You have been successfully logged out."
msgstr ""
@@ -3279,11 +3331,11 @@ msgstr "Hírek"
msgid "posted on {time}"
msgstr "{time}-kor posztolva"
-#: templates/blog/list.html:130 templates/problem/problem.html:309
+#: templates/blog/list.html:130 templates/problem/problem.html:311
msgid "Clarifications"
msgstr "Pontosítások"
-#: templates/blog/list.html:146 templates/problem/problem.html:320
+#: templates/blog/list.html:146 templates/problem/problem.html:322
msgid "No clarifications have been made at this time."
msgstr "Nem jelentek meg pontosítások még."
@@ -3476,7 +3528,7 @@ msgid "Info"
msgstr ""
#: templates/contest/contest-tabs.html:6 templates/stats/base.html:9
-#: templates/submission/list.html:337
+#: templates/submission/list.html:336
msgid "Statistics"
msgstr ""
@@ -3679,19 +3731,19 @@ msgstr ""
msgid "Disqualify"
msgstr ""
-#: templates/contest/ranking.html:169
+#: templates/contest/ranking.html:173
msgid "Are you sure you want to disqualify this participation?"
msgstr ""
-#: templates/contest/ranking.html:174
+#: templates/contest/ranking.html:178
msgid "Are you sure you want to un-disqualify this participation?"
msgstr ""
-#: templates/contest/ranking.html:246
+#: templates/contest/ranking.html:250
msgid "View user participation"
msgstr ""
-#: templates/contest/ranking.html:250
+#: templates/contest/ranking.html:254
msgid "Show organizations"
msgstr "Csoportok mutatása"
@@ -3966,7 +4018,7 @@ msgstr ""
msgid "Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence."
msgstr "Ne feledd, hogy csak akkor használd a megoldási útmutatót ha elakadtál és ne másold csak úgy ki belőle a kódot. Kérlek legyél tisztelettudó a feladat és az útmutató szerzője felé.
Ha hivatalos megoldást küldesz be mielőtt te magad megoldanád a feladatot az kitiltást vonhat maga után!"
-#: templates/problem/editorial.html:27 templates/problem/problem.html:209
+#: templates/problem/editorial.html:27 templates/problem/problem.html:210
msgid "Author:"
msgid_plural "Authors:"
msgstr[0] "Szerző:"
@@ -4133,36 +4185,36 @@ msgstr "Időkorlát:"
msgid "Memory limit:"
msgstr "Memóriakorlát:"
-#: templates/problem/problem.html:224
+#: templates/problem/problem.html:226
msgid "Problem type"
msgid_plural "Problem types"
msgstr[0] "Feladat típus"
msgstr[1] "Feladat típusok"
-#: templates/problem/problem.html:237
+#: templates/problem/problem.html:239
msgid "Allowed languages"
msgstr "Engedélyezett nyelvek"
-#: templates/problem/problem.html:245
+#: templates/problem/problem.html:247
#, python-format
msgid "No %(lang)s judge online"
msgstr "Nincs jelenleg online %(lang)s tesztelő"
-#: templates/problem/problem.html:256
+#: templates/problem/problem.html:258
msgid "Judge:"
msgid_plural "Judges:"
msgstr[0] ""
msgstr[1] ""
-#: templates/problem/problem.html:273
+#: templates/problem/problem.html:275
msgid "none available"
msgstr ""
-#: templates/problem/problem.html:298
+#: templates/problem/problem.html:300
msgid "Request clarification"
msgstr "Pontosítást kérek"
-#: templates/problem/problem.html:300
+#: templates/problem/problem.html:302
msgid "Report an issue"
msgstr "Hiba jelentése"
@@ -4207,7 +4259,7 @@ msgstr ""
msgid "Point range"
msgstr ""
-#: templates/problem/search-form.html:63 templates/submission/list.html:329
+#: templates/problem/search-form.html:63 templates/submission/list.html:328
#: templates/ticket/list.html:248
msgid "Go"
msgstr ""
@@ -4254,7 +4306,7 @@ msgid "Invalid username or password."
msgstr ""
#: templates/registration/login.html:53
-#: templates/registration/two_factor_auth.html:86
+#: templates/registration/two_factor_auth.html:92
msgid "Login!"
msgstr ""
@@ -4374,12 +4426,12 @@ msgid "Default language"
msgstr "Alapértelmezett nyelv"
#: templates/registration/registration_form.html:184
-#: templates/user/edit-profile.html:310
+#: templates/user/edit-profile.html:314
msgid "Affiliated organizations"
msgstr "Kapcsolódó csoportok"
#: templates/registration/registration_form.html:190
-#: templates/user/edit-profile.html:324
+#: templates/user/edit-profile.html:328
msgid "Notify me about upcoming contests"
msgstr ""
@@ -4395,57 +4447,93 @@ msgstr "Felhasználási feltételek"
msgid "Register!"
msgstr ""
-#: templates/registration/totp_disable.html:38
+#: templates/registration/totp_disable.html:31
msgid "To protect your account, you must first authenticate before you can disable Two Factor Authentication."
msgstr ""
-#: templates/registration/totp_disable.html:45
+#: templates/registration/totp_disable.html:38
msgid "Enter the 6-digit code generated by your app or one of your 16-digit scratch codes:"
msgstr ""
-#: templates/registration/totp_disable.html:48
+#: templates/registration/totp_disable.html:41
msgid "Disable Two Factor Authentication"
msgstr ""
-#: templates/registration/totp_enable.html:75
+#: templates/registration/totp_enable.html:72
msgid "Scan this code with your authenticator app:"
msgstr ""
-#: templates/registration/totp_enable.html:76
+#: templates/registration/totp_enable.html:73
msgid "QR code"
msgstr ""
-#: templates/registration/totp_enable.html:77
+#: templates/registration/totp_enable.html:74
msgid "Or enter this code manually:"
msgstr ""
-#: templates/registration/totp_enable.html:88
+#: templates/registration/totp_enable.html:85
msgid "Enter the 6-digit code generated by your app:"
msgstr ""
-#: templates/registration/totp_enable.html:91
+#: templates/registration/totp_enable.html:90
+msgid "Refresh Two Factor Authentication"
+msgstr ""
+
+#: templates/registration/totp_enable.html:92
msgid "Enable Two Factor Authentication"
msgstr ""
+#: templates/registration/totp_enable.html:98
+msgid "Below is a list of one-time use scratch codes."
+msgstr ""
+
+#: templates/registration/totp_enable.html:99
+msgid "These codes can only be used once and are for emergency use."
+msgstr ""
+
+#: templates/registration/totp_enable.html:100
+msgid "You can use these codes to login to your account or disable two-factor authentication."
+msgstr ""
+
+#: templates/registration/totp_enable.html:101
+msgid "If you ever need more scratch codes, you can regenerate them on the edit profile tab."
+msgstr ""
+
+#: templates/registration/totp_enable.html:102
+msgid "Please write these down and keep them in a secure location."
+msgstr ""
+
+#: templates/registration/totp_enable.html:103
+msgid "These codes will never be shown again after you enable two-factor authentication."
+msgstr ""
+
#: templates/registration/two_factor_auth.html:33
-#: templates/user/edit-profile.html:161
+#: templates/user/edit-profile.html:165
msgid "WebAuthn is not supported by your browser."
msgstr ""
#: templates/registration/two_factor_auth.html:54
-#: templates/user/edit-profile.html:185
+#: templates/user/edit-profile.html:189
msgid "Failed to contact server."
msgstr ""
-#: templates/registration/two_factor_auth.html:77
+#: templates/registration/two_factor_auth.html:79
msgid "Enter the 6-digit code generated by your app or one of your 16-character scratch codes:"
msgstr ""
-#: templates/registration/two_factor_auth.html:83
-msgid "Use security key"
+#: templates/registration/two_factor_auth.html:81
+msgid "Enter one of your 16-character scratch codes:"
msgstr ""
#: templates/registration/two_factor_auth.html:89
+msgid "Use security key"
+msgstr ""
+
+#: templates/registration/two_factor_auth.html:94
+msgid "Use scratch code"
+msgstr ""
+
+#: templates/registration/two_factor_auth.html:97
#, python-format
msgid "If you lost your authentication device and are unable to use your scratch codes, please contact us at %(email)s."
msgstr ""
@@ -4526,15 +4614,15 @@ msgstr ""
msgid "Filter by language..."
msgstr ""
-#: templates/submission/list.html:307
+#: templates/submission/list.html:306
msgid "Filter submissions"
msgstr ""
-#: templates/submission/list.html:343
+#: templates/submission/list.html:342
msgid "Total:"
msgstr ""
-#: templates/submission/list.html:353
+#: templates/submission/list.html:352
msgid "You were disconnected. Refresh to show latest updates."
msgstr ""
@@ -4750,121 +4838,125 @@ msgstr ""
msgid "Search by handle..."
msgstr ""
-#: templates/user/edit-profile.html:109
+#: templates/user/edit-profile.html:113
msgid "Are you sure you want to generate or regenerate your API token?"
msgstr ""
-#: templates/user/edit-profile.html:110
+#: templates/user/edit-profile.html:114
msgid "This will invalidate any previous API tokens."
msgstr ""
-#: templates/user/edit-profile.html:111
+#: templates/user/edit-profile.html:115
msgid "It also allows access to your account without Two-factor Authentication."
msgstr ""
-#: templates/user/edit-profile.html:112
+#: templates/user/edit-profile.html:116
msgid "You will not be able to view your api token after you leave this page!"
msgstr ""
-#: templates/user/edit-profile.html:113 templates/user/edit-profile.html:207
+#: templates/user/edit-profile.html:117 templates/user/edit-profile.html:211
msgid "Generating..."
msgstr ""
-#: templates/user/edit-profile.html:121 templates/user/edit-profile.html:243
-#: templates/user/edit-profile.html:371 templates/user/edit-profile.html:390
+#: templates/user/edit-profile.html:125 templates/user/edit-profile.html:247
+#: templates/user/edit-profile.html:373 templates/user/edit-profile.html:395
msgid "Regenerate"
msgstr ""
-#: templates/user/edit-profile.html:127 templates/user/edit-profile.html:392
+#: templates/user/edit-profile.html:131 templates/user/edit-profile.html:397
msgid "Remove"
msgstr ""
-#: templates/user/edit-profile.html:137
+#: templates/user/edit-profile.html:141
msgid "Are you sure you want to remove your API token?"
msgstr ""
-#: templates/user/edit-profile.html:144 templates/user/edit-profile.html:375
-#: templates/user/edit-profile.html:396
+#: templates/user/edit-profile.html:148 templates/user/edit-profile.html:377
+#: templates/user/edit-profile.html:401
msgid "Generate"
msgstr ""
-#: templates/user/edit-profile.html:190
+#: templates/user/edit-profile.html:194
msgid "Are you sure you want to delete this security key?"
msgstr ""
-#: templates/user/edit-profile.html:280
+#: templates/user/edit-profile.html:284
msgid "Self-description"
msgstr ""
-#: templates/user/edit-profile.html:287
+#: templates/user/edit-profile.html:291
msgid "Select your closest major city"
msgstr ""
-#: templates/user/edit-profile.html:296
+#: templates/user/edit-profile.html:300
msgid "Editor theme"
msgstr ""
-#: templates/user/edit-profile.html:301
+#: templates/user/edit-profile.html:305
msgid "Math engine"
msgstr "Matek motor"
-#: templates/user/edit-profile.html:335 templates/user/edit-profile.html:337
+#: templates/user/edit-profile.html:339 templates/user/edit-profile.html:341
msgid "Change your avatar"
msgstr ""
-#: templates/user/edit-profile.html:342
+#: templates/user/edit-profile.html:346
msgid "Change your password"
msgstr ""
-#: templates/user/edit-profile.html:356
+#: templates/user/edit-profile.html:359
msgid "Two-factor Authentication is enabled"
msgstr ""
-#: templates/user/edit-profile.html:358
-msgid "Two-factor Authentication is disabled"
+#: templates/user/edit-profile.html:362 templates/user/edit-profile.html:365
+msgid "Disable"
msgstr ""
-#: templates/user/edit-profile.html:363 templates/user/edit-profile.html:365
-msgid "Disable"
+#: templates/user/edit-profile.html:367
+msgid "Refresh"
msgstr ""
-#: templates/user/edit-profile.html:368
+#: templates/user/edit-profile.html:370
msgid "Scratch Codes:"
msgstr ""
-#: templates/user/edit-profile.html:372 templates/user/edit-profile.html:393
+#: templates/user/edit-profile.html:374 templates/user/edit-profile.html:398
msgid "Hidden"
msgstr ""
-#: templates/user/edit-profile.html:381
+#: templates/user/edit-profile.html:384
+msgid "Two-factor Authentication is disabled"
+msgstr ""
+
+#: templates/user/edit-profile.html:385
msgid "Enable"
msgstr ""
-#: templates/user/edit-profile.html:387
+#: templates/user/edit-profile.html:392
msgid "API Token"
msgstr ""
-#: templates/user/edit-profile.html:404
+#: templates/user/edit-profile.html:409
msgid "Security keys"
msgstr ""
-#: templates/user/edit-profile.html:414
+#: templates/user/edit-profile.html:419
msgid "Delete"
msgstr ""
-#: templates/user/edit-profile.html:421
+#: templates/user/edit-profile.html:426
msgid "Enter a name for this key"
msgstr ""
-#: templates/user/edit-profile.html:422
+#: templates/user/edit-profile.html:427
msgid "Add"
msgstr ""
-#: templates/user/edit-profile.html:430
+#: templates/user/edit-profile.html:435
msgid "User-script"
msgstr ""
-#: templates/user/edit-profile.html:434
+#: templates/user/edit-profile.html:439
msgid "Update profile"
msgstr ""
diff --git a/locale/hu/LC_MESSAGES/djangojs.po b/locale/hu/LC_MESSAGES/djangojs.po
index 61196feb5c..2e6d3a911b 100644
--- a/locale/hu/LC_MESSAGES/djangojs.po
+++ b/locale/hu/LC_MESSAGES/djangojs.po
@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: dmoj\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-10-01 23:12+0000\n"
-"PO-Revision-Date: 2021-04-25 00:08\n"
+"PO-Revision-Date: 2021-07-07 00:27\n"
"Last-Translator: \n"
"Language-Team: Hungarian\n"
"Language: hu_HU\n"
diff --git a/locale/it/LC_MESSAGES/django.po b/locale/it/LC_MESSAGES/django.po
index 58086d017b..ba7ac8bcaa 100644
--- a/locale/it/LC_MESSAGES/django.po
+++ b/locale/it/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: dmoj\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-24 19:15+0000\n"
-"PO-Revision-Date: 2021-04-25 00:08\n"
+"POT-Creation-Date: 2021-06-17 01:38+0000\n"
+"PO-Revision-Date: 2021-07-07 00:27\n"
"Last-Translator: \n"
"Language-Team: Italian\n"
"Language: it_IT\n"
@@ -17,75 +17,75 @@ msgstr ""
"X-Crowdin-File: django.po\n"
"X-Crowdin-File-ID: 10\n"
-#: dmoj/settings.py:364
+#: dmoj/settings.py:365
msgid "Catalan"
msgstr ""
-#: dmoj/settings.py:365
+#: dmoj/settings.py:366
msgid "German"
msgstr ""
-#: dmoj/settings.py:366
+#: dmoj/settings.py:367
msgid "English"
msgstr ""
-#: dmoj/settings.py:367
+#: dmoj/settings.py:368
msgid "Spanish"
msgstr ""
-#: dmoj/settings.py:368
+#: dmoj/settings.py:369
msgid "French"
msgstr ""
-#: dmoj/settings.py:369
+#: dmoj/settings.py:370
msgid "Croatian"
msgstr ""
-#: dmoj/settings.py:370
+#: dmoj/settings.py:371
msgid "Hungarian"
msgstr ""
-#: dmoj/settings.py:371
+#: dmoj/settings.py:372
msgid "Japanese"
msgstr ""
-#: dmoj/settings.py:372
+#: dmoj/settings.py:373
msgid "Korean"
msgstr ""
-#: dmoj/settings.py:373
+#: dmoj/settings.py:374
msgid "Brazilian Portuguese"
msgstr ""
-#: dmoj/settings.py:374
+#: dmoj/settings.py:375
msgid "Romanian"
msgstr ""
-#: dmoj/settings.py:375
+#: dmoj/settings.py:376
msgid "Russian"
msgstr ""
-#: dmoj/settings.py:376
+#: dmoj/settings.py:377
msgid "Serbian (Latin)"
msgstr ""
-#: dmoj/settings.py:377
+#: dmoj/settings.py:378
msgid "Turkish"
msgstr ""
-#: dmoj/settings.py:378
+#: dmoj/settings.py:379
msgid "Vietnamese"
msgstr ""
-#: dmoj/settings.py:379
+#: dmoj/settings.py:380
msgid "Simplified Chinese"
msgstr ""
-#: dmoj/settings.py:380
+#: dmoj/settings.py:381
msgid "Traditional Chinese"
msgstr ""
-#: dmoj/urls.py:103 templates/base.html:190
+#: dmoj/urls.py:104 templates/base.html:190
msgid "Home"
msgstr ""
@@ -115,112 +115,112 @@ msgstr ""
msgid "Associated page"
msgstr ""
-#: judge/admin/contest.py:31
+#: judge/admin/contest.py:32
msgid "Included contests"
msgstr ""
-#: judge/admin/contest.py:65 templates/contest/contest.html:83
+#: judge/admin/contest.py:66 templates/contest/contest.html:83
#: templates/contest/moss.html:43 templates/problem/list.html:204
#: templates/problem/list.html:219 templates/user/user-problems.html:58
#: templates/user/user-problems.html:100
msgid "Problem"
msgstr ""
-#: judge/admin/contest.py:114
+#: judge/admin/contest.py:117
msgid "Settings"
msgstr ""
-#: judge/admin/contest.py:116
+#: judge/admin/contest.py:120
msgid "Scheduling"
msgstr ""
-#: judge/admin/contest.py:117
+#: judge/admin/contest.py:121
msgid "Details"
msgstr ""
-#: judge/admin/contest.py:118
+#: judge/admin/contest.py:122
msgid "Format"
msgstr ""
-#: judge/admin/contest.py:119 templates/contest/ranking-table.html:5
+#: judge/admin/contest.py:123 templates/contest/ranking-table.html:5
msgid "Rating"
msgstr ""
-#: judge/admin/contest.py:120
+#: judge/admin/contest.py:124
msgid "Access"
msgstr ""
-#: judge/admin/contest.py:122 judge/admin/problem.py:134
+#: judge/admin/contest.py:126 judge/admin/problem.py:135
msgid "Justice"
msgstr ""
-#: judge/admin/contest.py:211
+#: judge/admin/contest.py:215
#, python-format
msgid "%d contest successfully marked as visible."
msgid_plural "%d contests successfully marked as visible."
msgstr[0] ""
msgstr[1] ""
-#: judge/admin/contest.py:214
+#: judge/admin/contest.py:218
msgid "Mark contests as visible"
msgstr ""
-#: judge/admin/contest.py:220
+#: judge/admin/contest.py:224
#, python-format
msgid "%d contest successfully marked as hidden."
msgid_plural "%d contests successfully marked as hidden."
msgstr[0] ""
msgstr[1] ""
-#: judge/admin/contest.py:223
+#: judge/admin/contest.py:227
msgid "Mark contests as hidden"
msgstr ""
-#: judge/admin/contest.py:229
+#: judge/admin/contest.py:233
#, python-format
msgid "%d contest successfully locked."
msgid_plural "%d contests successfully locked."
msgstr[0] ""
msgstr[1] ""
-#: judge/admin/contest.py:232
+#: judge/admin/contest.py:236
msgid "Lock contest submissions"
msgstr ""
-#: judge/admin/contest.py:238
+#: judge/admin/contest.py:242
#, python-format
msgid "%d contest successfully unlocked."
msgid_plural "%d contests successfully unlocked."
msgstr[0] ""
msgstr[1] ""
-#: judge/admin/contest.py:241
+#: judge/admin/contest.py:245
msgid "Unlock contest submissions"
msgstr ""
-#: judge/admin/contest.py:262 judge/admin/submission.py:170
+#: judge/admin/contest.py:266 judge/admin/submission.py:170
#, python-format
msgid "%d submission was successfully scheduled for rejudging."
msgid_plural "%d submissions were successfully scheduled for rejudging."
msgstr[0] ""
msgstr[1] ""
-#: judge/admin/contest.py:337
+#: judge/admin/contest.py:341
#, python-format
msgid "%d participation recalculated."
msgid_plural "%d participations recalculated."
msgstr[0] ""
msgstr[1] ""
-#: judge/admin/contest.py:340
+#: judge/admin/contest.py:344
msgid "Recalculate results"
msgstr ""
-#: judge/admin/contest.py:344 judge/admin/organization.py:63
+#: judge/admin/contest.py:348 judge/admin/organization.py:63
msgid "username"
msgstr ""
-#: judge/admin/contest.py:349 templates/base.html:258
+#: judge/admin/contest.py:353 templates/base.html:258
msgid "virtual"
msgstr ""
@@ -236,9 +236,9 @@ msgstr ""
msgid "Summary"
msgstr ""
-#: judge/admin/interface.py:113 judge/models/contest.py:383
-#: judge/models/contest.py:509 judge/models/profile.py:244
-#: judge/models/profile.py:268
+#: judge/admin/interface.py:113 judge/models/contest.py:419
+#: judge/models/contest.py:546 judge/models/profile.py:261
+#: judge/models/profile.py:292
msgid "user"
msgstr ""
@@ -246,8 +246,8 @@ msgstr ""
msgid "object"
msgstr ""
-#: judge/admin/organization.py:32 judge/admin/problem.py:181
-#: judge/admin/profile.py:82
+#: judge/admin/organization.py:32 judge/admin/problem.py:182
+#: judge/admin/profile.py:92
msgid "View on site"
msgstr ""
@@ -255,69 +255,69 @@ msgstr ""
msgid "Describe the changes you made (optional)"
msgstr ""
-#: judge/admin/problem.py:129
+#: judge/admin/problem.py:130
msgid "Social Media"
msgstr ""
-#: judge/admin/problem.py:130
+#: judge/admin/problem.py:131
msgid "Taxonomy"
msgstr ""
-#: judge/admin/problem.py:131 templates/contest/contest.html:84
+#: judge/admin/problem.py:132 templates/contest/contest.html:84
#: templates/problem/data.html:385 templates/problem/list.html:209
#: templates/problem/list.html:230 templates/user/base-users-table.html:10
#: templates/user/user-problems.html:60
msgid "Points"
msgstr ""
-#: judge/admin/problem.py:132
+#: judge/admin/problem.py:133
msgid "Limits"
msgstr ""
-#: judge/admin/problem.py:133 judge/admin/submission.py:238
-#: templates/stats/base.html:14 templates/submission/list.html:320
-#: templates/user/edit-profile.html:292
+#: judge/admin/problem.py:134 judge/admin/submission.py:238
+#: templates/stats/base.html:14 templates/submission/list.html:319
+#: templates/user/edit-profile.html:296
msgid "Language"
msgstr ""
-#: judge/admin/problem.py:135
+#: judge/admin/problem.py:136
msgid "History"
msgstr ""
-#: judge/admin/problem.py:178
+#: judge/admin/problem.py:179
msgid "Authors"
msgstr ""
-#: judge/admin/problem.py:191
+#: judge/admin/problem.py:192
#, python-format
msgid "%d problem's publish date successfully updated."
msgid_plural "%d problems' publish date successfully updated."
msgstr[0] ""
msgstr[1] ""
-#: judge/admin/problem.py:195
+#: judge/admin/problem.py:196
msgid "Set publish date to now"
msgstr ""
-#: judge/admin/problem.py:201
+#: judge/admin/problem.py:202
#, python-format
msgid "%d problem successfully marked as public."
msgid_plural "%d problems successfully marked as public."
msgstr[0] ""
msgstr[1] ""
-#: judge/admin/problem.py:205
+#: judge/admin/problem.py:206
msgid "Mark problems as public"
msgstr ""
-#: judge/admin/problem.py:211
+#: judge/admin/problem.py:212
#, python-format
msgid "%d problem successfully marked as private."
msgid_plural "%d problems successfully marked as private."
msgstr[0] ""
msgstr[1] ""
-#: judge/admin/problem.py:215
+#: judge/admin/problem.py:216
msgid "Mark problems as private"
msgstr ""
@@ -325,35 +325,35 @@ msgstr ""
msgid "timezone"
msgstr ""
-#: judge/admin/profile.py:88 judge/admin/submission.py:217
+#: judge/admin/profile.py:98 judge/admin/submission.py:217
#: templates/organization/requests/log.html:9
#: templates/organization/requests/pending.html:12
#: templates/ticket/list.html:261
msgid "User"
msgstr ""
-#: judge/admin/profile.py:93 templates/registration/registration_form.html:143
+#: judge/admin/profile.py:103 templates/registration/registration_form.html:143
msgid "Email"
msgstr ""
-#: judge/admin/profile.py:98 judge/views/register.py:29
+#: judge/admin/profile.py:108 judge/views/register.py:28
#: templates/registration/registration_form.html:171
-#: templates/user/edit-profile.html:288
+#: templates/user/edit-profile.html:292
msgid "Timezone"
msgstr ""
-#: judge/admin/profile.py:103
+#: judge/admin/profile.py:113
msgid "date joined"
msgstr ""
-#: judge/admin/profile.py:110
+#: judge/admin/profile.py:120
#, python-format
msgid "%d user have scores recalculated."
msgid_plural "%d users have scores recalculated."
msgstr[0] ""
msgstr[1] ""
-#: judge/admin/profile.py:113
+#: judge/admin/profile.py:123
msgid "Recalculate scores"
msgstr ""
@@ -506,115 +506,116 @@ msgstr ""
msgid "IOI (pre-2016)"
msgstr ""
-#: judge/forms.py:26
-msgid "Two-factor authentication tokens must be 6 decimal digits."
+#: judge/forms.py:27
+#, python-brace-format
+msgid "Two-factor authentication tokens must be {TOTP_CODE_LENGTH} decimal digits."
msgstr ""
-#: judge/forms.py:29
+#: judge/forms.py:30
msgid "Invalid two-factor authentication token."
msgstr ""
-#: judge/forms.py:32
+#: judge/forms.py:33
msgid "Scratch codes must be 16 base32 characters."
msgstr ""
-#: judge/forms.py:34
+#: judge/forms.py:35 judge/forms.py:264
msgid "Invalid scratch code."
msgstr ""
-#: judge/forms.py:45
+#: judge/forms.py:46
msgid "Subscribe to contest updates"
msgstr ""
-#: judge/forms.py:46
+#: judge/forms.py:47
msgid "Enable experimental features"
msgstr ""
-#: judge/forms.py:71
+#: judge/forms.py:72
msgid "You must solve at least one problem before you can update your profile."
msgstr ""
-#: judge/forms.py:80 judge/views/organization.py:127
+#: judge/forms.py:81 judge/views/organization.py:126
#, python-brace-format
msgid "You may not be part of more than {count} public organizations."
msgstr ""
-#: judge/forms.py:96
+#: judge/forms.py:97
msgid "Download comments?"
msgstr ""
-#: judge/forms.py:97
+#: judge/forms.py:98
msgid "Download submissions?"
msgstr ""
-#: judge/forms.py:98
+#: judge/forms.py:99
msgid "Filter by problem code glob:"
msgstr ""
-#: judge/forms.py:102
+#: judge/forms.py:103
msgid "Leave empty to include all submissions"
msgstr ""
-#: judge/forms.py:105 templates/problem/manage_submission.html:142
+#: judge/forms.py:106 templates/problem/manage_submission.html:142
msgid "Filter by result:"
msgstr ""
-#: judge/forms.py:111
+#: judge/forms.py:112
msgid "Please select at least one thing to download."
msgstr ""
-#: judge/forms.py:137
+#: judge/forms.py:138
msgid "Any judge"
msgstr ""
-#: judge/forms.py:167 judge/views/register.py:26
+#: judge/forms.py:159 judge/views/register.py:25
#: templates/registration/registration_form.html:137
#: templates/user/base-users-table.html:5
msgid "Username"
msgstr ""
-#: judge/forms.py:168 templates/registration/registration_form.html:149
+#: judge/forms.py:160 templates/registration/registration_form.html:149
#: templates/registration/registration_form.html:163
msgid "Password"
msgstr ""
-#: judge/forms.py:201
+#: judge/forms.py:192
msgid "Invalid code length."
msgstr ""
-#: judge/forms.py:219
+#: judge/forms.py:223
msgid "Invalid WebAuthn response."
msgstr ""
-#: judge/forms.py:222
+#: judge/forms.py:226
msgid "No WebAuthn challenge issued."
msgstr ""
-#: judge/forms.py:228
+#: judge/forms.py:232
msgid "Invalid WebAuthn credential ID."
msgstr ""
-#: judge/forms.py:257
+#: judge/forms.py:262
msgid "Invalid two-factor authentication token or scratch code."
msgstr ""
-#: judge/forms.py:259
+#: judge/forms.py:266
msgid "Must specify either totp_token or webauthn_response."
msgstr ""
-#: judge/forms.py:263 judge/models/problem.py:105
+#: judge/forms.py:270 judge/models/problem.py:119
msgid "Problem code must be ^[a-z0-9]+$"
msgstr ""
-#: judge/forms.py:268
+#: judge/forms.py:275
msgid "Problem with code already exists."
msgstr ""
-#: judge/forms.py:273 judge/models/contest.py:66
+#: judge/forms.py:280 judge/models/contest.py:66
msgid "Contest id must be ^[a-z0-9]+$"
msgstr ""
-#: judge/forms.py:278
+#: judge/forms.py:285
msgid "Contest with key already exists."
msgstr ""
@@ -694,7 +695,7 @@ msgid "comments"
msgstr ""
#: judge/models/comment.py:89 judge/models/comment.py:141
-#: judge/models/problem.py:484
+#: judge/models/problem.py:511
#, python-format
msgid "Editorial for %s"
msgstr ""
@@ -735,7 +736,7 @@ msgstr ""
msgid "contest tag"
msgstr ""
-#: judge/models/contest.py:53 judge/models/contest.py:117
+#: judge/models/contest.py:53 judge/models/contest.py:126
msgid "contest tags"
msgstr ""
@@ -760,410 +761,426 @@ msgid "contest name"
msgstr ""
#: judge/models/contest.py:68
-msgid "These people will be able to edit the contest."
+msgid "These users will be able to edit the contest."
msgstr ""
-#: judge/models/contest.py:70 judge/models/runtime.py:136
+#: judge/models/contest.py:70
+msgid "These users will be able to edit the contest, but will not be listed as authors."
+msgstr ""
+
+#: judge/models/contest.py:73
+msgid "These users will be able to view the contest, but not edit it."
+msgstr ""
+
+#: judge/models/contest.py:76 judge/models/runtime.py:136
msgid "description"
msgstr ""
-#: judge/models/contest.py:71 judge/models/problem.py:431
+#: judge/models/contest.py:77 judge/models/problem.py:458
#: judge/models/runtime.py:138
msgid "problems"
msgstr ""
-#: judge/models/contest.py:72 judge/models/contest.py:384
+#: judge/models/contest.py:78 judge/models/contest.py:420
msgid "start time"
msgstr ""
-#: judge/models/contest.py:73
+#: judge/models/contest.py:79
msgid "end time"
msgstr ""
-#: judge/models/contest.py:74 judge/models/problem.py:126
-#: judge/models/problem.py:455
+#: judge/models/contest.py:80 judge/models/problem.py:140
+#: judge/models/problem.py:482
msgid "time limit"
msgstr ""
-#: judge/models/contest.py:75 judge/models/problem.py:144
+#: judge/models/contest.py:81 judge/models/problem.py:158
msgid "publicly visible"
msgstr ""
-#: judge/models/contest.py:76
+#: judge/models/contest.py:82
msgid "Should be set even for organization-private contests, where it determines whether the contest is visible to members of the specified organizations."
msgstr ""
-#: judge/models/contest.py:79
+#: judge/models/contest.py:85
msgid "contest rated"
msgstr ""
-#: judge/models/contest.py:79
+#: judge/models/contest.py:85
msgid "Whether this contest can be rated."
msgstr ""
-#: judge/models/contest.py:81
+#: judge/models/contest.py:87
msgid "view contest scoreboard"
msgstr ""
-#: judge/models/contest.py:83
+#: judge/models/contest.py:89
msgid "These users will be able to view the scoreboard."
msgstr ""
-#: judge/models/contest.py:84
+#: judge/models/contest.py:90
msgid "scoreboard visibility"
msgstr ""
-#: judge/models/contest.py:85
+#: judge/models/contest.py:91
msgid "Scoreboard visibility through the duration of the contest"
msgstr ""
-#: judge/models/contest.py:87
+#: judge/models/contest.py:93
msgid "no comments"
msgstr ""
-#: judge/models/contest.py:88
+#: judge/models/contest.py:94
msgid "Use clarification system instead of comments."
msgstr ""
-#: judge/models/contest.py:90
+#: judge/models/contest.py:96
msgid "Rating floor for contest"
msgstr ""
-#: judge/models/contest.py:92
+#: judge/models/contest.py:98
msgid "Rating ceiling for contest"
msgstr ""
-#: judge/models/contest.py:94
+#: judge/models/contest.py:100
msgid "rate all"
msgstr ""
-#: judge/models/contest.py:94
+#: judge/models/contest.py:100
msgid "Rate all users who joined."
msgstr ""
-#: judge/models/contest.py:95
+#: judge/models/contest.py:101
msgid "exclude from ratings"
msgstr ""
-#: judge/models/contest.py:97
+#: judge/models/contest.py:103
msgid "private to specific users"
msgstr ""
-#: judge/models/contest.py:98
+#: judge/models/contest.py:104
msgid "private contestants"
msgstr ""
-#: judge/models/contest.py:99
+#: judge/models/contest.py:105
msgid "If private, only these users may see the contest"
msgstr ""
-#: judge/models/contest.py:101
+#: judge/models/contest.py:107
msgid "hide problem tags"
msgstr ""
-#: judge/models/contest.py:102
+#: judge/models/contest.py:108
msgid "Whether problem tags should be hidden by default."
msgstr ""
-#: judge/models/contest.py:104
+#: judge/models/contest.py:110
+msgid "hide problem authors"
+msgstr ""
+
+#: judge/models/contest.py:111
+msgid "Whether problem authors should be hidden by default."
+msgstr ""
+
+#: judge/models/contest.py:113
msgid "run pretests only"
msgstr ""
-#: judge/models/contest.py:105
+#: judge/models/contest.py:114
msgid "Whether judges should grade pretests only, versus all testcases. Commonly set during a contest, then unset prior to rejudging user submissions when the contest ends."
msgstr ""
-#: judge/models/contest.py:109 judge/models/problem.py:166
+#: judge/models/contest.py:118 judge/models/problem.py:183
msgid "private to organizations"
msgstr ""
-#: judge/models/contest.py:110 judge/models/problem.py:164
-#: judge/models/profile.py:83
+#: judge/models/contest.py:119 judge/models/problem.py:181
+#: judge/models/profile.py:86
msgid "organizations"
msgstr ""
-#: judge/models/contest.py:111
+#: judge/models/contest.py:120
msgid "If private, only these organizations may see the contest"
msgstr ""
-#: judge/models/contest.py:112 judge/models/problem.py:153
+#: judge/models/contest.py:121 judge/models/problem.py:167
msgid "OpenGraph image"
msgstr ""
-#: judge/models/contest.py:113 judge/models/profile.py:54
+#: judge/models/contest.py:122 judge/models/profile.py:57
msgid "Logo override image"
msgstr ""
-#: judge/models/contest.py:115
+#: judge/models/contest.py:124
msgid "This image will replace the default site logo for users inside the contest."
msgstr ""
-#: judge/models/contest.py:118
+#: judge/models/contest.py:127
msgid "the amount of live participants"
msgstr ""
-#: judge/models/contest.py:119
+#: judge/models/contest.py:128
msgid "contest summary"
msgstr ""
-#: judge/models/contest.py:120 judge/models/problem.py:155
+#: judge/models/contest.py:129 judge/models/problem.py:169
msgid "Plain-text, shown in meta description tag, e.g. for social media."
msgstr ""
-#: judge/models/contest.py:121 judge/models/profile.py:53
+#: judge/models/contest.py:130 judge/models/profile.py:56
msgid "access code"
msgstr ""
-#: judge/models/contest.py:122
+#: judge/models/contest.py:131
msgid "An optional code to prompt contestants before they are allowed to join the contest. Leave it blank to disable."
msgstr ""
-#: judge/models/contest.py:124 judge/models/problem.py:149
+#: judge/models/contest.py:133 judge/models/problem.py:163
msgid "personae non gratae"
msgstr ""
-#: judge/models/contest.py:125
+#: judge/models/contest.py:134
msgid "Bans the selected users from joining this contest."
msgstr ""
-#: judge/models/contest.py:126
+#: judge/models/contest.py:135
msgid "contest format"
msgstr ""
-#: judge/models/contest.py:127
+#: judge/models/contest.py:136
msgid "The contest format module to use."
msgstr ""
-#: judge/models/contest.py:128
+#: judge/models/contest.py:137
msgid "contest format configuration"
msgstr ""
-#: judge/models/contest.py:129
+#: judge/models/contest.py:138
msgid "A JSON object to serve as the configuration for the chosen contest format module. Leave empty to use None. Exact format depends on the contest format selected."
msgstr ""
-#: judge/models/contest.py:136
+#: judge/models/contest.py:145
msgid "contest lock"
msgstr ""
-#: judge/models/contest.py:137
-msgid "Prevent submissions from this contest from being rejudged."
+#: judge/models/contest.py:146
+msgid "Prevent submissions from this contest from being rejudged after this date."
msgstr ""
-#: judge/models/contest.py:138
+#: judge/models/contest.py:148
msgid "precision points"
msgstr ""
-#: judge/models/contest.py:140
+#: judge/models/contest.py:150
msgid "Number of digits to round points to."
msgstr ""
-#: judge/models/contest.py:362
+#: judge/models/contest.py:398
msgid "See private contests"
msgstr ""
-#: judge/models/contest.py:363
+#: judge/models/contest.py:399
msgid "Edit own contests"
msgstr ""
-#: judge/models/contest.py:364
+#: judge/models/contest.py:400
msgid "Edit all contests"
msgstr ""
-#: judge/models/contest.py:365
+#: judge/models/contest.py:401
msgid "Clone contest"
msgstr ""
-#: judge/models/contest.py:366 templates/contest/moss.html:74
+#: judge/models/contest.py:402 templates/contest/moss.html:74
msgid "MOSS contest"
msgstr ""
-#: judge/models/contest.py:367
+#: judge/models/contest.py:403
msgid "Rate contests"
msgstr ""
-#: judge/models/contest.py:368
+#: judge/models/contest.py:404
msgid "Contest access codes"
msgstr ""
-#: judge/models/contest.py:369
+#: judge/models/contest.py:405
msgid "Create private contests"
msgstr ""
-#: judge/models/contest.py:370
+#: judge/models/contest.py:406
msgid "Change contest visibility"
msgstr ""
-#: judge/models/contest.py:371
+#: judge/models/contest.py:407
msgid "Edit contest problem label script"
msgstr ""
-#: judge/models/contest.py:372
+#: judge/models/contest.py:408
msgid "Change lock status of contest"
msgstr ""
-#: judge/models/contest.py:374 judge/models/contest.py:472
-#: judge/models/contest.py:510 judge/models/contest.py:532
-#: judge/models/submission.py:84
+#: judge/models/contest.py:410 judge/models/contest.py:508
+#: judge/models/contest.py:547 judge/models/contest.py:569
+#: judge/models/submission.py:85
msgid "contest"
msgstr ""
-#: judge/models/contest.py:375
+#: judge/models/contest.py:411
msgid "contests"
msgstr ""
-#: judge/models/contest.py:382
+#: judge/models/contest.py:418
msgid "associated contest"
msgstr ""
-#: judge/models/contest.py:385
+#: judge/models/contest.py:421
msgid "score"
msgstr ""
-#: judge/models/contest.py:386
+#: judge/models/contest.py:422
msgid "cumulative time"
msgstr ""
-#: judge/models/contest.py:387
+#: judge/models/contest.py:423
msgid "is disqualified"
msgstr ""
-#: judge/models/contest.py:388
+#: judge/models/contest.py:424
msgid "Whether this participation is disqualified."
msgstr ""
-#: judge/models/contest.py:389
+#: judge/models/contest.py:425
msgid "tie-breaking field"
msgstr ""
-#: judge/models/contest.py:390
+#: judge/models/contest.py:426
msgid "virtual participation id"
msgstr ""
-#: judge/models/contest.py:391
+#: judge/models/contest.py:427
msgid "0 means non-virtual, otherwise the n-th virtual participation."
msgstr ""
-#: judge/models/contest.py:392
+#: judge/models/contest.py:428
msgid "contest format specific data"
msgstr ""
-#: judge/models/contest.py:458
+#: judge/models/contest.py:494
#, python-format
msgid "%s spectating in %s"
msgstr ""
-#: judge/models/contest.py:460
+#: judge/models/contest.py:496
#, python-format
msgid "%s in %s, v%d"
msgstr ""
-#: judge/models/contest.py:461
+#: judge/models/contest.py:497
#, python-format
msgid "%s in %s"
msgstr ""
-#: judge/models/contest.py:464
+#: judge/models/contest.py:500
msgid "contest participation"
msgstr ""
-#: judge/models/contest.py:465
+#: judge/models/contest.py:501
msgid "contest participations"
msgstr ""
-#: judge/models/contest.py:471 judge/models/contest.py:494
-#: judge/models/contest.py:533 judge/models/problem.py:430
-#: judge/models/problem.py:435 judge/models/problem.py:453
+#: judge/models/contest.py:507 judge/models/contest.py:531
+#: judge/models/contest.py:570 judge/models/problem.py:457
+#: judge/models/problem.py:462 judge/models/problem.py:480
#: judge/models/problem_data.py:35
msgid "problem"
msgstr ""
-#: judge/models/contest.py:473 judge/models/contest.py:498
-#: judge/models/problem.py:137
+#: judge/models/contest.py:509 judge/models/contest.py:535
+#: judge/models/problem.py:151
msgid "points"
msgstr ""
-#: judge/models/contest.py:474
+#: judge/models/contest.py:510
msgid "partial"
msgstr ""
-#: judge/models/contest.py:475 judge/models/contest.py:499
+#: judge/models/contest.py:511 judge/models/contest.py:536
msgid "is pretested"
msgstr ""
-#: judge/models/contest.py:476 judge/models/interface.py:43
+#: judge/models/contest.py:512 judge/models/interface.py:43
msgid "order"
msgstr ""
-#: judge/models/contest.py:477
+#: judge/models/contest.py:513
msgid "output prefix length override"
msgstr ""
-#: judge/models/contest.py:479
+#: judge/models/contest.py:515
msgid "Maximum number of submissions for this problem, or leave blank for no limit."
msgstr ""
-#: judge/models/contest.py:482
+#: judge/models/contest.py:518
msgid "Why include a problem you can't submit to?"
msgstr ""
-#: judge/models/contest.py:487
+#: judge/models/contest.py:523
msgid "contest problem"
msgstr ""
-#: judge/models/contest.py:488
+#: judge/models/contest.py:524
msgid "contest problems"
msgstr ""
-#: judge/models/contest.py:492 judge/models/submission.py:207
+#: judge/models/contest.py:529 judge/models/submission.py:218
msgid "submission"
msgstr ""
-#: judge/models/contest.py:496 judge/models/contest.py:511
+#: judge/models/contest.py:533 judge/models/contest.py:548
msgid "participation"
msgstr ""
-#: judge/models/contest.py:500
+#: judge/models/contest.py:537
msgid "Whether this submission was ran only on pretests."
msgstr ""
-#: judge/models/contest.py:504
+#: judge/models/contest.py:541
msgid "contest submission"
msgstr ""
-#: judge/models/contest.py:505
+#: judge/models/contest.py:542
msgid "contest submissions"
msgstr ""
-#: judge/models/contest.py:513
+#: judge/models/contest.py:550
msgid "rank"
msgstr ""
-#: judge/models/contest.py:514
+#: judge/models/contest.py:551
msgid "rating"
msgstr ""
-#: judge/models/contest.py:515
+#: judge/models/contest.py:552
msgid "volatility"
msgstr ""
-#: judge/models/contest.py:516
+#: judge/models/contest.py:553
msgid "last rated"
msgstr ""
-#: judge/models/contest.py:520
+#: judge/models/contest.py:557
msgid "contest rating"
msgstr ""
-#: judge/models/contest.py:521
+#: judge/models/contest.py:558
msgid "contest ratings"
msgstr ""
-#: judge/models/contest.py:540
+#: judge/models/contest.py:577
msgid "contest moss result"
msgstr ""
-#: judge/models/contest.py:541
+#: judge/models/contest.py:578
msgid "contest moss results"
msgstr ""
@@ -1203,7 +1220,7 @@ msgstr ""
msgid "post title"
msgstr ""
-#: judge/models/interface.py:67 judge/models/problem.py:473
+#: judge/models/interface.py:67 judge/models/problem.py:500
msgid "authors"
msgstr ""
@@ -1211,7 +1228,7 @@ msgstr ""
msgid "slug"
msgstr ""
-#: judge/models/interface.py:69 judge/models/problem.py:471
+#: judge/models/interface.py:69 judge/models/problem.py:498
msgid "public visibility"
msgstr ""
@@ -1247,34 +1264,6 @@ msgstr ""
msgid "blog posts"
msgstr ""
-#: judge/models/message.py:11
-msgid "message title"
-msgstr ""
-
-#: judge/models/message.py:12 judge/models/ticket.py:30
-msgid "message body"
-msgstr ""
-
-#: judge/models/message.py:13
-msgid "sender"
-msgstr ""
-
-#: judge/models/message.py:14
-msgid "target"
-msgstr ""
-
-#: judge/models/message.py:15
-msgid "message timestamp"
-msgstr ""
-
-#: judge/models/message.py:16
-msgid "read"
-msgstr ""
-
-#: judge/models/message.py:20
-msgid "messages in the thread"
-msgstr ""
-
#: judge/models/problem.py:30
#, python-format
msgid "Disallowed characters: %(value)s"
@@ -1292,7 +1281,7 @@ msgstr ""
msgid "problem type"
msgstr ""
-#: judge/models/problem.py:44 judge/models/problem.py:121
+#: judge/models/problem.py:44 judge/models/problem.py:135
msgid "problem types"
msgstr ""
@@ -1304,7 +1293,7 @@ msgstr ""
msgid "problem group name"
msgstr ""
-#: judge/models/problem.py:56 judge/models/problem.py:124
+#: judge/models/problem.py:56 judge/models/problem.py:138
msgid "problem group"
msgstr ""
@@ -1324,7 +1313,7 @@ msgstr ""
msgid "full name"
msgstr ""
-#: judge/models/problem.py:65 judge/models/profile.py:41
+#: judge/models/problem.py:65 judge/models/profile.py:44
#: judge/models/runtime.py:24
msgid "short name"
msgstr ""
@@ -1353,232 +1342,252 @@ msgstr ""
msgid "licenses"
msgstr ""
-#: judge/models/problem.py:104
+#: judge/models/problem.py:112
+msgid "Follow global setting"
+msgstr ""
+
+#: judge/models/problem.py:113
+msgid "Always visible"
+msgstr ""
+
+#: judge/models/problem.py:114
+msgid "Visible if problem solved"
+msgstr ""
+
+#: judge/models/problem.py:115
+msgid "Only own submissions"
+msgstr ""
+
+#: judge/models/problem.py:118
msgid "problem code"
msgstr ""
-#: judge/models/problem.py:106
+#: judge/models/problem.py:120
msgid "A short, unique code for the problem, used in the url after /problem/"
msgstr ""
-#: judge/models/problem.py:108
+#: judge/models/problem.py:122
msgid "problem name"
msgstr ""
-#: judge/models/problem.py:109
+#: judge/models/problem.py:123
msgid "The full name of the problem, as shown in the problem list."
msgstr ""
-#: judge/models/problem.py:111
+#: judge/models/problem.py:125
msgid "problem body"
msgstr ""
-#: judge/models/problem.py:112
+#: judge/models/problem.py:126
msgid "creators"
msgstr ""
-#: judge/models/problem.py:113
+#: judge/models/problem.py:127
msgid "These users will be able to edit the problem, and be listed as authors."
msgstr ""
-#: judge/models/problem.py:115
+#: judge/models/problem.py:129
msgid "curators"
msgstr ""
-#: judge/models/problem.py:116
+#: judge/models/problem.py:130
msgid "These users will be able to edit the problem, but not be listed as authors."
msgstr ""
-#: judge/models/problem.py:118
+#: judge/models/problem.py:132
msgid "testers"
msgstr ""
-#: judge/models/problem.py:120
+#: judge/models/problem.py:134
msgid "These users will be able to view the private problem, but not edit it."
msgstr ""
-#: judge/models/problem.py:122
+#: judge/models/problem.py:136
msgid "The type of problem, as shown on the problem's page."
msgstr ""
-#: judge/models/problem.py:125
+#: judge/models/problem.py:139
msgid "The group of problem, shown under Category in the problem list."
msgstr ""
-#: judge/models/problem.py:127
+#: judge/models/problem.py:141
msgid "The time limit for this problem, in seconds. Fractional seconds (e.g. 1.5) are supported."
msgstr ""
-#: judge/models/problem.py:131 judge/models/problem.py:458
+#: judge/models/problem.py:145 judge/models/problem.py:485
msgid "memory limit"
msgstr ""
-#: judge/models/problem.py:132
+#: judge/models/problem.py:146
msgid "The memory limit for this problem, in kilobytes (e.g. 64mb = 65536 kilobytes)."
msgstr ""
-#: judge/models/problem.py:138
+#: judge/models/problem.py:152
msgid "Points awarded for problem completion. Points are displayed with a 'p' suffix if partial."
msgstr ""
-#: judge/models/problem.py:141
+#: judge/models/problem.py:155
msgid "allows partial points"
msgstr ""
-#: judge/models/problem.py:142
+#: judge/models/problem.py:156
msgid "allowed languages"
msgstr ""
-#: judge/models/problem.py:143
+#: judge/models/problem.py:157
msgid "List of allowed submission languages."
msgstr ""
-#: judge/models/problem.py:145
+#: judge/models/problem.py:159
msgid "manually managed"
msgstr ""
-#: judge/models/problem.py:146
+#: judge/models/problem.py:160
msgid "Whether judges should be allowed to manage data or not."
msgstr ""
-#: judge/models/problem.py:147
+#: judge/models/problem.py:161
msgid "date of publishing"
msgstr ""
-#: judge/models/problem.py:148
+#: judge/models/problem.py:162
msgid "Doesn't have magic ability to auto-publish due to backward compatibility"
msgstr ""
-#: judge/models/problem.py:150
+#: judge/models/problem.py:164
msgid "Bans the selected users from submitting to this problem."
msgstr ""
-#: judge/models/problem.py:152
+#: judge/models/problem.py:166
msgid "The license under which this problem is published."
msgstr ""
-#: judge/models/problem.py:154
+#: judge/models/problem.py:168
msgid "problem summary"
msgstr ""
-#: judge/models/problem.py:156
+#: judge/models/problem.py:170
msgid "number of users"
msgstr ""
-#: judge/models/problem.py:157
+#: judge/models/problem.py:171
msgid "The number of users who solved the problem."
msgstr ""
-#: judge/models/problem.py:158
+#: judge/models/problem.py:172
msgid "solve rate"
msgstr ""
-#: judge/models/problem.py:159
+#: judge/models/problem.py:173
msgid "allow full markdown access"
msgstr ""
-#: judge/models/problem.py:165
+#: judge/models/problem.py:174
+msgid "submission source visibility"
+msgstr ""
+
+#: judge/models/problem.py:182
msgid "If private, only these organizations may see the problem."
msgstr ""
-#: judge/models/problem.py:420
+#: judge/models/problem.py:447
msgid "See hidden problems"
msgstr ""
-#: judge/models/problem.py:421
+#: judge/models/problem.py:448
msgid "Edit own problems"
msgstr ""
-#: judge/models/problem.py:422
+#: judge/models/problem.py:449
msgid "Edit all problems"
msgstr ""
-#: judge/models/problem.py:423
+#: judge/models/problem.py:450
msgid "Edit all public problems"
msgstr ""
-#: judge/models/problem.py:424
+#: judge/models/problem.py:451
msgid "Edit problems with full markup"
msgstr ""
-#: judge/models/problem.py:425 templates/problem/problem.html:161
+#: judge/models/problem.py:452 templates/problem/problem.html:161
msgid "Clone problem"
msgstr ""
-#: judge/models/problem.py:426
+#: judge/models/problem.py:453
msgid "Change is_public field"
msgstr ""
-#: judge/models/problem.py:427
+#: judge/models/problem.py:454
msgid "Change is_manually_managed field"
msgstr ""
-#: judge/models/problem.py:428
+#: judge/models/problem.py:455
msgid "See organization-private problems"
msgstr ""
-#: judge/models/problem.py:436 judge/models/problem.py:454
+#: judge/models/problem.py:463 judge/models/problem.py:481
#: judge/models/runtime.py:111
msgid "language"
msgstr ""
-#: judge/models/problem.py:437
+#: judge/models/problem.py:464
msgid "translated name"
msgstr ""
-#: judge/models/problem.py:438
+#: judge/models/problem.py:465
msgid "translated description"
msgstr ""
-#: judge/models/problem.py:442
+#: judge/models/problem.py:469
msgid "problem translation"
msgstr ""
-#: judge/models/problem.py:443
+#: judge/models/problem.py:470
msgid "problem translations"
msgstr ""
-#: judge/models/problem.py:447
+#: judge/models/problem.py:474
msgid "clarified problem"
msgstr ""
-#: judge/models/problem.py:448
+#: judge/models/problem.py:475
msgid "clarification body"
msgstr ""
-#: judge/models/problem.py:449
+#: judge/models/problem.py:476
msgid "clarification timestamp"
msgstr ""
-#: judge/models/problem.py:464
+#: judge/models/problem.py:491
msgid "language-specific resource limit"
msgstr ""
-#: judge/models/problem.py:465
+#: judge/models/problem.py:492
msgid "language-specific resource limits"
msgstr ""
-#: judge/models/problem.py:469
+#: judge/models/problem.py:496
msgid "associated problem"
msgstr ""
-#: judge/models/problem.py:472
+#: judge/models/problem.py:499
msgid "publish date"
msgstr ""
-#: judge/models/problem.py:474
+#: judge/models/problem.py:501
msgid "editorial content"
msgstr ""
-#: judge/models/problem.py:497
+#: judge/models/problem.py:524
msgid "See hidden solutions"
msgstr ""
-#: judge/models/problem.py:499
+#: judge/models/problem.py:526
msgid "solution"
msgstr ""
-#: judge/models/problem.py:500
+#: judge/models/problem.py:527
msgid "solutions"
msgstr ""
@@ -1690,112 +1699,112 @@ msgstr ""
msgid "case is pretest?"
msgstr ""
-#: judge/models/profile.py:38
+#: judge/models/profile.py:41
msgid "organization title"
msgstr ""
-#: judge/models/profile.py:39
+#: judge/models/profile.py:42
msgid "organization slug"
msgstr ""
-#: judge/models/profile.py:40
+#: judge/models/profile.py:43
msgid "Organization name shown in URL"
msgstr ""
-#: judge/models/profile.py:42
+#: judge/models/profile.py:45
msgid "Displayed beside user name during contests"
msgstr ""
-#: judge/models/profile.py:43
+#: judge/models/profile.py:46
msgid "organization description"
msgstr ""
-#: judge/models/profile.py:44
+#: judge/models/profile.py:47
msgid "administrators"
msgstr ""
-#: judge/models/profile.py:45
+#: judge/models/profile.py:48
msgid "Those who can edit this organization"
msgstr ""
-#: judge/models/profile.py:46
+#: judge/models/profile.py:49
msgid "creation date"
msgstr ""
-#: judge/models/profile.py:47
+#: judge/models/profile.py:50
msgid "is open organization?"
msgstr ""
-#: judge/models/profile.py:48
+#: judge/models/profile.py:51
msgid "Allow joining organization"
msgstr ""
-#: judge/models/profile.py:49
+#: judge/models/profile.py:52
msgid "maximum size"
msgstr ""
-#: judge/models/profile.py:50
+#: judge/models/profile.py:53
msgid "Maximum amount of users in this organization, only applicable to private organizations"
msgstr ""
-#: judge/models/profile.py:52
+#: judge/models/profile.py:55
msgid "Student access code"
msgstr ""
-#: judge/models/profile.py:56
+#: judge/models/profile.py:59
msgid "This image will replace the default site logo for users viewing the organization."
msgstr ""
-#: judge/models/profile.py:79
+#: judge/models/profile.py:82
msgid "Administer organizations"
msgstr ""
-#: judge/models/profile.py:80
+#: judge/models/profile.py:83
msgid "Edit all organizations"
msgstr ""
-#: judge/models/profile.py:82 judge/models/profile.py:99
-#: judge/models/profile.py:269
+#: judge/models/profile.py:85 judge/models/profile.py:102
+#: judge/models/profile.py:293
msgid "organization"
msgstr ""
-#: judge/models/profile.py:87
+#: judge/models/profile.py:90
msgid "user associated"
msgstr ""
-#: judge/models/profile.py:88
+#: judge/models/profile.py:91
msgid "self-description"
msgstr ""
-#: judge/models/profile.py:89
+#: judge/models/profile.py:92
msgid "location"
msgstr ""
-#: judge/models/profile.py:91
+#: judge/models/profile.py:94
msgid "preferred language"
msgstr ""
-#: judge/models/profile.py:97
+#: judge/models/profile.py:100
msgid "last access time"
msgstr ""
-#: judge/models/profile.py:98
+#: judge/models/profile.py:101
msgid "last IP"
msgstr ""
-#: judge/models/profile.py:101
+#: judge/models/profile.py:104
msgid "display rank"
msgstr ""
-#: judge/models/profile.py:103
+#: judge/models/profile.py:106
msgid "Normal User"
msgstr ""
-#: judge/models/profile.py:104
+#: judge/models/profile.py:107
msgid "Problem Setter"
msgstr ""
-#: judge/models/profile.py:105 templates/base.html:220
+#: judge/models/profile.py:108 templates/base.html:220
#: templates/comments/list.html:99 templates/contest/contest-list-tabs.html:24
#: templates/contest/ranking-table.html:49
#: templates/problem/problem-list-tabs.html:6
@@ -1804,155 +1813,167 @@ msgstr ""
msgid "Admin"
msgstr ""
-#: judge/models/profile.py:106
+#: judge/models/profile.py:109
msgid "comment mute"
msgstr ""
-#: judge/models/profile.py:106
+#: judge/models/profile.py:109
msgid "Some users are at their best when silent."
msgstr ""
-#: judge/models/profile.py:108
+#: judge/models/profile.py:111
msgid "unlisted user"
msgstr ""
-#: judge/models/profile.py:108
+#: judge/models/profile.py:111
msgid "User will not be ranked."
msgstr ""
-#: judge/models/profile.py:111
+#: judge/models/profile.py:114
msgid "user script"
msgstr ""
-#: judge/models/profile.py:112
+#: judge/models/profile.py:115
msgid "User-defined JavaScript for site customization."
msgstr ""
-#: judge/models/profile.py:113
+#: judge/models/profile.py:116
msgid "current contest"
msgstr ""
-#: judge/models/profile.py:115
+#: judge/models/profile.py:118
msgid "math engine"
msgstr ""
-#: judge/models/profile.py:117
+#: judge/models/profile.py:120
msgid "the rendering engine used to render math"
msgstr ""
-#: judge/models/profile.py:118
+#: judge/models/profile.py:121
msgid "TOTP 2FA enabled"
msgstr ""
-#: judge/models/profile.py:119
+#: judge/models/profile.py:122
msgid "check to enable TOTP-based two-factor authentication"
msgstr ""
-#: judge/models/profile.py:120
+#: judge/models/profile.py:123
msgid "WebAuthn 2FA enabled"
msgstr ""
-#: judge/models/profile.py:121
+#: judge/models/profile.py:124
msgid "check to enable WebAuthn-based two-factor authentication"
msgstr ""
-#: judge/models/profile.py:122
+#: judge/models/profile.py:125
msgid "TOTP key"
msgstr ""
-#: judge/models/profile.py:123
+#: judge/models/profile.py:126
msgid "32 character base32-encoded key for TOTP"
msgstr ""
-#: judge/models/profile.py:125
+#: judge/models/profile.py:128
msgid "TOTP key must be empty or base32"
msgstr ""
-#: judge/models/profile.py:126
+#: judge/models/profile.py:129
msgid "scratch codes"
msgstr ""
-#: judge/models/profile.py:127
+#: judge/models/profile.py:130
msgid "JSON array of 16 character base32-encoded codes for scratch codes"
msgstr ""
-#: judge/models/profile.py:131
+#: judge/models/profile.py:134
msgid "Scratch codes must be empty or a JSON array of 16-character base32 codes"
msgstr ""
-#: judge/models/profile.py:133
+#: judge/models/profile.py:136
+msgid "last TOTP timecode"
+msgstr ""
+
+#: judge/models/profile.py:137
msgid "API token"
msgstr ""
-#: judge/models/profile.py:134
+#: judge/models/profile.py:138
msgid "64 character hex-encoded API access token"
msgstr ""
-#: judge/models/profile.py:136
+#: judge/models/profile.py:140
msgid "API token must be None or hexadecimal"
msgstr ""
-#: judge/models/profile.py:137
+#: judge/models/profile.py:141
msgid "internal notes"
msgstr ""
-#: judge/models/profile.py:138
+#: judge/models/profile.py:142
msgid "Notes for administrators regarding this user."
msgstr ""
-#: judge/models/profile.py:139
+#: judge/models/profile.py:143
msgid "last data download time"
msgstr ""
-#: judge/models/profile.py:236
+#: judge/models/profile.py:253
msgid "Shows in-progress development stuff"
msgstr ""
-#: judge/models/profile.py:237
+#: judge/models/profile.py:254
msgid "Edit TOTP settings"
msgstr ""
-#: judge/models/profile.py:239
+#: judge/models/profile.py:256
msgid "user profile"
msgstr ""
-#: judge/models/profile.py:240
+#: judge/models/profile.py:257
msgid "user profiles"
msgstr ""
-#: judge/models/profile.py:246
+#: judge/models/profile.py:263
msgid "device name"
msgstr ""
-#: judge/models/profile.py:247
+#: judge/models/profile.py:264
msgid "credential ID"
msgstr ""
-#: judge/models/profile.py:248
+#: judge/models/profile.py:265
msgid "public key"
msgstr ""
-#: judge/models/profile.py:249
+#: judge/models/profile.py:266
msgid "sign counter"
msgstr ""
-#: judge/models/profile.py:271
+#: judge/models/profile.py:287
+msgid "WebAuthn credential"
+msgstr ""
+
+#: judge/models/profile.py:288
+msgid "WebAuthn credentials"
+msgstr ""
+
+#: judge/models/profile.py:295
msgid "request time"
msgstr ""
-#: judge/models/profile.py:272
+#: judge/models/profile.py:296
msgid "state"
msgstr ""
-#: judge/models/profile.py:277
+#: judge/models/profile.py:301
msgid "reason"
msgstr ""
-#: judge/models/profile.py:280
+#: judge/models/profile.py:304
msgid "organization join request"
msgstr ""
-#: judge/models/profile.py:281
+#: judge/models/profile.py:305
msgid "organization join requests"
msgstr ""
@@ -2108,210 +2129,210 @@ msgstr ""
msgid "judge"
msgstr ""
-#: judge/models/submission.py:20 judge/models/submission.py:47
+#: judge/models/submission.py:21 judge/models/submission.py:48
#: judge/utils/problems.py:74
msgid "Accepted"
msgstr ""
-#: judge/models/submission.py:21 judge/models/submission.py:48
+#: judge/models/submission.py:22 judge/models/submission.py:49
msgid "Wrong Answer"
msgstr ""
-#: judge/models/submission.py:22 judge/models/submission.py:50
+#: judge/models/submission.py:23 judge/models/submission.py:51
msgid "Time Limit Exceeded"
msgstr ""
-#: judge/models/submission.py:23 judge/models/submission.py:51
+#: judge/models/submission.py:24 judge/models/submission.py:52
msgid "Memory Limit Exceeded"
msgstr ""
-#: judge/models/submission.py:24 judge/models/submission.py:52
+#: judge/models/submission.py:25 judge/models/submission.py:53
msgid "Output Limit Exceeded"
msgstr ""
-#: judge/models/submission.py:25 judge/models/submission.py:53
+#: judge/models/submission.py:26 judge/models/submission.py:54
msgid "Invalid Return"
msgstr ""
-#: judge/models/submission.py:26 judge/models/submission.py:54
+#: judge/models/submission.py:27 judge/models/submission.py:55
msgid "Runtime Error"
msgstr ""
-#: judge/models/submission.py:27 judge/models/submission.py:41
-#: judge/models/submission.py:55 judge/utils/problems.py:76
+#: judge/models/submission.py:28 judge/models/submission.py:42
+#: judge/models/submission.py:56 judge/utils/problems.py:76
msgid "Compile Error"
msgstr ""
-#: judge/models/submission.py:28 judge/models/submission.py:40
+#: judge/models/submission.py:29 judge/models/submission.py:41
msgid "Internal Error"
msgstr ""
-#: judge/models/submission.py:29
+#: judge/models/submission.py:30
msgid "Short circuit"
msgstr ""
-#: judge/models/submission.py:30 judge/models/submission.py:42
-#: judge/models/submission.py:61
+#: judge/models/submission.py:31 judge/models/submission.py:43
+#: judge/models/submission.py:62
msgid "Aborted"
msgstr ""
-#: judge/models/submission.py:36 judge/models/submission.py:57
+#: judge/models/submission.py:37 judge/models/submission.py:58
msgid "Queued"
msgstr ""
-#: judge/models/submission.py:37 judge/models/submission.py:58
+#: judge/models/submission.py:38 judge/models/submission.py:59
msgid "Processing"
msgstr ""
-#: judge/models/submission.py:38 judge/models/submission.py:59
+#: judge/models/submission.py:39 judge/models/submission.py:60
msgid "Grading"
msgstr ""
-#: judge/models/submission.py:39 judge/models/submission.py:60
+#: judge/models/submission.py:40 judge/models/submission.py:61
msgid "Completed"
msgstr ""
-#: judge/models/submission.py:56
+#: judge/models/submission.py:57
msgid "Internal Error (judging server error)"
msgstr ""
-#: judge/models/submission.py:66
+#: judge/models/submission.py:67
msgid "submission time"
msgstr ""
-#: judge/models/submission.py:67 judge/models/submission.py:227
+#: judge/models/submission.py:68 judge/models/submission.py:238
msgid "execution time"
msgstr ""
-#: judge/models/submission.py:68 judge/models/submission.py:228
+#: judge/models/submission.py:69 judge/models/submission.py:239
msgid "memory usage"
msgstr ""
-#: judge/models/submission.py:69 judge/models/submission.py:229
+#: judge/models/submission.py:70 judge/models/submission.py:240
msgid "points granted"
msgstr ""
-#: judge/models/submission.py:70
+#: judge/models/submission.py:71
msgid "submission language"
msgstr ""
-#: judge/models/submission.py:71
+#: judge/models/submission.py:72
msgid "status"
msgstr ""
-#: judge/models/submission.py:72
+#: judge/models/submission.py:73
msgid "result"
msgstr ""
-#: judge/models/submission.py:74
+#: judge/models/submission.py:75
msgid "compile errors"
msgstr ""
-#: judge/models/submission.py:76
+#: judge/models/submission.py:77
msgid "batched cases"
msgstr ""
-#: judge/models/submission.py:77
+#: judge/models/submission.py:78
msgid "test case points"
msgstr ""
-#: judge/models/submission.py:78
+#: judge/models/submission.py:79
msgid "test case total points"
msgstr ""
-#: judge/models/submission.py:79
+#: judge/models/submission.py:80
msgid "judged on"
msgstr ""
-#: judge/models/submission.py:81
+#: judge/models/submission.py:82
msgid "submission judge time"
msgstr ""
-#: judge/models/submission.py:82
-msgid "was rejudged by admin"
+#: judge/models/submission.py:83
+msgid "last rejudge date by admin"
msgstr ""
-#: judge/models/submission.py:83
+#: judge/models/submission.py:84
msgid "was ran on pretests only"
msgstr ""
-#: judge/models/submission.py:86
-msgid "lock submission"
+#: judge/models/submission.py:87
+msgid "submission lock"
msgstr ""
-#: judge/models/submission.py:199
+#: judge/models/submission.py:210
msgid "Abort any submission"
msgstr ""
-#: judge/models/submission.py:200
+#: judge/models/submission.py:211
msgid "Rejudge the submission"
msgstr ""
-#: judge/models/submission.py:201
+#: judge/models/submission.py:212
msgid "Rejudge a lot of submissions"
msgstr ""
-#: judge/models/submission.py:202
+#: judge/models/submission.py:213
msgid "Submit without limit"
msgstr ""
-#: judge/models/submission.py:203
+#: judge/models/submission.py:214
msgid "View all submission"
msgstr ""
-#: judge/models/submission.py:204
+#: judge/models/submission.py:215
msgid "Resubmit others' submission"
msgstr ""
-#: judge/models/submission.py:205
+#: judge/models/submission.py:216
msgid "Change lock status of submission"
msgstr ""
-#: judge/models/submission.py:208 templates/contest/moss.html:58
+#: judge/models/submission.py:219 templates/contest/moss.html:58
msgid "submissions"
msgstr ""
-#: judge/models/submission.py:212 judge/models/submission.py:223
+#: judge/models/submission.py:223 judge/models/submission.py:234
msgid "associated submission"
msgstr ""
-#: judge/models/submission.py:214
+#: judge/models/submission.py:225
msgid "source code"
msgstr ""
-#: judge/models/submission.py:225
+#: judge/models/submission.py:236
msgid "test case ID"
msgstr ""
-#: judge/models/submission.py:226
+#: judge/models/submission.py:237
msgid "status flag"
msgstr ""
-#: judge/models/submission.py:230
+#: judge/models/submission.py:241
msgid "points possible"
msgstr ""
-#: judge/models/submission.py:231
+#: judge/models/submission.py:242
msgid "batch number"
msgstr ""
-#: judge/models/submission.py:232
+#: judge/models/submission.py:243
msgid "judging feedback"
msgstr ""
-#: judge/models/submission.py:233
+#: judge/models/submission.py:244
msgid "extended judging feedback"
msgstr ""
-#: judge/models/submission.py:234
+#: judge/models/submission.py:245
msgid "program output"
msgstr ""
-#: judge/models/submission.py:242
+#: judge/models/submission.py:253
msgid "submission test case"
msgstr ""
-#: judge/models/submission.py:243
+#: judge/models/submission.py:254
msgid "submission test cases"
msgstr ""
@@ -2359,6 +2380,10 @@ msgstr ""
msgid "poster"
msgstr ""
+#: judge/models/ticket.py:30
+msgid "message body"
+msgstr ""
+
#: judge/models/ticket.py:31
msgid "message time"
msgstr ""
@@ -2381,19 +2406,23 @@ msgstr ""
msgid "Running MOSS"
msgstr ""
-#: judge/tasks/submission.py:43
+#: judge/tasks/submission.py:45
msgid "Modifying submissions"
msgstr ""
-#: judge/tasks/submission.py:56
+#: judge/tasks/submission.py:58
msgid "Recalculating user points"
msgstr ""
-#: judge/tasks/user.py:50
+#: judge/tasks/user.py:49
+msgid "Applying filters"
+msgstr ""
+
+#: judge/tasks/user.py:64
msgid "Preparing your submission data"
msgstr ""
-#: judge/tasks/user.py:81
+#: judge/tasks/user.py:95
msgid "Preparing your comment data"
msgstr ""
@@ -2506,7 +2535,7 @@ msgstr ""
msgid "You already voted."
msgstr ""
-#: judge/views/comment.py:129 judge/views/organization.py:298
+#: judge/views/comment.py:129 judge/views/organization.py:297
msgid "Edited from site"
msgstr ""
@@ -2514,125 +2543,130 @@ msgstr ""
msgid "Editing comment"
msgstr ""
-#: judge/views/contests.py:56 judge/views/contests.py:201
-#: judge/views/contests.py:204 judge/views/contests.py:382
+#: judge/views/contests.py:57 judge/views/contests.py:210
+#: judge/views/contests.py:213 judge/views/contests.py:395
msgid "No such contest"
msgstr ""
-#: judge/views/contests.py:57 judge/views/contests.py:202
+#: judge/views/contests.py:58 judge/views/contests.py:211
#, python-format
msgid "Could not find a contest with the key \"%s\"."
msgstr ""
-#: judge/views/contests.py:70
+#: judge/views/contests.py:71
msgid "Contests"
msgstr ""
-#: judge/views/contests.py:205
+#: judge/views/contests.py:214
msgid "Could not find such contest."
msgstr ""
-#: judge/views/contests.py:208
+#: judge/views/contests.py:217
#, python-format
msgid "Access to contest \"%s\" denied"
msgstr ""
-#: judge/views/contests.py:235
+#: judge/views/contests.py:244
msgid "Clone Contest"
msgstr ""
-#: judge/views/contests.py:301
+#: judge/views/contests.py:278
+#, python-format
+msgid "Cloned contest from %s"
+msgstr ""
+
+#: judge/views/contests.py:314
msgid "Contest not ongoing"
msgstr ""
-#: judge/views/contests.py:302
+#: judge/views/contests.py:315
#, python-format
msgid "\"%s\" is not currently ongoing."
msgstr ""
-#: judge/views/contests.py:306
+#: judge/views/contests.py:319
msgid "Already in contest"
msgstr ""
-#: judge/views/contests.py:307
+#: judge/views/contests.py:320
#, python-format
msgid "You are already in a contest: \"%s\"."
msgstr ""
-#: judge/views/contests.py:310
+#: judge/views/contests.py:323
msgid "Banned from joining"
msgstr ""
-#: judge/views/contests.py:311
+#: judge/views/contests.py:324
msgid "You have been declared persona non grata for this contest. You are permanently barred from joining this contest."
msgstr ""
-#: judge/views/contests.py:372
+#: judge/views/contests.py:385
#, python-format
msgid "Enter access code for \"%s\""
msgstr ""
-#: judge/views/contests.py:383
+#: judge/views/contests.py:396
#, python-format
msgid "You are not in contest \"%s\"."
msgstr ""
-#: judge/views/contests.py:402
+#: judge/views/contests.py:415
msgid "ContestCalendar requires integer year and month"
msgstr ""
-#: judge/views/contests.py:442
+#: judge/views/contests.py:455
#, python-format
msgid "Contests in %(month)s"
msgstr ""
-#: judge/views/contests.py:442
+#: judge/views/contests.py:455
msgid "F Y"
msgstr ""
-#: judge/views/contests.py:489
+#: judge/views/contests.py:502
#, python-format
msgid "%s Statistics"
msgstr ""
-#: judge/views/contests.py:662
+#: judge/views/contests.py:675
#, python-format
msgid "%s Rankings"
msgstr ""
-#: judge/views/contests.py:670
+#: judge/views/contests.py:683
msgid "???"
msgstr ""
-#: judge/views/contests.py:686
+#: judge/views/contests.py:699
#, python-format
msgid "Your participation in %s"
msgstr ""
-#: judge/views/contests.py:687
+#: judge/views/contests.py:700
#, python-format
msgid "%s's participation in %s"
msgstr ""
-#: judge/views/contests.py:694
+#: judge/views/contests.py:707
msgid "Live"
msgstr ""
-#: judge/views/contests.py:706 templates/contest/contest-tabs.html:13
+#: judge/views/contests.py:719 templates/contest/contest-tabs.html:13
msgid "Participation"
msgstr ""
-#: judge/views/contests.py:750
+#: judge/views/contests.py:763
#, python-format
msgid "%s MOSS Results"
msgstr ""
-#: judge/views/contests.py:777
+#: judge/views/contests.py:790
#, python-format
msgid "Running MOSS for %s..."
msgstr ""
-#: judge/views/contests.py:800
+#: judge/views/contests.py:813
#, python-format
msgid "Contest tag: %s"
msgstr ""
@@ -2661,163 +2695,177 @@ msgstr ""
msgid "Runtimes"
msgstr ""
-#: judge/views/organization.py:44 judge/views/organization.py:47
+#: judge/views/organization.py:43 judge/views/organization.py:46
msgid "No such organization"
msgstr ""
-#: judge/views/organization.py:45
+#: judge/views/organization.py:44
#, python-format
msgid "Could not find an organization with the key \"%s\"."
msgstr ""
-#: judge/views/organization.py:48
+#: judge/views/organization.py:47
msgid "Could not find such organization."
msgstr ""
-#: judge/views/organization.py:72 judge/views/register.py:34
+#: judge/views/organization.py:71 judge/views/register.py:33
#: templates/organization/list.html:15 templates/user/user-list-tabs.html:5
msgid "Organizations"
msgstr ""
-#: judge/views/organization.py:93
+#: judge/views/organization.py:92
#, python-format
msgid "%s Members"
msgstr ""
-#: judge/views/organization.py:118 judge/views/organization.py:121
-#: judge/views/organization.py:126
+#: judge/views/organization.py:117 judge/views/organization.py:120
+#: judge/views/organization.py:125
msgid "Joining organization"
msgstr ""
-#: judge/views/organization.py:118
+#: judge/views/organization.py:117
msgid "You are already in the organization."
msgstr ""
-#: judge/views/organization.py:121
+#: judge/views/organization.py:120
msgid "This organization is not open."
msgstr ""
-#: judge/views/organization.py:138
+#: judge/views/organization.py:137
msgid "Leaving organization"
msgstr ""
-#: judge/views/organization.py:138
+#: judge/views/organization.py:137
#, python-format
msgid "You are not in \"%s\"."
msgstr ""
-#: judge/views/organization.py:162
+#: judge/views/organization.py:161
#, python-format
msgid "Request to join %s"
msgstr ""
-#: judge/views/organization.py:180
+#: judge/views/organization.py:179
msgid "Join request detail"
msgstr ""
-#: judge/views/organization.py:208
+#: judge/views/organization.py:207
#, python-format
msgid "Managing join requests for %s"
msgstr ""
-#: judge/views/organization.py:239
+#: judge/views/organization.py:238
#, python-format
msgid "Your organization can only receive %d more members. You cannot approve %d users."
msgstr ""
-#: judge/views/organization.py:251
+#: judge/views/organization.py:250
#, python-format
msgid "Approved %d user."
msgid_plural "Approved %d users."
msgstr[0] ""
msgstr[1] ""
-#: judge/views/organization.py:252
+#: judge/views/organization.py:251
#, python-format
msgid "Rejected %d user."
msgid_plural "Rejected %d users."
msgstr[0] ""
msgstr[1] ""
-#: judge/views/organization.py:282
+#: judge/views/organization.py:281
#, python-format
msgid "Editing %s"
msgstr ""
-#: judge/views/organization.py:306 judge/views/organization.py:314
+#: judge/views/organization.py:305 judge/views/organization.py:313
msgid "Can't edit organization"
msgstr ""
-#: judge/views/organization.py:307
+#: judge/views/organization.py:306
msgid "You are not allowed to edit this organization."
msgstr ""
-#: judge/views/organization.py:315
+#: judge/views/organization.py:314
msgid "You are not allowed to kick people from this organization."
msgstr ""
-#: judge/views/organization.py:320 judge/views/organization.py:324
+#: judge/views/organization.py:319 judge/views/organization.py:323
msgid "Can't kick user"
msgstr ""
-#: judge/views/organization.py:321
+#: judge/views/organization.py:320
msgid "The user you are trying to kick does not exist!"
msgstr ""
-#: judge/views/organization.py:325
+#: judge/views/organization.py:324
#, python-format
msgid "The user you are trying to kick is not in organization: %s."
msgstr ""
-#: judge/views/problem.py:67
+#: judge/views/problem.py:68
msgid "No such problem"
msgstr ""
-#: judge/views/problem.py:68
+#: judge/views/problem.py:69
#, python-format
msgid "Could not find a problem with the code \"%s\"."
msgstr ""
-#: judge/views/problem.py:110
+#: judge/views/problem.py:111
#, python-brace-format
msgid "Editorial for {0}"
msgstr ""
-#: judge/views/problem.py:113
+#: judge/views/problem.py:114
#, python-brace-format
msgid "Editorial for {0}"
msgstr ""
-#: judge/views/problem.py:283 templates/contest/contest.html:79
+#: judge/views/problem.py:133
+msgid "No such editorial"
+msgstr ""
+
+#: judge/views/problem.py:134
+#, python-format
+msgid "Could not find an editorial with the code \"%s\"."
+msgstr ""
+
+#: judge/views/problem.py:289 templates/contest/contest.html:79
#: templates/user/user-tabs.html:5 templates/user/users-table.html:23
msgid "Problems"
msgstr ""
-#: judge/views/problem.py:556 judge/views/problem.py:564
+#: judge/views/problem.py:562 judge/views/problem.py:570
#, python-format
msgid "Submit to %s"
msgstr ""
-#: judge/views/problem.py:613
+#: judge/views/problem.py:619
msgid "Banned from submitting"
msgstr ""
-#: judge/views/problem.py:614
+#: judge/views/problem.py:620
msgid "You have been declared persona non grata for this problem. You are permanently barred from submitting this problem."
msgstr ""
-#: judge/views/problem.py:618
+#: judge/views/problem.py:624
msgid "Too many submissions"
msgstr ""
-#: judge/views/problem.py:619
+#: judge/views/problem.py:625
msgid "You have exceeded the submission limit for this problem."
msgstr ""
-#: judge/views/problem.py:681
+#: judge/views/problem.py:693
msgid "Clone Problem"
msgstr ""
+#: judge/views/problem.py:720
+#, python-format
+msgid "Cloned problem from %s"
+msgstr ""
+
#: judge/views/problem_data.py:37
msgid "Checker arguments must be a JSON object"
msgstr ""
@@ -2887,52 +2935,52 @@ msgstr ""
msgid "Best solutions for {0}"
msgstr ""
-#: judge/views/ranked_submission.py:80
+#: judge/views/ranked_submission.py:82
#, python-format
msgid "Best solutions for %(problem)s in %(contest)s"
msgstr ""
-#: judge/views/ranked_submission.py:83
+#: judge/views/ranked_submission.py:85
#, python-format
msgid "Best solutions for problem %(number)s in %(contest)s"
msgstr ""
-#: judge/views/ranked_submission.py:89
+#: judge/views/ranked_submission.py:91
#, python-brace-format
msgid "Best solutions for {0} in {2}"
msgstr ""
-#: judge/views/ranked_submission.py:92
+#: judge/views/ranked_submission.py:94
#, python-brace-format
msgid "Best solutions for problem {0} in {1}"
msgstr ""
-#: judge/views/register.py:27
+#: judge/views/register.py:26
msgid "A username must contain letters, numbers, or underscores"
msgstr ""
-#: judge/views/register.py:31
+#: judge/views/register.py:30
msgid "Preferred language"
msgstr ""
-#: judge/views/register.py:38
+#: judge/views/register.py:37
msgid "Subscribe to newsletter?"
msgstr ""
-#: judge/views/register.py:45
+#: judge/views/register.py:44
#, python-format
msgid "The email address \"%s\" is already taken. Only one registration is allowed per address."
msgstr ""
-#: judge/views/register.py:51
+#: judge/views/register.py:50
msgid "Your email provider is not allowed due to history of abuse. Please use a reputable email provider."
msgstr ""
-#: judge/views/register.py:57 judge/views/register.py:95
+#: judge/views/register.py:56 judge/views/register.py:94
msgid "Registration"
msgstr ""
-#: judge/views/register.py:106
+#: judge/views/register.py:105
msgid "Authentication failure"
msgstr ""
@@ -2940,7 +2988,7 @@ msgstr ""
msgid "Language statistics"
msgstr ""
-#: judge/views/status.py:24 templates/submission/list.html:311
+#: judge/views/status.py:24 templates/submission/list.html:310
msgid "Status"
msgstr ""
@@ -2948,74 +2996,74 @@ msgstr ""
msgid "Version matrix"
msgstr ""
-#: judge/views/submission.py:53 judge/views/submission.py:60
+#: judge/views/submission.py:55 judge/views/submission.py:62
#, python-format
msgid "Submission of %(problem)s by %(user)s"
msgstr ""
-#: judge/views/submission.py:203 judge/views/submission.py:204
+#: judge/views/submission.py:205 judge/views/submission.py:206
#: templates/problem/problem.html:127
msgid "All submissions"
msgstr ""
-#: judge/views/submission.py:349
+#: judge/views/submission.py:355
msgid "All my submissions"
msgstr ""
-#: judge/views/submission.py:350
+#: judge/views/submission.py:356
#, python-format
msgid "All submissions by %s"
msgstr ""
-#: judge/views/submission.py:381
+#: judge/views/submission.py:387
#, python-format
msgid "All submissions for %s"
msgstr ""
-#: judge/views/submission.py:400
+#: judge/views/submission.py:410
msgid "Must pass a problem"
msgstr ""
-#: judge/views/submission.py:439
+#: judge/views/submission.py:449
#, python-format
msgid "My submissions for %(problem)s"
msgstr ""
-#: judge/views/submission.py:440
+#: judge/views/submission.py:450
#, python-format
msgid "%(user)s's submissions for %(problem)s"
msgstr ""
-#: judge/views/submission.py:536
+#: judge/views/submission.py:546
msgid "Must pass a contest"
msgstr ""
-#: judge/views/submission.py:544
+#: judge/views/submission.py:554
#, python-format
msgid "My submissions in %(contest)s"
msgstr ""
-#: judge/views/submission.py:545
+#: judge/views/submission.py:555
#, python-format
msgid "%(user)s's submissions in %(contest)s"
msgstr ""
-#: judge/views/submission.py:559
+#: judge/views/submission.py:569
#, python-brace-format
msgid "My submissions in {0}"
msgstr ""
-#: judge/views/submission.py:561
+#: judge/views/submission.py:571
#, python-brace-format
msgid "{0}'s submissions in {2}"
msgstr ""
-#: judge/views/submission.py:585
+#: judge/views/submission.py:597
#, python-brace-format
msgid "{0}'s submissions for {2} in {4}"
msgstr ""
-#: judge/views/submission.py:590
+#: judge/views/submission.py:602
#, python-brace-format
msgid "{0}'s submissions for problem {2} in {3}"
msgstr ""
@@ -3032,40 +3080,40 @@ msgstr ""
msgid "You must solve at least one problem before you can create a ticket."
msgstr ""
-#: judge/views/ticket.py:87 judge/views/ticket.py:90
+#: judge/views/ticket.py:91 judge/views/ticket.py:94
#, python-format
msgid "New ticket for %s"
msgstr ""
-#: judge/views/ticket.py:144
+#: judge/views/ticket.py:148
#, python-format
msgid "%(title)s - Ticket %(id)d"
msgstr ""
-#: judge/views/ticket.py:249
+#: judge/views/ticket.py:253
#, python-format
msgid "Tickets - Page %(number)d of %(total)d"
msgstr ""
-#: judge/views/ticket.py:298
+#: judge/views/ticket.py:302
#, python-format
msgid "New Ticket: %s"
msgstr ""
-#: judge/views/ticket.py:299
+#: judge/views/ticket.py:303
#, python-format
msgid "#%(id)d, assigned to: %(users)s"
msgstr ""
-#: judge/views/ticket.py:301
+#: judge/views/ticket.py:305
msgid ", "
msgstr ""
-#: judge/views/ticket.py:301
+#: judge/views/ticket.py:305
msgid "no one"
msgstr ""
-#: judge/views/ticket.py:321
+#: judge/views/ticket.py:325
#, python-format
msgid "New Ticket Message For: %s"
msgstr ""
@@ -3074,87 +3122,91 @@ msgstr ""
msgid "Enable Two-factor Authentication"
msgstr ""
-#: judge/views/two_factor.py:99
+#: judge/views/two_factor.py:108
+msgid "Refresh Two-factor Authentication"
+msgstr ""
+
+#: judge/views/two_factor.py:116
msgid "Disable Two-factor Authentication"
msgstr ""
-#: judge/views/two_factor.py:148
+#: judge/views/two_factor.py:165
msgid "Invalid WebAuthn response"
msgstr ""
-#: judge/views/two_factor.py:151
+#: judge/views/two_factor.py:168
msgid "Invalid name"
msgstr ""
-#: judge/views/two_factor.py:204
+#: judge/views/two_factor.py:221
msgid "Staff may not disable 2FA"
msgstr ""
-#: judge/views/two_factor.py:216
+#: judge/views/two_factor.py:229
msgid "Perform Two-factor Authentication"
msgstr ""
-#: judge/views/user.py:79
+#: judge/views/user.py:78
msgid "No such user"
msgstr ""
-#: judge/views/user.py:79
+#: judge/views/user.py:78
#, python-format
msgid "No user handle \"%s\"."
msgstr ""
-#: judge/views/user.py:83
+#: judge/views/user.py:82
msgid "My account"
msgstr ""
-#: judge/views/user.py:84
+#: judge/views/user.py:83
#, python-format
msgid "User %s"
msgstr ""
-#: judge/views/user.py:132
+#: judge/views/user.py:131
msgid "Login"
msgstr ""
-#: judge/views/user.py:173
+#: judge/views/user.py:172
msgid "M j, Y, G:i"
msgstr ""
-#: judge/views/user.py:307
+#: judge/views/user.py:306
msgid "Preparing your data..."
msgstr ""
-#: judge/views/user.py:311 templates/user/edit-profile.html:348
+#: judge/views/user.py:310 templates/user/edit-profile.html:352
msgid "Download your data"
msgstr ""
-#: judge/views/user.py:367
+#: judge/views/user.py:366
msgid "Updated on site"
msgstr ""
-#: judge/views/user.py:400 templates/admin/auth/user/change_form.html:14
+#: judge/views/user.py:399 templates/admin/auth/user/change_form.html:14
#: templates/admin/auth/user/change_form.html:17 templates/base.html:222
#: templates/user/user-tabs.html:16
msgid "Edit profile"
msgstr ""
-#: judge/views/user.py:415
+#: judge/views/user.py:414
msgid "Generated API token for user"
msgstr ""
-#: judge/views/user.py:427
+#: judge/views/user.py:426
msgid "Removed API token for user"
msgstr ""
-#: judge/views/user.py:437
+#: judge/views/user.py:436
msgid "Generated scratch codes for user"
msgstr ""
-#: judge/views/user.py:443 templates/user/user-list-tabs.html:4
+#: judge/views/user.py:442 templates/user/user-list-tabs.html:4
msgid "Leaderboard"
msgstr ""
-#: judge/views/user.py:504
+#: judge/views/user.py:503
msgid "You have been successfully logged out."
msgstr ""
@@ -3279,11 +3331,11 @@ msgstr ""
msgid "posted on {time}"
msgstr ""
-#: templates/blog/list.html:130 templates/problem/problem.html:309
+#: templates/blog/list.html:130 templates/problem/problem.html:311
msgid "Clarifications"
msgstr ""
-#: templates/blog/list.html:146 templates/problem/problem.html:320
+#: templates/blog/list.html:146 templates/problem/problem.html:322
msgid "No clarifications have been made at this time."
msgstr ""
@@ -3476,7 +3528,7 @@ msgid "Info"
msgstr ""
#: templates/contest/contest-tabs.html:6 templates/stats/base.html:9
-#: templates/submission/list.html:337
+#: templates/submission/list.html:336
msgid "Statistics"
msgstr ""
@@ -3679,19 +3731,19 @@ msgstr ""
msgid "Disqualify"
msgstr ""
-#: templates/contest/ranking.html:169
+#: templates/contest/ranking.html:173
msgid "Are you sure you want to disqualify this participation?"
msgstr ""
-#: templates/contest/ranking.html:174
+#: templates/contest/ranking.html:178
msgid "Are you sure you want to un-disqualify this participation?"
msgstr ""
-#: templates/contest/ranking.html:246
+#: templates/contest/ranking.html:250
msgid "View user participation"
msgstr ""
-#: templates/contest/ranking.html:250
+#: templates/contest/ranking.html:254
msgid "Show organizations"
msgstr ""
@@ -3966,7 +4018,7 @@ msgstr ""
msgid "Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence."
msgstr ""
-#: templates/problem/editorial.html:27 templates/problem/problem.html:209
+#: templates/problem/editorial.html:27 templates/problem/problem.html:210
msgid "Author:"
msgid_plural "Authors:"
msgstr[0] ""
@@ -4133,36 +4185,36 @@ msgstr ""
msgid "Memory limit:"
msgstr ""
-#: templates/problem/problem.html:224
+#: templates/problem/problem.html:226
msgid "Problem type"
msgid_plural "Problem types"
msgstr[0] ""
msgstr[1] ""
-#: templates/problem/problem.html:237
+#: templates/problem/problem.html:239
msgid "Allowed languages"
msgstr ""
-#: templates/problem/problem.html:245
+#: templates/problem/problem.html:247
#, python-format
msgid "No %(lang)s judge online"
msgstr ""
-#: templates/problem/problem.html:256
+#: templates/problem/problem.html:258
msgid "Judge:"
msgid_plural "Judges:"
msgstr[0] ""
msgstr[1] ""
-#: templates/problem/problem.html:273
+#: templates/problem/problem.html:275
msgid "none available"
msgstr ""
-#: templates/problem/problem.html:298
+#: templates/problem/problem.html:300
msgid "Request clarification"
msgstr ""
-#: templates/problem/problem.html:300
+#: templates/problem/problem.html:302
msgid "Report an issue"
msgstr ""
@@ -4207,7 +4259,7 @@ msgstr ""
msgid "Point range"
msgstr ""
-#: templates/problem/search-form.html:63 templates/submission/list.html:329
+#: templates/problem/search-form.html:63 templates/submission/list.html:328
#: templates/ticket/list.html:248
msgid "Go"
msgstr ""
@@ -4254,7 +4306,7 @@ msgid "Invalid username or password."
msgstr ""
#: templates/registration/login.html:53
-#: templates/registration/two_factor_auth.html:86
+#: templates/registration/two_factor_auth.html:92
msgid "Login!"
msgstr ""
@@ -4374,12 +4426,12 @@ msgid "Default language"
msgstr ""
#: templates/registration/registration_form.html:184
-#: templates/user/edit-profile.html:310
+#: templates/user/edit-profile.html:314
msgid "Affiliated organizations"
msgstr ""
#: templates/registration/registration_form.html:190
-#: templates/user/edit-profile.html:324
+#: templates/user/edit-profile.html:328
msgid "Notify me about upcoming contests"
msgstr ""
@@ -4395,57 +4447,93 @@ msgstr ""
msgid "Register!"
msgstr ""
-#: templates/registration/totp_disable.html:38
+#: templates/registration/totp_disable.html:31
msgid "To protect your account, you must first authenticate before you can disable Two Factor Authentication."
msgstr ""
-#: templates/registration/totp_disable.html:45
+#: templates/registration/totp_disable.html:38
msgid "Enter the 6-digit code generated by your app or one of your 16-digit scratch codes:"
msgstr ""
-#: templates/registration/totp_disable.html:48
+#: templates/registration/totp_disable.html:41
msgid "Disable Two Factor Authentication"
msgstr ""
-#: templates/registration/totp_enable.html:75
+#: templates/registration/totp_enable.html:72
msgid "Scan this code with your authenticator app:"
msgstr ""
-#: templates/registration/totp_enable.html:76
+#: templates/registration/totp_enable.html:73
msgid "QR code"
msgstr ""
-#: templates/registration/totp_enable.html:77
+#: templates/registration/totp_enable.html:74
msgid "Or enter this code manually:"
msgstr ""
-#: templates/registration/totp_enable.html:88
+#: templates/registration/totp_enable.html:85
msgid "Enter the 6-digit code generated by your app:"
msgstr ""
-#: templates/registration/totp_enable.html:91
+#: templates/registration/totp_enable.html:90
+msgid "Refresh Two Factor Authentication"
+msgstr ""
+
+#: templates/registration/totp_enable.html:92
msgid "Enable Two Factor Authentication"
msgstr ""
+#: templates/registration/totp_enable.html:98
+msgid "Below is a list of one-time use scratch codes."
+msgstr ""
+
+#: templates/registration/totp_enable.html:99
+msgid "These codes can only be used once and are for emergency use."
+msgstr ""
+
+#: templates/registration/totp_enable.html:100
+msgid "You can use these codes to login to your account or disable two-factor authentication."
+msgstr ""
+
+#: templates/registration/totp_enable.html:101
+msgid "If you ever need more scratch codes, you can regenerate them on the edit profile tab."
+msgstr ""
+
+#: templates/registration/totp_enable.html:102
+msgid "Please write these down and keep them in a secure location."
+msgstr ""
+
+#: templates/registration/totp_enable.html:103
+msgid "These codes will never be shown again after you enable two-factor authentication."
+msgstr ""
+
#: templates/registration/two_factor_auth.html:33
-#: templates/user/edit-profile.html:161
+#: templates/user/edit-profile.html:165
msgid "WebAuthn is not supported by your browser."
msgstr ""
#: templates/registration/two_factor_auth.html:54
-#: templates/user/edit-profile.html:185
+#: templates/user/edit-profile.html:189
msgid "Failed to contact server."
msgstr ""
-#: templates/registration/two_factor_auth.html:77
+#: templates/registration/two_factor_auth.html:79
msgid "Enter the 6-digit code generated by your app or one of your 16-character scratch codes:"
msgstr ""
-#: templates/registration/two_factor_auth.html:83
-msgid "Use security key"
+#: templates/registration/two_factor_auth.html:81
+msgid "Enter one of your 16-character scratch codes:"
msgstr ""
#: templates/registration/two_factor_auth.html:89
+msgid "Use security key"
+msgstr ""
+
+#: templates/registration/two_factor_auth.html:94
+msgid "Use scratch code"
+msgstr ""
+
+#: templates/registration/two_factor_auth.html:97
#, python-format
msgid "If you lost your authentication device and are unable to use your scratch codes, please contact us at %(email)s."
msgstr ""
@@ -4526,15 +4614,15 @@ msgstr ""
msgid "Filter by language..."
msgstr ""
-#: templates/submission/list.html:307
+#: templates/submission/list.html:306
msgid "Filter submissions"
msgstr ""
-#: templates/submission/list.html:343
+#: templates/submission/list.html:342
msgid "Total:"
msgstr ""
-#: templates/submission/list.html:353
+#: templates/submission/list.html:352
msgid "You were disconnected. Refresh to show latest updates."
msgstr ""
@@ -4750,121 +4838,125 @@ msgstr ""
msgid "Search by handle..."
msgstr ""
-#: templates/user/edit-profile.html:109
+#: templates/user/edit-profile.html:113
msgid "Are you sure you want to generate or regenerate your API token?"
msgstr ""
-#: templates/user/edit-profile.html:110
+#: templates/user/edit-profile.html:114
msgid "This will invalidate any previous API tokens."
msgstr ""
-#: templates/user/edit-profile.html:111
+#: templates/user/edit-profile.html:115
msgid "It also allows access to your account without Two-factor Authentication."
msgstr ""
-#: templates/user/edit-profile.html:112
+#: templates/user/edit-profile.html:116
msgid "You will not be able to view your api token after you leave this page!"
msgstr ""
-#: templates/user/edit-profile.html:113 templates/user/edit-profile.html:207
+#: templates/user/edit-profile.html:117 templates/user/edit-profile.html:211
msgid "Generating..."
msgstr ""
-#: templates/user/edit-profile.html:121 templates/user/edit-profile.html:243
-#: templates/user/edit-profile.html:371 templates/user/edit-profile.html:390
+#: templates/user/edit-profile.html:125 templates/user/edit-profile.html:247
+#: templates/user/edit-profile.html:373 templates/user/edit-profile.html:395
msgid "Regenerate"
msgstr ""
-#: templates/user/edit-profile.html:127 templates/user/edit-profile.html:392
+#: templates/user/edit-profile.html:131 templates/user/edit-profile.html:397
msgid "Remove"
msgstr ""
-#: templates/user/edit-profile.html:137
+#: templates/user/edit-profile.html:141
msgid "Are you sure you want to remove your API token?"
msgstr ""
-#: templates/user/edit-profile.html:144 templates/user/edit-profile.html:375
-#: templates/user/edit-profile.html:396
+#: templates/user/edit-profile.html:148 templates/user/edit-profile.html:377
+#: templates/user/edit-profile.html:401
msgid "Generate"
msgstr ""
-#: templates/user/edit-profile.html:190
+#: templates/user/edit-profile.html:194
msgid "Are you sure you want to delete this security key?"
msgstr ""
-#: templates/user/edit-profile.html:280
+#: templates/user/edit-profile.html:284
msgid "Self-description"
msgstr ""
-#: templates/user/edit-profile.html:287
+#: templates/user/edit-profile.html:291
msgid "Select your closest major city"
msgstr ""
-#: templates/user/edit-profile.html:296
+#: templates/user/edit-profile.html:300
msgid "Editor theme"
msgstr ""
-#: templates/user/edit-profile.html:301
+#: templates/user/edit-profile.html:305
msgid "Math engine"
msgstr ""
-#: templates/user/edit-profile.html:335 templates/user/edit-profile.html:337
+#: templates/user/edit-profile.html:339 templates/user/edit-profile.html:341
msgid "Change your avatar"
msgstr ""
-#: templates/user/edit-profile.html:342
+#: templates/user/edit-profile.html:346
msgid "Change your password"
msgstr ""
-#: templates/user/edit-profile.html:356
+#: templates/user/edit-profile.html:359
msgid "Two-factor Authentication is enabled"
msgstr ""
-#: templates/user/edit-profile.html:358
-msgid "Two-factor Authentication is disabled"
+#: templates/user/edit-profile.html:362 templates/user/edit-profile.html:365
+msgid "Disable"
msgstr ""
-#: templates/user/edit-profile.html:363 templates/user/edit-profile.html:365
-msgid "Disable"
+#: templates/user/edit-profile.html:367
+msgid "Refresh"
msgstr ""
-#: templates/user/edit-profile.html:368
+#: templates/user/edit-profile.html:370
msgid "Scratch Codes:"
msgstr ""
-#: templates/user/edit-profile.html:372 templates/user/edit-profile.html:393
+#: templates/user/edit-profile.html:374 templates/user/edit-profile.html:398
msgid "Hidden"
msgstr ""
-#: templates/user/edit-profile.html:381
+#: templates/user/edit-profile.html:384
+msgid "Two-factor Authentication is disabled"
+msgstr ""
+
+#: templates/user/edit-profile.html:385
msgid "Enable"
msgstr ""
-#: templates/user/edit-profile.html:387
+#: templates/user/edit-profile.html:392
msgid "API Token"
msgstr ""
-#: templates/user/edit-profile.html:404
+#: templates/user/edit-profile.html:409
msgid "Security keys"
msgstr ""
-#: templates/user/edit-profile.html:414
+#: templates/user/edit-profile.html:419
msgid "Delete"
msgstr ""
-#: templates/user/edit-profile.html:421
+#: templates/user/edit-profile.html:426
msgid "Enter a name for this key"
msgstr ""
-#: templates/user/edit-profile.html:422
+#: templates/user/edit-profile.html:427
msgid "Add"
msgstr ""
-#: templates/user/edit-profile.html:430
+#: templates/user/edit-profile.html:435
msgid "User-script"
msgstr ""
-#: templates/user/edit-profile.html:434
+#: templates/user/edit-profile.html:439
msgid "Update profile"
msgstr ""
diff --git a/locale/it/LC_MESSAGES/djangojs.po b/locale/it/LC_MESSAGES/djangojs.po
index 74edd17776..d6eee2f033 100644
--- a/locale/it/LC_MESSAGES/djangojs.po
+++ b/locale/it/LC_MESSAGES/djangojs.po
@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: dmoj\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-10-01 23:12+0000\n"
-"PO-Revision-Date: 2021-04-25 00:08\n"
+"PO-Revision-Date: 2021-07-07 00:27\n"
"Last-Translator: \n"
"Language-Team: Italian\n"
"Language: it_IT\n"
diff --git a/locale/ja/LC_MESSAGES/django.po b/locale/ja/LC_MESSAGES/django.po
index 6b95fd42d7..18fce6eaa1 100644
--- a/locale/ja/LC_MESSAGES/django.po
+++ b/locale/ja/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: dmoj\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-24 19:15+0000\n"
-"PO-Revision-Date: 2021-04-25 00:08\n"
+"POT-Creation-Date: 2021-06-17 01:38+0000\n"
+"PO-Revision-Date: 2021-07-07 00:27\n"
"Last-Translator: \n"
"Language-Team: Japanese\n"
"Language: ja_JP\n"
@@ -17,75 +17,75 @@ msgstr ""
"X-Crowdin-File: django.po\n"
"X-Crowdin-File-ID: 10\n"
-#: dmoj/settings.py:364
+#: dmoj/settings.py:365
msgid "Catalan"
msgstr ""
-#: dmoj/settings.py:365
+#: dmoj/settings.py:366
msgid "German"
msgstr "ドイツ語"
-#: dmoj/settings.py:366
+#: dmoj/settings.py:367
msgid "English"
msgstr "英語"
-#: dmoj/settings.py:367
+#: dmoj/settings.py:368
msgid "Spanish"
msgstr "スペイン語"
-#: dmoj/settings.py:368
+#: dmoj/settings.py:369
msgid "French"
msgstr "フランス語"
-#: dmoj/settings.py:369
+#: dmoj/settings.py:370
msgid "Croatian"
msgstr "クロアチア語"
-#: dmoj/settings.py:370
+#: dmoj/settings.py:371
msgid "Hungarian"
msgstr "ハンガリー語"
-#: dmoj/settings.py:371
+#: dmoj/settings.py:372
msgid "Japanese"
msgstr "日本語"
-#: dmoj/settings.py:372
+#: dmoj/settings.py:373
msgid "Korean"
msgstr "韓国語"
-#: dmoj/settings.py:373
+#: dmoj/settings.py:374
msgid "Brazilian Portuguese"
msgstr "ポルトガル語 (ブラジル)"
-#: dmoj/settings.py:374
+#: dmoj/settings.py:375
msgid "Romanian"
msgstr "ルーマニア語"
-#: dmoj/settings.py:375
+#: dmoj/settings.py:376
msgid "Russian"
msgstr "ロシア語"
-#: dmoj/settings.py:376
+#: dmoj/settings.py:377
msgid "Serbian (Latin)"
msgstr "セルビア語(ラテン)"
-#: dmoj/settings.py:377
+#: dmoj/settings.py:378
msgid "Turkish"
msgstr "トルコ語"
-#: dmoj/settings.py:378
+#: dmoj/settings.py:379
msgid "Vietnamese"
msgstr "ベトナム語"
-#: dmoj/settings.py:379
+#: dmoj/settings.py:380
msgid "Simplified Chinese"
msgstr "簡体字中国語"
-#: dmoj/settings.py:380
+#: dmoj/settings.py:381
msgid "Traditional Chinese"
msgstr "繁体字中国語"
-#: dmoj/urls.py:103 templates/base.html:190
+#: dmoj/urls.py:104 templates/base.html:190
msgid "Home"
msgstr "ホーム"
@@ -113,106 +113,106 @@ msgstr "コメントの非表示を解除する"
msgid "Associated page"
msgstr "関連するページ"
-#: judge/admin/contest.py:31
+#: judge/admin/contest.py:32
msgid "Included contests"
msgstr "含まれているコンテスト"
-#: judge/admin/contest.py:65 templates/contest/contest.html:83
+#: judge/admin/contest.py:66 templates/contest/contest.html:83
#: templates/contest/moss.html:43 templates/problem/list.html:204
#: templates/problem/list.html:219 templates/user/user-problems.html:58
#: templates/user/user-problems.html:100
msgid "Problem"
msgstr "課題"
-#: judge/admin/contest.py:114
+#: judge/admin/contest.py:117
msgid "Settings"
msgstr "設定"
-#: judge/admin/contest.py:116
+#: judge/admin/contest.py:120
msgid "Scheduling"
msgstr "スケジュール"
-#: judge/admin/contest.py:117
+#: judge/admin/contest.py:121
msgid "Details"
msgstr "詳細"
-#: judge/admin/contest.py:118
+#: judge/admin/contest.py:122
msgid "Format"
msgstr "フォーマット"
-#: judge/admin/contest.py:119 templates/contest/ranking-table.html:5
+#: judge/admin/contest.py:123 templates/contest/ranking-table.html:5
msgid "Rating"
msgstr "評価"
-#: judge/admin/contest.py:120
+#: judge/admin/contest.py:124
msgid "Access"
msgstr "アクセス"
-#: judge/admin/contest.py:122 judge/admin/problem.py:134
+#: judge/admin/contest.py:126 judge/admin/problem.py:135
msgid "Justice"
msgstr "正義"
-#: judge/admin/contest.py:211
+#: judge/admin/contest.py:215
#, python-format
msgid "%d contest successfully marked as visible."
msgid_plural "%d contests successfully marked as visible."
msgstr[0] "%d 個の課題を公開しました。"
-#: judge/admin/contest.py:214
+#: judge/admin/contest.py:218
msgid "Mark contests as visible"
msgstr "課題を公開する"
-#: judge/admin/contest.py:220
+#: judge/admin/contest.py:224
#, python-format
msgid "%d contest successfully marked as hidden."
msgid_plural "%d contests successfully marked as hidden."
msgstr[0] "%d 個の課題を非公開としました。"
-#: judge/admin/contest.py:223
+#: judge/admin/contest.py:227
msgid "Mark contests as hidden"
msgstr "課題を非公開にする"
-#: judge/admin/contest.py:229
+#: judge/admin/contest.py:233
#, python-format
msgid "%d contest successfully locked."
msgid_plural "%d contests successfully locked."
msgstr[0] ""
-#: judge/admin/contest.py:232
+#: judge/admin/contest.py:236
msgid "Lock contest submissions"
msgstr ""
-#: judge/admin/contest.py:238
+#: judge/admin/contest.py:242
#, python-format
msgid "%d contest successfully unlocked."
msgid_plural "%d contests successfully unlocked."
msgstr[0] ""
-#: judge/admin/contest.py:241
+#: judge/admin/contest.py:245
msgid "Unlock contest submissions"
msgstr ""
-#: judge/admin/contest.py:262 judge/admin/submission.py:170
+#: judge/admin/contest.py:266 judge/admin/submission.py:170
#, python-format
msgid "%d submission was successfully scheduled for rejudging."
msgid_plural "%d submissions were successfully scheduled for rejudging."
msgstr[0] "%d 個の提出を再判定するよう設定しました。"
-#: judge/admin/contest.py:337
+#: judge/admin/contest.py:341
#, python-format
msgid "%d participation recalculated."
msgid_plural "%d participations recalculated."
msgstr[0] "%d 人の参加者を再計算。"
-#: judge/admin/contest.py:340
+#: judge/admin/contest.py:344
msgid "Recalculate results"
msgstr "再計算の結果"
-#: judge/admin/contest.py:344 judge/admin/organization.py:63
+#: judge/admin/contest.py:348 judge/admin/organization.py:63
msgid "username"
msgstr "利用者名"
-#: judge/admin/contest.py:349 templates/base.html:258
+#: judge/admin/contest.py:353 templates/base.html:258
msgid "virtual"
msgstr "仮想"
@@ -228,9 +228,9 @@ msgstr "内容"
msgid "Summary"
msgstr "概要"
-#: judge/admin/interface.py:113 judge/models/contest.py:383
-#: judge/models/contest.py:509 judge/models/profile.py:244
-#: judge/models/profile.py:268
+#: judge/admin/interface.py:113 judge/models/contest.py:419
+#: judge/models/contest.py:546 judge/models/profile.py:261
+#: judge/models/profile.py:292
msgid "user"
msgstr "利用者"
@@ -238,8 +238,8 @@ msgstr "利用者"
msgid "object"
msgstr ""
-#: judge/admin/organization.py:32 judge/admin/problem.py:181
-#: judge/admin/profile.py:82
+#: judge/admin/organization.py:32 judge/admin/problem.py:182
+#: judge/admin/profile.py:92
msgid "View on site"
msgstr "サイト上で表示する"
@@ -247,66 +247,66 @@ msgstr "サイト上で表示する"
msgid "Describe the changes you made (optional)"
msgstr "あなたの変更を記述する(オプショナル)"
-#: judge/admin/problem.py:129
+#: judge/admin/problem.py:130
msgid "Social Media"
msgstr "ソーシャルメディア"
-#: judge/admin/problem.py:130
+#: judge/admin/problem.py:131
msgid "Taxonomy"
msgstr "分類"
-#: judge/admin/problem.py:131 templates/contest/contest.html:84
+#: judge/admin/problem.py:132 templates/contest/contest.html:84
#: templates/problem/data.html:385 templates/problem/list.html:209
#: templates/problem/list.html:230 templates/user/base-users-table.html:10
#: templates/user/user-problems.html:60
msgid "Points"
msgstr "点数"
-#: judge/admin/problem.py:132
+#: judge/admin/problem.py:133
msgid "Limits"
msgstr "制限"
-#: judge/admin/problem.py:133 judge/admin/submission.py:238
-#: templates/stats/base.html:14 templates/submission/list.html:320
-#: templates/user/edit-profile.html:292
+#: judge/admin/problem.py:134 judge/admin/submission.py:238
+#: templates/stats/base.html:14 templates/submission/list.html:319
+#: templates/user/edit-profile.html:296
msgid "Language"
msgstr "言語"
-#: judge/admin/problem.py:135
+#: judge/admin/problem.py:136
msgid "History"
msgstr "履歴"
-#: judge/admin/problem.py:178
+#: judge/admin/problem.py:179
msgid "Authors"
msgstr "著者"
-#: judge/admin/problem.py:191
+#: judge/admin/problem.py:192
#, python-format
msgid "%d problem's publish date successfully updated."
msgid_plural "%d problems' publish date successfully updated."
msgstr[0] ""
-#: judge/admin/problem.py:195
+#: judge/admin/problem.py:196
msgid "Set publish date to now"
msgstr ""
-#: judge/admin/problem.py:201
+#: judge/admin/problem.py:202
#, python-format
msgid "%d problem successfully marked as public."
msgid_plural "%d problems successfully marked as public."
msgstr[0] "%d 個の課題はパブリックとして印付けられました。"
-#: judge/admin/problem.py:205
+#: judge/admin/problem.py:206
msgid "Mark problems as public"
msgstr "課題をパブリックに印付けます。"
-#: judge/admin/problem.py:211
+#: judge/admin/problem.py:212
#, python-format
msgid "%d problem successfully marked as private."
msgid_plural "%d problems successfully marked as private."
msgstr[0] "%d 個の課題はプライベートとして印付けられました。"
-#: judge/admin/problem.py:215
+#: judge/admin/problem.py:216
msgid "Mark problems as private"
msgstr "課題をプライベートに印付けます"
@@ -314,34 +314,34 @@ msgstr "課題をプライベートに印付けます"
msgid "timezone"
msgstr "時間帯"
-#: judge/admin/profile.py:88 judge/admin/submission.py:217
+#: judge/admin/profile.py:98 judge/admin/submission.py:217
#: templates/organization/requests/log.html:9
#: templates/organization/requests/pending.html:12
#: templates/ticket/list.html:261
msgid "User"
msgstr "利用者"
-#: judge/admin/profile.py:93 templates/registration/registration_form.html:143
+#: judge/admin/profile.py:103 templates/registration/registration_form.html:143
msgid "Email"
msgstr "電子メール"
-#: judge/admin/profile.py:98 judge/views/register.py:29
+#: judge/admin/profile.py:108 judge/views/register.py:28
#: templates/registration/registration_form.html:171
-#: templates/user/edit-profile.html:288
+#: templates/user/edit-profile.html:292
msgid "Timezone"
msgstr "時間帯"
-#: judge/admin/profile.py:103
+#: judge/admin/profile.py:113
msgid "date joined"
msgstr "入会日"
-#: judge/admin/profile.py:110
+#: judge/admin/profile.py:120
#, python-format
msgid "%d user have scores recalculated."
msgid_plural "%d users have scores recalculated."
msgstr[0] "%d 人の利用者の得点が再計算されました。"
-#: judge/admin/profile.py:113
+#: judge/admin/profile.py:123
msgid "Recalculate scores"
msgstr "得点を再計算する"
@@ -493,115 +493,116 @@ msgstr ""
msgid "IOI (pre-2016)"
msgstr ""
-#: judge/forms.py:26
-msgid "Two-factor authentication tokens must be 6 decimal digits."
+#: judge/forms.py:27
+#, python-brace-format
+msgid "Two-factor authentication tokens must be {TOTP_CODE_LENGTH} decimal digits."
msgstr ""
-#: judge/forms.py:29
+#: judge/forms.py:30
msgid "Invalid two-factor authentication token."
msgstr ""
-#: judge/forms.py:32
+#: judge/forms.py:33
msgid "Scratch codes must be 16 base32 characters."
msgstr ""
-#: judge/forms.py:34
+#: judge/forms.py:35 judge/forms.py:264
msgid "Invalid scratch code."
msgstr ""
-#: judge/forms.py:45
+#: judge/forms.py:46
msgid "Subscribe to contest updates"
msgstr "コンテストの更新を購読する"
-#: judge/forms.py:46
+#: judge/forms.py:47
msgid "Enable experimental features"
msgstr "実験的な機能を有効化する"
-#: judge/forms.py:71
+#: judge/forms.py:72
msgid "You must solve at least one problem before you can update your profile."
msgstr ""
-#: judge/forms.py:80 judge/views/organization.py:127
+#: judge/forms.py:81 judge/views/organization.py:126
#, python-brace-format
msgid "You may not be part of more than {count} public organizations."
msgstr "あなたは {count} 個以上の公開組織に参加できない場合があります。"
-#: judge/forms.py:96
+#: judge/forms.py:97
msgid "Download comments?"
msgstr ""
-#: judge/forms.py:97
+#: judge/forms.py:98
msgid "Download submissions?"
msgstr ""
-#: judge/forms.py:98
+#: judge/forms.py:99
msgid "Filter by problem code glob:"
msgstr ""
-#: judge/forms.py:102
+#: judge/forms.py:103
msgid "Leave empty to include all submissions"
msgstr ""
-#: judge/forms.py:105 templates/problem/manage_submission.html:142
+#: judge/forms.py:106 templates/problem/manage_submission.html:142
msgid "Filter by result:"
msgstr ""
-#: judge/forms.py:111
+#: judge/forms.py:112
msgid "Please select at least one thing to download."
msgstr ""
-#: judge/forms.py:137
+#: judge/forms.py:138
msgid "Any judge"
msgstr ""
-#: judge/forms.py:167 judge/views/register.py:26
+#: judge/forms.py:159 judge/views/register.py:25
#: templates/registration/registration_form.html:137
#: templates/user/base-users-table.html:5
msgid "Username"
msgstr "利用者名"
-#: judge/forms.py:168 templates/registration/registration_form.html:149
+#: judge/forms.py:160 templates/registration/registration_form.html:149
#: templates/registration/registration_form.html:163
msgid "Password"
msgstr "パスワード"
-#: judge/forms.py:201
+#: judge/forms.py:192
msgid "Invalid code length."
msgstr ""
-#: judge/forms.py:219
+#: judge/forms.py:223
msgid "Invalid WebAuthn response."
msgstr ""
-#: judge/forms.py:222
+#: judge/forms.py:226
msgid "No WebAuthn challenge issued."
msgstr ""
-#: judge/forms.py:228
+#: judge/forms.py:232
msgid "Invalid WebAuthn credential ID."
msgstr ""
-#: judge/forms.py:257
+#: judge/forms.py:262
msgid "Invalid two-factor authentication token or scratch code."
msgstr ""
-#: judge/forms.py:259
+#: judge/forms.py:266
msgid "Must specify either totp_token or webauthn_response."
msgstr ""
-#: judge/forms.py:263 judge/models/problem.py:105
+#: judge/forms.py:270 judge/models/problem.py:119
msgid "Problem code must be ^[a-z0-9]+$"
msgstr "課題のコードは ^[a-z0-9]+$ でなければなりません"
-#: judge/forms.py:268
+#: judge/forms.py:275
msgid "Problem with code already exists."
msgstr "このコードを使用している問題はすでに存在しています。"
-#: judge/forms.py:273 judge/models/contest.py:66
+#: judge/forms.py:280 judge/models/contest.py:66
msgid "Contest id must be ^[a-z0-9]+$"
msgstr "コンテスト id は ^[a-z0-9]+$ でなければなりません"
-#: judge/forms.py:278
+#: judge/forms.py:285
msgid "Contest with key already exists."
msgstr "同じキーを持つコンテストはすでに存在しています。"
@@ -681,7 +682,7 @@ msgid "comments"
msgstr "コメント"
#: judge/models/comment.py:89 judge/models/comment.py:141
-#: judge/models/problem.py:484
+#: judge/models/problem.py:511
#, python-format
msgid "Editorial for %s"
msgstr "%s の論説"
@@ -722,7 +723,7 @@ msgstr "タグの説明"
msgid "contest tag"
msgstr "コンテストのタグ"
-#: judge/models/contest.py:53 judge/models/contest.py:117
+#: judge/models/contest.py:53 judge/models/contest.py:126
msgid "contest tags"
msgstr "コンテストのタグ"
@@ -747,410 +748,426 @@ msgid "contest name"
msgstr "コンテスト名"
#: judge/models/contest.py:68
-msgid "These people will be able to edit the contest."
-msgstr "これらの人々 は、コンテストを編集することができます。"
+msgid "These users will be able to edit the contest."
+msgstr ""
+
+#: judge/models/contest.py:70
+msgid "These users will be able to edit the contest, but will not be listed as authors."
+msgstr ""
-#: judge/models/contest.py:70 judge/models/runtime.py:136
+#: judge/models/contest.py:73
+msgid "These users will be able to view the contest, but not edit it."
+msgstr ""
+
+#: judge/models/contest.py:76 judge/models/runtime.py:136
msgid "description"
msgstr "説明"
-#: judge/models/contest.py:71 judge/models/problem.py:431
+#: judge/models/contest.py:77 judge/models/problem.py:458
#: judge/models/runtime.py:138
msgid "problems"
msgstr "課題"
-#: judge/models/contest.py:72 judge/models/contest.py:384
+#: judge/models/contest.py:78 judge/models/contest.py:420
msgid "start time"
msgstr "開始時刻"
-#: judge/models/contest.py:73
+#: judge/models/contest.py:79
msgid "end time"
msgstr "終了時刻"
-#: judge/models/contest.py:74 judge/models/problem.py:126
-#: judge/models/problem.py:455
+#: judge/models/contest.py:80 judge/models/problem.py:140
+#: judge/models/problem.py:482
msgid "time limit"
msgstr "時間制限"
-#: judge/models/contest.py:75 judge/models/problem.py:144
+#: judge/models/contest.py:81 judge/models/problem.py:158
msgid "publicly visible"
msgstr "公開されています"
-#: judge/models/contest.py:76
+#: judge/models/contest.py:82
msgid "Should be set even for organization-private contests, where it determines whether the contest is visible to members of the specified organizations."
msgstr "コンテストが指定された組織のメンバーに表示されるかどうかを決定するものであり、組織にプライベートなコンテストには設定すべきです。"
-#: judge/models/contest.py:79
+#: judge/models/contest.py:85
msgid "contest rated"
msgstr "評価されているコンテスト"
-#: judge/models/contest.py:79
+#: judge/models/contest.py:85
msgid "Whether this contest can be rated."
msgstr "このコンテストを評価できるようにするか。"
-#: judge/models/contest.py:81
+#: judge/models/contest.py:87
msgid "view contest scoreboard"
msgstr ""
-#: judge/models/contest.py:83
+#: judge/models/contest.py:89
msgid "These users will be able to view the scoreboard."
msgstr ""
-#: judge/models/contest.py:84
+#: judge/models/contest.py:90
msgid "scoreboard visibility"
msgstr ""
-#: judge/models/contest.py:85
+#: judge/models/contest.py:91
msgid "Scoreboard visibility through the duration of the contest"
msgstr ""
-#: judge/models/contest.py:87
+#: judge/models/contest.py:93
msgid "no comments"
msgstr "コメントがありません"
-#: judge/models/contest.py:88
+#: judge/models/contest.py:94
msgid "Use clarification system instead of comments."
msgstr "コメントではなく解説システムを使う。"
-#: judge/models/contest.py:90
+#: judge/models/contest.py:96
msgid "Rating floor for contest"
msgstr ""
-#: judge/models/contest.py:92
+#: judge/models/contest.py:98
msgid "Rating ceiling for contest"
msgstr ""
-#: judge/models/contest.py:94
+#: judge/models/contest.py:100
msgid "rate all"
msgstr "全てを評価する"
-#: judge/models/contest.py:94
+#: judge/models/contest.py:100
msgid "Rate all users who joined."
msgstr "参加している全ての利用者を評価する。"
-#: judge/models/contest.py:95
+#: judge/models/contest.py:101
msgid "exclude from ratings"
msgstr "評価から除外する"
-#: judge/models/contest.py:97
+#: judge/models/contest.py:103
msgid "private to specific users"
msgstr ""
-#: judge/models/contest.py:98
+#: judge/models/contest.py:104
msgid "private contestants"
msgstr "プライベートな参加者"
-#: judge/models/contest.py:99
+#: judge/models/contest.py:105
msgid "If private, only these users may see the contest"
msgstr "もしプライベートであれば、その参加者のみがコンテストを見ることができます。"
-#: judge/models/contest.py:101
+#: judge/models/contest.py:107
msgid "hide problem tags"
msgstr "課題のタグを非表示にする"
-#: judge/models/contest.py:102
+#: judge/models/contest.py:108
msgid "Whether problem tags should be hidden by default."
msgstr "課題タグをデフォルトで非表示にするかどうか"
-#: judge/models/contest.py:104
+#: judge/models/contest.py:110
+msgid "hide problem authors"
+msgstr ""
+
+#: judge/models/contest.py:111
+msgid "Whether problem authors should be hidden by default."
+msgstr ""
+
+#: judge/models/contest.py:113
msgid "run pretests only"
msgstr "予備テストのみ実行する"
-#: judge/models/contest.py:105
+#: judge/models/contest.py:114
msgid "Whether judges should grade pretests only, versus all testcases. Commonly set during a contest, then unset prior to rejudging user submissions when the contest ends."
msgstr "判定器が予備テストだけを採点するか、全てのテストケースを行なうか。一般的にはコンテスト中に設定し、コンテストが終了して利用者の提出物を再判定する前に解除する。"
-#: judge/models/contest.py:109 judge/models/problem.py:166
+#: judge/models/contest.py:118 judge/models/problem.py:183
msgid "private to organizations"
msgstr "組織へプライベートにする"
-#: judge/models/contest.py:110 judge/models/problem.py:164
-#: judge/models/profile.py:83
+#: judge/models/contest.py:119 judge/models/problem.py:181
+#: judge/models/profile.py:86
msgid "organizations"
msgstr "組織"
-#: judge/models/contest.py:111
+#: judge/models/contest.py:120
msgid "If private, only these organizations may see the contest"
msgstr "もしプライベートであれば、組織の者だけがコンテストを見ることができます"
-#: judge/models/contest.py:112 judge/models/problem.py:153
+#: judge/models/contest.py:121 judge/models/problem.py:167
msgid "OpenGraph image"
msgstr "OpenGraph 画像"
-#: judge/models/contest.py:113 judge/models/profile.py:54
+#: judge/models/contest.py:122 judge/models/profile.py:57
msgid "Logo override image"
msgstr ""
-#: judge/models/contest.py:115
+#: judge/models/contest.py:124
msgid "This image will replace the default site logo for users inside the contest."
msgstr ""
-#: judge/models/contest.py:118
+#: judge/models/contest.py:127
msgid "the amount of live participants"
msgstr "ライブ参加者の人数"
-#: judge/models/contest.py:119
+#: judge/models/contest.py:128
msgid "contest summary"
msgstr "コンテスト概要"
-#: judge/models/contest.py:120 judge/models/problem.py:155
+#: judge/models/contest.py:129 judge/models/problem.py:169
msgid "Plain-text, shown in meta description tag, e.g. for social media."
msgstr "ソーシャルメディアなどのメタ説明タグに表示されるプレーンテキスト。"
-#: judge/models/contest.py:121 judge/models/profile.py:53
+#: judge/models/contest.py:130 judge/models/profile.py:56
msgid "access code"
msgstr "アクセスコード"
-#: judge/models/contest.py:122
+#: judge/models/contest.py:131
msgid "An optional code to prompt contestants before they are allowed to join the contest. Leave it blank to disable."
msgstr "コンテストへの参加が許可される前に競技者に提示するオプションのコード。無効にするには空白のままにします。"
-#: judge/models/contest.py:124 judge/models/problem.py:149
+#: judge/models/contest.py:133 judge/models/problem.py:163
msgid "personae non gratae"
msgstr "感謝しない人"
-#: judge/models/contest.py:125
+#: judge/models/contest.py:134
msgid "Bans the selected users from joining this contest."
msgstr "選択した利用者の、このコンテストへの参加を禁止する。"
-#: judge/models/contest.py:126
+#: judge/models/contest.py:135
msgid "contest format"
msgstr ""
-#: judge/models/contest.py:127
+#: judge/models/contest.py:136
msgid "The contest format module to use."
msgstr ""
-#: judge/models/contest.py:128
+#: judge/models/contest.py:137
msgid "contest format configuration"
msgstr ""
-#: judge/models/contest.py:129
+#: judge/models/contest.py:138
msgid "A JSON object to serve as the configuration for the chosen contest format module. Leave empty to use None. Exact format depends on the contest format selected."
msgstr ""
-#: judge/models/contest.py:136
+#: judge/models/contest.py:145
msgid "contest lock"
msgstr ""
-#: judge/models/contest.py:137
-msgid "Prevent submissions from this contest from being rejudged."
+#: judge/models/contest.py:146
+msgid "Prevent submissions from this contest from being rejudged after this date."
msgstr ""
-#: judge/models/contest.py:138
+#: judge/models/contest.py:148
msgid "precision points"
msgstr ""
-#: judge/models/contest.py:140
+#: judge/models/contest.py:150
msgid "Number of digits to round points to."
msgstr ""
-#: judge/models/contest.py:362
+#: judge/models/contest.py:398
msgid "See private contests"
msgstr "プライベートのコンテストを見る"
-#: judge/models/contest.py:363
+#: judge/models/contest.py:399
msgid "Edit own contests"
msgstr "自分のコンテストを編集する"
-#: judge/models/contest.py:364
+#: judge/models/contest.py:400
msgid "Edit all contests"
msgstr "全てのコンテストを編集する"
-#: judge/models/contest.py:365
+#: judge/models/contest.py:401
msgid "Clone contest"
msgstr "コンテストをクローンする"
-#: judge/models/contest.py:366 templates/contest/moss.html:74
+#: judge/models/contest.py:402 templates/contest/moss.html:74
msgid "MOSS contest"
msgstr "MOSSコンテスト"
-#: judge/models/contest.py:367
+#: judge/models/contest.py:403
msgid "Rate contests"
msgstr "コンテストを評価する"
-#: judge/models/contest.py:368
+#: judge/models/contest.py:404
msgid "Contest access codes"
msgstr "コンテストのアクセス コード"
-#: judge/models/contest.py:369
+#: judge/models/contest.py:405
msgid "Create private contests"
msgstr "プライベートなコンテストの生成"
-#: judge/models/contest.py:370
+#: judge/models/contest.py:406
msgid "Change contest visibility"
msgstr ""
-#: judge/models/contest.py:371
+#: judge/models/contest.py:407
msgid "Edit contest problem label script"
msgstr ""
-#: judge/models/contest.py:372
+#: judge/models/contest.py:408
msgid "Change lock status of contest"
msgstr ""
-#: judge/models/contest.py:374 judge/models/contest.py:472
-#: judge/models/contest.py:510 judge/models/contest.py:532
-#: judge/models/submission.py:84
+#: judge/models/contest.py:410 judge/models/contest.py:508
+#: judge/models/contest.py:547 judge/models/contest.py:569
+#: judge/models/submission.py:85
msgid "contest"
msgstr "コンテスト"
-#: judge/models/contest.py:375
+#: judge/models/contest.py:411
msgid "contests"
msgstr "コンテスト"
-#: judge/models/contest.py:382
+#: judge/models/contest.py:418
msgid "associated contest"
msgstr "関連するコンテスト"
-#: judge/models/contest.py:385
+#: judge/models/contest.py:421
msgid "score"
msgstr "得点"
-#: judge/models/contest.py:386
+#: judge/models/contest.py:422
msgid "cumulative time"
msgstr "累積時間"
-#: judge/models/contest.py:387
+#: judge/models/contest.py:423
msgid "is disqualified"
msgstr ""
-#: judge/models/contest.py:388
+#: judge/models/contest.py:424
msgid "Whether this participation is disqualified."
msgstr ""
-#: judge/models/contest.py:389
+#: judge/models/contest.py:425
msgid "tie-breaking field"
msgstr ""
-#: judge/models/contest.py:390
+#: judge/models/contest.py:426
msgid "virtual participation id"
msgstr "仮想参加 id"
-#: judge/models/contest.py:391
+#: judge/models/contest.py:427
msgid "0 means non-virtual, otherwise the n-th virtual participation."
msgstr ""
-#: judge/models/contest.py:392
+#: judge/models/contest.py:428
msgid "contest format specific data"
msgstr ""
-#: judge/models/contest.py:458
+#: judge/models/contest.py:494
#, python-format
msgid "%s spectating in %s"
msgstr "%s は %s を観戦している"
-#: judge/models/contest.py:460
+#: judge/models/contest.py:496
#, python-format
msgid "%s in %s, v%d"
msgstr "%s は %s 中で v%d として参加"
-#: judge/models/contest.py:461
+#: judge/models/contest.py:497
#, python-format
msgid "%s in %s"
msgstr "%s は %s に参加"
-#: judge/models/contest.py:464
+#: judge/models/contest.py:500
msgid "contest participation"
msgstr "コンテスト参加者"
-#: judge/models/contest.py:465
+#: judge/models/contest.py:501
msgid "contest participations"
msgstr "コンテスト参加者"
-#: judge/models/contest.py:471 judge/models/contest.py:494
-#: judge/models/contest.py:533 judge/models/problem.py:430
-#: judge/models/problem.py:435 judge/models/problem.py:453
+#: judge/models/contest.py:507 judge/models/contest.py:531
+#: judge/models/contest.py:570 judge/models/problem.py:457
+#: judge/models/problem.py:462 judge/models/problem.py:480
#: judge/models/problem_data.py:35
msgid "problem"
msgstr "課題"
-#: judge/models/contest.py:473 judge/models/contest.py:498
-#: judge/models/problem.py:137
+#: judge/models/contest.py:509 judge/models/contest.py:535
+#: judge/models/problem.py:151
msgid "points"
msgstr "点数"
-#: judge/models/contest.py:474
+#: judge/models/contest.py:510
msgid "partial"
msgstr "部分点"
-#: judge/models/contest.py:475 judge/models/contest.py:499
+#: judge/models/contest.py:511 judge/models/contest.py:536
msgid "is pretested"
msgstr "予備テストされているか"
-#: judge/models/contest.py:476 judge/models/interface.py:43
+#: judge/models/contest.py:512 judge/models/interface.py:43
msgid "order"
msgstr "順番"
-#: judge/models/contest.py:477
+#: judge/models/contest.py:513
msgid "output prefix length override"
msgstr "出力プレフィックス長のオーバーライド"
-#: judge/models/contest.py:479
+#: judge/models/contest.py:515
msgid "Maximum number of submissions for this problem, or leave blank for no limit."
msgstr ""
-#: judge/models/contest.py:482
+#: judge/models/contest.py:518
msgid "Why include a problem you can't submit to?"
msgstr "なぜあなたが提出できない課題を含むのか?"
-#: judge/models/contest.py:487
+#: judge/models/contest.py:523
msgid "contest problem"
msgstr "コンテストの課題"
-#: judge/models/contest.py:488
+#: judge/models/contest.py:524
msgid "contest problems"
msgstr "コンテストの課題"
-#: judge/models/contest.py:492 judge/models/submission.py:207
+#: judge/models/contest.py:529 judge/models/submission.py:218
msgid "submission"
msgstr "提出"
-#: judge/models/contest.py:496 judge/models/contest.py:511
+#: judge/models/contest.py:533 judge/models/contest.py:548
msgid "participation"
msgstr "参加者"
-#: judge/models/contest.py:500
+#: judge/models/contest.py:537
msgid "Whether this submission was ran only on pretests."
msgstr "この提出物が予備テストだけを実行したのかどうか。"
-#: judge/models/contest.py:504
+#: judge/models/contest.py:541
msgid "contest submission"
msgstr "コンテスト提出"
-#: judge/models/contest.py:505
+#: judge/models/contest.py:542
msgid "contest submissions"
msgstr "コンテスト提出"
-#: judge/models/contest.py:513
+#: judge/models/contest.py:550
msgid "rank"
msgstr "順位"
-#: judge/models/contest.py:514
+#: judge/models/contest.py:551
msgid "rating"
msgstr "評価"
-#: judge/models/contest.py:515
+#: judge/models/contest.py:552
msgid "volatility"
msgstr "変動率"
-#: judge/models/contest.py:516
+#: judge/models/contest.py:553
msgid "last rated"
msgstr "最後の評価"
-#: judge/models/contest.py:520
+#: judge/models/contest.py:557
msgid "contest rating"
msgstr "コンテストの評価"
-#: judge/models/contest.py:521
+#: judge/models/contest.py:558
msgid "contest ratings"
msgstr "コンテストの評価"
-#: judge/models/contest.py:540
+#: judge/models/contest.py:577
msgid "contest moss result"
msgstr ""
-#: judge/models/contest.py:541
+#: judge/models/contest.py:578
msgid "contest moss results"
msgstr ""
@@ -1190,7 +1207,7 @@ msgstr "親項目"
msgid "post title"
msgstr "投稿の題目"
-#: judge/models/interface.py:67 judge/models/problem.py:473
+#: judge/models/interface.py:67 judge/models/problem.py:500
msgid "authors"
msgstr "著者"
@@ -1198,7 +1215,7 @@ msgstr "著者"
msgid "slug"
msgstr "スラグ"
-#: judge/models/interface.py:69 judge/models/problem.py:471
+#: judge/models/interface.py:69 judge/models/problem.py:498
msgid "public visibility"
msgstr "一般公開"
@@ -1234,34 +1251,6 @@ msgstr "ブログ投稿"
msgid "blog posts"
msgstr "ブログ投稿"
-#: judge/models/message.py:11
-msgid "message title"
-msgstr "メッセージ題目"
-
-#: judge/models/message.py:12 judge/models/ticket.py:30
-msgid "message body"
-msgstr "メッセージ本文"
-
-#: judge/models/message.py:13
-msgid "sender"
-msgstr "送信者"
-
-#: judge/models/message.py:14
-msgid "target"
-msgstr "宛先"
-
-#: judge/models/message.py:15
-msgid "message timestamp"
-msgstr "メッセージのタイムスタンプ"
-
-#: judge/models/message.py:16
-msgid "read"
-msgstr "読む"
-
-#: judge/models/message.py:20
-msgid "messages in the thread"
-msgstr "スレッド中のメッセージ"
-
#: judge/models/problem.py:30
#, python-format
msgid "Disallowed characters: %(value)s"
@@ -1279,7 +1268,7 @@ msgstr "課題分類名"
msgid "problem type"
msgstr "課題のタイプ"
-#: judge/models/problem.py:44 judge/models/problem.py:121
+#: judge/models/problem.py:44 judge/models/problem.py:135
msgid "problem types"
msgstr "課題のタイプ"
@@ -1291,7 +1280,7 @@ msgstr "課題のグループ ID"
msgid "problem group name"
msgstr "課題のグループ名"
-#: judge/models/problem.py:56 judge/models/problem.py:124
+#: judge/models/problem.py:56 judge/models/problem.py:138
msgid "problem group"
msgstr "課題グループ"
@@ -1311,7 +1300,7 @@ msgstr "リンク"
msgid "full name"
msgstr "氏名"
-#: judge/models/problem.py:65 judge/models/profile.py:41
+#: judge/models/problem.py:65 judge/models/profile.py:44
#: judge/models/runtime.py:24
msgid "short name"
msgstr "短縮名"
@@ -1340,232 +1329,252 @@ msgstr "ライセンス"
msgid "licenses"
msgstr "ライセンス"
-#: judge/models/problem.py:104
+#: judge/models/problem.py:112
+msgid "Follow global setting"
+msgstr ""
+
+#: judge/models/problem.py:113
+msgid "Always visible"
+msgstr ""
+
+#: judge/models/problem.py:114
+msgid "Visible if problem solved"
+msgstr ""
+
+#: judge/models/problem.py:115
+msgid "Only own submissions"
+msgstr ""
+
+#: judge/models/problem.py:118
msgid "problem code"
msgstr "課題のコード"
-#: judge/models/problem.py:106
+#: judge/models/problem.py:120
msgid "A short, unique code for the problem, used in the url after /problem/"
msgstr "問題に対する短くて唯一なコード、URL で /problem/ の後に使用される"
-#: judge/models/problem.py:108
+#: judge/models/problem.py:122
msgid "problem name"
msgstr "課題名"
-#: judge/models/problem.py:109
+#: judge/models/problem.py:123
msgid "The full name of the problem, as shown in the problem list."
msgstr ""
-#: judge/models/problem.py:111
+#: judge/models/problem.py:125
msgid "problem body"
msgstr "課題本文"
-#: judge/models/problem.py:112
+#: judge/models/problem.py:126
msgid "creators"
msgstr "作成者"
-#: judge/models/problem.py:113
+#: judge/models/problem.py:127
msgid "These users will be able to edit the problem, and be listed as authors."
msgstr ""
-#: judge/models/problem.py:115
+#: judge/models/problem.py:129
msgid "curators"
msgstr "キュレーター"
-#: judge/models/problem.py:116
+#: judge/models/problem.py:130
msgid "These users will be able to edit the problem, but not be listed as authors."
msgstr ""
-#: judge/models/problem.py:118
+#: judge/models/problem.py:132
msgid "testers"
msgstr "テスター"
-#: judge/models/problem.py:120
+#: judge/models/problem.py:134
msgid "These users will be able to view the private problem, but not edit it."
msgstr ""
-#: judge/models/problem.py:122
+#: judge/models/problem.py:136
msgid "The type of problem, as shown on the problem's page."
msgstr ""
-#: judge/models/problem.py:125
+#: judge/models/problem.py:139
msgid "The group of problem, shown under Category in the problem list."
msgstr ""
-#: judge/models/problem.py:127
+#: judge/models/problem.py:141
msgid "The time limit for this problem, in seconds. Fractional seconds (e.g. 1.5) are supported."
msgstr "この課題の秒単位での制限時間。小数秒(例えば1.5)はサポートされています。"
-#: judge/models/problem.py:131 judge/models/problem.py:458
+#: judge/models/problem.py:145 judge/models/problem.py:485
msgid "memory limit"
msgstr "メモリ制限"
-#: judge/models/problem.py:132
+#: judge/models/problem.py:146
msgid "The memory limit for this problem, in kilobytes (e.g. 64mb = 65536 kilobytes)."
msgstr "この課題のメモリ制限、キロバイト単位(例えば 64 mb = 65536 キロバイト)。"
-#: judge/models/problem.py:138
+#: judge/models/problem.py:152
msgid "Points awarded for problem completion. Points are displayed with a 'p' suffix if partial."
msgstr ""
-#: judge/models/problem.py:141
+#: judge/models/problem.py:155
msgid "allows partial points"
msgstr "部分点を許す"
-#: judge/models/problem.py:142
+#: judge/models/problem.py:156
msgid "allowed languages"
msgstr "許可されている言語"
-#: judge/models/problem.py:143
+#: judge/models/problem.py:157
msgid "List of allowed submission languages."
msgstr ""
-#: judge/models/problem.py:145
+#: judge/models/problem.py:159
msgid "manually managed"
msgstr "手動で管理されている"
-#: judge/models/problem.py:146
+#: judge/models/problem.py:160
msgid "Whether judges should be allowed to manage data or not."
msgstr ""
-#: judge/models/problem.py:147
+#: judge/models/problem.py:161
msgid "date of publishing"
msgstr "発行年月日"
-#: judge/models/problem.py:148
+#: judge/models/problem.py:162
msgid "Doesn't have magic ability to auto-publish due to backward compatibility"
msgstr "下位互換性を保つのために自動発行する魔法のような能力は持ちません。"
-#: judge/models/problem.py:150
+#: judge/models/problem.py:164
msgid "Bans the selected users from submitting to this problem."
msgstr ""
-#: judge/models/problem.py:152
+#: judge/models/problem.py:166
msgid "The license under which this problem is published."
msgstr ""
-#: judge/models/problem.py:154
+#: judge/models/problem.py:168
msgid "problem summary"
msgstr "課題の概要"
-#: judge/models/problem.py:156
+#: judge/models/problem.py:170
msgid "number of users"
msgstr ""
-#: judge/models/problem.py:157
+#: judge/models/problem.py:171
msgid "The number of users who solved the problem."
msgstr ""
-#: judge/models/problem.py:158
+#: judge/models/problem.py:172
msgid "solve rate"
msgstr ""
-#: judge/models/problem.py:159
+#: judge/models/problem.py:173
msgid "allow full markdown access"
msgstr ""
-#: judge/models/problem.py:165
+#: judge/models/problem.py:174
+msgid "submission source visibility"
+msgstr ""
+
+#: judge/models/problem.py:182
msgid "If private, only these organizations may see the problem."
msgstr ""
-#: judge/models/problem.py:420
+#: judge/models/problem.py:447
msgid "See hidden problems"
msgstr ""
-#: judge/models/problem.py:421
+#: judge/models/problem.py:448
msgid "Edit own problems"
msgstr ""
-#: judge/models/problem.py:422
+#: judge/models/problem.py:449
msgid "Edit all problems"
msgstr ""
-#: judge/models/problem.py:423
+#: judge/models/problem.py:450
msgid "Edit all public problems"
msgstr ""
-#: judge/models/problem.py:424
+#: judge/models/problem.py:451
msgid "Edit problems with full markup"
msgstr ""
-#: judge/models/problem.py:425 templates/problem/problem.html:161
+#: judge/models/problem.py:452 templates/problem/problem.html:161
msgid "Clone problem"
msgstr "課題を複製する"
-#: judge/models/problem.py:426
+#: judge/models/problem.py:453
msgid "Change is_public field"
msgstr ""
-#: judge/models/problem.py:427
+#: judge/models/problem.py:454
msgid "Change is_manually_managed field"
msgstr ""
-#: judge/models/problem.py:428
+#: judge/models/problem.py:455
msgid "See organization-private problems"
msgstr ""
-#: judge/models/problem.py:436 judge/models/problem.py:454
+#: judge/models/problem.py:463 judge/models/problem.py:481
#: judge/models/runtime.py:111
msgid "language"
msgstr "言語"
-#: judge/models/problem.py:437
+#: judge/models/problem.py:464
msgid "translated name"
msgstr "翻訳された名前"
-#: judge/models/problem.py:438
+#: judge/models/problem.py:465
msgid "translated description"
msgstr "翻訳された説明"
-#: judge/models/problem.py:442
+#: judge/models/problem.py:469
msgid "problem translation"
msgstr "翻訳された課題"
-#: judge/models/problem.py:443
+#: judge/models/problem.py:470
msgid "problem translations"
msgstr "翻訳された課題"
-#: judge/models/problem.py:447
+#: judge/models/problem.py:474
msgid "clarified problem"
msgstr "解説された課題"
-#: judge/models/problem.py:448
+#: judge/models/problem.py:475
msgid "clarification body"
msgstr "解説本文"
-#: judge/models/problem.py:449
+#: judge/models/problem.py:476
msgid "clarification timestamp"
msgstr "解説のタイムスタンプ"
-#: judge/models/problem.py:464
+#: judge/models/problem.py:491
msgid "language-specific resource limit"
msgstr "言語固有のリソース制限"
-#: judge/models/problem.py:465
+#: judge/models/problem.py:492
msgid "language-specific resource limits"
msgstr "言語固有のリソース制限"
-#: judge/models/problem.py:469
+#: judge/models/problem.py:496
msgid "associated problem"
msgstr "関連する課題"
-#: judge/models/problem.py:472
+#: judge/models/problem.py:499
msgid "publish date"
msgstr "発行日"
-#: judge/models/problem.py:474
+#: judge/models/problem.py:501
msgid "editorial content"
msgstr "編集内容"
-#: judge/models/problem.py:497
+#: judge/models/problem.py:524
msgid "See hidden solutions"
msgstr ""
-#: judge/models/problem.py:499
+#: judge/models/problem.py:526
msgid "solution"
msgstr "解答"
-#: judge/models/problem.py:500
+#: judge/models/problem.py:527
msgid "solutions"
msgstr "解答"
@@ -1677,112 +1686,112 @@ msgstr "点数"
msgid "case is pretest?"
msgstr "予備テストのケースか?"
-#: judge/models/profile.py:38
+#: judge/models/profile.py:41
msgid "organization title"
msgstr "組織の名称"
-#: judge/models/profile.py:39
+#: judge/models/profile.py:42
msgid "organization slug"
msgstr ""
-#: judge/models/profile.py:40
+#: judge/models/profile.py:43
msgid "Organization name shown in URL"
msgstr ""
-#: judge/models/profile.py:42
+#: judge/models/profile.py:45
msgid "Displayed beside user name during contests"
msgstr "コンテスト中に利用者名の横に表示されます"
-#: judge/models/profile.py:43
+#: judge/models/profile.py:46
msgid "organization description"
msgstr "組織の説明"
-#: judge/models/profile.py:44
+#: judge/models/profile.py:47
msgid "administrators"
msgstr "管理者"
-#: judge/models/profile.py:45
+#: judge/models/profile.py:48
msgid "Those who can edit this organization"
msgstr "この組織を編集できる人"
-#: judge/models/profile.py:46
+#: judge/models/profile.py:49
msgid "creation date"
msgstr "作成日"
-#: judge/models/profile.py:47
+#: judge/models/profile.py:50
msgid "is open organization?"
msgstr "オープンな組織か?"
-#: judge/models/profile.py:48
+#: judge/models/profile.py:51
msgid "Allow joining organization"
msgstr "組織への参加を許可する"
-#: judge/models/profile.py:49
+#: judge/models/profile.py:52
msgid "maximum size"
msgstr "最大サイズ"
-#: judge/models/profile.py:50
+#: judge/models/profile.py:53
msgid "Maximum amount of users in this organization, only applicable to private organizations"
msgstr "この組織の最大利用者数、プライベートな組織にのみ適用される"
-#: judge/models/profile.py:52
+#: judge/models/profile.py:55
msgid "Student access code"
msgstr "学生のアクセスコード"
-#: judge/models/profile.py:56
+#: judge/models/profile.py:59
msgid "This image will replace the default site logo for users viewing the organization."
msgstr ""
-#: judge/models/profile.py:79
+#: judge/models/profile.py:82
msgid "Administer organizations"
msgstr ""
-#: judge/models/profile.py:80
+#: judge/models/profile.py:83
msgid "Edit all organizations"
msgstr ""
-#: judge/models/profile.py:82 judge/models/profile.py:99
-#: judge/models/profile.py:269
+#: judge/models/profile.py:85 judge/models/profile.py:102
+#: judge/models/profile.py:293
msgid "organization"
msgstr "組織"
-#: judge/models/profile.py:87
+#: judge/models/profile.py:90
msgid "user associated"
msgstr "関連する利用者"
-#: judge/models/profile.py:88
+#: judge/models/profile.py:91
msgid "self-description"
msgstr "自己紹介"
-#: judge/models/profile.py:89
+#: judge/models/profile.py:92
msgid "location"
msgstr "位置"
-#: judge/models/profile.py:91
+#: judge/models/profile.py:94
msgid "preferred language"
msgstr "好みの言語"
-#: judge/models/profile.py:97
+#: judge/models/profile.py:100
msgid "last access time"
msgstr "最終アクセス時刻"
-#: judge/models/profile.py:98
+#: judge/models/profile.py:101
msgid "last IP"
msgstr "最終 IP アドレス"
-#: judge/models/profile.py:101
+#: judge/models/profile.py:104
msgid "display rank"
msgstr "順位を表示する"
-#: judge/models/profile.py:103
+#: judge/models/profile.py:106
msgid "Normal User"
msgstr ""
-#: judge/models/profile.py:104
+#: judge/models/profile.py:107
msgid "Problem Setter"
msgstr ""
-#: judge/models/profile.py:105 templates/base.html:220
+#: judge/models/profile.py:108 templates/base.html:220
#: templates/comments/list.html:99 templates/contest/contest-list-tabs.html:24
#: templates/contest/ranking-table.html:49
#: templates/problem/problem-list-tabs.html:6
@@ -1791,155 +1800,167 @@ msgstr ""
msgid "Admin"
msgstr "管理"
-#: judge/models/profile.py:106
+#: judge/models/profile.py:109
msgid "comment mute"
msgstr "コメントミュート"
-#: judge/models/profile.py:106
+#: judge/models/profile.py:109
msgid "Some users are at their best when silent."
msgstr "ある利用者は沈黙の時に能力を発揮する"
-#: judge/models/profile.py:108
+#: judge/models/profile.py:111
msgid "unlisted user"
msgstr ""
-#: judge/models/profile.py:108
+#: judge/models/profile.py:111
msgid "User will not be ranked."
msgstr ""
-#: judge/models/profile.py:111
+#: judge/models/profile.py:114
msgid "user script"
msgstr "利用者スクリプト"
-#: judge/models/profile.py:112
+#: judge/models/profile.py:115
msgid "User-defined JavaScript for site customization."
msgstr "サイトのカスタマイズするためのユーザー定義 JavaScript。"
-#: judge/models/profile.py:113
+#: judge/models/profile.py:116
msgid "current contest"
msgstr "現在のコンテスト"
-#: judge/models/profile.py:115
+#: judge/models/profile.py:118
msgid "math engine"
msgstr "数式エンジン"
-#: judge/models/profile.py:117
+#: judge/models/profile.py:120
msgid "the rendering engine used to render math"
msgstr "数式の表示に使用されるレンダリングエンジン"
-#: judge/models/profile.py:118
+#: judge/models/profile.py:121
msgid "TOTP 2FA enabled"
msgstr ""
-#: judge/models/profile.py:119
+#: judge/models/profile.py:122
msgid "check to enable TOTP-based two-factor authentication"
msgstr ""
-#: judge/models/profile.py:120
+#: judge/models/profile.py:123
msgid "WebAuthn 2FA enabled"
msgstr ""
-#: judge/models/profile.py:121
+#: judge/models/profile.py:124
msgid "check to enable WebAuthn-based two-factor authentication"
msgstr ""
-#: judge/models/profile.py:122
+#: judge/models/profile.py:125
msgid "TOTP key"
msgstr ""
-#: judge/models/profile.py:123
+#: judge/models/profile.py:126
msgid "32 character base32-encoded key for TOTP"
msgstr ""
-#: judge/models/profile.py:125
+#: judge/models/profile.py:128
msgid "TOTP key must be empty or base32"
msgstr ""
-#: judge/models/profile.py:126
+#: judge/models/profile.py:129
msgid "scratch codes"
msgstr ""
-#: judge/models/profile.py:127
+#: judge/models/profile.py:130
msgid "JSON array of 16 character base32-encoded codes for scratch codes"
msgstr ""
-#: judge/models/profile.py:131
+#: judge/models/profile.py:134
msgid "Scratch codes must be empty or a JSON array of 16-character base32 codes"
msgstr ""
-#: judge/models/profile.py:133
+#: judge/models/profile.py:136
+msgid "last TOTP timecode"
+msgstr ""
+
+#: judge/models/profile.py:137
msgid "API token"
msgstr ""
-#: judge/models/profile.py:134
+#: judge/models/profile.py:138
msgid "64 character hex-encoded API access token"
msgstr ""
-#: judge/models/profile.py:136
+#: judge/models/profile.py:140
msgid "API token must be None or hexadecimal"
msgstr ""
-#: judge/models/profile.py:137
+#: judge/models/profile.py:141
msgid "internal notes"
msgstr "内部メモ"
-#: judge/models/profile.py:138
+#: judge/models/profile.py:142
msgid "Notes for administrators regarding this user."
msgstr ""
-#: judge/models/profile.py:139
+#: judge/models/profile.py:143
msgid "last data download time"
msgstr ""
-#: judge/models/profile.py:236
+#: judge/models/profile.py:253
msgid "Shows in-progress development stuff"
msgstr ""
-#: judge/models/profile.py:237
+#: judge/models/profile.py:254
msgid "Edit TOTP settings"
msgstr ""
-#: judge/models/profile.py:239
+#: judge/models/profile.py:256
msgid "user profile"
msgstr "ユーザープロフィール"
-#: judge/models/profile.py:240
+#: judge/models/profile.py:257
msgid "user profiles"
msgstr "ユーザープロフィール"
-#: judge/models/profile.py:246
+#: judge/models/profile.py:263
msgid "device name"
msgstr ""
-#: judge/models/profile.py:247
+#: judge/models/profile.py:264
msgid "credential ID"
msgstr ""
-#: judge/models/profile.py:248
+#: judge/models/profile.py:265
msgid "public key"
msgstr ""
-#: judge/models/profile.py:249
+#: judge/models/profile.py:266
msgid "sign counter"
msgstr ""
-#: judge/models/profile.py:271
+#: judge/models/profile.py:287
+msgid "WebAuthn credential"
+msgstr ""
+
+#: judge/models/profile.py:288
+msgid "WebAuthn credentials"
+msgstr ""
+
+#: judge/models/profile.py:295
msgid "request time"
msgstr "要求時刻"
-#: judge/models/profile.py:272
+#: judge/models/profile.py:296
msgid "state"
msgstr "状態"
-#: judge/models/profile.py:277
+#: judge/models/profile.py:301
msgid "reason"
msgstr "理由"
-#: judge/models/profile.py:280
+#: judge/models/profile.py:304
msgid "organization join request"
msgstr "組織への参加要求"
-#: judge/models/profile.py:281
+#: judge/models/profile.py:305
msgid "organization join requests"
msgstr "組織への参加要求"
@@ -2095,210 +2116,210 @@ msgstr "判定器"
msgid "judge"
msgstr "判定器"
-#: judge/models/submission.py:20 judge/models/submission.py:47
+#: judge/models/submission.py:21 judge/models/submission.py:48
#: judge/utils/problems.py:74
msgid "Accepted"
msgstr "合格した"
-#: judge/models/submission.py:21 judge/models/submission.py:48
+#: judge/models/submission.py:22 judge/models/submission.py:49
msgid "Wrong Answer"
msgstr "間違った解答"
-#: judge/models/submission.py:22 judge/models/submission.py:50
+#: judge/models/submission.py:23 judge/models/submission.py:51
msgid "Time Limit Exceeded"
msgstr "時間制限を超過しました"
-#: judge/models/submission.py:23 judge/models/submission.py:51
+#: judge/models/submission.py:24 judge/models/submission.py:52
msgid "Memory Limit Exceeded"
msgstr "メモリの制限を超過しました"
-#: judge/models/submission.py:24 judge/models/submission.py:52
+#: judge/models/submission.py:25 judge/models/submission.py:53
msgid "Output Limit Exceeded"
msgstr "出力制限を超過しました"
-#: judge/models/submission.py:25 judge/models/submission.py:53
+#: judge/models/submission.py:26 judge/models/submission.py:54
msgid "Invalid Return"
msgstr "不正な戻り値"
-#: judge/models/submission.py:26 judge/models/submission.py:54
+#: judge/models/submission.py:27 judge/models/submission.py:55
msgid "Runtime Error"
msgstr "ランタイムエラー"
-#: judge/models/submission.py:27 judge/models/submission.py:41
-#: judge/models/submission.py:55 judge/utils/problems.py:76
+#: judge/models/submission.py:28 judge/models/submission.py:42
+#: judge/models/submission.py:56 judge/utils/problems.py:76
msgid "Compile Error"
msgstr "コンパイル エラー"
-#: judge/models/submission.py:28 judge/models/submission.py:40
+#: judge/models/submission.py:29 judge/models/submission.py:41
msgid "Internal Error"
msgstr "内部エラー"
-#: judge/models/submission.py:29
+#: judge/models/submission.py:30
msgid "Short circuit"
msgstr "短絡"
-#: judge/models/submission.py:30 judge/models/submission.py:42
-#: judge/models/submission.py:61
+#: judge/models/submission.py:31 judge/models/submission.py:43
+#: judge/models/submission.py:62
msgid "Aborted"
msgstr "中断された"
-#: judge/models/submission.py:36 judge/models/submission.py:57
+#: judge/models/submission.py:37 judge/models/submission.py:58
msgid "Queued"
msgstr "順番待ち"
-#: judge/models/submission.py:37 judge/models/submission.py:58
+#: judge/models/submission.py:38 judge/models/submission.py:59
msgid "Processing"
msgstr "処理中"
-#: judge/models/submission.py:38 judge/models/submission.py:59
+#: judge/models/submission.py:39 judge/models/submission.py:60
msgid "Grading"
msgstr "採点中"
-#: judge/models/submission.py:39 judge/models/submission.py:60
+#: judge/models/submission.py:40 judge/models/submission.py:61
msgid "Completed"
msgstr "完了"
-#: judge/models/submission.py:56
+#: judge/models/submission.py:57
msgid "Internal Error (judging server error)"
msgstr "内部エラー(判定サーバエラー)"
-#: judge/models/submission.py:66
+#: judge/models/submission.py:67
msgid "submission time"
msgstr "提出時刻"
-#: judge/models/submission.py:67 judge/models/submission.py:227
+#: judge/models/submission.py:68 judge/models/submission.py:238
msgid "execution time"
msgstr "実行時間"
-#: judge/models/submission.py:68 judge/models/submission.py:228
+#: judge/models/submission.py:69 judge/models/submission.py:239
msgid "memory usage"
msgstr "メモリ使用量"
-#: judge/models/submission.py:69 judge/models/submission.py:229
+#: judge/models/submission.py:70 judge/models/submission.py:240
msgid "points granted"
msgstr "付与された点数"
-#: judge/models/submission.py:70
+#: judge/models/submission.py:71
msgid "submission language"
msgstr "提出言語"
-#: judge/models/submission.py:71
+#: judge/models/submission.py:72
msgid "status"
msgstr "状態"
-#: judge/models/submission.py:72
+#: judge/models/submission.py:73
msgid "result"
msgstr "結果"
-#: judge/models/submission.py:74
+#: judge/models/submission.py:75
msgid "compile errors"
msgstr "コンパイルエラー"
-#: judge/models/submission.py:76
+#: judge/models/submission.py:77
msgid "batched cases"
msgstr "バッチのケース"
-#: judge/models/submission.py:77
+#: judge/models/submission.py:78
msgid "test case points"
msgstr "テストケースの点数"
-#: judge/models/submission.py:78
+#: judge/models/submission.py:79
msgid "test case total points"
msgstr "テストケースの合計点"
-#: judge/models/submission.py:79
+#: judge/models/submission.py:80
msgid "judged on"
msgstr "判定された"
-#: judge/models/submission.py:81
+#: judge/models/submission.py:82
msgid "submission judge time"
msgstr ""
-#: judge/models/submission.py:82
-msgid "was rejudged by admin"
-msgstr "管理者により再判定された"
-
#: judge/models/submission.py:83
+msgid "last rejudge date by admin"
+msgstr ""
+
+#: judge/models/submission.py:84
msgid "was ran on pretests only"
msgstr "予備テストのみ実行された"
-#: judge/models/submission.py:86
-msgid "lock submission"
+#: judge/models/submission.py:87
+msgid "submission lock"
msgstr ""
-#: judge/models/submission.py:199
+#: judge/models/submission.py:210
msgid "Abort any submission"
msgstr ""
-#: judge/models/submission.py:200
+#: judge/models/submission.py:211
msgid "Rejudge the submission"
msgstr ""
-#: judge/models/submission.py:201
+#: judge/models/submission.py:212
msgid "Rejudge a lot of submissions"
msgstr ""
-#: judge/models/submission.py:202
+#: judge/models/submission.py:213
msgid "Submit without limit"
msgstr ""
-#: judge/models/submission.py:203
+#: judge/models/submission.py:214
msgid "View all submission"
msgstr ""
-#: judge/models/submission.py:204
+#: judge/models/submission.py:215
msgid "Resubmit others' submission"
msgstr ""
-#: judge/models/submission.py:205
+#: judge/models/submission.py:216
msgid "Change lock status of submission"
msgstr ""
-#: judge/models/submission.py:208 templates/contest/moss.html:58
+#: judge/models/submission.py:219 templates/contest/moss.html:58
msgid "submissions"
msgstr "提出"
-#: judge/models/submission.py:212 judge/models/submission.py:223
+#: judge/models/submission.py:223 judge/models/submission.py:234
msgid "associated submission"
msgstr "関連する提出物"
-#: judge/models/submission.py:214
+#: judge/models/submission.py:225
msgid "source code"
msgstr "ソースコード"
-#: judge/models/submission.py:225
+#: judge/models/submission.py:236
msgid "test case ID"
msgstr "テストケースの ID"
-#: judge/models/submission.py:226
+#: judge/models/submission.py:237
msgid "status flag"
msgstr "状態フラグ"
-#: judge/models/submission.py:230
+#: judge/models/submission.py:241
msgid "points possible"
msgstr "可能な点数"
-#: judge/models/submission.py:231
+#: judge/models/submission.py:242
msgid "batch number"
msgstr "バッチ番号"
-#: judge/models/submission.py:232
+#: judge/models/submission.py:243
msgid "judging feedback"
msgstr "判定のフィードバック"
-#: judge/models/submission.py:233
+#: judge/models/submission.py:244
msgid "extended judging feedback"
msgstr ""
-#: judge/models/submission.py:234
+#: judge/models/submission.py:245
msgid "program output"
msgstr "プログラムの出力"
-#: judge/models/submission.py:242
+#: judge/models/submission.py:253
msgid "submission test case"
msgstr "提出テストケース"
-#: judge/models/submission.py:243
+#: judge/models/submission.py:254
msgid "submission test cases"
msgstr "提出テストケース"
@@ -2346,6 +2367,10 @@ msgstr "チケット"
msgid "poster"
msgstr "投稿者"
+#: judge/models/ticket.py:30
+msgid "message body"
+msgstr "メッセージ本文"
+
#: judge/models/ticket.py:31
msgid "message time"
msgstr "メッセージの時刻"
@@ -2368,19 +2393,23 @@ msgstr ""
msgid "Running MOSS"
msgstr ""
-#: judge/tasks/submission.py:43
+#: judge/tasks/submission.py:45
msgid "Modifying submissions"
msgstr ""
-#: judge/tasks/submission.py:56
+#: judge/tasks/submission.py:58
msgid "Recalculating user points"
msgstr ""
-#: judge/tasks/user.py:50
+#: judge/tasks/user.py:49
+msgid "Applying filters"
+msgstr ""
+
+#: judge/tasks/user.py:64
msgid "Preparing your submission data"
msgstr ""
-#: judge/tasks/user.py:81
+#: judge/tasks/user.py:95
msgid "Preparing your comment data"
msgstr ""
@@ -2490,7 +2519,7 @@ msgstr ""
msgid "You already voted."
msgstr "あなたは既に投票しました。"
-#: judge/views/comment.py:129 judge/views/organization.py:298
+#: judge/views/comment.py:129 judge/views/organization.py:297
msgid "Edited from site"
msgstr "サイトから編集された"
@@ -2498,125 +2527,130 @@ msgstr "サイトから編集された"
msgid "Editing comment"
msgstr "コメントの編集"
-#: judge/views/contests.py:56 judge/views/contests.py:201
-#: judge/views/contests.py:204 judge/views/contests.py:382
+#: judge/views/contests.py:57 judge/views/contests.py:210
+#: judge/views/contests.py:213 judge/views/contests.py:395
msgid "No such contest"
msgstr "そのようなコンテストはありません"
-#: judge/views/contests.py:57 judge/views/contests.py:202
+#: judge/views/contests.py:58 judge/views/contests.py:211
#, python-format
msgid "Could not find a contest with the key \"%s\"."
msgstr "鍵 \"%s\" を持つコンテストは見つかりませんでした。"
-#: judge/views/contests.py:70
+#: judge/views/contests.py:71
msgid "Contests"
msgstr "コンテスト"
-#: judge/views/contests.py:205
+#: judge/views/contests.py:214
msgid "Could not find such contest."
msgstr "このようなコンテストは見つかりませんでした。"
-#: judge/views/contests.py:208
+#: judge/views/contests.py:217
#, python-format
msgid "Access to contest \"%s\" denied"
msgstr "コンテスト \"%s\" へのアクセスは拒否されました"
-#: judge/views/contests.py:235
+#: judge/views/contests.py:244
msgid "Clone Contest"
msgstr ""
-#: judge/views/contests.py:301
+#: judge/views/contests.py:278
+#, python-format
+msgid "Cloned contest from %s"
+msgstr ""
+
+#: judge/views/contests.py:314
msgid "Contest not ongoing"
msgstr "開催中ではないコンテスト"
-#: judge/views/contests.py:302
+#: judge/views/contests.py:315
#, python-format
msgid "\"%s\" is not currently ongoing."
msgstr "\"%s\" は現在開催中ではありません。"
-#: judge/views/contests.py:306
+#: judge/views/contests.py:319
msgid "Already in contest"
msgstr "既にコンテストに参加しています"
-#: judge/views/contests.py:307
+#: judge/views/contests.py:320
#, python-format
msgid "You are already in a contest: \"%s\"."
msgstr "あなたは既にコンテストに参加しています: \"%s\"。"
-#: judge/views/contests.py:310
+#: judge/views/contests.py:323
msgid "Banned from joining"
msgstr ""
-#: judge/views/contests.py:311
+#: judge/views/contests.py:324
msgid "You have been declared persona non grata for this contest. You are permanently barred from joining this contest."
msgstr ""
-#: judge/views/contests.py:372
+#: judge/views/contests.py:385
#, python-format
msgid "Enter access code for \"%s\""
msgstr "\"%s\" のアクセスコードを入力してください"
-#: judge/views/contests.py:383
+#: judge/views/contests.py:396
#, python-format
msgid "You are not in contest \"%s\"."
msgstr "あなたはコンテストに参加していません: \"%s\"。"
-#: judge/views/contests.py:402
+#: judge/views/contests.py:415
msgid "ContestCalendar requires integer year and month"
msgstr ""
-#: judge/views/contests.py:442
+#: judge/views/contests.py:455
#, python-format
msgid "Contests in %(month)s"
msgstr "%(month)s 年のコンテスト"
-#: judge/views/contests.py:442
+#: judge/views/contests.py:455
msgid "F Y"
msgstr ""
-#: judge/views/contests.py:489
+#: judge/views/contests.py:502
#, python-format
msgid "%s Statistics"
msgstr ""
-#: judge/views/contests.py:662
+#: judge/views/contests.py:675
#, python-format
msgid "%s Rankings"
msgstr "%s 順位表"
-#: judge/views/contests.py:670
+#: judge/views/contests.py:683
msgid "???"
msgstr "???"
-#: judge/views/contests.py:686
+#: judge/views/contests.py:699
#, python-format
msgid "Your participation in %s"
msgstr "あなたの %s への参加"
-#: judge/views/contests.py:687
+#: judge/views/contests.py:700
#, python-format
msgid "%s's participation in %s"
msgstr "%s の %s への参加"
-#: judge/views/contests.py:694
+#: judge/views/contests.py:707
msgid "Live"
msgstr "ライブ"
-#: judge/views/contests.py:706 templates/contest/contest-tabs.html:13
+#: judge/views/contests.py:719 templates/contest/contest-tabs.html:13
msgid "Participation"
msgstr "参加"
-#: judge/views/contests.py:750
+#: judge/views/contests.py:763
#, python-format
msgid "%s MOSS Results"
msgstr ""
-#: judge/views/contests.py:777
+#: judge/views/contests.py:790
#, python-format
msgid "Running MOSS for %s..."
msgstr ""
-#: judge/views/contests.py:800
+#: judge/views/contests.py:813
#, python-format
msgid "Contest tag: %s"
msgstr "コンテストタグ: %s"
@@ -2645,161 +2679,175 @@ msgstr "破損ページ %s"
msgid "Runtimes"
msgstr "ランタイム"
-#: judge/views/organization.py:44 judge/views/organization.py:47
+#: judge/views/organization.py:43 judge/views/organization.py:46
msgid "No such organization"
msgstr "このような組織はありません"
-#: judge/views/organization.py:45
+#: judge/views/organization.py:44
#, python-format
msgid "Could not find an organization with the key \"%s\"."
msgstr "鍵 \"%s\" を持つ組織は見つかりませんでした。"
-#: judge/views/organization.py:48
+#: judge/views/organization.py:47
msgid "Could not find such organization."
msgstr "このような組織を見つけることができませんでした。"
-#: judge/views/organization.py:72 judge/views/register.py:34
+#: judge/views/organization.py:71 judge/views/register.py:33
#: templates/organization/list.html:15 templates/user/user-list-tabs.html:5
msgid "Organizations"
msgstr "組織"
-#: judge/views/organization.py:93
+#: judge/views/organization.py:92
#, python-format
msgid "%s Members"
msgstr "%s のメンバー"
-#: judge/views/organization.py:118 judge/views/organization.py:121
-#: judge/views/organization.py:126
+#: judge/views/organization.py:117 judge/views/organization.py:120
+#: judge/views/organization.py:125
msgid "Joining organization"
msgstr "所属している組織"
-#: judge/views/organization.py:118
+#: judge/views/organization.py:117
msgid "You are already in the organization."
msgstr "あなたは、既にこの組織にしょぞくしています。"
-#: judge/views/organization.py:121
+#: judge/views/organization.py:120
msgid "This organization is not open."
msgstr "この組織は公開ではありません。"
-#: judge/views/organization.py:138
+#: judge/views/organization.py:137
msgid "Leaving organization"
msgstr "組織から脱退する"
-#: judge/views/organization.py:138
+#: judge/views/organization.py:137
#, python-format
msgid "You are not in \"%s\"."
msgstr "あなたは \"%s\" に所属していません。"
-#: judge/views/organization.py:162
+#: judge/views/organization.py:161
#, python-format
msgid "Request to join %s"
msgstr "%s への参加を申し込む"
-#: judge/views/organization.py:180
+#: judge/views/organization.py:179
msgid "Join request detail"
msgstr "参加申込みの詳細"
-#: judge/views/organization.py:208
+#: judge/views/organization.py:207
#, python-format
msgid "Managing join requests for %s"
msgstr "%s への参加申込みを管理する"
-#: judge/views/organization.py:239
+#: judge/views/organization.py:238
#, python-format
msgid "Your organization can only receive %d more members. You cannot approve %d users."
msgstr "あなたの組織はあと %d 人のメンバーしか受け入れられません。あなたは %d 人の利用者を承認できません。"
-#: judge/views/organization.py:251
+#: judge/views/organization.py:250
#, python-format
msgid "Approved %d user."
msgid_plural "Approved %d users."
msgstr[0] "%d 人の利用者を承認しました。"
-#: judge/views/organization.py:252
+#: judge/views/organization.py:251
#, python-format
msgid "Rejected %d user."
msgid_plural "Rejected %d users."
msgstr[0] "%d 人の利用者を拒否しました。"
-#: judge/views/organization.py:282
+#: judge/views/organization.py:281
#, python-format
msgid "Editing %s"
msgstr "%s を編集"
-#: judge/views/organization.py:306 judge/views/organization.py:314
+#: judge/views/organization.py:305 judge/views/organization.py:313
msgid "Can't edit organization"
msgstr "組織を編集できません"
-#: judge/views/organization.py:307
+#: judge/views/organization.py:306
msgid "You are not allowed to edit this organization."
msgstr "あなたは、この組織を編集することは許可されていません。"
-#: judge/views/organization.py:315
+#: judge/views/organization.py:314
msgid "You are not allowed to kick people from this organization."
msgstr "あなたはこの組織から人を追い出すことを許可されていません。"
-#: judge/views/organization.py:320 judge/views/organization.py:324
+#: judge/views/organization.py:319 judge/views/organization.py:323
msgid "Can't kick user"
msgstr "利用者を追い出せません"
-#: judge/views/organization.py:321
+#: judge/views/organization.py:320
msgid "The user you are trying to kick does not exist!"
msgstr "あなたが追い出そうとしている利用者は存在しません!"
-#: judge/views/organization.py:325
+#: judge/views/organization.py:324
#, python-format
msgid "The user you are trying to kick is not in organization: %s."
msgstr "あなたが追い出そうとしているユーザは組織内にいません: %s 。"
-#: judge/views/problem.py:67
+#: judge/views/problem.py:68
msgid "No such problem"
msgstr "そのような課題はありません"
-#: judge/views/problem.py:68
+#: judge/views/problem.py:69
#, python-format
msgid "Could not find a problem with the code \"%s\"."
msgstr "コード \"%s\" を有する課題は見つかりませんでした。"
-#: judge/views/problem.py:110
+#: judge/views/problem.py:111
#, python-brace-format
msgid "Editorial for {0}"
msgstr "{0} の論説"
-#: judge/views/problem.py:113
+#: judge/views/problem.py:114
#, python-brace-format
msgid "Editorial for {0}"
msgstr "{0} の論説"
-#: judge/views/problem.py:283 templates/contest/contest.html:79
+#: judge/views/problem.py:133
+msgid "No such editorial"
+msgstr ""
+
+#: judge/views/problem.py:134
+#, python-format
+msgid "Could not find an editorial with the code \"%s\"."
+msgstr ""
+
+#: judge/views/problem.py:289 templates/contest/contest.html:79
#: templates/user/user-tabs.html:5 templates/user/users-table.html:23
msgid "Problems"
msgstr "課題"
-#: judge/views/problem.py:556 judge/views/problem.py:564
+#: judge/views/problem.py:562 judge/views/problem.py:570
#, python-format
msgid "Submit to %s"
msgstr ""
-#: judge/views/problem.py:613
+#: judge/views/problem.py:619
msgid "Banned from submitting"
msgstr "提出が禁止された"
-#: judge/views/problem.py:614
+#: judge/views/problem.py:620
msgid "You have been declared persona non grata for this problem. You are permanently barred from submitting this problem."
msgstr "あなたはこの課題に感謝しない人として宣言されている。あなたはこの課題に提出することを永続的に禁止されている。"
-#: judge/views/problem.py:618
+#: judge/views/problem.py:624
msgid "Too many submissions"
msgstr "提出物が多過ぎます"
-#: judge/views/problem.py:619
+#: judge/views/problem.py:625
msgid "You have exceeded the submission limit for this problem."
msgstr "あなたは、この課題の提出制限を超えました"
-#: judge/views/problem.py:681
+#: judge/views/problem.py:693
msgid "Clone Problem"
msgstr ""
+#: judge/views/problem.py:720
+#, python-format
+msgid "Cloned problem from %s"
+msgstr ""
+
#: judge/views/problem_data.py:37
msgid "Checker arguments must be a JSON object"
msgstr "ジェッカー引数は JSON オブジェクトでなければなりません。"
@@ -2868,52 +2916,52 @@ msgstr "%s の最優秀解答"
msgid "Best solutions for {0}"
msgstr "{0} の最優秀解答"
-#: judge/views/ranked_submission.py:80
+#: judge/views/ranked_submission.py:82
#, python-format
msgid "Best solutions for %(problem)s in %(contest)s"
msgstr "%(contest)s 中の %(problem)s への最優秀解答"
-#: judge/views/ranked_submission.py:83
+#: judge/views/ranked_submission.py:85
#, python-format
msgid "Best solutions for problem %(number)s in %(contest)s"
msgstr "%(contest)s の課題 %(number)s への最優秀解答"
-#: judge/views/ranked_submission.py:89
+#: judge/views/ranked_submission.py:91
#, python-brace-format
msgid "Best solutions for {0} in {2}"
msgstr "{2} 中の {0} への最優秀解答"
-#: judge/views/ranked_submission.py:92
+#: judge/views/ranked_submission.py:94
#, python-brace-format
msgid "Best solutions for problem {0} in {1}"
msgstr "{1} 中の課題 {0} への最優秀解答"
-#: judge/views/register.py:27
+#: judge/views/register.py:26
msgid "A username must contain letters, numbers, or underscores"
msgstr "利用者名は文字、数字またはアンダースコアを含めることができます。"
-#: judge/views/register.py:31
+#: judge/views/register.py:30
msgid "Preferred language"
msgstr "好みの言語"
-#: judge/views/register.py:38
+#: judge/views/register.py:37
msgid "Subscribe to newsletter?"
msgstr "ニュースレターを購読しますか?"
-#: judge/views/register.py:45
+#: judge/views/register.py:44
#, python-format
msgid "The email address \"%s\" is already taken. Only one registration is allowed per address."
msgstr "電子メールアドレス \"%s\" は既に使用されています。1アドレスにつき1登録だけが許されています。"
-#: judge/views/register.py:51
+#: judge/views/register.py:50
msgid "Your email provider is not allowed due to history of abuse. Please use a reputable email provider."
msgstr "あなたの電子メールプロバイダは不正利用の履歴のため許可されていません。信頼できる電子メールプロバイダを利用してください。"
-#: judge/views/register.py:57 judge/views/register.py:95
+#: judge/views/register.py:56 judge/views/register.py:94
msgid "Registration"
msgstr "登録"
-#: judge/views/register.py:106
+#: judge/views/register.py:105
msgid "Authentication failure"
msgstr "認証の失敗"
@@ -2921,7 +2969,7 @@ msgstr "認証の失敗"
msgid "Language statistics"
msgstr "言語の統計"
-#: judge/views/status.py:24 templates/submission/list.html:311
+#: judge/views/status.py:24 templates/submission/list.html:310
msgid "Status"
msgstr "状態"
@@ -2929,74 +2977,74 @@ msgstr "状態"
msgid "Version matrix"
msgstr "バージョンマトリックス"
-#: judge/views/submission.py:53 judge/views/submission.py:60
+#: judge/views/submission.py:55 judge/views/submission.py:62
#, python-format
msgid "Submission of %(problem)s by %(user)s"
msgstr "%(user)s による %(problem)s への提出物"
-#: judge/views/submission.py:203 judge/views/submission.py:204
+#: judge/views/submission.py:205 judge/views/submission.py:206
#: templates/problem/problem.html:127
msgid "All submissions"
msgstr "全ての提出物"
-#: judge/views/submission.py:349
+#: judge/views/submission.py:355
msgid "All my submissions"
msgstr "私の全ての提出物"
-#: judge/views/submission.py:350
+#: judge/views/submission.py:356
#, python-format
msgid "All submissions by %s"
msgstr "%s による全ての提出物"
-#: judge/views/submission.py:381
+#: judge/views/submission.py:387
#, python-format
msgid "All submissions for %s"
msgstr "%s への全ての提出物"
-#: judge/views/submission.py:400
+#: judge/views/submission.py:410
msgid "Must pass a problem"
msgstr "課題を通過しなければなりません"
-#: judge/views/submission.py:439
+#: judge/views/submission.py:449
#, python-format
msgid "My submissions for %(problem)s"
msgstr "%(problem)s への私の提出物"
-#: judge/views/submission.py:440
+#: judge/views/submission.py:450
#, python-format
msgid "%(user)s's submissions for %(problem)s"
msgstr "%(problem)s への %(user)s による提出物"
-#: judge/views/submission.py:536
+#: judge/views/submission.py:546
msgid "Must pass a contest"
msgstr "コンテストを通過しなければなりません"
-#: judge/views/submission.py:544
+#: judge/views/submission.py:554
#, python-format
msgid "My submissions in %(contest)s"
msgstr ""
-#: judge/views/submission.py:545
+#: judge/views/submission.py:555
#, python-format
msgid "%(user)s's submissions in %(contest)s"
msgstr ""
-#: judge/views/submission.py:559
+#: judge/views/submission.py:569
#, python-brace-format
msgid "My submissions in {0}"
msgstr ""
-#: judge/views/submission.py:561
+#: judge/views/submission.py:571
#, python-brace-format
msgid "{0}'s submissions in {2}"
msgstr ""
-#: judge/views/submission.py:585
+#: judge/views/submission.py:597
#, python-brace-format
msgid "{0}'s submissions for {2} in {4}"
msgstr "{4} 中の {2} への {0} による提出物"
-#: judge/views/submission.py:590
+#: judge/views/submission.py:602
#, python-brace-format
msgid "{0}'s submissions for problem {2} in {3}"
msgstr "{3} 中の課題 {2} への {0} による提出物"
@@ -3013,40 +3061,40 @@ msgstr "問題の説明"
msgid "You must solve at least one problem before you can create a ticket."
msgstr ""
-#: judge/views/ticket.py:87 judge/views/ticket.py:90
+#: judge/views/ticket.py:91 judge/views/ticket.py:94
#, python-format
msgid "New ticket for %s"
msgstr "%s への新しいチケット"
-#: judge/views/ticket.py:144
+#: judge/views/ticket.py:148
#, python-format
msgid "%(title)s - Ticket %(id)d"
msgstr "%(title)s - チケット %(id)d"
-#: judge/views/ticket.py:249
+#: judge/views/ticket.py:253
#, python-format
msgid "Tickets - Page %(number)d of %(total)d"
msgstr "チケットのページ %(number)d / %(total)d"
-#: judge/views/ticket.py:298
+#: judge/views/ticket.py:302
#, python-format
msgid "New Ticket: %s"
msgstr "新しいチケット: %s"
-#: judge/views/ticket.py:299
+#: judge/views/ticket.py:303
#, python-format
msgid "#%(id)d, assigned to: %(users)s"
msgstr "#%(id)d, %(users)s に割り当てられた"
-#: judge/views/ticket.py:301
+#: judge/views/ticket.py:305
msgid ", "
msgstr "、"
-#: judge/views/ticket.py:301
+#: judge/views/ticket.py:305
msgid "no one"
msgstr "誰もいません"
-#: judge/views/ticket.py:321
+#: judge/views/ticket.py:325
#, python-format
msgid "New Ticket Message For: %s"
msgstr ""
@@ -3055,87 +3103,91 @@ msgstr ""
msgid "Enable Two-factor Authentication"
msgstr ""
-#: judge/views/two_factor.py:99
+#: judge/views/two_factor.py:108
+msgid "Refresh Two-factor Authentication"
+msgstr ""
+
+#: judge/views/two_factor.py:116
msgid "Disable Two-factor Authentication"
msgstr ""
-#: judge/views/two_factor.py:148
+#: judge/views/two_factor.py:165
msgid "Invalid WebAuthn response"
msgstr ""
-#: judge/views/two_factor.py:151
+#: judge/views/two_factor.py:168
msgid "Invalid name"
msgstr ""
-#: judge/views/two_factor.py:204
+#: judge/views/two_factor.py:221
msgid "Staff may not disable 2FA"
msgstr ""
-#: judge/views/two_factor.py:216
+#: judge/views/two_factor.py:229
msgid "Perform Two-factor Authentication"
msgstr ""
-#: judge/views/user.py:79
+#: judge/views/user.py:78
msgid "No such user"
msgstr "そのような利用者はいません"
-#: judge/views/user.py:79
+#: judge/views/user.py:78
#, python-format
msgid "No user handle \"%s\"."
msgstr "利用者ハンドル \"%s\" はありません。"
-#: judge/views/user.py:83
+#: judge/views/user.py:82
msgid "My account"
msgstr "自分のアカウント"
-#: judge/views/user.py:84
+#: judge/views/user.py:83
#, python-format
msgid "User %s"
msgstr "利用者 %s"
-#: judge/views/user.py:132
+#: judge/views/user.py:131
msgid "Login"
msgstr "ログイン"
-#: judge/views/user.py:173
+#: judge/views/user.py:172
msgid "M j, Y, G:i"
msgstr "M j, Y, G:i"
-#: judge/views/user.py:307
+#: judge/views/user.py:306
msgid "Preparing your data..."
msgstr ""
-#: judge/views/user.py:311 templates/user/edit-profile.html:348
+#: judge/views/user.py:310 templates/user/edit-profile.html:352
msgid "Download your data"
msgstr ""
-#: judge/views/user.py:367
+#: judge/views/user.py:366
msgid "Updated on site"
msgstr "サイトで更新された"
-#: judge/views/user.py:400 templates/admin/auth/user/change_form.html:14
+#: judge/views/user.py:399 templates/admin/auth/user/change_form.html:14
#: templates/admin/auth/user/change_form.html:17 templates/base.html:222
#: templates/user/user-tabs.html:16
msgid "Edit profile"
msgstr "プロフィールを編集する"
-#: judge/views/user.py:415
+#: judge/views/user.py:414
msgid "Generated API token for user"
msgstr ""
-#: judge/views/user.py:427
+#: judge/views/user.py:426
msgid "Removed API token for user"
msgstr ""
-#: judge/views/user.py:437
+#: judge/views/user.py:436
msgid "Generated scratch codes for user"
msgstr ""
-#: judge/views/user.py:443 templates/user/user-list-tabs.html:4
+#: judge/views/user.py:442 templates/user/user-list-tabs.html:4
msgid "Leaderboard"
msgstr "リーダーボード"
-#: judge/views/user.py:504
+#: judge/views/user.py:503
msgid "You have been successfully logged out."
msgstr ""
@@ -3264,11 +3316,11 @@ msgstr "お知らせ"
msgid "posted on {time}"
msgstr "{time} に投稿された"
-#: templates/blog/list.html:130 templates/problem/problem.html:309
+#: templates/blog/list.html:130 templates/problem/problem.html:311
msgid "Clarifications"
msgstr "解説"
-#: templates/blog/list.html:146 templates/problem/problem.html:320
+#: templates/blog/list.html:146 templates/problem/problem.html:322
msgid "No clarifications have been made at this time."
msgstr "現時点では何も解説されていません。"
@@ -3461,7 +3513,7 @@ msgid "Info"
msgstr "情報"
#: templates/contest/contest-tabs.html:6 templates/stats/base.html:9
-#: templates/submission/list.html:337
+#: templates/submission/list.html:336
msgid "Statistics"
msgstr "統計"
@@ -3664,19 +3716,19 @@ msgstr ""
msgid "Disqualify"
msgstr ""
-#: templates/contest/ranking.html:169
+#: templates/contest/ranking.html:173
msgid "Are you sure you want to disqualify this participation?"
msgstr ""
-#: templates/contest/ranking.html:174
+#: templates/contest/ranking.html:178
msgid "Are you sure you want to un-disqualify this participation?"
msgstr ""
-#: templates/contest/ranking.html:246
+#: templates/contest/ranking.html:250
msgid "View user participation"
msgstr "利用者の参加を見る"
-#: templates/contest/ranking.html:250
+#: templates/contest/ranking.html:254
msgid "Show organizations"
msgstr "組織を表示する"
@@ -3951,7 +4003,7 @@ msgstr ""
msgid "Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence."
msgstr "この論説は、つまずいた時に限って使用し、ここからコードをコピーアンドペーストしないようにすることを覚えておいて下さい。課題と論説の著者に敬意を表してください。
自身で課題を解く前に公式の解答を提出することは禁止されています。"
-#: templates/problem/editorial.html:27 templates/problem/problem.html:209
+#: templates/problem/editorial.html:27 templates/problem/problem.html:210
msgid "Author:"
msgid_plural "Authors:"
msgstr[0] "著者:"
@@ -4116,34 +4168,34 @@ msgstr "制限時間:"
msgid "Memory limit:"
msgstr "メモリ制限:"
-#: templates/problem/problem.html:224
+#: templates/problem/problem.html:226
msgid "Problem type"
msgid_plural "Problem types"
msgstr[0] "課題のタイプ"
-#: templates/problem/problem.html:237
+#: templates/problem/problem.html:239
msgid "Allowed languages"
msgstr "許可されている言語"
-#: templates/problem/problem.html:245
+#: templates/problem/problem.html:247
#, python-format
msgid "No %(lang)s judge online"
msgstr "%(lang)s はオンライン判定されません"
-#: templates/problem/problem.html:256
+#: templates/problem/problem.html:258
msgid "Judge:"
msgid_plural "Judges:"
msgstr[0] ""
-#: templates/problem/problem.html:273
+#: templates/problem/problem.html:275
msgid "none available"
msgstr ""
-#: templates/problem/problem.html:298
+#: templates/problem/problem.html:300
msgid "Request clarification"
msgstr "解説を要求する"
-#: templates/problem/problem.html:300
+#: templates/problem/problem.html:302
msgid "Report an issue"
msgstr "問題を報告する"
@@ -4188,7 +4240,7 @@ msgstr "課題のタイプ"
msgid "Point range"
msgstr "点数の範囲"
-#: templates/problem/search-form.html:63 templates/submission/list.html:329
+#: templates/problem/search-form.html:63 templates/submission/list.html:328
#: templates/ticket/list.html:248
msgid "Go"
msgstr "実行する"
@@ -4234,7 +4286,7 @@ msgid "Invalid username or password."
msgstr "不正な利用者名またはパスワードです。"
#: templates/registration/login.html:53
-#: templates/registration/two_factor_auth.html:86
+#: templates/registration/two_factor_auth.html:92
msgid "Login!"
msgstr "ログイン!"
@@ -4354,12 +4406,12 @@ msgid "Default language"
msgstr "デフォルトの言語"
#: templates/registration/registration_form.html:184
-#: templates/user/edit-profile.html:310
+#: templates/user/edit-profile.html:314
msgid "Affiliated organizations"
msgstr "所属組織"
#: templates/registration/registration_form.html:190
-#: templates/user/edit-profile.html:324
+#: templates/user/edit-profile.html:328
msgid "Notify me about upcoming contests"
msgstr "まもなく開催予定のコンテストを通知する"
@@ -4375,57 +4427,93 @@ msgstr "利用規約・条件"
msgid "Register!"
msgstr "登録!"
-#: templates/registration/totp_disable.html:38
+#: templates/registration/totp_disable.html:31
msgid "To protect your account, you must first authenticate before you can disable Two Factor Authentication."
msgstr ""
-#: templates/registration/totp_disable.html:45
+#: templates/registration/totp_disable.html:38
msgid "Enter the 6-digit code generated by your app or one of your 16-digit scratch codes:"
msgstr ""
-#: templates/registration/totp_disable.html:48
+#: templates/registration/totp_disable.html:41
msgid "Disable Two Factor Authentication"
msgstr ""
-#: templates/registration/totp_enable.html:75
+#: templates/registration/totp_enable.html:72
msgid "Scan this code with your authenticator app:"
msgstr ""
-#: templates/registration/totp_enable.html:76
+#: templates/registration/totp_enable.html:73
msgid "QR code"
msgstr ""
-#: templates/registration/totp_enable.html:77
+#: templates/registration/totp_enable.html:74
msgid "Or enter this code manually:"
msgstr ""
-#: templates/registration/totp_enable.html:88
+#: templates/registration/totp_enable.html:85
msgid "Enter the 6-digit code generated by your app:"
msgstr ""
-#: templates/registration/totp_enable.html:91
+#: templates/registration/totp_enable.html:90
+msgid "Refresh Two Factor Authentication"
+msgstr ""
+
+#: templates/registration/totp_enable.html:92
msgid "Enable Two Factor Authentication"
msgstr ""
+#: templates/registration/totp_enable.html:98
+msgid "Below is a list of one-time use scratch codes."
+msgstr ""
+
+#: templates/registration/totp_enable.html:99
+msgid "These codes can only be used once and are for emergency use."
+msgstr ""
+
+#: templates/registration/totp_enable.html:100
+msgid "You can use these codes to login to your account or disable two-factor authentication."
+msgstr ""
+
+#: templates/registration/totp_enable.html:101
+msgid "If you ever need more scratch codes, you can regenerate them on the edit profile tab."
+msgstr ""
+
+#: templates/registration/totp_enable.html:102
+msgid "Please write these down and keep them in a secure location."
+msgstr ""
+
+#: templates/registration/totp_enable.html:103
+msgid "These codes will never be shown again after you enable two-factor authentication."
+msgstr ""
+
#: templates/registration/two_factor_auth.html:33
-#: templates/user/edit-profile.html:161
+#: templates/user/edit-profile.html:165
msgid "WebAuthn is not supported by your browser."
msgstr ""
#: templates/registration/two_factor_auth.html:54
-#: templates/user/edit-profile.html:185
+#: templates/user/edit-profile.html:189
msgid "Failed to contact server."
msgstr ""
-#: templates/registration/two_factor_auth.html:77
+#: templates/registration/two_factor_auth.html:79
msgid "Enter the 6-digit code generated by your app or one of your 16-character scratch codes:"
msgstr ""
-#: templates/registration/two_factor_auth.html:83
-msgid "Use security key"
+#: templates/registration/two_factor_auth.html:81
+msgid "Enter one of your 16-character scratch codes:"
msgstr ""
#: templates/registration/two_factor_auth.html:89
+msgid "Use security key"
+msgstr ""
+
+#: templates/registration/two_factor_auth.html:94
+msgid "Use scratch code"
+msgstr ""
+
+#: templates/registration/two_factor_auth.html:97
#, python-format
msgid "If you lost your authentication device and are unable to use your scratch codes, please contact us at %(email)s."
msgstr ""
@@ -4506,15 +4594,15 @@ msgstr "状態で絞り込む..."
msgid "Filter by language..."
msgstr "言語で絞り込む..."
-#: templates/submission/list.html:307
+#: templates/submission/list.html:306
msgid "Filter submissions"
msgstr "提出物を絞り込む"
-#: templates/submission/list.html:343
+#: templates/submission/list.html:342
msgid "Total:"
msgstr ""
-#: templates/submission/list.html:353
+#: templates/submission/list.html:352
msgid "You were disconnected. Refresh to show latest updates."
msgstr "あなたは切断されました。最終更新を表示するためにリフレッシュして下さい。"
@@ -4729,121 +4817,125 @@ msgstr "ランク"
msgid "Search by handle..."
msgstr "ハンドルで検索..."
-#: templates/user/edit-profile.html:109
+#: templates/user/edit-profile.html:113
msgid "Are you sure you want to generate or regenerate your API token?"
msgstr ""
-#: templates/user/edit-profile.html:110
+#: templates/user/edit-profile.html:114
msgid "This will invalidate any previous API tokens."
msgstr ""
-#: templates/user/edit-profile.html:111
+#: templates/user/edit-profile.html:115
msgid "It also allows access to your account without Two-factor Authentication."
msgstr ""
-#: templates/user/edit-profile.html:112
+#: templates/user/edit-profile.html:116
msgid "You will not be able to view your api token after you leave this page!"
msgstr ""
-#: templates/user/edit-profile.html:113 templates/user/edit-profile.html:207
+#: templates/user/edit-profile.html:117 templates/user/edit-profile.html:211
msgid "Generating..."
msgstr ""
-#: templates/user/edit-profile.html:121 templates/user/edit-profile.html:243
-#: templates/user/edit-profile.html:371 templates/user/edit-profile.html:390
+#: templates/user/edit-profile.html:125 templates/user/edit-profile.html:247
+#: templates/user/edit-profile.html:373 templates/user/edit-profile.html:395
msgid "Regenerate"
msgstr ""
-#: templates/user/edit-profile.html:127 templates/user/edit-profile.html:392
+#: templates/user/edit-profile.html:131 templates/user/edit-profile.html:397
msgid "Remove"
msgstr ""
-#: templates/user/edit-profile.html:137
+#: templates/user/edit-profile.html:141
msgid "Are you sure you want to remove your API token?"
msgstr ""
-#: templates/user/edit-profile.html:144 templates/user/edit-profile.html:375
-#: templates/user/edit-profile.html:396
+#: templates/user/edit-profile.html:148 templates/user/edit-profile.html:377
+#: templates/user/edit-profile.html:401
msgid "Generate"
msgstr ""
-#: templates/user/edit-profile.html:190
+#: templates/user/edit-profile.html:194
msgid "Are you sure you want to delete this security key?"
msgstr ""
-#: templates/user/edit-profile.html:280
+#: templates/user/edit-profile.html:284
msgid "Self-description"
msgstr "自己紹介"
-#: templates/user/edit-profile.html:287
+#: templates/user/edit-profile.html:291
msgid "Select your closest major city"
msgstr "最寄りの大都市を選択してください"
-#: templates/user/edit-profile.html:296
+#: templates/user/edit-profile.html:300
msgid "Editor theme"
msgstr "エディタのテーマ"
-#: templates/user/edit-profile.html:301
+#: templates/user/edit-profile.html:305
msgid "Math engine"
msgstr "数式エンジン"
-#: templates/user/edit-profile.html:335 templates/user/edit-profile.html:337
+#: templates/user/edit-profile.html:339 templates/user/edit-profile.html:341
msgid "Change your avatar"
msgstr "アバターを変更する"
-#: templates/user/edit-profile.html:342
+#: templates/user/edit-profile.html:346
msgid "Change your password"
msgstr "パスワードを変更する"
-#: templates/user/edit-profile.html:356
+#: templates/user/edit-profile.html:359
msgid "Two-factor Authentication is enabled"
msgstr ""
-#: templates/user/edit-profile.html:358
-msgid "Two-factor Authentication is disabled"
+#: templates/user/edit-profile.html:362 templates/user/edit-profile.html:365
+msgid "Disable"
msgstr ""
-#: templates/user/edit-profile.html:363 templates/user/edit-profile.html:365
-msgid "Disable"
+#: templates/user/edit-profile.html:367
+msgid "Refresh"
msgstr ""
-#: templates/user/edit-profile.html:368
+#: templates/user/edit-profile.html:370
msgid "Scratch Codes:"
msgstr ""
-#: templates/user/edit-profile.html:372 templates/user/edit-profile.html:393
+#: templates/user/edit-profile.html:374 templates/user/edit-profile.html:398
msgid "Hidden"
msgstr ""
-#: templates/user/edit-profile.html:381
+#: templates/user/edit-profile.html:384
+msgid "Two-factor Authentication is disabled"
+msgstr ""
+
+#: templates/user/edit-profile.html:385
msgid "Enable"
msgstr ""
-#: templates/user/edit-profile.html:387
+#: templates/user/edit-profile.html:392
msgid "API Token"
msgstr ""
-#: templates/user/edit-profile.html:404
+#: templates/user/edit-profile.html:409
msgid "Security keys"
msgstr ""
-#: templates/user/edit-profile.html:414
+#: templates/user/edit-profile.html:419
msgid "Delete"
msgstr ""
-#: templates/user/edit-profile.html:421
+#: templates/user/edit-profile.html:426
msgid "Enter a name for this key"
msgstr ""
-#: templates/user/edit-profile.html:422
+#: templates/user/edit-profile.html:427
msgid "Add"
msgstr ""
-#: templates/user/edit-profile.html:430
+#: templates/user/edit-profile.html:435
msgid "User-script"
msgstr "利用者スクリプト"
-#: templates/user/edit-profile.html:434
+#: templates/user/edit-profile.html:439
msgid "Update profile"
msgstr "プロフィールの更新"
diff --git a/locale/ja/LC_MESSAGES/djangojs.po b/locale/ja/LC_MESSAGES/djangojs.po
index ce1aebaa91..ab9e175c25 100644
--- a/locale/ja/LC_MESSAGES/djangojs.po
+++ b/locale/ja/LC_MESSAGES/djangojs.po
@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: dmoj\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-10-01 23:12+0000\n"
-"PO-Revision-Date: 2021-04-25 00:08\n"
+"PO-Revision-Date: 2021-07-07 00:27\n"
"Last-Translator: \n"
"Language-Team: Japanese\n"
"Language: ja_JP\n"
diff --git a/locale/ko/LC_MESSAGES/django.po b/locale/ko/LC_MESSAGES/django.po
index 65dbeda97b..9cc194697a 100644
--- a/locale/ko/LC_MESSAGES/django.po
+++ b/locale/ko/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: dmoj\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-24 19:15+0000\n"
-"PO-Revision-Date: 2021-04-25 00:08\n"
+"POT-Creation-Date: 2021-06-17 01:38+0000\n"
+"PO-Revision-Date: 2021-07-07 00:27\n"
"Last-Translator: \n"
"Language-Team: Korean\n"
"Language: ko_KR\n"
@@ -17,75 +17,75 @@ msgstr ""
"X-Crowdin-File: django.po\n"
"X-Crowdin-File-ID: 10\n"
-#: dmoj/settings.py:364
+#: dmoj/settings.py:365
msgid "Catalan"
msgstr "카탈루냐어"
-#: dmoj/settings.py:365
+#: dmoj/settings.py:366
msgid "German"
msgstr "독일어"
-#: dmoj/settings.py:366
+#: dmoj/settings.py:367
msgid "English"
msgstr "영어"
-#: dmoj/settings.py:367
+#: dmoj/settings.py:368
msgid "Spanish"
msgstr "스페인어"
-#: dmoj/settings.py:368
+#: dmoj/settings.py:369
msgid "French"
msgstr "프랑스어"
-#: dmoj/settings.py:369
+#: dmoj/settings.py:370
msgid "Croatian"
msgstr "크로아티아어"
-#: dmoj/settings.py:370
+#: dmoj/settings.py:371
msgid "Hungarian"
msgstr "헝가리어"
-#: dmoj/settings.py:371
+#: dmoj/settings.py:372
msgid "Japanese"
msgstr "일본어"
-#: dmoj/settings.py:372
+#: dmoj/settings.py:373
msgid "Korean"
msgstr "한국어"
-#: dmoj/settings.py:373
+#: dmoj/settings.py:374
msgid "Brazilian Portuguese"
msgstr "포르투갈어 (브라질)"
-#: dmoj/settings.py:374
+#: dmoj/settings.py:375
msgid "Romanian"
msgstr "루마니아어"
-#: dmoj/settings.py:375
+#: dmoj/settings.py:376
msgid "Russian"
msgstr "러시아어"
-#: dmoj/settings.py:376
+#: dmoj/settings.py:377
msgid "Serbian (Latin)"
msgstr "세르비아어(라틴문자)"
-#: dmoj/settings.py:377
+#: dmoj/settings.py:378
msgid "Turkish"
msgstr "터키어"
-#: dmoj/settings.py:378
+#: dmoj/settings.py:379
msgid "Vietnamese"
msgstr "베트남어"
-#: dmoj/settings.py:379
+#: dmoj/settings.py:380
msgid "Simplified Chinese"
msgstr "중국어(간체)"
-#: dmoj/settings.py:380
+#: dmoj/settings.py:381
msgid "Traditional Chinese"
msgstr "중국어(번체)"
-#: dmoj/urls.py:103 templates/base.html:190
+#: dmoj/urls.py:104 templates/base.html:190
msgid "Home"
msgstr "메인"
@@ -113,106 +113,106 @@ msgstr "코멘트 보이기"
msgid "Associated page"
msgstr "관련 페이지"
-#: judge/admin/contest.py:31
+#: judge/admin/contest.py:32
msgid "Included contests"
msgstr "포함된 대회"
-#: judge/admin/contest.py:65 templates/contest/contest.html:83
+#: judge/admin/contest.py:66 templates/contest/contest.html:83
#: templates/contest/moss.html:43 templates/problem/list.html:204
#: templates/problem/list.html:219 templates/user/user-problems.html:58
#: templates/user/user-problems.html:100
msgid "Problem"
msgstr "문제"
-#: judge/admin/contest.py:114
+#: judge/admin/contest.py:117
msgid "Settings"
msgstr "설정"
-#: judge/admin/contest.py:116
+#: judge/admin/contest.py:120
msgid "Scheduling"
msgstr "Scheduling"
-#: judge/admin/contest.py:117
+#: judge/admin/contest.py:121
msgid "Details"
msgstr "세부사항"
-#: judge/admin/contest.py:118
+#: judge/admin/contest.py:122
msgid "Format"
msgstr ""
-#: judge/admin/contest.py:119 templates/contest/ranking-table.html:5
+#: judge/admin/contest.py:123 templates/contest/ranking-table.html:5
msgid "Rating"
msgstr "순위"
-#: judge/admin/contest.py:120
+#: judge/admin/contest.py:124
msgid "Access"
msgstr ""
-#: judge/admin/contest.py:122 judge/admin/problem.py:134
+#: judge/admin/contest.py:126 judge/admin/problem.py:135
msgid "Justice"
msgstr "정의"
-#: judge/admin/contest.py:211
+#: judge/admin/contest.py:215
#, python-format
msgid "%d contest successfully marked as visible."
msgid_plural "%d contests successfully marked as visible."
msgstr[0] ""
-#: judge/admin/contest.py:214
+#: judge/admin/contest.py:218
msgid "Mark contests as visible"
msgstr "공개 대회로 전환"
-#: judge/admin/contest.py:220
+#: judge/admin/contest.py:224
#, python-format
msgid "%d contest successfully marked as hidden."
msgid_plural "%d contests successfully marked as hidden."
msgstr[0] ""
-#: judge/admin/contest.py:223
+#: judge/admin/contest.py:227
msgid "Mark contests as hidden"
msgstr "비공개 대회로 전환"
-#: judge/admin/contest.py:229
+#: judge/admin/contest.py:233
#, python-format
msgid "%d contest successfully locked."
msgid_plural "%d contests successfully locked."
msgstr[0] ""
-#: judge/admin/contest.py:232
+#: judge/admin/contest.py:236
msgid "Lock contest submissions"
msgstr ""
-#: judge/admin/contest.py:238
+#: judge/admin/contest.py:242
#, python-format
msgid "%d contest successfully unlocked."
msgid_plural "%d contests successfully unlocked."
msgstr[0] ""
-#: judge/admin/contest.py:241
+#: judge/admin/contest.py:245
msgid "Unlock contest submissions"
msgstr ""
-#: judge/admin/contest.py:262 judge/admin/submission.py:170
+#: judge/admin/contest.py:266 judge/admin/submission.py:170
#, python-format
msgid "%d submission was successfully scheduled for rejudging."
msgid_plural "%d submissions were successfully scheduled for rejudging."
msgstr[0] ""
-#: judge/admin/contest.py:337
+#: judge/admin/contest.py:341
#, python-format
msgid "%d participation recalculated."
msgid_plural "%d participations recalculated."
msgstr[0] ""
-#: judge/admin/contest.py:340
+#: judge/admin/contest.py:344
msgid "Recalculate results"
msgstr ""
-#: judge/admin/contest.py:344 judge/admin/organization.py:63
+#: judge/admin/contest.py:348 judge/admin/organization.py:63
msgid "username"
msgstr "사용자 이름"
-#: judge/admin/contest.py:349 templates/base.html:258
+#: judge/admin/contest.py:353 templates/base.html:258
msgid "virtual"
msgstr "가상"
@@ -228,9 +228,9 @@ msgstr "내용"
msgid "Summary"
msgstr "요약"
-#: judge/admin/interface.py:113 judge/models/contest.py:383
-#: judge/models/contest.py:509 judge/models/profile.py:244
-#: judge/models/profile.py:268
+#: judge/admin/interface.py:113 judge/models/contest.py:419
+#: judge/models/contest.py:546 judge/models/profile.py:261
+#: judge/models/profile.py:292
msgid "user"
msgstr "사용자"
@@ -238,8 +238,8 @@ msgstr "사용자"
msgid "object"
msgstr ""
-#: judge/admin/organization.py:32 judge/admin/problem.py:181
-#: judge/admin/profile.py:82
+#: judge/admin/organization.py:32 judge/admin/problem.py:182
+#: judge/admin/profile.py:92
msgid "View on site"
msgstr "사이트에서 보기"
@@ -247,66 +247,66 @@ msgstr "사이트에서 보기"
msgid "Describe the changes you made (optional)"
msgstr "변경 사항을 설명하세요. (선택사항)"
-#: judge/admin/problem.py:129
+#: judge/admin/problem.py:130
msgid "Social Media"
msgstr "SNS"
-#: judge/admin/problem.py:130
+#: judge/admin/problem.py:131
msgid "Taxonomy"
msgstr "분류"
-#: judge/admin/problem.py:131 templates/contest/contest.html:84
+#: judge/admin/problem.py:132 templates/contest/contest.html:84
#: templates/problem/data.html:385 templates/problem/list.html:209
#: templates/problem/list.html:230 templates/user/base-users-table.html:10
#: templates/user/user-problems.html:60
msgid "Points"
msgstr "포인트"
-#: judge/admin/problem.py:132
+#: judge/admin/problem.py:133
msgid "Limits"
msgstr "제한"
-#: judge/admin/problem.py:133 judge/admin/submission.py:238
-#: templates/stats/base.html:14 templates/submission/list.html:320
-#: templates/user/edit-profile.html:292
+#: judge/admin/problem.py:134 judge/admin/submission.py:238
+#: templates/stats/base.html:14 templates/submission/list.html:319
+#: templates/user/edit-profile.html:296
msgid "Language"
msgstr "언어"
-#: judge/admin/problem.py:135
+#: judge/admin/problem.py:136
msgid "History"
msgstr "히스토리"
-#: judge/admin/problem.py:178
+#: judge/admin/problem.py:179
msgid "Authors"
msgstr "저자"
-#: judge/admin/problem.py:191
+#: judge/admin/problem.py:192
#, python-format
msgid "%d problem's publish date successfully updated."
msgid_plural "%d problems' publish date successfully updated."
msgstr[0] ""
-#: judge/admin/problem.py:195
+#: judge/admin/problem.py:196
msgid "Set publish date to now"
msgstr ""
-#: judge/admin/problem.py:201
+#: judge/admin/problem.py:202
#, python-format
msgid "%d problem successfully marked as public."
msgid_plural "%d problems successfully marked as public."
msgstr[0] "%d개의 문제가 공개로 전환되었습니다."
-#: judge/admin/problem.py:205
+#: judge/admin/problem.py:206
msgid "Mark problems as public"
msgstr "공개로 설정"
-#: judge/admin/problem.py:211
+#: judge/admin/problem.py:212
#, python-format
msgid "%d problem successfully marked as private."
msgid_plural "%d problems successfully marked as private."
msgstr[0] "%d개의 문제가 비공개로 전환되었습니다."
-#: judge/admin/problem.py:215
+#: judge/admin/problem.py:216
msgid "Mark problems as private"
msgstr "비공개로 설정"
@@ -314,34 +314,34 @@ msgstr "비공개로 설정"
msgid "timezone"
msgstr ""
-#: judge/admin/profile.py:88 judge/admin/submission.py:217
+#: judge/admin/profile.py:98 judge/admin/submission.py:217
#: templates/organization/requests/log.html:9
#: templates/organization/requests/pending.html:12
#: templates/ticket/list.html:261
msgid "User"
msgstr "사용자"
-#: judge/admin/profile.py:93 templates/registration/registration_form.html:143
+#: judge/admin/profile.py:103 templates/registration/registration_form.html:143
msgid "Email"
msgstr "이메일"
-#: judge/admin/profile.py:98 judge/views/register.py:29
+#: judge/admin/profile.py:108 judge/views/register.py:28
#: templates/registration/registration_form.html:171
-#: templates/user/edit-profile.html:288
+#: templates/user/edit-profile.html:292
msgid "Timezone"
msgstr "시간대"
-#: judge/admin/profile.py:103
+#: judge/admin/profile.py:113
msgid "date joined"
msgstr "가입한 날짜"
-#: judge/admin/profile.py:110
+#: judge/admin/profile.py:120
#, python-format
msgid "%d user have scores recalculated."
msgid_plural "%d users have scores recalculated."
msgstr[0] "%d명의 사용자 점수가 재계산되었습니다."
-#: judge/admin/profile.py:113
+#: judge/admin/profile.py:123
msgid "Recalculate scores"
msgstr "점수 재계산"
@@ -493,115 +493,116 @@ msgstr ""
msgid "IOI (pre-2016)"
msgstr ""
-#: judge/forms.py:26
-msgid "Two-factor authentication tokens must be 6 decimal digits."
+#: judge/forms.py:27
+#, python-brace-format
+msgid "Two-factor authentication tokens must be {TOTP_CODE_LENGTH} decimal digits."
msgstr ""
-#: judge/forms.py:29
+#: judge/forms.py:30
msgid "Invalid two-factor authentication token."
msgstr ""
-#: judge/forms.py:32
+#: judge/forms.py:33
msgid "Scratch codes must be 16 base32 characters."
msgstr ""
-#: judge/forms.py:34
+#: judge/forms.py:35 judge/forms.py:264
msgid "Invalid scratch code."
msgstr ""
-#: judge/forms.py:45
+#: judge/forms.py:46
msgid "Subscribe to contest updates"
msgstr "대회 업데이트를 구독하세요."
-#: judge/forms.py:46
+#: judge/forms.py:47
msgid "Enable experimental features"
msgstr "베타 기능 활성화"
-#: judge/forms.py:71
+#: judge/forms.py:72
msgid "You must solve at least one problem before you can update your profile."
msgstr ""
-#: judge/forms.py:80 judge/views/organization.py:127
+#: judge/forms.py:81 judge/views/organization.py:126
#, python-brace-format
msgid "You may not be part of more than {count} public organizations."
msgstr "{count}개보다 많은 공개 조직에 소속될 수 없습니다."
-#: judge/forms.py:96
+#: judge/forms.py:97
msgid "Download comments?"
msgstr ""
-#: judge/forms.py:97
+#: judge/forms.py:98
msgid "Download submissions?"
msgstr ""
-#: judge/forms.py:98
+#: judge/forms.py:99
msgid "Filter by problem code glob:"
msgstr ""
-#: judge/forms.py:102
+#: judge/forms.py:103
msgid "Leave empty to include all submissions"
msgstr ""
-#: judge/forms.py:105 templates/problem/manage_submission.html:142
+#: judge/forms.py:106 templates/problem/manage_submission.html:142
msgid "Filter by result:"
msgstr ""
-#: judge/forms.py:111
+#: judge/forms.py:112
msgid "Please select at least one thing to download."
msgstr ""
-#: judge/forms.py:137
+#: judge/forms.py:138
msgid "Any judge"
msgstr ""
-#: judge/forms.py:167 judge/views/register.py:26
+#: judge/forms.py:159 judge/views/register.py:25
#: templates/registration/registration_form.html:137
#: templates/user/base-users-table.html:5
msgid "Username"
msgstr "사용자 이름"
-#: judge/forms.py:168 templates/registration/registration_form.html:149
+#: judge/forms.py:160 templates/registration/registration_form.html:149
#: templates/registration/registration_form.html:163
msgid "Password"
msgstr "비밀번호"
-#: judge/forms.py:201
+#: judge/forms.py:192
msgid "Invalid code length."
msgstr ""
-#: judge/forms.py:219
+#: judge/forms.py:223
msgid "Invalid WebAuthn response."
msgstr ""
-#: judge/forms.py:222
+#: judge/forms.py:226
msgid "No WebAuthn challenge issued."
msgstr ""
-#: judge/forms.py:228
+#: judge/forms.py:232
msgid "Invalid WebAuthn credential ID."
msgstr ""
-#: judge/forms.py:257
+#: judge/forms.py:262
msgid "Invalid two-factor authentication token or scratch code."
msgstr ""
-#: judge/forms.py:259
+#: judge/forms.py:266
msgid "Must specify either totp_token or webauthn_response."
msgstr ""
-#: judge/forms.py:263 judge/models/problem.py:105
+#: judge/forms.py:270 judge/models/problem.py:119
msgid "Problem code must be ^[a-z0-9]+$"
msgstr ""
-#: judge/forms.py:268
+#: judge/forms.py:275
msgid "Problem with code already exists."
msgstr ""
-#: judge/forms.py:273 judge/models/contest.py:66
+#: judge/forms.py:280 judge/models/contest.py:66
msgid "Contest id must be ^[a-z0-9]+$"
msgstr "Contest id must be ^[a-z0-9]+$"
-#: judge/forms.py:278
+#: judge/forms.py:285
msgid "Contest with key already exists."
msgstr ""
@@ -681,7 +682,7 @@ msgid "comments"
msgstr "코멘트"
#: judge/models/comment.py:89 judge/models/comment.py:141
-#: judge/models/problem.py:484
+#: judge/models/problem.py:511
#, python-format
msgid "Editorial for %s"
msgstr ""
@@ -722,7 +723,7 @@ msgstr "태그 설명"
msgid "contest tag"
msgstr "대회 태그"
-#: judge/models/contest.py:53 judge/models/contest.py:117
+#: judge/models/contest.py:53 judge/models/contest.py:126
msgid "contest tags"
msgstr "대회 태그"
@@ -747,410 +748,426 @@ msgid "contest name"
msgstr "대회 이름"
#: judge/models/contest.py:68
-msgid "These people will be able to edit the contest."
-msgstr "이 사람들은 대회를 편집할 권한이 있습니다."
+msgid "These users will be able to edit the contest."
+msgstr ""
+
+#: judge/models/contest.py:70
+msgid "These users will be able to edit the contest, but will not be listed as authors."
+msgstr ""
-#: judge/models/contest.py:70 judge/models/runtime.py:136
+#: judge/models/contest.py:73
+msgid "These users will be able to view the contest, but not edit it."
+msgstr ""
+
+#: judge/models/contest.py:76 judge/models/runtime.py:136
msgid "description"
msgstr "설명"
-#: judge/models/contest.py:71 judge/models/problem.py:431
+#: judge/models/contest.py:77 judge/models/problem.py:458
#: judge/models/runtime.py:138
msgid "problems"
msgstr "문제"
-#: judge/models/contest.py:72 judge/models/contest.py:384
+#: judge/models/contest.py:78 judge/models/contest.py:420
msgid "start time"
msgstr "시작 시각"
-#: judge/models/contest.py:73
+#: judge/models/contest.py:79
msgid "end time"
msgstr "종료 시각"
-#: judge/models/contest.py:74 judge/models/problem.py:126
-#: judge/models/problem.py:455
+#: judge/models/contest.py:80 judge/models/problem.py:140
+#: judge/models/problem.py:482
msgid "time limit"
msgstr "시간 제한"
-#: judge/models/contest.py:75 judge/models/problem.py:144
+#: judge/models/contest.py:81 judge/models/problem.py:158
msgid "publicly visible"
msgstr "공개"
-#: judge/models/contest.py:76
+#: judge/models/contest.py:82
msgid "Should be set even for organization-private contests, where it determines whether the contest is visible to members of the specified organizations."
msgstr ""
-#: judge/models/contest.py:79
+#: judge/models/contest.py:85
msgid "contest rated"
msgstr "대회 순위"
-#: judge/models/contest.py:79
+#: judge/models/contest.py:85
msgid "Whether this contest can be rated."
msgstr "대회 순위 표시 여부"
-#: judge/models/contest.py:81
+#: judge/models/contest.py:87
msgid "view contest scoreboard"
msgstr ""
-#: judge/models/contest.py:83
+#: judge/models/contest.py:89
msgid "These users will be able to view the scoreboard."
msgstr ""
-#: judge/models/contest.py:84
+#: judge/models/contest.py:90
msgid "scoreboard visibility"
msgstr ""
-#: judge/models/contest.py:85
+#: judge/models/contest.py:91
msgid "Scoreboard visibility through the duration of the contest"
msgstr ""
-#: judge/models/contest.py:87
+#: judge/models/contest.py:93
msgid "no comments"
msgstr "코멘트 없음"
-#: judge/models/contest.py:88
+#: judge/models/contest.py:94
msgid "Use clarification system instead of comments."
msgstr "코멘트 대신 수정 시스템을 사용하세요."
-#: judge/models/contest.py:90
+#: judge/models/contest.py:96
msgid "Rating floor for contest"
msgstr ""
-#: judge/models/contest.py:92
+#: judge/models/contest.py:98
msgid "Rating ceiling for contest"
msgstr ""
-#: judge/models/contest.py:94
+#: judge/models/contest.py:100
msgid "rate all"
msgstr "모든 순위"
-#: judge/models/contest.py:94
+#: judge/models/contest.py:100
msgid "Rate all users who joined."
msgstr "참가한 모든 사용자에 대한 순위"
-#: judge/models/contest.py:95
+#: judge/models/contest.py:101
msgid "exclude from ratings"
msgstr "순위에서 제외"
-#: judge/models/contest.py:97
+#: judge/models/contest.py:103
msgid "private to specific users"
msgstr ""
-#: judge/models/contest.py:98
+#: judge/models/contest.py:104
msgid "private contestants"
msgstr ""
-#: judge/models/contest.py:99
+#: judge/models/contest.py:105
msgid "If private, only these users may see the contest"
msgstr ""
-#: judge/models/contest.py:101
+#: judge/models/contest.py:107
msgid "hide problem tags"
msgstr "문제 태그 숨기기"
-#: judge/models/contest.py:102
+#: judge/models/contest.py:108
msgid "Whether problem tags should be hidden by default."
msgstr "문제 태그 공개 여부 기본값"
-#: judge/models/contest.py:104
+#: judge/models/contest.py:110
+msgid "hide problem authors"
+msgstr ""
+
+#: judge/models/contest.py:111
+msgid "Whether problem authors should be hidden by default."
+msgstr ""
+
+#: judge/models/contest.py:113
msgid "run pretests only"
msgstr "pretests만 실행"
-#: judge/models/contest.py:105
+#: judge/models/contest.py:114
msgid "Whether judges should grade pretests only, versus all testcases. Commonly set during a contest, then unset prior to rejudging user submissions when the contest ends."
msgstr "judge가 pretests만 채점할지, 모든 테스트 데이터를 채점할지 여부. 일반적으로 대회 종료전까지 설정 후 대회 종료 후 해제하여 모든 테스트 케이스 채점 진행"
-#: judge/models/contest.py:109 judge/models/problem.py:166
+#: judge/models/contest.py:118 judge/models/problem.py:183
msgid "private to organizations"
msgstr "조직에 비공개"
-#: judge/models/contest.py:110 judge/models/problem.py:164
-#: judge/models/profile.py:83
+#: judge/models/contest.py:119 judge/models/problem.py:181
+#: judge/models/profile.py:86
msgid "organizations"
msgstr "조직"
-#: judge/models/contest.py:111
+#: judge/models/contest.py:120
msgid "If private, only these organizations may see the contest"
msgstr "비공개로 설정 시, 이 조직만 대회를 볼 수 있습니다."
-#: judge/models/contest.py:112 judge/models/problem.py:153
+#: judge/models/contest.py:121 judge/models/problem.py:167
msgid "OpenGraph image"
msgstr "OpenGraph 이미지"
-#: judge/models/contest.py:113 judge/models/profile.py:54
+#: judge/models/contest.py:122 judge/models/profile.py:57
msgid "Logo override image"
msgstr ""
-#: judge/models/contest.py:115
+#: judge/models/contest.py:124
msgid "This image will replace the default site logo for users inside the contest."
msgstr ""
-#: judge/models/contest.py:118
+#: judge/models/contest.py:127
msgid "the amount of live participants"
msgstr "현재 접속되어 있는 참가자 수"
-#: judge/models/contest.py:119
+#: judge/models/contest.py:128
msgid "contest summary"
msgstr "대회 요약"
-#: judge/models/contest.py:120 judge/models/problem.py:155
+#: judge/models/contest.py:129 judge/models/problem.py:169
msgid "Plain-text, shown in meta description tag, e.g. for social media."
msgstr ""
-#: judge/models/contest.py:121 judge/models/profile.py:53
+#: judge/models/contest.py:130 judge/models/profile.py:56
msgid "access code"
msgstr "액세스 코드"
-#: judge/models/contest.py:122
+#: judge/models/contest.py:131
msgid "An optional code to prompt contestants before they are allowed to join the contest. Leave it blank to disable."
msgstr ""
-#: judge/models/contest.py:124 judge/models/problem.py:149
+#: judge/models/contest.py:133 judge/models/problem.py:163
msgid "personae non gratae"
msgstr ""
-#: judge/models/contest.py:125
+#: judge/models/contest.py:134
msgid "Bans the selected users from joining this contest."
msgstr ""
-#: judge/models/contest.py:126
+#: judge/models/contest.py:135
msgid "contest format"
msgstr ""
-#: judge/models/contest.py:127
+#: judge/models/contest.py:136
msgid "The contest format module to use."
msgstr ""
-#: judge/models/contest.py:128
+#: judge/models/contest.py:137
msgid "contest format configuration"
msgstr ""
-#: judge/models/contest.py:129
+#: judge/models/contest.py:138
msgid "A JSON object to serve as the configuration for the chosen contest format module. Leave empty to use None. Exact format depends on the contest format selected."
msgstr ""
-#: judge/models/contest.py:136
+#: judge/models/contest.py:145
msgid "contest lock"
msgstr ""
-#: judge/models/contest.py:137
-msgid "Prevent submissions from this contest from being rejudged."
+#: judge/models/contest.py:146
+msgid "Prevent submissions from this contest from being rejudged after this date."
msgstr ""
-#: judge/models/contest.py:138
+#: judge/models/contest.py:148
msgid "precision points"
msgstr ""
-#: judge/models/contest.py:140
+#: judge/models/contest.py:150
msgid "Number of digits to round points to."
msgstr ""
-#: judge/models/contest.py:362
+#: judge/models/contest.py:398
msgid "See private contests"
msgstr ""
-#: judge/models/contest.py:363
+#: judge/models/contest.py:399
msgid "Edit own contests"
msgstr ""
-#: judge/models/contest.py:364
+#: judge/models/contest.py:400
msgid "Edit all contests"
msgstr ""
-#: judge/models/contest.py:365
+#: judge/models/contest.py:401
msgid "Clone contest"
msgstr ""
-#: judge/models/contest.py:366 templates/contest/moss.html:74
+#: judge/models/contest.py:402 templates/contest/moss.html:74
msgid "MOSS contest"
msgstr ""
-#: judge/models/contest.py:367
+#: judge/models/contest.py:403
msgid "Rate contests"
msgstr ""
-#: judge/models/contest.py:368
+#: judge/models/contest.py:404
msgid "Contest access codes"
msgstr ""
-#: judge/models/contest.py:369
+#: judge/models/contest.py:405
msgid "Create private contests"
msgstr ""
-#: judge/models/contest.py:370
+#: judge/models/contest.py:406
msgid "Change contest visibility"
msgstr ""
-#: judge/models/contest.py:371
+#: judge/models/contest.py:407
msgid "Edit contest problem label script"
msgstr ""
-#: judge/models/contest.py:372
+#: judge/models/contest.py:408
msgid "Change lock status of contest"
msgstr ""
-#: judge/models/contest.py:374 judge/models/contest.py:472
-#: judge/models/contest.py:510 judge/models/contest.py:532
-#: judge/models/submission.py:84
+#: judge/models/contest.py:410 judge/models/contest.py:508
+#: judge/models/contest.py:547 judge/models/contest.py:569
+#: judge/models/submission.py:85
msgid "contest"
msgstr "대회"
-#: judge/models/contest.py:375
+#: judge/models/contest.py:411
msgid "contests"
msgstr "대회"
-#: judge/models/contest.py:382
+#: judge/models/contest.py:418
msgid "associated contest"
msgstr "관련된 대회"
-#: judge/models/contest.py:385
+#: judge/models/contest.py:421
msgid "score"
msgstr "점수"
-#: judge/models/contest.py:386
+#: judge/models/contest.py:422
msgid "cumulative time"
msgstr "누적 시간"
-#: judge/models/contest.py:387
+#: judge/models/contest.py:423
msgid "is disqualified"
msgstr ""
-#: judge/models/contest.py:388
+#: judge/models/contest.py:424
msgid "Whether this participation is disqualified."
msgstr ""
-#: judge/models/contest.py:389
+#: judge/models/contest.py:425
msgid "tie-breaking field"
msgstr ""
-#: judge/models/contest.py:390
+#: judge/models/contest.py:426
msgid "virtual participation id"
msgstr "가상 참여 id"
-#: judge/models/contest.py:391
+#: judge/models/contest.py:427
msgid "0 means non-virtual, otherwise the n-th virtual participation."
msgstr ""
-#: judge/models/contest.py:392
+#: judge/models/contest.py:428
msgid "contest format specific data"
msgstr ""
-#: judge/models/contest.py:458
+#: judge/models/contest.py:494
#, python-format
msgid "%s spectating in %s"
msgstr ""
-#: judge/models/contest.py:460
+#: judge/models/contest.py:496
#, python-format
msgid "%s in %s, v%d"
msgstr ""
-#: judge/models/contest.py:461
+#: judge/models/contest.py:497
#, python-format
msgid "%s in %s"
msgstr "%s에서 %s"
-#: judge/models/contest.py:464
+#: judge/models/contest.py:500
msgid "contest participation"
msgstr "대회 참가"
-#: judge/models/contest.py:465
+#: judge/models/contest.py:501
msgid "contest participations"
msgstr "대회 참가자"
-#: judge/models/contest.py:471 judge/models/contest.py:494
-#: judge/models/contest.py:533 judge/models/problem.py:430
-#: judge/models/problem.py:435 judge/models/problem.py:453
+#: judge/models/contest.py:507 judge/models/contest.py:531
+#: judge/models/contest.py:570 judge/models/problem.py:457
+#: judge/models/problem.py:462 judge/models/problem.py:480
#: judge/models/problem_data.py:35
msgid "problem"
msgstr "문제"
-#: judge/models/contest.py:473 judge/models/contest.py:498
-#: judge/models/problem.py:137
+#: judge/models/contest.py:509 judge/models/contest.py:535
+#: judge/models/problem.py:151
msgid "points"
msgstr "점수"
-#: judge/models/contest.py:474
+#: judge/models/contest.py:510
msgid "partial"
msgstr "부분"
-#: judge/models/contest.py:475 judge/models/contest.py:499
+#: judge/models/contest.py:511 judge/models/contest.py:536
msgid "is pretested"
msgstr "pretested 됨"
-#: judge/models/contest.py:476 judge/models/interface.py:43
+#: judge/models/contest.py:512 judge/models/interface.py:43
msgid "order"
msgstr "순서"
-#: judge/models/contest.py:477
+#: judge/models/contest.py:513
msgid "output prefix length override"
msgstr "출력 접두사 길이 재정의"
-#: judge/models/contest.py:479
+#: judge/models/contest.py:515
msgid "Maximum number of submissions for this problem, or leave blank for no limit."
msgstr ""
-#: judge/models/contest.py:482
+#: judge/models/contest.py:518
msgid "Why include a problem you can't submit to?"
msgstr ""
-#: judge/models/contest.py:487
+#: judge/models/contest.py:523
msgid "contest problem"
msgstr "대회 문제"
-#: judge/models/contest.py:488
+#: judge/models/contest.py:524
msgid "contest problems"
msgstr "대회 문제"
-#: judge/models/contest.py:492 judge/models/submission.py:207
+#: judge/models/contest.py:529 judge/models/submission.py:218
msgid "submission"
msgstr "제출"
-#: judge/models/contest.py:496 judge/models/contest.py:511
+#: judge/models/contest.py:533 judge/models/contest.py:548
msgid "participation"
msgstr "참가 여부"
-#: judge/models/contest.py:500
+#: judge/models/contest.py:537
msgid "Whether this submission was ran only on pretests."
msgstr "Pretests에서만 이 제출이 실행되었는지 여부"
-#: judge/models/contest.py:504
+#: judge/models/contest.py:541
msgid "contest submission"
msgstr "대회 제출"
-#: judge/models/contest.py:505
+#: judge/models/contest.py:542
msgid "contest submissions"
msgstr "대회 제출"
-#: judge/models/contest.py:513
+#: judge/models/contest.py:550
msgid "rank"
msgstr "등수"
-#: judge/models/contest.py:514
+#: judge/models/contest.py:551
msgid "rating"
msgstr "순위"
-#: judge/models/contest.py:515
+#: judge/models/contest.py:552
msgid "volatility"
msgstr "변동"
-#: judge/models/contest.py:516
+#: judge/models/contest.py:553
msgid "last rated"
msgstr "최근 순위"
-#: judge/models/contest.py:520
+#: judge/models/contest.py:557
msgid "contest rating"
msgstr "대회 순위"
-#: judge/models/contest.py:521
+#: judge/models/contest.py:558
msgid "contest ratings"
msgstr "대회 순위"
-#: judge/models/contest.py:540
+#: judge/models/contest.py:577
msgid "contest moss result"
msgstr ""
-#: judge/models/contest.py:541
+#: judge/models/contest.py:578
msgid "contest moss results"
msgstr ""
@@ -1190,7 +1207,7 @@ msgstr "부모 항목"
msgid "post title"
msgstr "게시물 제목"
-#: judge/models/interface.py:67 judge/models/problem.py:473
+#: judge/models/interface.py:67 judge/models/problem.py:500
msgid "authors"
msgstr "저자"
@@ -1198,7 +1215,7 @@ msgstr "저자"
msgid "slug"
msgstr "slug"
-#: judge/models/interface.py:69 judge/models/problem.py:471
+#: judge/models/interface.py:69 judge/models/problem.py:498
msgid "public visibility"
msgstr "공개 여부"
@@ -1234,34 +1251,6 @@ msgstr "블로그 게시물"
msgid "blog posts"
msgstr "블로그 게시물"
-#: judge/models/message.py:11
-msgid "message title"
-msgstr "메시지 제목"
-
-#: judge/models/message.py:12 judge/models/ticket.py:30
-msgid "message body"
-msgstr "메시지 본문"
-
-#: judge/models/message.py:13
-msgid "sender"
-msgstr "보낸 사람"
-
-#: judge/models/message.py:14
-msgid "target"
-msgstr "대상"
-
-#: judge/models/message.py:15
-msgid "message timestamp"
-msgstr "메시지 타임스탬프"
-
-#: judge/models/message.py:16
-msgid "read"
-msgstr "읽음"
-
-#: judge/models/message.py:20
-msgid "messages in the thread"
-msgstr "messages in the thread"
-
#: judge/models/problem.py:30
#, python-format
msgid "Disallowed characters: %(value)s"
@@ -1279,7 +1268,7 @@ msgstr "문제 범주 이름"
msgid "problem type"
msgstr "문제 유형"
-#: judge/models/problem.py:44 judge/models/problem.py:121
+#: judge/models/problem.py:44 judge/models/problem.py:135
msgid "problem types"
msgstr "문제 유형"
@@ -1291,7 +1280,7 @@ msgstr "문제 그룹 ID"
msgid "problem group name"
msgstr "문제 그룹"
-#: judge/models/problem.py:56 judge/models/problem.py:124
+#: judge/models/problem.py:56 judge/models/problem.py:138
msgid "problem group"
msgstr "문제 그룹"
@@ -1311,7 +1300,7 @@ msgstr "링크"
msgid "full name"
msgstr "전체 이름"
-#: judge/models/problem.py:65 judge/models/profile.py:41
+#: judge/models/problem.py:65 judge/models/profile.py:44
#: judge/models/runtime.py:24
msgid "short name"
msgstr "짧은 이름"
@@ -1340,232 +1329,252 @@ msgstr "라이센스"
msgid "licenses"
msgstr "라이센스"
-#: judge/models/problem.py:104
+#: judge/models/problem.py:112
+msgid "Follow global setting"
+msgstr ""
+
+#: judge/models/problem.py:113
+msgid "Always visible"
+msgstr ""
+
+#: judge/models/problem.py:114
+msgid "Visible if problem solved"
+msgstr ""
+
+#: judge/models/problem.py:115
+msgid "Only own submissions"
+msgstr ""
+
+#: judge/models/problem.py:118
msgid "problem code"
msgstr "문제 코드"
-#: judge/models/problem.py:106
+#: judge/models/problem.py:120
msgid "A short, unique code for the problem, used in the url after /problem/"
msgstr ""
-#: judge/models/problem.py:108
+#: judge/models/problem.py:122
msgid "problem name"
msgstr "문제 이름"
-#: judge/models/problem.py:109
+#: judge/models/problem.py:123
msgid "The full name of the problem, as shown in the problem list."
msgstr ""
-#: judge/models/problem.py:111
+#: judge/models/problem.py:125
msgid "problem body"
msgstr "문제 본문"
-#: judge/models/problem.py:112
+#: judge/models/problem.py:126
msgid "creators"
msgstr "제작자"
-#: judge/models/problem.py:113
+#: judge/models/problem.py:127
msgid "These users will be able to edit the problem, and be listed as authors."
msgstr ""
-#: judge/models/problem.py:115
+#: judge/models/problem.py:129
msgid "curators"
msgstr "curators"
-#: judge/models/problem.py:116
+#: judge/models/problem.py:130
msgid "These users will be able to edit the problem, but not be listed as authors."
msgstr ""
-#: judge/models/problem.py:118
+#: judge/models/problem.py:132
msgid "testers"
msgstr "testers"
-#: judge/models/problem.py:120
+#: judge/models/problem.py:134
msgid "These users will be able to view the private problem, but not edit it."
msgstr ""
-#: judge/models/problem.py:122
+#: judge/models/problem.py:136
msgid "The type of problem, as shown on the problem's page."
msgstr ""
-#: judge/models/problem.py:125
+#: judge/models/problem.py:139
msgid "The group of problem, shown under Category in the problem list."
msgstr ""
-#: judge/models/problem.py:127
+#: judge/models/problem.py:141
msgid "The time limit for this problem, in seconds. Fractional seconds (e.g. 1.5) are supported."
msgstr ""
-#: judge/models/problem.py:131 judge/models/problem.py:458
+#: judge/models/problem.py:145 judge/models/problem.py:485
msgid "memory limit"
msgstr "메모리 제한"
-#: judge/models/problem.py:132
+#: judge/models/problem.py:146
msgid "The memory limit for this problem, in kilobytes (e.g. 64mb = 65536 kilobytes)."
msgstr ""
-#: judge/models/problem.py:138
+#: judge/models/problem.py:152
msgid "Points awarded for problem completion. Points are displayed with a 'p' suffix if partial."
msgstr ""
-#: judge/models/problem.py:141
+#: judge/models/problem.py:155
msgid "allows partial points"
msgstr "부분 점수 허용"
-#: judge/models/problem.py:142
+#: judge/models/problem.py:156
msgid "allowed languages"
msgstr "허용된 언어"
-#: judge/models/problem.py:143
+#: judge/models/problem.py:157
msgid "List of allowed submission languages."
msgstr ""
-#: judge/models/problem.py:145
+#: judge/models/problem.py:159
msgid "manually managed"
msgstr "수동으로 관리됨"
-#: judge/models/problem.py:146
+#: judge/models/problem.py:160
msgid "Whether judges should be allowed to manage data or not."
msgstr ""
-#: judge/models/problem.py:147
+#: judge/models/problem.py:161
msgid "date of publishing"
msgstr "게시 날짜"
-#: judge/models/problem.py:148
+#: judge/models/problem.py:162
msgid "Doesn't have magic ability to auto-publish due to backward compatibility"
msgstr ""
-#: judge/models/problem.py:150
+#: judge/models/problem.py:164
msgid "Bans the selected users from submitting to this problem."
msgstr ""
-#: judge/models/problem.py:152
+#: judge/models/problem.py:166
msgid "The license under which this problem is published."
msgstr ""
-#: judge/models/problem.py:154
+#: judge/models/problem.py:168
msgid "problem summary"
msgstr "문제 요약"
-#: judge/models/problem.py:156
+#: judge/models/problem.py:170
msgid "number of users"
msgstr ""
-#: judge/models/problem.py:157
+#: judge/models/problem.py:171
msgid "The number of users who solved the problem."
msgstr ""
-#: judge/models/problem.py:158
+#: judge/models/problem.py:172
msgid "solve rate"
msgstr ""
-#: judge/models/problem.py:159
+#: judge/models/problem.py:173
msgid "allow full markdown access"
msgstr ""
-#: judge/models/problem.py:165
+#: judge/models/problem.py:174
+msgid "submission source visibility"
+msgstr ""
+
+#: judge/models/problem.py:182
msgid "If private, only these organizations may see the problem."
msgstr ""
-#: judge/models/problem.py:420
+#: judge/models/problem.py:447
msgid "See hidden problems"
msgstr ""
-#: judge/models/problem.py:421
+#: judge/models/problem.py:448
msgid "Edit own problems"
msgstr ""
-#: judge/models/problem.py:422
+#: judge/models/problem.py:449
msgid "Edit all problems"
msgstr ""
-#: judge/models/problem.py:423
+#: judge/models/problem.py:450
msgid "Edit all public problems"
msgstr ""
-#: judge/models/problem.py:424
+#: judge/models/problem.py:451
msgid "Edit problems with full markup"
msgstr ""
-#: judge/models/problem.py:425 templates/problem/problem.html:161
+#: judge/models/problem.py:452 templates/problem/problem.html:161
msgid "Clone problem"
msgstr ""
-#: judge/models/problem.py:426
+#: judge/models/problem.py:453
msgid "Change is_public field"
msgstr ""
-#: judge/models/problem.py:427
+#: judge/models/problem.py:454
msgid "Change is_manually_managed field"
msgstr ""
-#: judge/models/problem.py:428
+#: judge/models/problem.py:455
msgid "See organization-private problems"
msgstr ""
-#: judge/models/problem.py:436 judge/models/problem.py:454
+#: judge/models/problem.py:463 judge/models/problem.py:481
#: judge/models/runtime.py:111
msgid "language"
msgstr "언어"
-#: judge/models/problem.py:437
+#: judge/models/problem.py:464
msgid "translated name"
msgstr "번역된 이름"
-#: judge/models/problem.py:438
+#: judge/models/problem.py:465
msgid "translated description"
msgstr "번역된 설명"
-#: judge/models/problem.py:442
+#: judge/models/problem.py:469
msgid "problem translation"
msgstr "문제 번역"
-#: judge/models/problem.py:443
+#: judge/models/problem.py:470
msgid "problem translations"
msgstr "문제 번역"
-#: judge/models/problem.py:447
+#: judge/models/problem.py:474
msgid "clarified problem"
msgstr "수정된 문제"
-#: judge/models/problem.py:448
+#: judge/models/problem.py:475
msgid "clarification body"
msgstr "수정사항"
-#: judge/models/problem.py:449
+#: judge/models/problem.py:476
msgid "clarification timestamp"
msgstr "수정 타임스탬프"
-#: judge/models/problem.py:464
+#: judge/models/problem.py:491
msgid "language-specific resource limit"
msgstr "특정 언어 리소스 제한"
-#: judge/models/problem.py:465
+#: judge/models/problem.py:492
msgid "language-specific resource limits"
msgstr "특정 언어 리소스 제한"
-#: judge/models/problem.py:469
+#: judge/models/problem.py:496
msgid "associated problem"
msgstr "관련된 문제"
-#: judge/models/problem.py:472
+#: judge/models/problem.py:499
msgid "publish date"
msgstr ""
-#: judge/models/problem.py:474
+#: judge/models/problem.py:501
msgid "editorial content"
msgstr ""
-#: judge/models/problem.py:497
+#: judge/models/problem.py:524
msgid "See hidden solutions"
msgstr ""
-#: judge/models/problem.py:499
+#: judge/models/problem.py:526
msgid "solution"
msgstr "솔루션"
-#: judge/models/problem.py:500
+#: judge/models/problem.py:527
msgid "solutions"
msgstr "솔루션"
@@ -1677,112 +1686,112 @@ msgstr ""
msgid "case is pretest?"
msgstr ""
-#: judge/models/profile.py:38
+#: judge/models/profile.py:41
msgid "organization title"
msgstr "조직 이름"
-#: judge/models/profile.py:39
+#: judge/models/profile.py:42
msgid "organization slug"
msgstr ""
-#: judge/models/profile.py:40
+#: judge/models/profile.py:43
msgid "Organization name shown in URL"
msgstr ""
-#: judge/models/profile.py:42
+#: judge/models/profile.py:45
msgid "Displayed beside user name during contests"
msgstr "대회 동안 사용자 이름 옆에 표시됩니다."
-#: judge/models/profile.py:43
+#: judge/models/profile.py:46
msgid "organization description"
msgstr "조직 설명"
-#: judge/models/profile.py:44
+#: judge/models/profile.py:47
msgid "administrators"
msgstr "관리자"
-#: judge/models/profile.py:45
+#: judge/models/profile.py:48
msgid "Those who can edit this organization"
msgstr "이 조직을 편집할 수 있는 사람"
-#: judge/models/profile.py:46
+#: judge/models/profile.py:49
msgid "creation date"
msgstr "만든 날짜"
-#: judge/models/profile.py:47
+#: judge/models/profile.py:50
msgid "is open organization?"
msgstr "공개 조직인가?"
-#: judge/models/profile.py:48
+#: judge/models/profile.py:51
msgid "Allow joining organization"
msgstr "조직 가입 허용"
-#: judge/models/profile.py:49
+#: judge/models/profile.py:52
msgid "maximum size"
msgstr "최대 크기"
-#: judge/models/profile.py:50
+#: judge/models/profile.py:53
msgid "Maximum amount of users in this organization, only applicable to private organizations"
msgstr "이 조직의 최대 인원수(비공개 조직에만 적용)"
-#: judge/models/profile.py:52
+#: judge/models/profile.py:55
msgid "Student access code"
msgstr "학생 엑세스 코드"
-#: judge/models/profile.py:56
+#: judge/models/profile.py:59
msgid "This image will replace the default site logo for users viewing the organization."
msgstr ""
-#: judge/models/profile.py:79
+#: judge/models/profile.py:82
msgid "Administer organizations"
msgstr ""
-#: judge/models/profile.py:80
+#: judge/models/profile.py:83
msgid "Edit all organizations"
msgstr ""
-#: judge/models/profile.py:82 judge/models/profile.py:99
-#: judge/models/profile.py:269
+#: judge/models/profile.py:85 judge/models/profile.py:102
+#: judge/models/profile.py:293
msgid "organization"
msgstr "조직"
-#: judge/models/profile.py:87
+#: judge/models/profile.py:90
msgid "user associated"
msgstr "연결된 사용자"
-#: judge/models/profile.py:88
+#: judge/models/profile.py:91
msgid "self-description"
msgstr "자기소개"
-#: judge/models/profile.py:89
+#: judge/models/profile.py:92
msgid "location"
msgstr "위치"
-#: judge/models/profile.py:91
+#: judge/models/profile.py:94
msgid "preferred language"
msgstr "기본 설정 언어"
-#: judge/models/profile.py:97
+#: judge/models/profile.py:100
msgid "last access time"
msgstr "마지막 접속 시간"
-#: judge/models/profile.py:98
+#: judge/models/profile.py:101
msgid "last IP"
msgstr "마지막 IP"
-#: judge/models/profile.py:101
+#: judge/models/profile.py:104
msgid "display rank"
msgstr "순위 표시"
-#: judge/models/profile.py:103
+#: judge/models/profile.py:106
msgid "Normal User"
msgstr ""
-#: judge/models/profile.py:104
+#: judge/models/profile.py:107
msgid "Problem Setter"
msgstr ""
-#: judge/models/profile.py:105 templates/base.html:220
+#: judge/models/profile.py:108 templates/base.html:220
#: templates/comments/list.html:99 templates/contest/contest-list-tabs.html:24
#: templates/contest/ranking-table.html:49
#: templates/problem/problem-list-tabs.html:6
@@ -1791,155 +1800,167 @@ msgstr ""
msgid "Admin"
msgstr "관리자"
-#: judge/models/profile.py:106
+#: judge/models/profile.py:109
msgid "comment mute"
msgstr "코멘트 음소거"
-#: judge/models/profile.py:106
+#: judge/models/profile.py:109
msgid "Some users are at their best when silent."
msgstr ""
-#: judge/models/profile.py:108
+#: judge/models/profile.py:111
msgid "unlisted user"
msgstr ""
-#: judge/models/profile.py:108
+#: judge/models/profile.py:111
msgid "User will not be ranked."
msgstr ""
-#: judge/models/profile.py:111
+#: judge/models/profile.py:114
msgid "user script"
msgstr "사용자 스크립트"
-#: judge/models/profile.py:112
+#: judge/models/profile.py:115
msgid "User-defined JavaScript for site customization."
msgstr "사이트 수정을 위한 사용자 자바스크립트입니다."
-#: judge/models/profile.py:113
+#: judge/models/profile.py:116
msgid "current contest"
msgstr "현재 대회"
-#: judge/models/profile.py:115
+#: judge/models/profile.py:118
msgid "math engine"
msgstr "math engine"
-#: judge/models/profile.py:117
+#: judge/models/profile.py:120
msgid "the rendering engine used to render math"
msgstr ""
-#: judge/models/profile.py:118
+#: judge/models/profile.py:121
msgid "TOTP 2FA enabled"
msgstr ""
-#: judge/models/profile.py:119
+#: judge/models/profile.py:122
msgid "check to enable TOTP-based two-factor authentication"
msgstr ""
-#: judge/models/profile.py:120
+#: judge/models/profile.py:123
msgid "WebAuthn 2FA enabled"
msgstr ""
-#: judge/models/profile.py:121
+#: judge/models/profile.py:124
msgid "check to enable WebAuthn-based two-factor authentication"
msgstr ""
-#: judge/models/profile.py:122
+#: judge/models/profile.py:125
msgid "TOTP key"
msgstr ""
-#: judge/models/profile.py:123
+#: judge/models/profile.py:126
msgid "32 character base32-encoded key for TOTP"
msgstr ""
-#: judge/models/profile.py:125
+#: judge/models/profile.py:128
msgid "TOTP key must be empty or base32"
msgstr ""
-#: judge/models/profile.py:126
+#: judge/models/profile.py:129
msgid "scratch codes"
msgstr ""
-#: judge/models/profile.py:127
+#: judge/models/profile.py:130
msgid "JSON array of 16 character base32-encoded codes for scratch codes"
msgstr ""
-#: judge/models/profile.py:131
+#: judge/models/profile.py:134
msgid "Scratch codes must be empty or a JSON array of 16-character base32 codes"
msgstr ""
-#: judge/models/profile.py:133
+#: judge/models/profile.py:136
+msgid "last TOTP timecode"
+msgstr ""
+
+#: judge/models/profile.py:137
msgid "API token"
msgstr ""
-#: judge/models/profile.py:134
+#: judge/models/profile.py:138
msgid "64 character hex-encoded API access token"
msgstr ""
-#: judge/models/profile.py:136
+#: judge/models/profile.py:140
msgid "API token must be None or hexadecimal"
msgstr ""
-#: judge/models/profile.py:137
+#: judge/models/profile.py:141
msgid "internal notes"
msgstr ""
-#: judge/models/profile.py:138
+#: judge/models/profile.py:142
msgid "Notes for administrators regarding this user."
msgstr ""
-#: judge/models/profile.py:139
+#: judge/models/profile.py:143
msgid "last data download time"
msgstr ""
-#: judge/models/profile.py:236
+#: judge/models/profile.py:253
msgid "Shows in-progress development stuff"
msgstr ""
-#: judge/models/profile.py:237
+#: judge/models/profile.py:254
msgid "Edit TOTP settings"
msgstr ""
-#: judge/models/profile.py:239
+#: judge/models/profile.py:256
msgid "user profile"
msgstr "사용자 프로파일"
-#: judge/models/profile.py:240
+#: judge/models/profile.py:257
msgid "user profiles"
msgstr "사용자 프로파일"
-#: judge/models/profile.py:246
+#: judge/models/profile.py:263
msgid "device name"
msgstr ""
-#: judge/models/profile.py:247
+#: judge/models/profile.py:264
msgid "credential ID"
msgstr ""
-#: judge/models/profile.py:248
+#: judge/models/profile.py:265
msgid "public key"
msgstr ""
-#: judge/models/profile.py:249
+#: judge/models/profile.py:266
msgid "sign counter"
msgstr ""
-#: judge/models/profile.py:271
+#: judge/models/profile.py:287
+msgid "WebAuthn credential"
+msgstr ""
+
+#: judge/models/profile.py:288
+msgid "WebAuthn credentials"
+msgstr ""
+
+#: judge/models/profile.py:295
msgid "request time"
msgstr "요청 시간"
-#: judge/models/profile.py:272
+#: judge/models/profile.py:296
msgid "state"
msgstr "상태"
-#: judge/models/profile.py:277
+#: judge/models/profile.py:301
msgid "reason"
msgstr "이유"
-#: judge/models/profile.py:280
+#: judge/models/profile.py:304
msgid "organization join request"
msgstr "조직 가입 요청"
-#: judge/models/profile.py:281
+#: judge/models/profile.py:305
msgid "organization join requests"
msgstr "조직 가입 요청"
@@ -2095,210 +2116,210 @@ msgstr "채점기"
msgid "judge"
msgstr "채점"
-#: judge/models/submission.py:20 judge/models/submission.py:47
+#: judge/models/submission.py:21 judge/models/submission.py:48
#: judge/utils/problems.py:74
msgid "Accepted"
msgstr "통과"
-#: judge/models/submission.py:21 judge/models/submission.py:48
+#: judge/models/submission.py:22 judge/models/submission.py:49
msgid "Wrong Answer"
msgstr "오답"
-#: judge/models/submission.py:22 judge/models/submission.py:50
+#: judge/models/submission.py:23 judge/models/submission.py:51
msgid "Time Limit Exceeded"
msgstr "시간 제한 초과"
-#: judge/models/submission.py:23 judge/models/submission.py:51
+#: judge/models/submission.py:24 judge/models/submission.py:52
msgid "Memory Limit Exceeded"
msgstr "메모리 제한 초과"
-#: judge/models/submission.py:24 judge/models/submission.py:52
+#: judge/models/submission.py:25 judge/models/submission.py:53
msgid "Output Limit Exceeded"
msgstr "출력 제한 초과"
-#: judge/models/submission.py:25 judge/models/submission.py:53
+#: judge/models/submission.py:26 judge/models/submission.py:54
msgid "Invalid Return"
msgstr "잘못된 반환"
-#: judge/models/submission.py:26 judge/models/submission.py:54
+#: judge/models/submission.py:27 judge/models/submission.py:55
msgid "Runtime Error"
msgstr "런타임 에러"
-#: judge/models/submission.py:27 judge/models/submission.py:41
-#: judge/models/submission.py:55 judge/utils/problems.py:76
+#: judge/models/submission.py:28 judge/models/submission.py:42
+#: judge/models/submission.py:56 judge/utils/problems.py:76
msgid "Compile Error"
msgstr "컴파일 에러"
-#: judge/models/submission.py:28 judge/models/submission.py:40
+#: judge/models/submission.py:29 judge/models/submission.py:41
msgid "Internal Error"
msgstr "내부 에러"
-#: judge/models/submission.py:29
+#: judge/models/submission.py:30
msgid "Short circuit"
msgstr "Short circuit"
-#: judge/models/submission.py:30 judge/models/submission.py:42
-#: judge/models/submission.py:61
+#: judge/models/submission.py:31 judge/models/submission.py:43
+#: judge/models/submission.py:62
msgid "Aborted"
msgstr "취소됨"
-#: judge/models/submission.py:36 judge/models/submission.py:57
+#: judge/models/submission.py:37 judge/models/submission.py:58
msgid "Queued"
msgstr "대기열에 있음"
-#: judge/models/submission.py:37 judge/models/submission.py:58
+#: judge/models/submission.py:38 judge/models/submission.py:59
msgid "Processing"
msgstr "처리중"
-#: judge/models/submission.py:38 judge/models/submission.py:59
+#: judge/models/submission.py:39 judge/models/submission.py:60
msgid "Grading"
msgstr "채점중"
-#: judge/models/submission.py:39 judge/models/submission.py:60
+#: judge/models/submission.py:40 judge/models/submission.py:61
msgid "Completed"
msgstr "완료"
-#: judge/models/submission.py:56
+#: judge/models/submission.py:57
msgid "Internal Error (judging server error)"
msgstr ""
-#: judge/models/submission.py:66
+#: judge/models/submission.py:67
msgid "submission time"
msgstr "제출 시간"
-#: judge/models/submission.py:67 judge/models/submission.py:227
+#: judge/models/submission.py:68 judge/models/submission.py:238
msgid "execution time"
msgstr "실행 시간"
-#: judge/models/submission.py:68 judge/models/submission.py:228
+#: judge/models/submission.py:69 judge/models/submission.py:239
msgid "memory usage"
msgstr "메모리 사용량"
-#: judge/models/submission.py:69 judge/models/submission.py:229
+#: judge/models/submission.py:70 judge/models/submission.py:240
msgid "points granted"
msgstr "획득 포인트"
-#: judge/models/submission.py:70
+#: judge/models/submission.py:71
msgid "submission language"
msgstr "제출 언어"
-#: judge/models/submission.py:71
+#: judge/models/submission.py:72
msgid "status"
msgstr "상태"
-#: judge/models/submission.py:72
+#: judge/models/submission.py:73
msgid "result"
msgstr "결과"
-#: judge/models/submission.py:74
+#: judge/models/submission.py:75
msgid "compile errors"
msgstr "컴파일 에러"
-#: judge/models/submission.py:76
+#: judge/models/submission.py:77
msgid "batched cases"
msgstr "batched 테스트 케이스"
-#: judge/models/submission.py:77
+#: judge/models/submission.py:78
msgid "test case points"
msgstr "테스크 케이스 점수"
-#: judge/models/submission.py:78
+#: judge/models/submission.py:79
msgid "test case total points"
msgstr "테스트 케이스 총 점수"
-#: judge/models/submission.py:79
+#: judge/models/submission.py:80
msgid "judged on"
msgstr ""
-#: judge/models/submission.py:81
+#: judge/models/submission.py:82
msgid "submission judge time"
msgstr ""
-#: judge/models/submission.py:82
-msgid "was rejudged by admin"
-msgstr "관리자에 의해 재채점"
-
#: judge/models/submission.py:83
+msgid "last rejudge date by admin"
+msgstr ""
+
+#: judge/models/submission.py:84
msgid "was ran on pretests only"
msgstr "pretest에서만 채점됨"
-#: judge/models/submission.py:86
-msgid "lock submission"
+#: judge/models/submission.py:87
+msgid "submission lock"
msgstr ""
-#: judge/models/submission.py:199
+#: judge/models/submission.py:210
msgid "Abort any submission"
msgstr ""
-#: judge/models/submission.py:200
+#: judge/models/submission.py:211
msgid "Rejudge the submission"
msgstr ""
-#: judge/models/submission.py:201
+#: judge/models/submission.py:212
msgid "Rejudge a lot of submissions"
msgstr ""
-#: judge/models/submission.py:202
+#: judge/models/submission.py:213
msgid "Submit without limit"
msgstr ""
-#: judge/models/submission.py:203
+#: judge/models/submission.py:214
msgid "View all submission"
msgstr ""
-#: judge/models/submission.py:204
+#: judge/models/submission.py:215
msgid "Resubmit others' submission"
msgstr ""
-#: judge/models/submission.py:205
+#: judge/models/submission.py:216
msgid "Change lock status of submission"
msgstr ""
-#: judge/models/submission.py:208 templates/contest/moss.html:58
+#: judge/models/submission.py:219 templates/contest/moss.html:58
msgid "submissions"
msgstr "제출"
-#: judge/models/submission.py:212 judge/models/submission.py:223
+#: judge/models/submission.py:223 judge/models/submission.py:234
msgid "associated submission"
msgstr "관련된 제출"
-#: judge/models/submission.py:214
+#: judge/models/submission.py:225
msgid "source code"
msgstr "소스 코드"
-#: judge/models/submission.py:225
+#: judge/models/submission.py:236
msgid "test case ID"
msgstr "test case ID"
-#: judge/models/submission.py:226
+#: judge/models/submission.py:237
msgid "status flag"
msgstr "상태 flag"
-#: judge/models/submission.py:230
+#: judge/models/submission.py:241
msgid "points possible"
msgstr "획득 가능한 포인트"
-#: judge/models/submission.py:231
+#: judge/models/submission.py:242
msgid "batch number"
msgstr "batch number"
-#: judge/models/submission.py:232
+#: judge/models/submission.py:243
msgid "judging feedback"
msgstr "채점 피드백"
-#: judge/models/submission.py:233
+#: judge/models/submission.py:244
msgid "extended judging feedback"
msgstr ""
-#: judge/models/submission.py:234
+#: judge/models/submission.py:245
msgid "program output"
msgstr "프로그램 출력"
-#: judge/models/submission.py:242
+#: judge/models/submission.py:253
msgid "submission test case"
msgstr "제출 테스트 케이스"
-#: judge/models/submission.py:243
+#: judge/models/submission.py:254
msgid "submission test cases"
msgstr "제출 테스트 케이스"
@@ -2346,6 +2367,10 @@ msgstr "티켓"
msgid "poster"
msgstr "포스터"
+#: judge/models/ticket.py:30
+msgid "message body"
+msgstr "메시지 본문"
+
#: judge/models/ticket.py:31
msgid "message time"
msgstr "메시지 시간"
@@ -2368,19 +2393,23 @@ msgstr ""
msgid "Running MOSS"
msgstr ""
-#: judge/tasks/submission.py:43
+#: judge/tasks/submission.py:45
msgid "Modifying submissions"
msgstr ""
-#: judge/tasks/submission.py:56
+#: judge/tasks/submission.py:58
msgid "Recalculating user points"
msgstr ""
-#: judge/tasks/user.py:50
+#: judge/tasks/user.py:49
+msgid "Applying filters"
+msgstr ""
+
+#: judge/tasks/user.py:64
msgid "Preparing your submission data"
msgstr ""
-#: judge/tasks/user.py:81
+#: judge/tasks/user.py:95
msgid "Preparing your comment data"
msgstr ""
@@ -2490,7 +2519,7 @@ msgstr ""
msgid "You already voted."
msgstr "이미 투표하셨습니다."
-#: judge/views/comment.py:129 judge/views/organization.py:298
+#: judge/views/comment.py:129 judge/views/organization.py:297
msgid "Edited from site"
msgstr "사이트에서 편집"
@@ -2498,125 +2527,130 @@ msgstr "사이트에서 편집"
msgid "Editing comment"
msgstr ""
-#: judge/views/contests.py:56 judge/views/contests.py:201
-#: judge/views/contests.py:204 judge/views/contests.py:382
+#: judge/views/contests.py:57 judge/views/contests.py:210
+#: judge/views/contests.py:213 judge/views/contests.py:395
msgid "No such contest"
msgstr "그런 대회는 존재하지 않습니다."
-#: judge/views/contests.py:57 judge/views/contests.py:202
+#: judge/views/contests.py:58 judge/views/contests.py:211
#, python-format
msgid "Could not find a contest with the key \"%s\"."
msgstr "키 %s로는 대회를 찾을 수 없습니다."
-#: judge/views/contests.py:70
+#: judge/views/contests.py:71
msgid "Contests"
msgstr "대회"
-#: judge/views/contests.py:205
+#: judge/views/contests.py:214
msgid "Could not find such contest."
msgstr "그런 대회를 찾을 수 있습니다."
-#: judge/views/contests.py:208
+#: judge/views/contests.py:217
#, python-format
msgid "Access to contest \"%s\" denied"
msgstr "%s 대회 접근이 거부되었습니다."
-#: judge/views/contests.py:235
+#: judge/views/contests.py:244
msgid "Clone Contest"
msgstr ""
-#: judge/views/contests.py:301
+#: judge/views/contests.py:278
+#, python-format
+msgid "Cloned contest from %s"
+msgstr ""
+
+#: judge/views/contests.py:314
msgid "Contest not ongoing"
msgstr "현재 진행중인 대회가 아닙니다."
-#: judge/views/contests.py:302
+#: judge/views/contests.py:315
#, python-format
msgid "\"%s\" is not currently ongoing."
msgstr "%s는 현재 진행중이 아닙니다."
-#: judge/views/contests.py:306
+#: judge/views/contests.py:319
msgid "Already in contest"
msgstr "대회에 이미 있습니다."
-#: judge/views/contests.py:307
+#: judge/views/contests.py:320
#, python-format
msgid "You are already in a contest: \"%s\"."
msgstr "현재 대회 %s에 이미 참가해 있습니다."
-#: judge/views/contests.py:310
+#: judge/views/contests.py:323
msgid "Banned from joining"
msgstr ""
-#: judge/views/contests.py:311
+#: judge/views/contests.py:324
msgid "You have been declared persona non grata for this contest. You are permanently barred from joining this contest."
msgstr ""
-#: judge/views/contests.py:372
+#: judge/views/contests.py:385
#, python-format
msgid "Enter access code for \"%s\""
msgstr ""
-#: judge/views/contests.py:383
+#: judge/views/contests.py:396
#, python-format
msgid "You are not in contest \"%s\"."
msgstr "현재 대회 %s에 참가중이 아닙니다."
-#: judge/views/contests.py:402
+#: judge/views/contests.py:415
msgid "ContestCalendar requires integer year and month"
msgstr ""
-#: judge/views/contests.py:442
+#: judge/views/contests.py:455
#, python-format
msgid "Contests in %(month)s"
msgstr ""
-#: judge/views/contests.py:442
+#: judge/views/contests.py:455
msgid "F Y"
msgstr ""
-#: judge/views/contests.py:489
+#: judge/views/contests.py:502
#, python-format
msgid "%s Statistics"
msgstr ""
-#: judge/views/contests.py:662
+#: judge/views/contests.py:675
#, python-format
msgid "%s Rankings"
msgstr "%s 순위"
-#: judge/views/contests.py:670
+#: judge/views/contests.py:683
msgid "???"
msgstr ""
-#: judge/views/contests.py:686
+#: judge/views/contests.py:699
#, python-format
msgid "Your participation in %s"
msgstr "%s에 대한 당신의 참가"
-#: judge/views/contests.py:687
+#: judge/views/contests.py:700
#, python-format
msgid "%s's participation in %s"
msgstr "%s's %s에 대한 참가"
-#: judge/views/contests.py:694
+#: judge/views/contests.py:707
msgid "Live"
msgstr "실시간"
-#: judge/views/contests.py:706 templates/contest/contest-tabs.html:13
+#: judge/views/contests.py:719 templates/contest/contest-tabs.html:13
msgid "Participation"
msgstr "참여"
-#: judge/views/contests.py:750
+#: judge/views/contests.py:763
#, python-format
msgid "%s MOSS Results"
msgstr ""
-#: judge/views/contests.py:777
+#: judge/views/contests.py:790
#, python-format
msgid "Running MOSS for %s..."
msgstr ""
-#: judge/views/contests.py:800
+#: judge/views/contests.py:813
#, python-format
msgid "Contest tag: %s"
msgstr "대회 태그: %s"
@@ -2645,161 +2679,175 @@ msgstr "손상된 페이지 %s"
msgid "Runtimes"
msgstr "런타임"
-#: judge/views/organization.py:44 judge/views/organization.py:47
+#: judge/views/organization.py:43 judge/views/organization.py:46
msgid "No such organization"
msgstr "존재하지 않는 조직"
-#: judge/views/organization.py:45
+#: judge/views/organization.py:44
#, python-format
msgid "Could not find an organization with the key \"%s\"."
msgstr "%s 조직을 찾을 수 없습니다."
-#: judge/views/organization.py:48
+#: judge/views/organization.py:47
msgid "Could not find such organization."
msgstr "그러한 조직을 찾을 수 없습니다."
-#: judge/views/organization.py:72 judge/views/register.py:34
+#: judge/views/organization.py:71 judge/views/register.py:33
#: templates/organization/list.html:15 templates/user/user-list-tabs.html:5
msgid "Organizations"
msgstr "조직"
-#: judge/views/organization.py:93
+#: judge/views/organization.py:92
#, python-format
msgid "%s Members"
msgstr "%s 멤버"
-#: judge/views/organization.py:118 judge/views/organization.py:121
-#: judge/views/organization.py:126
+#: judge/views/organization.py:117 judge/views/organization.py:120
+#: judge/views/organization.py:125
msgid "Joining organization"
msgstr "조직 가입"
-#: judge/views/organization.py:118
+#: judge/views/organization.py:117
msgid "You are already in the organization."
msgstr "이미 조직에 가입되어 있습니다."
-#: judge/views/organization.py:121
+#: judge/views/organization.py:120
msgid "This organization is not open."
msgstr "이 조직은 공개되어 있지 않습니다."
-#: judge/views/organization.py:138
+#: judge/views/organization.py:137
msgid "Leaving organization"
msgstr "조직 탈퇴"
-#: judge/views/organization.py:138
+#: judge/views/organization.py:137
#, python-format
msgid "You are not in \"%s\"."
msgstr "%s에 있지 않습니다."
-#: judge/views/organization.py:162
+#: judge/views/organization.py:161
#, python-format
msgid "Request to join %s"
msgstr "%s 가입 신청"
-#: judge/views/organization.py:180
+#: judge/views/organization.py:179
msgid "Join request detail"
msgstr "가입 신청 세부 사항"
-#: judge/views/organization.py:208
+#: judge/views/organization.py:207
#, python-format
msgid "Managing join requests for %s"
msgstr "%s 가입 신청 가입"
-#: judge/views/organization.py:239
+#: judge/views/organization.py:238
#, python-format
msgid "Your organization can only receive %d more members. You cannot approve %d users."
msgstr "당신의 조직은 %d명의 회원만 더 가입이 가능합니다. %d명의 사용자 가입 승인이 불가합니다."
-#: judge/views/organization.py:251
+#: judge/views/organization.py:250
#, python-format
msgid "Approved %d user."
msgid_plural "Approved %d users."
msgstr[0] "%d명 사용자 승인"
-#: judge/views/organization.py:252
+#: judge/views/organization.py:251
#, python-format
msgid "Rejected %d user."
msgid_plural "Rejected %d users."
msgstr[0] "%d명 거부"
-#: judge/views/organization.py:282
+#: judge/views/organization.py:281
#, python-format
msgid "Editing %s"
msgstr "%s 편집중"
-#: judge/views/organization.py:306 judge/views/organization.py:314
+#: judge/views/organization.py:305 judge/views/organization.py:313
msgid "Can't edit organization"
msgstr "조직 편집이 불가합니다."
-#: judge/views/organization.py:307
+#: judge/views/organization.py:306
msgid "You are not allowed to edit this organization."
msgstr "조직을 편집할 권한이 없습니다."
-#: judge/views/organization.py:315
+#: judge/views/organization.py:314
msgid "You are not allowed to kick people from this organization."
msgstr "조직 사용자를 탈퇴시킬 권한이 없습니다."
-#: judge/views/organization.py:320 judge/views/organization.py:324
+#: judge/views/organization.py:319 judge/views/organization.py:323
msgid "Can't kick user"
msgstr "이 사용자를 탈퇴시킬 수 없습니다."
-#: judge/views/organization.py:321
+#: judge/views/organization.py:320
msgid "The user you are trying to kick does not exist!"
msgstr "탈퇴시키려는 사용자가 존재하지 않습니다."
-#: judge/views/organization.py:325
+#: judge/views/organization.py:324
#, python-format
msgid "The user you are trying to kick is not in organization: %s."
msgstr ""
-#: judge/views/problem.py:67
+#: judge/views/problem.py:68
msgid "No such problem"
msgstr "존재하지 않는 문제"
-#: judge/views/problem.py:68
+#: judge/views/problem.py:69
#, python-format
msgid "Could not find a problem with the code \"%s\"."
msgstr "%s 문제를 찾을 수 없습니다."
-#: judge/views/problem.py:110
+#: judge/views/problem.py:111
#, python-brace-format
msgid "Editorial for {0}"
msgstr ""
-#: judge/views/problem.py:113
+#: judge/views/problem.py:114
#, python-brace-format
msgid "Editorial for {0}"
msgstr ""
-#: judge/views/problem.py:283 templates/contest/contest.html:79
+#: judge/views/problem.py:133
+msgid "No such editorial"
+msgstr ""
+
+#: judge/views/problem.py:134
+#, python-format
+msgid "Could not find an editorial with the code \"%s\"."
+msgstr ""
+
+#: judge/views/problem.py:289 templates/contest/contest.html:79
#: templates/user/user-tabs.html:5 templates/user/users-table.html:23
msgid "Problems"
msgstr "문제"
-#: judge/views/problem.py:556 judge/views/problem.py:564
+#: judge/views/problem.py:562 judge/views/problem.py:570
#, python-format
msgid "Submit to %s"
msgstr ""
-#: judge/views/problem.py:613
+#: judge/views/problem.py:619
msgid "Banned from submitting"
msgstr ""
-#: judge/views/problem.py:614
+#: judge/views/problem.py:620
msgid "You have been declared persona non grata for this problem. You are permanently barred from submitting this problem."
msgstr ""
-#: judge/views/problem.py:618
+#: judge/views/problem.py:624
msgid "Too many submissions"
msgstr ""
-#: judge/views/problem.py:619
+#: judge/views/problem.py:625
msgid "You have exceeded the submission limit for this problem."
msgstr ""
-#: judge/views/problem.py:681
+#: judge/views/problem.py:693
msgid "Clone Problem"
msgstr ""
+#: judge/views/problem.py:720
+#, python-format
+msgid "Cloned problem from %s"
+msgstr ""
+
#: judge/views/problem_data.py:37
msgid "Checker arguments must be a JSON object"
msgstr "Checker arguments must be a JSON object"
@@ -2868,52 +2916,52 @@ msgstr "%s를 위한 best 솔루션"
msgid "Best solutions for {0}"
msgstr ""
-#: judge/views/ranked_submission.py:80
+#: judge/views/ranked_submission.py:82
#, python-format
msgid "Best solutions for %(problem)s in %(contest)s"
msgstr ""
-#: judge/views/ranked_submission.py:83
+#: judge/views/ranked_submission.py:85
#, python-format
msgid "Best solutions for problem %(number)s in %(contest)s"
msgstr ""
-#: judge/views/ranked_submission.py:89
+#: judge/views/ranked_submission.py:91
#, python-brace-format
msgid "Best solutions for {0} in {2}"
msgstr ""
-#: judge/views/ranked_submission.py:92
+#: judge/views/ranked_submission.py:94
#, python-brace-format
msgid "Best solutions for problem {0} in {1}"
msgstr ""
-#: judge/views/register.py:27
+#: judge/views/register.py:26
msgid "A username must contain letters, numbers, or underscores"
msgstr "사용자 이름은 문자, 숫자, 또는 밑줄을 포함해야 합니다."
-#: judge/views/register.py:31
+#: judge/views/register.py:30
msgid "Preferred language"
msgstr "선호하는 언어"
-#: judge/views/register.py:38
+#: judge/views/register.py:37
msgid "Subscribe to newsletter?"
msgstr "뉴스레터에 구독하시겠습니까?"
-#: judge/views/register.py:45
+#: judge/views/register.py:44
#, python-format
msgid "The email address \"%s\" is already taken. Only one registration is allowed per address."
msgstr "이메일 주소 %s는 사용중입니다. 하나의 주소에 대해 한번만 가입이 허용됩니다."
-#: judge/views/register.py:51
+#: judge/views/register.py:50
msgid "Your email provider is not allowed due to history of abuse. Please use a reputable email provider."
msgstr "스팸으로 인해 이 이메일 제공업체는 허용되지 않습니다. 다른 메일 주소를 사용해 주세요."
-#: judge/views/register.py:57 judge/views/register.py:95
+#: judge/views/register.py:56 judge/views/register.py:94
msgid "Registration"
msgstr "회원가입"
-#: judge/views/register.py:106
+#: judge/views/register.py:105
msgid "Authentication failure"
msgstr "인증 실패"
@@ -2921,7 +2969,7 @@ msgstr "인증 실패"
msgid "Language statistics"
msgstr "언어 통계"
-#: judge/views/status.py:24 templates/submission/list.html:311
+#: judge/views/status.py:24 templates/submission/list.html:310
msgid "Status"
msgstr "현재 상태"
@@ -2929,74 +2977,74 @@ msgstr "현재 상태"
msgid "Version matrix"
msgstr ""
-#: judge/views/submission.py:53 judge/views/submission.py:60
+#: judge/views/submission.py:55 judge/views/submission.py:62
#, python-format
msgid "Submission of %(problem)s by %(user)s"
msgstr ""
-#: judge/views/submission.py:203 judge/views/submission.py:204
+#: judge/views/submission.py:205 judge/views/submission.py:206
#: templates/problem/problem.html:127
msgid "All submissions"
msgstr "모든 제출들"
-#: judge/views/submission.py:349
+#: judge/views/submission.py:355
msgid "All my submissions"
msgstr "내 모든 제출들"
-#: judge/views/submission.py:350
+#: judge/views/submission.py:356
#, python-format
msgid "All submissions by %s"
msgstr ""
-#: judge/views/submission.py:381
+#: judge/views/submission.py:387
#, python-format
msgid "All submissions for %s"
msgstr ""
-#: judge/views/submission.py:400
+#: judge/views/submission.py:410
msgid "Must pass a problem"
msgstr ""
-#: judge/views/submission.py:439
+#: judge/views/submission.py:449
#, python-format
msgid "My submissions for %(problem)s"
msgstr "%(problem)s에 대한 나의 제출"
-#: judge/views/submission.py:440
+#: judge/views/submission.py:450
#, python-format
msgid "%(user)s's submissions for %(problem)s"
msgstr "%(problem)s에 대한 %(user)s의 제출"
-#: judge/views/submission.py:536
+#: judge/views/submission.py:546
msgid "Must pass a contest"
msgstr "대회를 통화해야한다"
-#: judge/views/submission.py:544
+#: judge/views/submission.py:554
#, python-format
msgid "My submissions in %(contest)s"
msgstr ""
-#: judge/views/submission.py:545
+#: judge/views/submission.py:555
#, python-format
msgid "%(user)s's submissions in %(contest)s"
msgstr ""
-#: judge/views/submission.py:559
+#: judge/views/submission.py:569
#, python-brace-format
msgid "My submissions in {0}"
msgstr ""
-#: judge/views/submission.py:561
+#: judge/views/submission.py:571
#, python-brace-format
msgid "{0}'s submissions in {2}"
msgstr ""
-#: judge/views/submission.py:585
+#: judge/views/submission.py:597
#, python-brace-format
msgid "{0}'s submissions for {2} in {4}"
msgstr "{0}'s submissions for {2} in {4}"
-#: judge/views/submission.py:590
+#: judge/views/submission.py:602
#, python-brace-format
msgid "{0}'s submissions for problem {2} in {3}"
msgstr "{0}'s submissions for problem {2} in {3}"
@@ -3013,40 +3061,40 @@ msgstr ""
msgid "You must solve at least one problem before you can create a ticket."
msgstr ""
-#: judge/views/ticket.py:87 judge/views/ticket.py:90
+#: judge/views/ticket.py:91 judge/views/ticket.py:94
#, python-format
msgid "New ticket for %s"
msgstr ""
-#: judge/views/ticket.py:144
+#: judge/views/ticket.py:148
#, python-format
msgid "%(title)s - Ticket %(id)d"
msgstr ""
-#: judge/views/ticket.py:249
+#: judge/views/ticket.py:253
#, python-format
msgid "Tickets - Page %(number)d of %(total)d"
msgstr ""
-#: judge/views/ticket.py:298
+#: judge/views/ticket.py:302
#, python-format
msgid "New Ticket: %s"
msgstr ""
-#: judge/views/ticket.py:299
+#: judge/views/ticket.py:303
#, python-format
msgid "#%(id)d, assigned to: %(users)s"
msgstr ""
-#: judge/views/ticket.py:301
+#: judge/views/ticket.py:305
msgid ", "
msgstr ""
-#: judge/views/ticket.py:301
+#: judge/views/ticket.py:305
msgid "no one"
msgstr ""
-#: judge/views/ticket.py:321
+#: judge/views/ticket.py:325
#, python-format
msgid "New Ticket Message For: %s"
msgstr ""
@@ -3055,87 +3103,91 @@ msgstr ""
msgid "Enable Two-factor Authentication"
msgstr ""
-#: judge/views/two_factor.py:99
+#: judge/views/two_factor.py:108
+msgid "Refresh Two-factor Authentication"
+msgstr ""
+
+#: judge/views/two_factor.py:116
msgid "Disable Two-factor Authentication"
msgstr ""
-#: judge/views/two_factor.py:148
+#: judge/views/two_factor.py:165
msgid "Invalid WebAuthn response"
msgstr ""
-#: judge/views/two_factor.py:151
+#: judge/views/two_factor.py:168
msgid "Invalid name"
msgstr ""
-#: judge/views/two_factor.py:204
+#: judge/views/two_factor.py:221
msgid "Staff may not disable 2FA"
msgstr ""
-#: judge/views/two_factor.py:216
+#: judge/views/two_factor.py:229
msgid "Perform Two-factor Authentication"
msgstr ""
-#: judge/views/user.py:79
+#: judge/views/user.py:78
msgid "No such user"
msgstr ""
-#: judge/views/user.py:79
+#: judge/views/user.py:78
#, python-format
msgid "No user handle \"%s\"."
msgstr ""
-#: judge/views/user.py:83
+#: judge/views/user.py:82
msgid "My account"
msgstr ""
-#: judge/views/user.py:84
+#: judge/views/user.py:83
#, python-format
msgid "User %s"
msgstr ""
-#: judge/views/user.py:132
+#: judge/views/user.py:131
msgid "Login"
msgstr "로그인"
-#: judge/views/user.py:173
+#: judge/views/user.py:172
msgid "M j, Y, G:i"
msgstr ""
-#: judge/views/user.py:307
+#: judge/views/user.py:306
msgid "Preparing your data..."
msgstr ""
-#: judge/views/user.py:311 templates/user/edit-profile.html:348
+#: judge/views/user.py:310 templates/user/edit-profile.html:352
msgid "Download your data"
msgstr ""
-#: judge/views/user.py:367
+#: judge/views/user.py:366
msgid "Updated on site"
msgstr ""
-#: judge/views/user.py:400 templates/admin/auth/user/change_form.html:14
+#: judge/views/user.py:399 templates/admin/auth/user/change_form.html:14
#: templates/admin/auth/user/change_form.html:17 templates/base.html:222
#: templates/user/user-tabs.html:16
msgid "Edit profile"
msgstr ""
-#: judge/views/user.py:415
+#: judge/views/user.py:414
msgid "Generated API token for user"
msgstr ""
-#: judge/views/user.py:427
+#: judge/views/user.py:426
msgid "Removed API token for user"
msgstr ""
-#: judge/views/user.py:437
+#: judge/views/user.py:436
msgid "Generated scratch codes for user"
msgstr ""
-#: judge/views/user.py:443 templates/user/user-list-tabs.html:4
+#: judge/views/user.py:442 templates/user/user-list-tabs.html:4
msgid "Leaderboard"
msgstr ""
-#: judge/views/user.py:504
+#: judge/views/user.py:503
msgid "You have been successfully logged out."
msgstr ""
@@ -3260,11 +3312,11 @@ msgstr ""
msgid "posted on {time}"
msgstr ""
-#: templates/blog/list.html:130 templates/problem/problem.html:309
+#: templates/blog/list.html:130 templates/problem/problem.html:311
msgid "Clarifications"
msgstr ""
-#: templates/blog/list.html:146 templates/problem/problem.html:320
+#: templates/blog/list.html:146 templates/problem/problem.html:322
msgid "No clarifications have been made at this time."
msgstr ""
@@ -3457,7 +3509,7 @@ msgid "Info"
msgstr ""
#: templates/contest/contest-tabs.html:6 templates/stats/base.html:9
-#: templates/submission/list.html:337
+#: templates/submission/list.html:336
msgid "Statistics"
msgstr ""
@@ -3660,19 +3712,19 @@ msgstr ""
msgid "Disqualify"
msgstr ""
-#: templates/contest/ranking.html:169
+#: templates/contest/ranking.html:173
msgid "Are you sure you want to disqualify this participation?"
msgstr ""
-#: templates/contest/ranking.html:174
+#: templates/contest/ranking.html:178
msgid "Are you sure you want to un-disqualify this participation?"
msgstr ""
-#: templates/contest/ranking.html:246
+#: templates/contest/ranking.html:250
msgid "View user participation"
msgstr ""
-#: templates/contest/ranking.html:250
+#: templates/contest/ranking.html:254
msgid "Show organizations"
msgstr ""
@@ -3947,7 +3999,7 @@ msgstr ""
msgid "Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence."
msgstr ""
-#: templates/problem/editorial.html:27 templates/problem/problem.html:209
+#: templates/problem/editorial.html:27 templates/problem/problem.html:210
msgid "Author:"
msgid_plural "Authors:"
msgstr[0] ""
@@ -4112,34 +4164,34 @@ msgstr ""
msgid "Memory limit:"
msgstr ""
-#: templates/problem/problem.html:224
+#: templates/problem/problem.html:226
msgid "Problem type"
msgid_plural "Problem types"
msgstr[0] ""
-#: templates/problem/problem.html:237
+#: templates/problem/problem.html:239
msgid "Allowed languages"
msgstr ""
-#: templates/problem/problem.html:245
+#: templates/problem/problem.html:247
#, python-format
msgid "No %(lang)s judge online"
msgstr ""
-#: templates/problem/problem.html:256
+#: templates/problem/problem.html:258
msgid "Judge:"
msgid_plural "Judges:"
msgstr[0] ""
-#: templates/problem/problem.html:273
+#: templates/problem/problem.html:275
msgid "none available"
msgstr ""
-#: templates/problem/problem.html:298
+#: templates/problem/problem.html:300
msgid "Request clarification"
msgstr ""
-#: templates/problem/problem.html:300
+#: templates/problem/problem.html:302
msgid "Report an issue"
msgstr ""
@@ -4184,7 +4236,7 @@ msgstr ""
msgid "Point range"
msgstr ""
-#: templates/problem/search-form.html:63 templates/submission/list.html:329
+#: templates/problem/search-form.html:63 templates/submission/list.html:328
#: templates/ticket/list.html:248
msgid "Go"
msgstr ""
@@ -4230,7 +4282,7 @@ msgid "Invalid username or password."
msgstr ""
#: templates/registration/login.html:53
-#: templates/registration/two_factor_auth.html:86
+#: templates/registration/two_factor_auth.html:92
msgid "Login!"
msgstr ""
@@ -4350,12 +4402,12 @@ msgid "Default language"
msgstr ""
#: templates/registration/registration_form.html:184
-#: templates/user/edit-profile.html:310
+#: templates/user/edit-profile.html:314
msgid "Affiliated organizations"
msgstr ""
#: templates/registration/registration_form.html:190
-#: templates/user/edit-profile.html:324
+#: templates/user/edit-profile.html:328
msgid "Notify me about upcoming contests"
msgstr ""
@@ -4371,57 +4423,93 @@ msgstr ""
msgid "Register!"
msgstr ""
-#: templates/registration/totp_disable.html:38
+#: templates/registration/totp_disable.html:31
msgid "To protect your account, you must first authenticate before you can disable Two Factor Authentication."
msgstr ""
-#: templates/registration/totp_disable.html:45
+#: templates/registration/totp_disable.html:38
msgid "Enter the 6-digit code generated by your app or one of your 16-digit scratch codes:"
msgstr ""
-#: templates/registration/totp_disable.html:48
+#: templates/registration/totp_disable.html:41
msgid "Disable Two Factor Authentication"
msgstr ""
-#: templates/registration/totp_enable.html:75
+#: templates/registration/totp_enable.html:72
msgid "Scan this code with your authenticator app:"
msgstr ""
-#: templates/registration/totp_enable.html:76
+#: templates/registration/totp_enable.html:73
msgid "QR code"
msgstr ""
-#: templates/registration/totp_enable.html:77
+#: templates/registration/totp_enable.html:74
msgid "Or enter this code manually:"
msgstr ""
-#: templates/registration/totp_enable.html:88
+#: templates/registration/totp_enable.html:85
msgid "Enter the 6-digit code generated by your app:"
msgstr ""
-#: templates/registration/totp_enable.html:91
+#: templates/registration/totp_enable.html:90
+msgid "Refresh Two Factor Authentication"
+msgstr ""
+
+#: templates/registration/totp_enable.html:92
msgid "Enable Two Factor Authentication"
msgstr ""
+#: templates/registration/totp_enable.html:98
+msgid "Below is a list of one-time use scratch codes."
+msgstr ""
+
+#: templates/registration/totp_enable.html:99
+msgid "These codes can only be used once and are for emergency use."
+msgstr ""
+
+#: templates/registration/totp_enable.html:100
+msgid "You can use these codes to login to your account or disable two-factor authentication."
+msgstr ""
+
+#: templates/registration/totp_enable.html:101
+msgid "If you ever need more scratch codes, you can regenerate them on the edit profile tab."
+msgstr ""
+
+#: templates/registration/totp_enable.html:102
+msgid "Please write these down and keep them in a secure location."
+msgstr ""
+
+#: templates/registration/totp_enable.html:103
+msgid "These codes will never be shown again after you enable two-factor authentication."
+msgstr ""
+
#: templates/registration/two_factor_auth.html:33
-#: templates/user/edit-profile.html:161
+#: templates/user/edit-profile.html:165
msgid "WebAuthn is not supported by your browser."
msgstr ""
#: templates/registration/two_factor_auth.html:54
-#: templates/user/edit-profile.html:185
+#: templates/user/edit-profile.html:189
msgid "Failed to contact server."
msgstr ""
-#: templates/registration/two_factor_auth.html:77
+#: templates/registration/two_factor_auth.html:79
msgid "Enter the 6-digit code generated by your app or one of your 16-character scratch codes:"
msgstr ""
-#: templates/registration/two_factor_auth.html:83
-msgid "Use security key"
+#: templates/registration/two_factor_auth.html:81
+msgid "Enter one of your 16-character scratch codes:"
msgstr ""
#: templates/registration/two_factor_auth.html:89
+msgid "Use security key"
+msgstr ""
+
+#: templates/registration/two_factor_auth.html:94
+msgid "Use scratch code"
+msgstr ""
+
+#: templates/registration/two_factor_auth.html:97
#, python-format
msgid "If you lost your authentication device and are unable to use your scratch codes, please contact us at %(email)s."
msgstr ""
@@ -4502,15 +4590,15 @@ msgstr ""
msgid "Filter by language..."
msgstr ""
-#: templates/submission/list.html:307
+#: templates/submission/list.html:306
msgid "Filter submissions"
msgstr ""
-#: templates/submission/list.html:343
+#: templates/submission/list.html:342
msgid "Total:"
msgstr ""
-#: templates/submission/list.html:353
+#: templates/submission/list.html:352
msgid "You were disconnected. Refresh to show latest updates."
msgstr ""
@@ -4725,121 +4813,125 @@ msgstr ""
msgid "Search by handle..."
msgstr ""
-#: templates/user/edit-profile.html:109
+#: templates/user/edit-profile.html:113
msgid "Are you sure you want to generate or regenerate your API token?"
msgstr ""
-#: templates/user/edit-profile.html:110
+#: templates/user/edit-profile.html:114
msgid "This will invalidate any previous API tokens."
msgstr ""
-#: templates/user/edit-profile.html:111
+#: templates/user/edit-profile.html:115
msgid "It also allows access to your account without Two-factor Authentication."
msgstr ""
-#: templates/user/edit-profile.html:112
+#: templates/user/edit-profile.html:116
msgid "You will not be able to view your api token after you leave this page!"
msgstr ""
-#: templates/user/edit-profile.html:113 templates/user/edit-profile.html:207
+#: templates/user/edit-profile.html:117 templates/user/edit-profile.html:211
msgid "Generating..."
msgstr ""
-#: templates/user/edit-profile.html:121 templates/user/edit-profile.html:243
-#: templates/user/edit-profile.html:371 templates/user/edit-profile.html:390
+#: templates/user/edit-profile.html:125 templates/user/edit-profile.html:247
+#: templates/user/edit-profile.html:373 templates/user/edit-profile.html:395
msgid "Regenerate"
msgstr ""
-#: templates/user/edit-profile.html:127 templates/user/edit-profile.html:392
+#: templates/user/edit-profile.html:131 templates/user/edit-profile.html:397
msgid "Remove"
msgstr ""
-#: templates/user/edit-profile.html:137
+#: templates/user/edit-profile.html:141
msgid "Are you sure you want to remove your API token?"
msgstr ""
-#: templates/user/edit-profile.html:144 templates/user/edit-profile.html:375
-#: templates/user/edit-profile.html:396
+#: templates/user/edit-profile.html:148 templates/user/edit-profile.html:377
+#: templates/user/edit-profile.html:401
msgid "Generate"
msgstr ""
-#: templates/user/edit-profile.html:190
+#: templates/user/edit-profile.html:194
msgid "Are you sure you want to delete this security key?"
msgstr ""
-#: templates/user/edit-profile.html:280
+#: templates/user/edit-profile.html:284
msgid "Self-description"
msgstr ""
-#: templates/user/edit-profile.html:287
+#: templates/user/edit-profile.html:291
msgid "Select your closest major city"
msgstr ""
-#: templates/user/edit-profile.html:296
+#: templates/user/edit-profile.html:300
msgid "Editor theme"
msgstr ""
-#: templates/user/edit-profile.html:301
+#: templates/user/edit-profile.html:305
msgid "Math engine"
msgstr ""
-#: templates/user/edit-profile.html:335 templates/user/edit-profile.html:337
+#: templates/user/edit-profile.html:339 templates/user/edit-profile.html:341
msgid "Change your avatar"
msgstr ""
-#: templates/user/edit-profile.html:342
+#: templates/user/edit-profile.html:346
msgid "Change your password"
msgstr ""
-#: templates/user/edit-profile.html:356
+#: templates/user/edit-profile.html:359
msgid "Two-factor Authentication is enabled"
msgstr ""
-#: templates/user/edit-profile.html:358
-msgid "Two-factor Authentication is disabled"
+#: templates/user/edit-profile.html:362 templates/user/edit-profile.html:365
+msgid "Disable"
msgstr ""
-#: templates/user/edit-profile.html:363 templates/user/edit-profile.html:365
-msgid "Disable"
+#: templates/user/edit-profile.html:367
+msgid "Refresh"
msgstr ""
-#: templates/user/edit-profile.html:368
+#: templates/user/edit-profile.html:370
msgid "Scratch Codes:"
msgstr ""
-#: templates/user/edit-profile.html:372 templates/user/edit-profile.html:393
+#: templates/user/edit-profile.html:374 templates/user/edit-profile.html:398
msgid "Hidden"
msgstr ""
-#: templates/user/edit-profile.html:381
+#: templates/user/edit-profile.html:384
+msgid "Two-factor Authentication is disabled"
+msgstr ""
+
+#: templates/user/edit-profile.html:385
msgid "Enable"
msgstr ""
-#: templates/user/edit-profile.html:387
+#: templates/user/edit-profile.html:392
msgid "API Token"
msgstr ""
-#: templates/user/edit-profile.html:404
+#: templates/user/edit-profile.html:409
msgid "Security keys"
msgstr ""
-#: templates/user/edit-profile.html:414
+#: templates/user/edit-profile.html:419
msgid "Delete"
msgstr ""
-#: templates/user/edit-profile.html:421
+#: templates/user/edit-profile.html:426
msgid "Enter a name for this key"
msgstr ""
-#: templates/user/edit-profile.html:422
+#: templates/user/edit-profile.html:427
msgid "Add"
msgstr ""
-#: templates/user/edit-profile.html:430
+#: templates/user/edit-profile.html:435
msgid "User-script"
msgstr ""
-#: templates/user/edit-profile.html:434
+#: templates/user/edit-profile.html:439
msgid "Update profile"
msgstr ""
diff --git a/locale/ko/LC_MESSAGES/djangojs.po b/locale/ko/LC_MESSAGES/djangojs.po
index 51f8fe1f4c..62ada0aba5 100644
--- a/locale/ko/LC_MESSAGES/djangojs.po
+++ b/locale/ko/LC_MESSAGES/djangojs.po
@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: dmoj\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-10-01 23:12+0000\n"
-"PO-Revision-Date: 2021-04-25 00:08\n"
+"PO-Revision-Date: 2021-07-07 00:27\n"
"Last-Translator: \n"
"Language-Team: Korean\n"
"Language: ko_KR\n"
diff --git a/locale/lt/LC_MESSAGES/django.po b/locale/lt/LC_MESSAGES/django.po
index fb6e6cdde8..45d28819f2 100644
--- a/locale/lt/LC_MESSAGES/django.po
+++ b/locale/lt/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: dmoj\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-24 19:15+0000\n"
-"PO-Revision-Date: 2021-04-25 00:08\n"
+"POT-Creation-Date: 2021-06-17 01:38+0000\n"
+"PO-Revision-Date: 2021-07-07 00:27\n"
"Last-Translator: \n"
"Language-Team: Lithuanian\n"
"Language: lt_LT\n"
@@ -17,75 +17,75 @@ msgstr ""
"X-Crowdin-File: django.po\n"
"X-Crowdin-File-ID: 10\n"
-#: dmoj/settings.py:364
+#: dmoj/settings.py:365
msgid "Catalan"
msgstr ""
-#: dmoj/settings.py:365
+#: dmoj/settings.py:366
msgid "German"
msgstr ""
-#: dmoj/settings.py:366
+#: dmoj/settings.py:367
msgid "English"
msgstr ""
-#: dmoj/settings.py:367
+#: dmoj/settings.py:368
msgid "Spanish"
msgstr ""
-#: dmoj/settings.py:368
+#: dmoj/settings.py:369
msgid "French"
msgstr ""
-#: dmoj/settings.py:369
+#: dmoj/settings.py:370
msgid "Croatian"
msgstr ""
-#: dmoj/settings.py:370
+#: dmoj/settings.py:371
msgid "Hungarian"
msgstr ""
-#: dmoj/settings.py:371
+#: dmoj/settings.py:372
msgid "Japanese"
msgstr ""
-#: dmoj/settings.py:372
+#: dmoj/settings.py:373
msgid "Korean"
msgstr ""
-#: dmoj/settings.py:373
+#: dmoj/settings.py:374
msgid "Brazilian Portuguese"
msgstr ""
-#: dmoj/settings.py:374
+#: dmoj/settings.py:375
msgid "Romanian"
msgstr ""
-#: dmoj/settings.py:375
+#: dmoj/settings.py:376
msgid "Russian"
msgstr ""
-#: dmoj/settings.py:376
+#: dmoj/settings.py:377
msgid "Serbian (Latin)"
msgstr ""
-#: dmoj/settings.py:377
+#: dmoj/settings.py:378
msgid "Turkish"
msgstr ""
-#: dmoj/settings.py:378
+#: dmoj/settings.py:379
msgid "Vietnamese"
msgstr ""
-#: dmoj/settings.py:379
+#: dmoj/settings.py:380
msgid "Simplified Chinese"
msgstr ""
-#: dmoj/settings.py:380
+#: dmoj/settings.py:381
msgid "Traditional Chinese"
msgstr ""
-#: dmoj/urls.py:103 templates/base.html:190
+#: dmoj/urls.py:104 templates/base.html:190
msgid "Home"
msgstr ""
@@ -119,46 +119,46 @@ msgstr ""
msgid "Associated page"
msgstr ""
-#: judge/admin/contest.py:31
+#: judge/admin/contest.py:32
msgid "Included contests"
msgstr ""
-#: judge/admin/contest.py:65 templates/contest/contest.html:83
+#: judge/admin/contest.py:66 templates/contest/contest.html:83
#: templates/contest/moss.html:43 templates/problem/list.html:204
#: templates/problem/list.html:219 templates/user/user-problems.html:58
#: templates/user/user-problems.html:100
msgid "Problem"
msgstr ""
-#: judge/admin/contest.py:114
+#: judge/admin/contest.py:117
msgid "Settings"
msgstr ""
-#: judge/admin/contest.py:116
+#: judge/admin/contest.py:120
msgid "Scheduling"
msgstr ""
-#: judge/admin/contest.py:117
+#: judge/admin/contest.py:121
msgid "Details"
msgstr ""
-#: judge/admin/contest.py:118
+#: judge/admin/contest.py:122
msgid "Format"
msgstr ""
-#: judge/admin/contest.py:119 templates/contest/ranking-table.html:5
+#: judge/admin/contest.py:123 templates/contest/ranking-table.html:5
msgid "Rating"
msgstr ""
-#: judge/admin/contest.py:120
+#: judge/admin/contest.py:124
msgid "Access"
msgstr ""
-#: judge/admin/contest.py:122 judge/admin/problem.py:134
+#: judge/admin/contest.py:126 judge/admin/problem.py:135
msgid "Justice"
msgstr ""
-#: judge/admin/contest.py:211
+#: judge/admin/contest.py:215
#, python-format
msgid "%d contest successfully marked as visible."
msgid_plural "%d contests successfully marked as visible."
@@ -167,11 +167,11 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-#: judge/admin/contest.py:214
+#: judge/admin/contest.py:218
msgid "Mark contests as visible"
msgstr ""
-#: judge/admin/contest.py:220
+#: judge/admin/contest.py:224
#, python-format
msgid "%d contest successfully marked as hidden."
msgid_plural "%d contests successfully marked as hidden."
@@ -180,11 +180,11 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-#: judge/admin/contest.py:223
+#: judge/admin/contest.py:227
msgid "Mark contests as hidden"
msgstr ""
-#: judge/admin/contest.py:229
+#: judge/admin/contest.py:233
#, python-format
msgid "%d contest successfully locked."
msgid_plural "%d contests successfully locked."
@@ -193,11 +193,11 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-#: judge/admin/contest.py:232
+#: judge/admin/contest.py:236
msgid "Lock contest submissions"
msgstr ""
-#: judge/admin/contest.py:238
+#: judge/admin/contest.py:242
#, python-format
msgid "%d contest successfully unlocked."
msgid_plural "%d contests successfully unlocked."
@@ -206,11 +206,11 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-#: judge/admin/contest.py:241
+#: judge/admin/contest.py:245
msgid "Unlock contest submissions"
msgstr ""
-#: judge/admin/contest.py:262 judge/admin/submission.py:170
+#: judge/admin/contest.py:266 judge/admin/submission.py:170
#, python-format
msgid "%d submission was successfully scheduled for rejudging."
msgid_plural "%d submissions were successfully scheduled for rejudging."
@@ -219,7 +219,7 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-#: judge/admin/contest.py:337
+#: judge/admin/contest.py:341
#, python-format
msgid "%d participation recalculated."
msgid_plural "%d participations recalculated."
@@ -228,15 +228,15 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-#: judge/admin/contest.py:340
+#: judge/admin/contest.py:344
msgid "Recalculate results"
msgstr ""
-#: judge/admin/contest.py:344 judge/admin/organization.py:63
+#: judge/admin/contest.py:348 judge/admin/organization.py:63
msgid "username"
msgstr ""
-#: judge/admin/contest.py:349 templates/base.html:258
+#: judge/admin/contest.py:353 templates/base.html:258
msgid "virtual"
msgstr ""
@@ -252,9 +252,9 @@ msgstr ""
msgid "Summary"
msgstr ""
-#: judge/admin/interface.py:113 judge/models/contest.py:383
-#: judge/models/contest.py:509 judge/models/profile.py:244
-#: judge/models/profile.py:268
+#: judge/admin/interface.py:113 judge/models/contest.py:419
+#: judge/models/contest.py:546 judge/models/profile.py:261
+#: judge/models/profile.py:292
msgid "user"
msgstr ""
@@ -262,8 +262,8 @@ msgstr ""
msgid "object"
msgstr ""
-#: judge/admin/organization.py:32 judge/admin/problem.py:181
-#: judge/admin/profile.py:82
+#: judge/admin/organization.py:32 judge/admin/problem.py:182
+#: judge/admin/profile.py:92
msgid "View on site"
msgstr ""
@@ -271,40 +271,40 @@ msgstr ""
msgid "Describe the changes you made (optional)"
msgstr ""
-#: judge/admin/problem.py:129
+#: judge/admin/problem.py:130
msgid "Social Media"
msgstr ""
-#: judge/admin/problem.py:130
+#: judge/admin/problem.py:131
msgid "Taxonomy"
msgstr ""
-#: judge/admin/problem.py:131 templates/contest/contest.html:84
+#: judge/admin/problem.py:132 templates/contest/contest.html:84
#: templates/problem/data.html:385 templates/problem/list.html:209
#: templates/problem/list.html:230 templates/user/base-users-table.html:10
#: templates/user/user-problems.html:60
msgid "Points"
msgstr ""
-#: judge/admin/problem.py:132
+#: judge/admin/problem.py:133
msgid "Limits"
msgstr ""
-#: judge/admin/problem.py:133 judge/admin/submission.py:238
-#: templates/stats/base.html:14 templates/submission/list.html:320
-#: templates/user/edit-profile.html:292
+#: judge/admin/problem.py:134 judge/admin/submission.py:238
+#: templates/stats/base.html:14 templates/submission/list.html:319
+#: templates/user/edit-profile.html:296
msgid "Language"
msgstr ""
-#: judge/admin/problem.py:135
+#: judge/admin/problem.py:136
msgid "History"
msgstr ""
-#: judge/admin/problem.py:178
+#: judge/admin/problem.py:179
msgid "Authors"
msgstr ""
-#: judge/admin/problem.py:191
+#: judge/admin/problem.py:192
#, python-format
msgid "%d problem's publish date successfully updated."
msgid_plural "%d problems' publish date successfully updated."
@@ -313,11 +313,11 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-#: judge/admin/problem.py:195
+#: judge/admin/problem.py:196
msgid "Set publish date to now"
msgstr ""
-#: judge/admin/problem.py:201
+#: judge/admin/problem.py:202
#, python-format
msgid "%d problem successfully marked as public."
msgid_plural "%d problems successfully marked as public."
@@ -326,11 +326,11 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-#: judge/admin/problem.py:205
+#: judge/admin/problem.py:206
msgid "Mark problems as public"
msgstr ""
-#: judge/admin/problem.py:211
+#: judge/admin/problem.py:212
#, python-format
msgid "%d problem successfully marked as private."
msgid_plural "%d problems successfully marked as private."
@@ -339,7 +339,7 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-#: judge/admin/problem.py:215
+#: judge/admin/problem.py:216
msgid "Mark problems as private"
msgstr ""
@@ -347,28 +347,28 @@ msgstr ""
msgid "timezone"
msgstr ""
-#: judge/admin/profile.py:88 judge/admin/submission.py:217
+#: judge/admin/profile.py:98 judge/admin/submission.py:217
#: templates/organization/requests/log.html:9
#: templates/organization/requests/pending.html:12
#: templates/ticket/list.html:261
msgid "User"
msgstr ""
-#: judge/admin/profile.py:93 templates/registration/registration_form.html:143
+#: judge/admin/profile.py:103 templates/registration/registration_form.html:143
msgid "Email"
msgstr ""
-#: judge/admin/profile.py:98 judge/views/register.py:29
+#: judge/admin/profile.py:108 judge/views/register.py:28
#: templates/registration/registration_form.html:171
-#: templates/user/edit-profile.html:288
+#: templates/user/edit-profile.html:292
msgid "Timezone"
msgstr ""
-#: judge/admin/profile.py:103
+#: judge/admin/profile.py:113
msgid "date joined"
msgstr ""
-#: judge/admin/profile.py:110
+#: judge/admin/profile.py:120
#, python-format
msgid "%d user have scores recalculated."
msgid_plural "%d users have scores recalculated."
@@ -377,7 +377,7 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-#: judge/admin/profile.py:113
+#: judge/admin/profile.py:123
msgid "Recalculate scores"
msgstr ""
@@ -532,115 +532,116 @@ msgstr ""
msgid "IOI (pre-2016)"
msgstr ""
-#: judge/forms.py:26
-msgid "Two-factor authentication tokens must be 6 decimal digits."
+#: judge/forms.py:27
+#, python-brace-format
+msgid "Two-factor authentication tokens must be {TOTP_CODE_LENGTH} decimal digits."
msgstr ""
-#: judge/forms.py:29
+#: judge/forms.py:30
msgid "Invalid two-factor authentication token."
msgstr ""
-#: judge/forms.py:32
+#: judge/forms.py:33
msgid "Scratch codes must be 16 base32 characters."
msgstr ""
-#: judge/forms.py:34
+#: judge/forms.py:35 judge/forms.py:264
msgid "Invalid scratch code."
msgstr ""
-#: judge/forms.py:45
+#: judge/forms.py:46
msgid "Subscribe to contest updates"
msgstr ""
-#: judge/forms.py:46
+#: judge/forms.py:47
msgid "Enable experimental features"
msgstr ""
-#: judge/forms.py:71
+#: judge/forms.py:72
msgid "You must solve at least one problem before you can update your profile."
msgstr ""
-#: judge/forms.py:80 judge/views/organization.py:127
+#: judge/forms.py:81 judge/views/organization.py:126
#, python-brace-format
msgid "You may not be part of more than {count} public organizations."
msgstr ""
-#: judge/forms.py:96
+#: judge/forms.py:97
msgid "Download comments?"
msgstr ""
-#: judge/forms.py:97
+#: judge/forms.py:98
msgid "Download submissions?"
msgstr ""
-#: judge/forms.py:98
+#: judge/forms.py:99
msgid "Filter by problem code glob:"
msgstr ""
-#: judge/forms.py:102
+#: judge/forms.py:103
msgid "Leave empty to include all submissions"
msgstr ""
-#: judge/forms.py:105 templates/problem/manage_submission.html:142
+#: judge/forms.py:106 templates/problem/manage_submission.html:142
msgid "Filter by result:"
msgstr ""
-#: judge/forms.py:111
+#: judge/forms.py:112
msgid "Please select at least one thing to download."
msgstr ""
-#: judge/forms.py:137
+#: judge/forms.py:138
msgid "Any judge"
msgstr ""
-#: judge/forms.py:167 judge/views/register.py:26
+#: judge/forms.py:159 judge/views/register.py:25
#: templates/registration/registration_form.html:137
#: templates/user/base-users-table.html:5
msgid "Username"
msgstr ""
-#: judge/forms.py:168 templates/registration/registration_form.html:149
+#: judge/forms.py:160 templates/registration/registration_form.html:149
#: templates/registration/registration_form.html:163
msgid "Password"
msgstr ""
-#: judge/forms.py:201
+#: judge/forms.py:192
msgid "Invalid code length."
msgstr ""
-#: judge/forms.py:219
+#: judge/forms.py:223
msgid "Invalid WebAuthn response."
msgstr ""
-#: judge/forms.py:222
+#: judge/forms.py:226
msgid "No WebAuthn challenge issued."
msgstr ""
-#: judge/forms.py:228
+#: judge/forms.py:232
msgid "Invalid WebAuthn credential ID."
msgstr ""
-#: judge/forms.py:257
+#: judge/forms.py:262
msgid "Invalid two-factor authentication token or scratch code."
msgstr ""
-#: judge/forms.py:259
+#: judge/forms.py:266
msgid "Must specify either totp_token or webauthn_response."
msgstr ""
-#: judge/forms.py:263 judge/models/problem.py:105
+#: judge/forms.py:270 judge/models/problem.py:119
msgid "Problem code must be ^[a-z0-9]+$"
msgstr ""
-#: judge/forms.py:268
+#: judge/forms.py:275
msgid "Problem with code already exists."
msgstr ""
-#: judge/forms.py:273 judge/models/contest.py:66
+#: judge/forms.py:280 judge/models/contest.py:66
msgid "Contest id must be ^[a-z0-9]+$"
msgstr ""
-#: judge/forms.py:278
+#: judge/forms.py:285
msgid "Contest with key already exists."
msgstr ""
@@ -720,7 +721,7 @@ msgid "comments"
msgstr ""
#: judge/models/comment.py:89 judge/models/comment.py:141
-#: judge/models/problem.py:484
+#: judge/models/problem.py:511
#, python-format
msgid "Editorial for %s"
msgstr ""
@@ -761,7 +762,7 @@ msgstr ""
msgid "contest tag"
msgstr ""
-#: judge/models/contest.py:53 judge/models/contest.py:117
+#: judge/models/contest.py:53 judge/models/contest.py:126
msgid "contest tags"
msgstr ""
@@ -786,410 +787,426 @@ msgid "contest name"
msgstr ""
#: judge/models/contest.py:68
-msgid "These people will be able to edit the contest."
+msgid "These users will be able to edit the contest."
msgstr ""
-#: judge/models/contest.py:70 judge/models/runtime.py:136
+#: judge/models/contest.py:70
+msgid "These users will be able to edit the contest, but will not be listed as authors."
+msgstr ""
+
+#: judge/models/contest.py:73
+msgid "These users will be able to view the contest, but not edit it."
+msgstr ""
+
+#: judge/models/contest.py:76 judge/models/runtime.py:136
msgid "description"
msgstr ""
-#: judge/models/contest.py:71 judge/models/problem.py:431
+#: judge/models/contest.py:77 judge/models/problem.py:458
#: judge/models/runtime.py:138
msgid "problems"
msgstr ""
-#: judge/models/contest.py:72 judge/models/contest.py:384
+#: judge/models/contest.py:78 judge/models/contest.py:420
msgid "start time"
msgstr ""
-#: judge/models/contest.py:73
+#: judge/models/contest.py:79
msgid "end time"
msgstr ""
-#: judge/models/contest.py:74 judge/models/problem.py:126
-#: judge/models/problem.py:455
+#: judge/models/contest.py:80 judge/models/problem.py:140
+#: judge/models/problem.py:482
msgid "time limit"
msgstr ""
-#: judge/models/contest.py:75 judge/models/problem.py:144
+#: judge/models/contest.py:81 judge/models/problem.py:158
msgid "publicly visible"
msgstr ""
-#: judge/models/contest.py:76
+#: judge/models/contest.py:82
msgid "Should be set even for organization-private contests, where it determines whether the contest is visible to members of the specified organizations."
msgstr ""
-#: judge/models/contest.py:79
+#: judge/models/contest.py:85
msgid "contest rated"
msgstr ""
-#: judge/models/contest.py:79
+#: judge/models/contest.py:85
msgid "Whether this contest can be rated."
msgstr ""
-#: judge/models/contest.py:81
+#: judge/models/contest.py:87
msgid "view contest scoreboard"
msgstr ""
-#: judge/models/contest.py:83
+#: judge/models/contest.py:89
msgid "These users will be able to view the scoreboard."
msgstr ""
-#: judge/models/contest.py:84
+#: judge/models/contest.py:90
msgid "scoreboard visibility"
msgstr ""
-#: judge/models/contest.py:85
+#: judge/models/contest.py:91
msgid "Scoreboard visibility through the duration of the contest"
msgstr ""
-#: judge/models/contest.py:87
+#: judge/models/contest.py:93
msgid "no comments"
msgstr ""
-#: judge/models/contest.py:88
+#: judge/models/contest.py:94
msgid "Use clarification system instead of comments."
msgstr ""
-#: judge/models/contest.py:90
+#: judge/models/contest.py:96
msgid "Rating floor for contest"
msgstr ""
-#: judge/models/contest.py:92
+#: judge/models/contest.py:98
msgid "Rating ceiling for contest"
msgstr ""
-#: judge/models/contest.py:94
+#: judge/models/contest.py:100
msgid "rate all"
msgstr ""
-#: judge/models/contest.py:94
+#: judge/models/contest.py:100
msgid "Rate all users who joined."
msgstr ""
-#: judge/models/contest.py:95
+#: judge/models/contest.py:101
msgid "exclude from ratings"
msgstr ""
-#: judge/models/contest.py:97
+#: judge/models/contest.py:103
msgid "private to specific users"
msgstr ""
-#: judge/models/contest.py:98
+#: judge/models/contest.py:104
msgid "private contestants"
msgstr ""
-#: judge/models/contest.py:99
+#: judge/models/contest.py:105
msgid "If private, only these users may see the contest"
msgstr ""
-#: judge/models/contest.py:101
+#: judge/models/contest.py:107
msgid "hide problem tags"
msgstr ""
-#: judge/models/contest.py:102
+#: judge/models/contest.py:108
msgid "Whether problem tags should be hidden by default."
msgstr ""
-#: judge/models/contest.py:104
+#: judge/models/contest.py:110
+msgid "hide problem authors"
+msgstr ""
+
+#: judge/models/contest.py:111
+msgid "Whether problem authors should be hidden by default."
+msgstr ""
+
+#: judge/models/contest.py:113
msgid "run pretests only"
msgstr ""
-#: judge/models/contest.py:105
+#: judge/models/contest.py:114
msgid "Whether judges should grade pretests only, versus all testcases. Commonly set during a contest, then unset prior to rejudging user submissions when the contest ends."
msgstr ""
-#: judge/models/contest.py:109 judge/models/problem.py:166
+#: judge/models/contest.py:118 judge/models/problem.py:183
msgid "private to organizations"
msgstr ""
-#: judge/models/contest.py:110 judge/models/problem.py:164
-#: judge/models/profile.py:83
+#: judge/models/contest.py:119 judge/models/problem.py:181
+#: judge/models/profile.py:86
msgid "organizations"
msgstr ""
-#: judge/models/contest.py:111
+#: judge/models/contest.py:120
msgid "If private, only these organizations may see the contest"
msgstr ""
-#: judge/models/contest.py:112 judge/models/problem.py:153
+#: judge/models/contest.py:121 judge/models/problem.py:167
msgid "OpenGraph image"
msgstr ""
-#: judge/models/contest.py:113 judge/models/profile.py:54
+#: judge/models/contest.py:122 judge/models/profile.py:57
msgid "Logo override image"
msgstr ""
-#: judge/models/contest.py:115
+#: judge/models/contest.py:124
msgid "This image will replace the default site logo for users inside the contest."
msgstr ""
-#: judge/models/contest.py:118
+#: judge/models/contest.py:127
msgid "the amount of live participants"
msgstr ""
-#: judge/models/contest.py:119
+#: judge/models/contest.py:128
msgid "contest summary"
msgstr ""
-#: judge/models/contest.py:120 judge/models/problem.py:155
+#: judge/models/contest.py:129 judge/models/problem.py:169
msgid "Plain-text, shown in meta description tag, e.g. for social media."
msgstr ""
-#: judge/models/contest.py:121 judge/models/profile.py:53
+#: judge/models/contest.py:130 judge/models/profile.py:56
msgid "access code"
msgstr ""
-#: judge/models/contest.py:122
+#: judge/models/contest.py:131
msgid "An optional code to prompt contestants before they are allowed to join the contest. Leave it blank to disable."
msgstr ""
-#: judge/models/contest.py:124 judge/models/problem.py:149
+#: judge/models/contest.py:133 judge/models/problem.py:163
msgid "personae non gratae"
msgstr ""
-#: judge/models/contest.py:125
+#: judge/models/contest.py:134
msgid "Bans the selected users from joining this contest."
msgstr ""
-#: judge/models/contest.py:126
+#: judge/models/contest.py:135
msgid "contest format"
msgstr ""
-#: judge/models/contest.py:127
+#: judge/models/contest.py:136
msgid "The contest format module to use."
msgstr ""
-#: judge/models/contest.py:128
+#: judge/models/contest.py:137
msgid "contest format configuration"
msgstr ""
-#: judge/models/contest.py:129
+#: judge/models/contest.py:138
msgid "A JSON object to serve as the configuration for the chosen contest format module. Leave empty to use None. Exact format depends on the contest format selected."
msgstr ""
-#: judge/models/contest.py:136
+#: judge/models/contest.py:145
msgid "contest lock"
msgstr ""
-#: judge/models/contest.py:137
-msgid "Prevent submissions from this contest from being rejudged."
+#: judge/models/contest.py:146
+msgid "Prevent submissions from this contest from being rejudged after this date."
msgstr ""
-#: judge/models/contest.py:138
+#: judge/models/contest.py:148
msgid "precision points"
msgstr ""
-#: judge/models/contest.py:140
+#: judge/models/contest.py:150
msgid "Number of digits to round points to."
msgstr ""
-#: judge/models/contest.py:362
+#: judge/models/contest.py:398
msgid "See private contests"
msgstr ""
-#: judge/models/contest.py:363
+#: judge/models/contest.py:399
msgid "Edit own contests"
msgstr ""
-#: judge/models/contest.py:364
+#: judge/models/contest.py:400
msgid "Edit all contests"
msgstr ""
-#: judge/models/contest.py:365
+#: judge/models/contest.py:401
msgid "Clone contest"
msgstr ""
-#: judge/models/contest.py:366 templates/contest/moss.html:74
+#: judge/models/contest.py:402 templates/contest/moss.html:74
msgid "MOSS contest"
msgstr ""
-#: judge/models/contest.py:367
+#: judge/models/contest.py:403
msgid "Rate contests"
msgstr ""
-#: judge/models/contest.py:368
+#: judge/models/contest.py:404
msgid "Contest access codes"
msgstr ""
-#: judge/models/contest.py:369
+#: judge/models/contest.py:405
msgid "Create private contests"
msgstr ""
-#: judge/models/contest.py:370
+#: judge/models/contest.py:406
msgid "Change contest visibility"
msgstr ""
-#: judge/models/contest.py:371
+#: judge/models/contest.py:407
msgid "Edit contest problem label script"
msgstr ""
-#: judge/models/contest.py:372
+#: judge/models/contest.py:408
msgid "Change lock status of contest"
msgstr ""
-#: judge/models/contest.py:374 judge/models/contest.py:472
-#: judge/models/contest.py:510 judge/models/contest.py:532
-#: judge/models/submission.py:84
+#: judge/models/contest.py:410 judge/models/contest.py:508
+#: judge/models/contest.py:547 judge/models/contest.py:569
+#: judge/models/submission.py:85
msgid "contest"
msgstr ""
-#: judge/models/contest.py:375
+#: judge/models/contest.py:411
msgid "contests"
msgstr ""
-#: judge/models/contest.py:382
+#: judge/models/contest.py:418
msgid "associated contest"
msgstr ""
-#: judge/models/contest.py:385
+#: judge/models/contest.py:421
msgid "score"
msgstr ""
-#: judge/models/contest.py:386
+#: judge/models/contest.py:422
msgid "cumulative time"
msgstr ""
-#: judge/models/contest.py:387
+#: judge/models/contest.py:423
msgid "is disqualified"
msgstr ""
-#: judge/models/contest.py:388
+#: judge/models/contest.py:424
msgid "Whether this participation is disqualified."
msgstr ""
-#: judge/models/contest.py:389
+#: judge/models/contest.py:425
msgid "tie-breaking field"
msgstr ""
-#: judge/models/contest.py:390
+#: judge/models/contest.py:426
msgid "virtual participation id"
msgstr ""
-#: judge/models/contest.py:391
+#: judge/models/contest.py:427
msgid "0 means non-virtual, otherwise the n-th virtual participation."
msgstr ""
-#: judge/models/contest.py:392
+#: judge/models/contest.py:428
msgid "contest format specific data"
msgstr ""
-#: judge/models/contest.py:458
+#: judge/models/contest.py:494
#, python-format
msgid "%s spectating in %s"
msgstr ""
-#: judge/models/contest.py:460
+#: judge/models/contest.py:496
#, python-format
msgid "%s in %s, v%d"
msgstr ""
-#: judge/models/contest.py:461
+#: judge/models/contest.py:497
#, python-format
msgid "%s in %s"
msgstr ""
-#: judge/models/contest.py:464
+#: judge/models/contest.py:500
msgid "contest participation"
msgstr ""
-#: judge/models/contest.py:465
+#: judge/models/contest.py:501
msgid "contest participations"
msgstr ""
-#: judge/models/contest.py:471 judge/models/contest.py:494
-#: judge/models/contest.py:533 judge/models/problem.py:430
-#: judge/models/problem.py:435 judge/models/problem.py:453
+#: judge/models/contest.py:507 judge/models/contest.py:531
+#: judge/models/contest.py:570 judge/models/problem.py:457
+#: judge/models/problem.py:462 judge/models/problem.py:480
#: judge/models/problem_data.py:35
msgid "problem"
msgstr ""
-#: judge/models/contest.py:473 judge/models/contest.py:498
-#: judge/models/problem.py:137
+#: judge/models/contest.py:509 judge/models/contest.py:535
+#: judge/models/problem.py:151
msgid "points"
msgstr ""
-#: judge/models/contest.py:474
+#: judge/models/contest.py:510
msgid "partial"
msgstr ""
-#: judge/models/contest.py:475 judge/models/contest.py:499
+#: judge/models/contest.py:511 judge/models/contest.py:536
msgid "is pretested"
msgstr ""
-#: judge/models/contest.py:476 judge/models/interface.py:43
+#: judge/models/contest.py:512 judge/models/interface.py:43
msgid "order"
msgstr ""
-#: judge/models/contest.py:477
+#: judge/models/contest.py:513
msgid "output prefix length override"
msgstr ""
-#: judge/models/contest.py:479
+#: judge/models/contest.py:515
msgid "Maximum number of submissions for this problem, or leave blank for no limit."
msgstr ""
-#: judge/models/contest.py:482
+#: judge/models/contest.py:518
msgid "Why include a problem you can't submit to?"
msgstr ""
-#: judge/models/contest.py:487
+#: judge/models/contest.py:523
msgid "contest problem"
msgstr ""
-#: judge/models/contest.py:488
+#: judge/models/contest.py:524
msgid "contest problems"
msgstr ""
-#: judge/models/contest.py:492 judge/models/submission.py:207
+#: judge/models/contest.py:529 judge/models/submission.py:218
msgid "submission"
msgstr ""
-#: judge/models/contest.py:496 judge/models/contest.py:511
+#: judge/models/contest.py:533 judge/models/contest.py:548
msgid "participation"
msgstr ""
-#: judge/models/contest.py:500
+#: judge/models/contest.py:537
msgid "Whether this submission was ran only on pretests."
msgstr ""
-#: judge/models/contest.py:504
+#: judge/models/contest.py:541
msgid "contest submission"
msgstr ""
-#: judge/models/contest.py:505
+#: judge/models/contest.py:542
msgid "contest submissions"
msgstr ""
-#: judge/models/contest.py:513
+#: judge/models/contest.py:550
msgid "rank"
msgstr ""
-#: judge/models/contest.py:514
+#: judge/models/contest.py:551
msgid "rating"
msgstr ""
-#: judge/models/contest.py:515
+#: judge/models/contest.py:552
msgid "volatility"
msgstr ""
-#: judge/models/contest.py:516
+#: judge/models/contest.py:553
msgid "last rated"
msgstr ""
-#: judge/models/contest.py:520
+#: judge/models/contest.py:557
msgid "contest rating"
msgstr ""
-#: judge/models/contest.py:521
+#: judge/models/contest.py:558
msgid "contest ratings"
msgstr ""
-#: judge/models/contest.py:540
+#: judge/models/contest.py:577
msgid "contest moss result"
msgstr ""
-#: judge/models/contest.py:541
+#: judge/models/contest.py:578
msgid "contest moss results"
msgstr ""
@@ -1229,7 +1246,7 @@ msgstr ""
msgid "post title"
msgstr ""
-#: judge/models/interface.py:67 judge/models/problem.py:473
+#: judge/models/interface.py:67 judge/models/problem.py:500
msgid "authors"
msgstr ""
@@ -1237,7 +1254,7 @@ msgstr ""
msgid "slug"
msgstr ""
-#: judge/models/interface.py:69 judge/models/problem.py:471
+#: judge/models/interface.py:69 judge/models/problem.py:498
msgid "public visibility"
msgstr ""
@@ -1273,34 +1290,6 @@ msgstr ""
msgid "blog posts"
msgstr ""
-#: judge/models/message.py:11
-msgid "message title"
-msgstr ""
-
-#: judge/models/message.py:12 judge/models/ticket.py:30
-msgid "message body"
-msgstr ""
-
-#: judge/models/message.py:13
-msgid "sender"
-msgstr ""
-
-#: judge/models/message.py:14
-msgid "target"
-msgstr ""
-
-#: judge/models/message.py:15
-msgid "message timestamp"
-msgstr ""
-
-#: judge/models/message.py:16
-msgid "read"
-msgstr ""
-
-#: judge/models/message.py:20
-msgid "messages in the thread"
-msgstr ""
-
#: judge/models/problem.py:30
#, python-format
msgid "Disallowed characters: %(value)s"
@@ -1318,7 +1307,7 @@ msgstr ""
msgid "problem type"
msgstr ""
-#: judge/models/problem.py:44 judge/models/problem.py:121
+#: judge/models/problem.py:44 judge/models/problem.py:135
msgid "problem types"
msgstr ""
@@ -1330,7 +1319,7 @@ msgstr ""
msgid "problem group name"
msgstr ""
-#: judge/models/problem.py:56 judge/models/problem.py:124
+#: judge/models/problem.py:56 judge/models/problem.py:138
msgid "problem group"
msgstr ""
@@ -1350,7 +1339,7 @@ msgstr ""
msgid "full name"
msgstr ""
-#: judge/models/problem.py:65 judge/models/profile.py:41
+#: judge/models/problem.py:65 judge/models/profile.py:44
#: judge/models/runtime.py:24
msgid "short name"
msgstr ""
@@ -1379,232 +1368,252 @@ msgstr ""
msgid "licenses"
msgstr ""
-#: judge/models/problem.py:104
+#: judge/models/problem.py:112
+msgid "Follow global setting"
+msgstr ""
+
+#: judge/models/problem.py:113
+msgid "Always visible"
+msgstr ""
+
+#: judge/models/problem.py:114
+msgid "Visible if problem solved"
+msgstr ""
+
+#: judge/models/problem.py:115
+msgid "Only own submissions"
+msgstr ""
+
+#: judge/models/problem.py:118
msgid "problem code"
msgstr ""
-#: judge/models/problem.py:106
+#: judge/models/problem.py:120
msgid "A short, unique code for the problem, used in the url after /problem/"
msgstr ""
-#: judge/models/problem.py:108
+#: judge/models/problem.py:122
msgid "problem name"
msgstr ""
-#: judge/models/problem.py:109
+#: judge/models/problem.py:123
msgid "The full name of the problem, as shown in the problem list."
msgstr ""
-#: judge/models/problem.py:111
+#: judge/models/problem.py:125
msgid "problem body"
msgstr ""
-#: judge/models/problem.py:112
+#: judge/models/problem.py:126
msgid "creators"
msgstr ""
-#: judge/models/problem.py:113
+#: judge/models/problem.py:127
msgid "These users will be able to edit the problem, and be listed as authors."
msgstr ""
-#: judge/models/problem.py:115
+#: judge/models/problem.py:129
msgid "curators"
msgstr ""
-#: judge/models/problem.py:116
+#: judge/models/problem.py:130
msgid "These users will be able to edit the problem, but not be listed as authors."
msgstr ""
-#: judge/models/problem.py:118
+#: judge/models/problem.py:132
msgid "testers"
msgstr ""
-#: judge/models/problem.py:120
+#: judge/models/problem.py:134
msgid "These users will be able to view the private problem, but not edit it."
msgstr ""
-#: judge/models/problem.py:122
+#: judge/models/problem.py:136
msgid "The type of problem, as shown on the problem's page."
msgstr ""
-#: judge/models/problem.py:125
+#: judge/models/problem.py:139
msgid "The group of problem, shown under Category in the problem list."
msgstr ""
-#: judge/models/problem.py:127
+#: judge/models/problem.py:141
msgid "The time limit for this problem, in seconds. Fractional seconds (e.g. 1.5) are supported."
msgstr ""
-#: judge/models/problem.py:131 judge/models/problem.py:458
+#: judge/models/problem.py:145 judge/models/problem.py:485
msgid "memory limit"
msgstr ""
-#: judge/models/problem.py:132
+#: judge/models/problem.py:146
msgid "The memory limit for this problem, in kilobytes (e.g. 64mb = 65536 kilobytes)."
msgstr ""
-#: judge/models/problem.py:138
+#: judge/models/problem.py:152
msgid "Points awarded for problem completion. Points are displayed with a 'p' suffix if partial."
msgstr ""
-#: judge/models/problem.py:141
+#: judge/models/problem.py:155
msgid "allows partial points"
msgstr ""
-#: judge/models/problem.py:142
+#: judge/models/problem.py:156
msgid "allowed languages"
msgstr ""
-#: judge/models/problem.py:143
+#: judge/models/problem.py:157
msgid "List of allowed submission languages."
msgstr ""
-#: judge/models/problem.py:145
+#: judge/models/problem.py:159
msgid "manually managed"
msgstr ""
-#: judge/models/problem.py:146
+#: judge/models/problem.py:160
msgid "Whether judges should be allowed to manage data or not."
msgstr ""
-#: judge/models/problem.py:147
+#: judge/models/problem.py:161
msgid "date of publishing"
msgstr ""
-#: judge/models/problem.py:148
+#: judge/models/problem.py:162
msgid "Doesn't have magic ability to auto-publish due to backward compatibility"
msgstr ""
-#: judge/models/problem.py:150
+#: judge/models/problem.py:164
msgid "Bans the selected users from submitting to this problem."
msgstr ""
-#: judge/models/problem.py:152
+#: judge/models/problem.py:166
msgid "The license under which this problem is published."
msgstr ""
-#: judge/models/problem.py:154
+#: judge/models/problem.py:168
msgid "problem summary"
msgstr ""
-#: judge/models/problem.py:156
+#: judge/models/problem.py:170
msgid "number of users"
msgstr ""
-#: judge/models/problem.py:157
+#: judge/models/problem.py:171
msgid "The number of users who solved the problem."
msgstr ""
-#: judge/models/problem.py:158
+#: judge/models/problem.py:172
msgid "solve rate"
msgstr ""
-#: judge/models/problem.py:159
+#: judge/models/problem.py:173
msgid "allow full markdown access"
msgstr ""
-#: judge/models/problem.py:165
+#: judge/models/problem.py:174
+msgid "submission source visibility"
+msgstr ""
+
+#: judge/models/problem.py:182
msgid "If private, only these organizations may see the problem."
msgstr ""
-#: judge/models/problem.py:420
+#: judge/models/problem.py:447
msgid "See hidden problems"
msgstr ""
-#: judge/models/problem.py:421
+#: judge/models/problem.py:448
msgid "Edit own problems"
msgstr ""
-#: judge/models/problem.py:422
+#: judge/models/problem.py:449
msgid "Edit all problems"
msgstr ""
-#: judge/models/problem.py:423
+#: judge/models/problem.py:450
msgid "Edit all public problems"
msgstr ""
-#: judge/models/problem.py:424
+#: judge/models/problem.py:451
msgid "Edit problems with full markup"
msgstr ""
-#: judge/models/problem.py:425 templates/problem/problem.html:161
+#: judge/models/problem.py:452 templates/problem/problem.html:161
msgid "Clone problem"
msgstr ""
-#: judge/models/problem.py:426
+#: judge/models/problem.py:453
msgid "Change is_public field"
msgstr ""
-#: judge/models/problem.py:427
+#: judge/models/problem.py:454
msgid "Change is_manually_managed field"
msgstr ""
-#: judge/models/problem.py:428
+#: judge/models/problem.py:455
msgid "See organization-private problems"
msgstr ""
-#: judge/models/problem.py:436 judge/models/problem.py:454
+#: judge/models/problem.py:463 judge/models/problem.py:481
#: judge/models/runtime.py:111
msgid "language"
msgstr ""
-#: judge/models/problem.py:437
+#: judge/models/problem.py:464
msgid "translated name"
msgstr ""
-#: judge/models/problem.py:438
+#: judge/models/problem.py:465
msgid "translated description"
msgstr ""
-#: judge/models/problem.py:442
+#: judge/models/problem.py:469
msgid "problem translation"
msgstr ""
-#: judge/models/problem.py:443
+#: judge/models/problem.py:470
msgid "problem translations"
msgstr ""
-#: judge/models/problem.py:447
+#: judge/models/problem.py:474
msgid "clarified problem"
msgstr ""
-#: judge/models/problem.py:448
+#: judge/models/problem.py:475
msgid "clarification body"
msgstr ""
-#: judge/models/problem.py:449
+#: judge/models/problem.py:476
msgid "clarification timestamp"
msgstr ""
-#: judge/models/problem.py:464
+#: judge/models/problem.py:491
msgid "language-specific resource limit"
msgstr ""
-#: judge/models/problem.py:465
+#: judge/models/problem.py:492
msgid "language-specific resource limits"
msgstr ""
-#: judge/models/problem.py:469
+#: judge/models/problem.py:496
msgid "associated problem"
msgstr ""
-#: judge/models/problem.py:472
+#: judge/models/problem.py:499
msgid "publish date"
msgstr ""
-#: judge/models/problem.py:474
+#: judge/models/problem.py:501
msgid "editorial content"
msgstr ""
-#: judge/models/problem.py:497
+#: judge/models/problem.py:524
msgid "See hidden solutions"
msgstr ""
-#: judge/models/problem.py:499
+#: judge/models/problem.py:526
msgid "solution"
msgstr ""
-#: judge/models/problem.py:500
+#: judge/models/problem.py:527
msgid "solutions"
msgstr ""
@@ -1716,112 +1725,112 @@ msgstr ""
msgid "case is pretest?"
msgstr ""
-#: judge/models/profile.py:38
+#: judge/models/profile.py:41
msgid "organization title"
msgstr ""
-#: judge/models/profile.py:39
+#: judge/models/profile.py:42
msgid "organization slug"
msgstr ""
-#: judge/models/profile.py:40
+#: judge/models/profile.py:43
msgid "Organization name shown in URL"
msgstr ""
-#: judge/models/profile.py:42
+#: judge/models/profile.py:45
msgid "Displayed beside user name during contests"
msgstr ""
-#: judge/models/profile.py:43
+#: judge/models/profile.py:46
msgid "organization description"
msgstr ""
-#: judge/models/profile.py:44
+#: judge/models/profile.py:47
msgid "administrators"
msgstr ""
-#: judge/models/profile.py:45
+#: judge/models/profile.py:48
msgid "Those who can edit this organization"
msgstr ""
-#: judge/models/profile.py:46
+#: judge/models/profile.py:49
msgid "creation date"
msgstr ""
-#: judge/models/profile.py:47
+#: judge/models/profile.py:50
msgid "is open organization?"
msgstr ""
-#: judge/models/profile.py:48
+#: judge/models/profile.py:51
msgid "Allow joining organization"
msgstr ""
-#: judge/models/profile.py:49
+#: judge/models/profile.py:52
msgid "maximum size"
msgstr ""
-#: judge/models/profile.py:50
+#: judge/models/profile.py:53
msgid "Maximum amount of users in this organization, only applicable to private organizations"
msgstr ""
-#: judge/models/profile.py:52
+#: judge/models/profile.py:55
msgid "Student access code"
msgstr ""
-#: judge/models/profile.py:56
+#: judge/models/profile.py:59
msgid "This image will replace the default site logo for users viewing the organization."
msgstr ""
-#: judge/models/profile.py:79
+#: judge/models/profile.py:82
msgid "Administer organizations"
msgstr ""
-#: judge/models/profile.py:80
+#: judge/models/profile.py:83
msgid "Edit all organizations"
msgstr ""
-#: judge/models/profile.py:82 judge/models/profile.py:99
-#: judge/models/profile.py:269
+#: judge/models/profile.py:85 judge/models/profile.py:102
+#: judge/models/profile.py:293
msgid "organization"
msgstr ""
-#: judge/models/profile.py:87
+#: judge/models/profile.py:90
msgid "user associated"
msgstr ""
-#: judge/models/profile.py:88
+#: judge/models/profile.py:91
msgid "self-description"
msgstr ""
-#: judge/models/profile.py:89
+#: judge/models/profile.py:92
msgid "location"
msgstr ""
-#: judge/models/profile.py:91
+#: judge/models/profile.py:94
msgid "preferred language"
msgstr ""
-#: judge/models/profile.py:97
+#: judge/models/profile.py:100
msgid "last access time"
msgstr ""
-#: judge/models/profile.py:98
+#: judge/models/profile.py:101
msgid "last IP"
msgstr ""
-#: judge/models/profile.py:101
+#: judge/models/profile.py:104
msgid "display rank"
msgstr ""
-#: judge/models/profile.py:103
+#: judge/models/profile.py:106
msgid "Normal User"
msgstr ""
-#: judge/models/profile.py:104
+#: judge/models/profile.py:107
msgid "Problem Setter"
msgstr ""
-#: judge/models/profile.py:105 templates/base.html:220
+#: judge/models/profile.py:108 templates/base.html:220
#: templates/comments/list.html:99 templates/contest/contest-list-tabs.html:24
#: templates/contest/ranking-table.html:49
#: templates/problem/problem-list-tabs.html:6
@@ -1830,155 +1839,167 @@ msgstr ""
msgid "Admin"
msgstr ""
-#: judge/models/profile.py:106
+#: judge/models/profile.py:109
msgid "comment mute"
msgstr ""
-#: judge/models/profile.py:106
+#: judge/models/profile.py:109
msgid "Some users are at their best when silent."
msgstr ""
-#: judge/models/profile.py:108
+#: judge/models/profile.py:111
msgid "unlisted user"
msgstr ""
-#: judge/models/profile.py:108
+#: judge/models/profile.py:111
msgid "User will not be ranked."
msgstr ""
-#: judge/models/profile.py:111
+#: judge/models/profile.py:114
msgid "user script"
msgstr ""
-#: judge/models/profile.py:112
+#: judge/models/profile.py:115
msgid "User-defined JavaScript for site customization."
msgstr ""
-#: judge/models/profile.py:113
+#: judge/models/profile.py:116
msgid "current contest"
msgstr ""
-#: judge/models/profile.py:115
+#: judge/models/profile.py:118
msgid "math engine"
msgstr ""
-#: judge/models/profile.py:117
+#: judge/models/profile.py:120
msgid "the rendering engine used to render math"
msgstr ""
-#: judge/models/profile.py:118
+#: judge/models/profile.py:121
msgid "TOTP 2FA enabled"
msgstr ""
-#: judge/models/profile.py:119
+#: judge/models/profile.py:122
msgid "check to enable TOTP-based two-factor authentication"
msgstr ""
-#: judge/models/profile.py:120
+#: judge/models/profile.py:123
msgid "WebAuthn 2FA enabled"
msgstr ""
-#: judge/models/profile.py:121
+#: judge/models/profile.py:124
msgid "check to enable WebAuthn-based two-factor authentication"
msgstr ""
-#: judge/models/profile.py:122
+#: judge/models/profile.py:125
msgid "TOTP key"
msgstr ""
-#: judge/models/profile.py:123
+#: judge/models/profile.py:126
msgid "32 character base32-encoded key for TOTP"
msgstr ""
-#: judge/models/profile.py:125
+#: judge/models/profile.py:128
msgid "TOTP key must be empty or base32"
msgstr ""
-#: judge/models/profile.py:126
+#: judge/models/profile.py:129
msgid "scratch codes"
msgstr ""
-#: judge/models/profile.py:127
+#: judge/models/profile.py:130
msgid "JSON array of 16 character base32-encoded codes for scratch codes"
msgstr ""
-#: judge/models/profile.py:131
+#: judge/models/profile.py:134
msgid "Scratch codes must be empty or a JSON array of 16-character base32 codes"
msgstr ""
-#: judge/models/profile.py:133
+#: judge/models/profile.py:136
+msgid "last TOTP timecode"
+msgstr ""
+
+#: judge/models/profile.py:137
msgid "API token"
msgstr ""
-#: judge/models/profile.py:134
+#: judge/models/profile.py:138
msgid "64 character hex-encoded API access token"
msgstr ""
-#: judge/models/profile.py:136
+#: judge/models/profile.py:140
msgid "API token must be None or hexadecimal"
msgstr ""
-#: judge/models/profile.py:137
+#: judge/models/profile.py:141
msgid "internal notes"
msgstr ""
-#: judge/models/profile.py:138
+#: judge/models/profile.py:142
msgid "Notes for administrators regarding this user."
msgstr ""
-#: judge/models/profile.py:139
+#: judge/models/profile.py:143
msgid "last data download time"
msgstr ""
-#: judge/models/profile.py:236
+#: judge/models/profile.py:253
msgid "Shows in-progress development stuff"
msgstr ""
-#: judge/models/profile.py:237
+#: judge/models/profile.py:254
msgid "Edit TOTP settings"
msgstr ""
-#: judge/models/profile.py:239
+#: judge/models/profile.py:256
msgid "user profile"
msgstr ""
-#: judge/models/profile.py:240
+#: judge/models/profile.py:257
msgid "user profiles"
msgstr ""
-#: judge/models/profile.py:246
+#: judge/models/profile.py:263
msgid "device name"
msgstr ""
-#: judge/models/profile.py:247
+#: judge/models/profile.py:264
msgid "credential ID"
msgstr ""
-#: judge/models/profile.py:248
+#: judge/models/profile.py:265
msgid "public key"
msgstr ""
-#: judge/models/profile.py:249
+#: judge/models/profile.py:266
msgid "sign counter"
msgstr ""
-#: judge/models/profile.py:271
+#: judge/models/profile.py:287
+msgid "WebAuthn credential"
+msgstr ""
+
+#: judge/models/profile.py:288
+msgid "WebAuthn credentials"
+msgstr ""
+
+#: judge/models/profile.py:295
msgid "request time"
msgstr ""
-#: judge/models/profile.py:272
+#: judge/models/profile.py:296
msgid "state"
msgstr ""
-#: judge/models/profile.py:277
+#: judge/models/profile.py:301
msgid "reason"
msgstr ""
-#: judge/models/profile.py:280
+#: judge/models/profile.py:304
msgid "organization join request"
msgstr ""
-#: judge/models/profile.py:281
+#: judge/models/profile.py:305
msgid "organization join requests"
msgstr ""
@@ -2134,210 +2155,210 @@ msgstr ""
msgid "judge"
msgstr ""
-#: judge/models/submission.py:20 judge/models/submission.py:47
+#: judge/models/submission.py:21 judge/models/submission.py:48
#: judge/utils/problems.py:74
msgid "Accepted"
msgstr ""
-#: judge/models/submission.py:21 judge/models/submission.py:48
+#: judge/models/submission.py:22 judge/models/submission.py:49
msgid "Wrong Answer"
msgstr ""
-#: judge/models/submission.py:22 judge/models/submission.py:50
+#: judge/models/submission.py:23 judge/models/submission.py:51
msgid "Time Limit Exceeded"
msgstr ""
-#: judge/models/submission.py:23 judge/models/submission.py:51
+#: judge/models/submission.py:24 judge/models/submission.py:52
msgid "Memory Limit Exceeded"
msgstr ""
-#: judge/models/submission.py:24 judge/models/submission.py:52
+#: judge/models/submission.py:25 judge/models/submission.py:53
msgid "Output Limit Exceeded"
msgstr ""
-#: judge/models/submission.py:25 judge/models/submission.py:53
+#: judge/models/submission.py:26 judge/models/submission.py:54
msgid "Invalid Return"
msgstr ""
-#: judge/models/submission.py:26 judge/models/submission.py:54
+#: judge/models/submission.py:27 judge/models/submission.py:55
msgid "Runtime Error"
msgstr ""
-#: judge/models/submission.py:27 judge/models/submission.py:41
-#: judge/models/submission.py:55 judge/utils/problems.py:76
+#: judge/models/submission.py:28 judge/models/submission.py:42
+#: judge/models/submission.py:56 judge/utils/problems.py:76
msgid "Compile Error"
msgstr ""
-#: judge/models/submission.py:28 judge/models/submission.py:40
+#: judge/models/submission.py:29 judge/models/submission.py:41
msgid "Internal Error"
msgstr ""
-#: judge/models/submission.py:29
+#: judge/models/submission.py:30
msgid "Short circuit"
msgstr ""
-#: judge/models/submission.py:30 judge/models/submission.py:42
-#: judge/models/submission.py:61
+#: judge/models/submission.py:31 judge/models/submission.py:43
+#: judge/models/submission.py:62
msgid "Aborted"
msgstr ""
-#: judge/models/submission.py:36 judge/models/submission.py:57
+#: judge/models/submission.py:37 judge/models/submission.py:58
msgid "Queued"
msgstr ""
-#: judge/models/submission.py:37 judge/models/submission.py:58
+#: judge/models/submission.py:38 judge/models/submission.py:59
msgid "Processing"
msgstr ""
-#: judge/models/submission.py:38 judge/models/submission.py:59
+#: judge/models/submission.py:39 judge/models/submission.py:60
msgid "Grading"
msgstr ""
-#: judge/models/submission.py:39 judge/models/submission.py:60
+#: judge/models/submission.py:40 judge/models/submission.py:61
msgid "Completed"
msgstr ""
-#: judge/models/submission.py:56
+#: judge/models/submission.py:57
msgid "Internal Error (judging server error)"
msgstr ""
-#: judge/models/submission.py:66
+#: judge/models/submission.py:67
msgid "submission time"
msgstr ""
-#: judge/models/submission.py:67 judge/models/submission.py:227
+#: judge/models/submission.py:68 judge/models/submission.py:238
msgid "execution time"
msgstr ""
-#: judge/models/submission.py:68 judge/models/submission.py:228
+#: judge/models/submission.py:69 judge/models/submission.py:239
msgid "memory usage"
msgstr ""
-#: judge/models/submission.py:69 judge/models/submission.py:229
+#: judge/models/submission.py:70 judge/models/submission.py:240
msgid "points granted"
msgstr ""
-#: judge/models/submission.py:70
+#: judge/models/submission.py:71
msgid "submission language"
msgstr ""
-#: judge/models/submission.py:71
+#: judge/models/submission.py:72
msgid "status"
msgstr ""
-#: judge/models/submission.py:72
+#: judge/models/submission.py:73
msgid "result"
msgstr ""
-#: judge/models/submission.py:74
+#: judge/models/submission.py:75
msgid "compile errors"
msgstr ""
-#: judge/models/submission.py:76
+#: judge/models/submission.py:77
msgid "batched cases"
msgstr ""
-#: judge/models/submission.py:77
+#: judge/models/submission.py:78
msgid "test case points"
msgstr ""
-#: judge/models/submission.py:78
+#: judge/models/submission.py:79
msgid "test case total points"
msgstr ""
-#: judge/models/submission.py:79
+#: judge/models/submission.py:80
msgid "judged on"
msgstr ""
-#: judge/models/submission.py:81
+#: judge/models/submission.py:82
msgid "submission judge time"
msgstr ""
-#: judge/models/submission.py:82
-msgid "was rejudged by admin"
+#: judge/models/submission.py:83
+msgid "last rejudge date by admin"
msgstr ""
-#: judge/models/submission.py:83
+#: judge/models/submission.py:84
msgid "was ran on pretests only"
msgstr ""
-#: judge/models/submission.py:86
-msgid "lock submission"
+#: judge/models/submission.py:87
+msgid "submission lock"
msgstr ""
-#: judge/models/submission.py:199
+#: judge/models/submission.py:210
msgid "Abort any submission"
msgstr ""
-#: judge/models/submission.py:200
+#: judge/models/submission.py:211
msgid "Rejudge the submission"
msgstr ""
-#: judge/models/submission.py:201
+#: judge/models/submission.py:212
msgid "Rejudge a lot of submissions"
msgstr ""
-#: judge/models/submission.py:202
+#: judge/models/submission.py:213
msgid "Submit without limit"
msgstr ""
-#: judge/models/submission.py:203
+#: judge/models/submission.py:214
msgid "View all submission"
msgstr ""
-#: judge/models/submission.py:204
+#: judge/models/submission.py:215
msgid "Resubmit others' submission"
msgstr ""
-#: judge/models/submission.py:205
+#: judge/models/submission.py:216
msgid "Change lock status of submission"
msgstr ""
-#: judge/models/submission.py:208 templates/contest/moss.html:58
+#: judge/models/submission.py:219 templates/contest/moss.html:58
msgid "submissions"
msgstr ""
-#: judge/models/submission.py:212 judge/models/submission.py:223
+#: judge/models/submission.py:223 judge/models/submission.py:234
msgid "associated submission"
msgstr ""
-#: judge/models/submission.py:214
+#: judge/models/submission.py:225
msgid "source code"
msgstr ""
-#: judge/models/submission.py:225
+#: judge/models/submission.py:236
msgid "test case ID"
msgstr ""
-#: judge/models/submission.py:226
+#: judge/models/submission.py:237
msgid "status flag"
msgstr ""
-#: judge/models/submission.py:230
+#: judge/models/submission.py:241
msgid "points possible"
msgstr ""
-#: judge/models/submission.py:231
+#: judge/models/submission.py:242
msgid "batch number"
msgstr ""
-#: judge/models/submission.py:232
+#: judge/models/submission.py:243
msgid "judging feedback"
msgstr ""
-#: judge/models/submission.py:233
+#: judge/models/submission.py:244
msgid "extended judging feedback"
msgstr ""
-#: judge/models/submission.py:234
+#: judge/models/submission.py:245
msgid "program output"
msgstr ""
-#: judge/models/submission.py:242
+#: judge/models/submission.py:253
msgid "submission test case"
msgstr ""
-#: judge/models/submission.py:243
+#: judge/models/submission.py:254
msgid "submission test cases"
msgstr ""
@@ -2385,6 +2406,10 @@ msgstr ""
msgid "poster"
msgstr ""
+#: judge/models/ticket.py:30
+msgid "message body"
+msgstr ""
+
#: judge/models/ticket.py:31
msgid "message time"
msgstr ""
@@ -2407,19 +2432,23 @@ msgstr ""
msgid "Running MOSS"
msgstr ""
-#: judge/tasks/submission.py:43
+#: judge/tasks/submission.py:45
msgid "Modifying submissions"
msgstr ""
-#: judge/tasks/submission.py:56
+#: judge/tasks/submission.py:58
msgid "Recalculating user points"
msgstr ""
-#: judge/tasks/user.py:50
+#: judge/tasks/user.py:49
+msgid "Applying filters"
+msgstr ""
+
+#: judge/tasks/user.py:64
msgid "Preparing your submission data"
msgstr ""
-#: judge/tasks/user.py:81
+#: judge/tasks/user.py:95
msgid "Preparing your comment data"
msgstr ""
@@ -2538,7 +2567,7 @@ msgstr ""
msgid "You already voted."
msgstr ""
-#: judge/views/comment.py:129 judge/views/organization.py:298
+#: judge/views/comment.py:129 judge/views/organization.py:297
msgid "Edited from site"
msgstr ""
@@ -2546,125 +2575,130 @@ msgstr ""
msgid "Editing comment"
msgstr ""
-#: judge/views/contests.py:56 judge/views/contests.py:201
-#: judge/views/contests.py:204 judge/views/contests.py:382
+#: judge/views/contests.py:57 judge/views/contests.py:210
+#: judge/views/contests.py:213 judge/views/contests.py:395
msgid "No such contest"
msgstr ""
-#: judge/views/contests.py:57 judge/views/contests.py:202
+#: judge/views/contests.py:58 judge/views/contests.py:211
#, python-format
msgid "Could not find a contest with the key \"%s\"."
msgstr ""
-#: judge/views/contests.py:70
+#: judge/views/contests.py:71
msgid "Contests"
msgstr ""
-#: judge/views/contests.py:205
+#: judge/views/contests.py:214
msgid "Could not find such contest."
msgstr ""
-#: judge/views/contests.py:208
+#: judge/views/contests.py:217
#, python-format
msgid "Access to contest \"%s\" denied"
msgstr ""
-#: judge/views/contests.py:235
+#: judge/views/contests.py:244
msgid "Clone Contest"
msgstr ""
-#: judge/views/contests.py:301
+#: judge/views/contests.py:278
+#, python-format
+msgid "Cloned contest from %s"
+msgstr ""
+
+#: judge/views/contests.py:314
msgid "Contest not ongoing"
msgstr ""
-#: judge/views/contests.py:302
+#: judge/views/contests.py:315
#, python-format
msgid "\"%s\" is not currently ongoing."
msgstr ""
-#: judge/views/contests.py:306
+#: judge/views/contests.py:319
msgid "Already in contest"
msgstr ""
-#: judge/views/contests.py:307
+#: judge/views/contests.py:320
#, python-format
msgid "You are already in a contest: \"%s\"."
msgstr ""
-#: judge/views/contests.py:310
+#: judge/views/contests.py:323
msgid "Banned from joining"
msgstr ""
-#: judge/views/contests.py:311
+#: judge/views/contests.py:324
msgid "You have been declared persona non grata for this contest. You are permanently barred from joining this contest."
msgstr ""
-#: judge/views/contests.py:372
+#: judge/views/contests.py:385
#, python-format
msgid "Enter access code for \"%s\""
msgstr ""
-#: judge/views/contests.py:383
+#: judge/views/contests.py:396
#, python-format
msgid "You are not in contest \"%s\"."
msgstr ""
-#: judge/views/contests.py:402
+#: judge/views/contests.py:415
msgid "ContestCalendar requires integer year and month"
msgstr ""
-#: judge/views/contests.py:442
+#: judge/views/contests.py:455
#, python-format
msgid "Contests in %(month)s"
msgstr ""
-#: judge/views/contests.py:442
+#: judge/views/contests.py:455
msgid "F Y"
msgstr ""
-#: judge/views/contests.py:489
+#: judge/views/contests.py:502
#, python-format
msgid "%s Statistics"
msgstr ""
-#: judge/views/contests.py:662
+#: judge/views/contests.py:675
#, python-format
msgid "%s Rankings"
msgstr ""
-#: judge/views/contests.py:670
+#: judge/views/contests.py:683
msgid "???"
msgstr ""
-#: judge/views/contests.py:686
+#: judge/views/contests.py:699
#, python-format
msgid "Your participation in %s"
msgstr ""
-#: judge/views/contests.py:687
+#: judge/views/contests.py:700
#, python-format
msgid "%s's participation in %s"
msgstr ""
-#: judge/views/contests.py:694
+#: judge/views/contests.py:707
msgid "Live"
msgstr ""
-#: judge/views/contests.py:706 templates/contest/contest-tabs.html:13
+#: judge/views/contests.py:719 templates/contest/contest-tabs.html:13
msgid "Participation"
msgstr ""
-#: judge/views/contests.py:750
+#: judge/views/contests.py:763
#, python-format
msgid "%s MOSS Results"
msgstr ""
-#: judge/views/contests.py:777
+#: judge/views/contests.py:790
#, python-format
msgid "Running MOSS for %s..."
msgstr ""
-#: judge/views/contests.py:800
+#: judge/views/contests.py:813
#, python-format
msgid "Contest tag: %s"
msgstr ""
@@ -2693,71 +2727,71 @@ msgstr ""
msgid "Runtimes"
msgstr ""
-#: judge/views/organization.py:44 judge/views/organization.py:47
+#: judge/views/organization.py:43 judge/views/organization.py:46
msgid "No such organization"
msgstr ""
-#: judge/views/organization.py:45
+#: judge/views/organization.py:44
#, python-format
msgid "Could not find an organization with the key \"%s\"."
msgstr ""
-#: judge/views/organization.py:48
+#: judge/views/organization.py:47
msgid "Could not find such organization."
msgstr ""
-#: judge/views/organization.py:72 judge/views/register.py:34
+#: judge/views/organization.py:71 judge/views/register.py:33
#: templates/organization/list.html:15 templates/user/user-list-tabs.html:5
msgid "Organizations"
msgstr ""
-#: judge/views/organization.py:93
+#: judge/views/organization.py:92
#, python-format
msgid "%s Members"
msgstr ""
-#: judge/views/organization.py:118 judge/views/organization.py:121
-#: judge/views/organization.py:126
+#: judge/views/organization.py:117 judge/views/organization.py:120
+#: judge/views/organization.py:125
msgid "Joining organization"
msgstr ""
-#: judge/views/organization.py:118
+#: judge/views/organization.py:117
msgid "You are already in the organization."
msgstr ""
-#: judge/views/organization.py:121
+#: judge/views/organization.py:120
msgid "This organization is not open."
msgstr ""
-#: judge/views/organization.py:138
+#: judge/views/organization.py:137
msgid "Leaving organization"
msgstr ""
-#: judge/views/organization.py:138
+#: judge/views/organization.py:137
#, python-format
msgid "You are not in \"%s\"."
msgstr ""
-#: judge/views/organization.py:162
+#: judge/views/organization.py:161
#, python-format
msgid "Request to join %s"
msgstr ""
-#: judge/views/organization.py:180
+#: judge/views/organization.py:179
msgid "Join request detail"
msgstr ""
-#: judge/views/organization.py:208
+#: judge/views/organization.py:207
#, python-format
msgid "Managing join requests for %s"
msgstr ""
-#: judge/views/organization.py:239
+#: judge/views/organization.py:238
#, python-format
msgid "Your organization can only receive %d more members. You cannot approve %d users."
msgstr ""
-#: judge/views/organization.py:251
+#: judge/views/organization.py:250
#, python-format
msgid "Approved %d user."
msgid_plural "Approved %d users."
@@ -2766,7 +2800,7 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-#: judge/views/organization.py:252
+#: judge/views/organization.py:251
#, python-format
msgid "Rejected %d user."
msgid_plural "Rejected %d users."
@@ -2775,85 +2809,99 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-#: judge/views/organization.py:282
+#: judge/views/organization.py:281
#, python-format
msgid "Editing %s"
msgstr ""
-#: judge/views/organization.py:306 judge/views/organization.py:314
+#: judge/views/organization.py:305 judge/views/organization.py:313
msgid "Can't edit organization"
msgstr ""
-#: judge/views/organization.py:307
+#: judge/views/organization.py:306
msgid "You are not allowed to edit this organization."
msgstr ""
-#: judge/views/organization.py:315
+#: judge/views/organization.py:314
msgid "You are not allowed to kick people from this organization."
msgstr ""
-#: judge/views/organization.py:320 judge/views/organization.py:324
+#: judge/views/organization.py:319 judge/views/organization.py:323
msgid "Can't kick user"
msgstr ""
-#: judge/views/organization.py:321
+#: judge/views/organization.py:320
msgid "The user you are trying to kick does not exist!"
msgstr ""
-#: judge/views/organization.py:325
+#: judge/views/organization.py:324
#, python-format
msgid "The user you are trying to kick is not in organization: %s."
msgstr ""
-#: judge/views/problem.py:67
+#: judge/views/problem.py:68
msgid "No such problem"
msgstr ""
-#: judge/views/problem.py:68
+#: judge/views/problem.py:69
#, python-format
msgid "Could not find a problem with the code \"%s\"."
msgstr ""
-#: judge/views/problem.py:110
+#: judge/views/problem.py:111
#, python-brace-format
msgid "Editorial for {0}"
msgstr ""
-#: judge/views/problem.py:113
+#: judge/views/problem.py:114
#, python-brace-format
msgid "Editorial for {0}"
msgstr ""
-#: judge/views/problem.py:283 templates/contest/contest.html:79
+#: judge/views/problem.py:133
+msgid "No such editorial"
+msgstr ""
+
+#: judge/views/problem.py:134
+#, python-format
+msgid "Could not find an editorial with the code \"%s\"."
+msgstr ""
+
+#: judge/views/problem.py:289 templates/contest/contest.html:79
#: templates/user/user-tabs.html:5 templates/user/users-table.html:23
msgid "Problems"
msgstr ""
-#: judge/views/problem.py:556 judge/views/problem.py:564
+#: judge/views/problem.py:562 judge/views/problem.py:570
#, python-format
msgid "Submit to %s"
msgstr ""
-#: judge/views/problem.py:613
+#: judge/views/problem.py:619
msgid "Banned from submitting"
msgstr ""
-#: judge/views/problem.py:614
+#: judge/views/problem.py:620
msgid "You have been declared persona non grata for this problem. You are permanently barred from submitting this problem."
msgstr ""
-#: judge/views/problem.py:618
+#: judge/views/problem.py:624
msgid "Too many submissions"
msgstr ""
-#: judge/views/problem.py:619
+#: judge/views/problem.py:625
msgid "You have exceeded the submission limit for this problem."
msgstr ""
-#: judge/views/problem.py:681
+#: judge/views/problem.py:693
msgid "Clone Problem"
msgstr ""
+#: judge/views/problem.py:720
+#, python-format
+msgid "Cloned problem from %s"
+msgstr ""
+
#: judge/views/problem_data.py:37
msgid "Checker arguments must be a JSON object"
msgstr ""
@@ -2925,52 +2973,52 @@ msgstr ""
msgid "Best solutions for {0}"
msgstr ""
-#: judge/views/ranked_submission.py:80
+#: judge/views/ranked_submission.py:82
#, python-format
msgid "Best solutions for %(problem)s in %(contest)s"
msgstr ""
-#: judge/views/ranked_submission.py:83
+#: judge/views/ranked_submission.py:85
#, python-format
msgid "Best solutions for problem %(number)s in %(contest)s"
msgstr ""
-#: judge/views/ranked_submission.py:89
+#: judge/views/ranked_submission.py:91
#, python-brace-format
msgid "Best solutions for {0} in {2}"
msgstr ""
-#: judge/views/ranked_submission.py:92
+#: judge/views/ranked_submission.py:94
#, python-brace-format
msgid "Best solutions for problem {0} in {1}"
msgstr ""
-#: judge/views/register.py:27
+#: judge/views/register.py:26
msgid "A username must contain letters, numbers, or underscores"
msgstr ""
-#: judge/views/register.py:31
+#: judge/views/register.py:30
msgid "Preferred language"
msgstr ""
-#: judge/views/register.py:38
+#: judge/views/register.py:37
msgid "Subscribe to newsletter?"
msgstr ""
-#: judge/views/register.py:45
+#: judge/views/register.py:44
#, python-format
msgid "The email address \"%s\" is already taken. Only one registration is allowed per address."
msgstr ""
-#: judge/views/register.py:51
+#: judge/views/register.py:50
msgid "Your email provider is not allowed due to history of abuse. Please use a reputable email provider."
msgstr ""
-#: judge/views/register.py:57 judge/views/register.py:95
+#: judge/views/register.py:56 judge/views/register.py:94
msgid "Registration"
msgstr ""
-#: judge/views/register.py:106
+#: judge/views/register.py:105
msgid "Authentication failure"
msgstr ""
@@ -2978,7 +3026,7 @@ msgstr ""
msgid "Language statistics"
msgstr ""
-#: judge/views/status.py:24 templates/submission/list.html:311
+#: judge/views/status.py:24 templates/submission/list.html:310
msgid "Status"
msgstr ""
@@ -2986,74 +3034,74 @@ msgstr ""
msgid "Version matrix"
msgstr ""
-#: judge/views/submission.py:53 judge/views/submission.py:60
+#: judge/views/submission.py:55 judge/views/submission.py:62
#, python-format
msgid "Submission of %(problem)s by %(user)s"
msgstr ""
-#: judge/views/submission.py:203 judge/views/submission.py:204
+#: judge/views/submission.py:205 judge/views/submission.py:206
#: templates/problem/problem.html:127
msgid "All submissions"
msgstr ""
-#: judge/views/submission.py:349
+#: judge/views/submission.py:355
msgid "All my submissions"
msgstr ""
-#: judge/views/submission.py:350
+#: judge/views/submission.py:356
#, python-format
msgid "All submissions by %s"
msgstr ""
-#: judge/views/submission.py:381
+#: judge/views/submission.py:387
#, python-format
msgid "All submissions for %s"
msgstr ""
-#: judge/views/submission.py:400
+#: judge/views/submission.py:410
msgid "Must pass a problem"
msgstr ""
-#: judge/views/submission.py:439
+#: judge/views/submission.py:449
#, python-format
msgid "My submissions for %(problem)s"
msgstr ""
-#: judge/views/submission.py:440
+#: judge/views/submission.py:450
#, python-format
msgid "%(user)s's submissions for %(problem)s"
msgstr ""
-#: judge/views/submission.py:536
+#: judge/views/submission.py:546
msgid "Must pass a contest"
msgstr ""
-#: judge/views/submission.py:544
+#: judge/views/submission.py:554
#, python-format
msgid "My submissions in %(contest)s"
msgstr ""
-#: judge/views/submission.py:545
+#: judge/views/submission.py:555
#, python-format
msgid "%(user)s's submissions in %(contest)s"
msgstr ""
-#: judge/views/submission.py:559
+#: judge/views/submission.py:569
#, python-brace-format
msgid "My submissions in {0}"
msgstr ""
-#: judge/views/submission.py:561
+#: judge/views/submission.py:571
#, python-brace-format
msgid "{0}'s submissions in {2}"
msgstr ""
-#: judge/views/submission.py:585
+#: judge/views/submission.py:597
#, python-brace-format
msgid "{0}'s submissions for {2} in {4}"
msgstr ""
-#: judge/views/submission.py:590
+#: judge/views/submission.py:602
#, python-brace-format
msgid "{0}'s submissions for problem {2} in {3}"
msgstr ""
@@ -3070,40 +3118,40 @@ msgstr ""
msgid "You must solve at least one problem before you can create a ticket."
msgstr ""
-#: judge/views/ticket.py:87 judge/views/ticket.py:90
+#: judge/views/ticket.py:91 judge/views/ticket.py:94
#, python-format
msgid "New ticket for %s"
msgstr ""
-#: judge/views/ticket.py:144
+#: judge/views/ticket.py:148
#, python-format
msgid "%(title)s - Ticket %(id)d"
msgstr ""
-#: judge/views/ticket.py:249
+#: judge/views/ticket.py:253
#, python-format
msgid "Tickets - Page %(number)d of %(total)d"
msgstr ""
-#: judge/views/ticket.py:298
+#: judge/views/ticket.py:302
#, python-format
msgid "New Ticket: %s"
msgstr ""
-#: judge/views/ticket.py:299
+#: judge/views/ticket.py:303
#, python-format
msgid "#%(id)d, assigned to: %(users)s"
msgstr ""
-#: judge/views/ticket.py:301
+#: judge/views/ticket.py:305
msgid ", "
msgstr ""
-#: judge/views/ticket.py:301
+#: judge/views/ticket.py:305
msgid "no one"
msgstr ""
-#: judge/views/ticket.py:321
+#: judge/views/ticket.py:325
#, python-format
msgid "New Ticket Message For: %s"
msgstr ""
@@ -3112,87 +3160,91 @@ msgstr ""
msgid "Enable Two-factor Authentication"
msgstr ""
-#: judge/views/two_factor.py:99
+#: judge/views/two_factor.py:108
+msgid "Refresh Two-factor Authentication"
+msgstr ""
+
+#: judge/views/two_factor.py:116
msgid "Disable Two-factor Authentication"
msgstr ""
-#: judge/views/two_factor.py:148
+#: judge/views/two_factor.py:165
msgid "Invalid WebAuthn response"
msgstr ""
-#: judge/views/two_factor.py:151
+#: judge/views/two_factor.py:168
msgid "Invalid name"
msgstr ""
-#: judge/views/two_factor.py:204
+#: judge/views/two_factor.py:221
msgid "Staff may not disable 2FA"
msgstr ""
-#: judge/views/two_factor.py:216
+#: judge/views/two_factor.py:229
msgid "Perform Two-factor Authentication"
msgstr ""
-#: judge/views/user.py:79
+#: judge/views/user.py:78
msgid "No such user"
msgstr ""
-#: judge/views/user.py:79
+#: judge/views/user.py:78
#, python-format
msgid "No user handle \"%s\"."
msgstr ""
-#: judge/views/user.py:83
+#: judge/views/user.py:82
msgid "My account"
msgstr ""
-#: judge/views/user.py:84
+#: judge/views/user.py:83
#, python-format
msgid "User %s"
msgstr ""
-#: judge/views/user.py:132
+#: judge/views/user.py:131
msgid "Login"
msgstr ""
-#: judge/views/user.py:173
+#: judge/views/user.py:172
msgid "M j, Y, G:i"
msgstr ""
-#: judge/views/user.py:307
+#: judge/views/user.py:306
msgid "Preparing your data..."
msgstr ""
-#: judge/views/user.py:311 templates/user/edit-profile.html:348
+#: judge/views/user.py:310 templates/user/edit-profile.html:352
msgid "Download your data"
msgstr ""
-#: judge/views/user.py:367
+#: judge/views/user.py:366
msgid "Updated on site"
msgstr ""
-#: judge/views/user.py:400 templates/admin/auth/user/change_form.html:14
+#: judge/views/user.py:399 templates/admin/auth/user/change_form.html:14
#: templates/admin/auth/user/change_form.html:17 templates/base.html:222
#: templates/user/user-tabs.html:16
msgid "Edit profile"
msgstr ""
-#: judge/views/user.py:415
+#: judge/views/user.py:414
msgid "Generated API token for user"
msgstr ""
-#: judge/views/user.py:427
+#: judge/views/user.py:426
msgid "Removed API token for user"
msgstr ""
-#: judge/views/user.py:437
+#: judge/views/user.py:436
msgid "Generated scratch codes for user"
msgstr ""
-#: judge/views/user.py:443 templates/user/user-list-tabs.html:4
+#: judge/views/user.py:442 templates/user/user-list-tabs.html:4
msgid "Leaderboard"
msgstr ""
-#: judge/views/user.py:504
+#: judge/views/user.py:503
msgid "You have been successfully logged out."
msgstr ""
@@ -3317,11 +3369,11 @@ msgstr ""
msgid "posted on {time}"
msgstr ""
-#: templates/blog/list.html:130 templates/problem/problem.html:309
+#: templates/blog/list.html:130 templates/problem/problem.html:311
msgid "Clarifications"
msgstr ""
-#: templates/blog/list.html:146 templates/problem/problem.html:320
+#: templates/blog/list.html:146 templates/problem/problem.html:322
msgid "No clarifications have been made at this time."
msgstr ""
@@ -3514,7 +3566,7 @@ msgid "Info"
msgstr ""
#: templates/contest/contest-tabs.html:6 templates/stats/base.html:9
-#: templates/submission/list.html:337
+#: templates/submission/list.html:336
msgid "Statistics"
msgstr ""
@@ -3717,19 +3769,19 @@ msgstr ""
msgid "Disqualify"
msgstr ""
-#: templates/contest/ranking.html:169
+#: templates/contest/ranking.html:173
msgid "Are you sure you want to disqualify this participation?"
msgstr ""
-#: templates/contest/ranking.html:174
+#: templates/contest/ranking.html:178
msgid "Are you sure you want to un-disqualify this participation?"
msgstr ""
-#: templates/contest/ranking.html:246
+#: templates/contest/ranking.html:250
msgid "View user participation"
msgstr ""
-#: templates/contest/ranking.html:250
+#: templates/contest/ranking.html:254
msgid "Show organizations"
msgstr ""
@@ -4004,7 +4056,7 @@ msgstr ""
msgid "Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence."
msgstr ""
-#: templates/problem/editorial.html:27 templates/problem/problem.html:209
+#: templates/problem/editorial.html:27 templates/problem/problem.html:210
msgid "Author:"
msgid_plural "Authors:"
msgstr[0] ""
@@ -4175,7 +4227,7 @@ msgstr ""
msgid "Memory limit:"
msgstr ""
-#: templates/problem/problem.html:224
+#: templates/problem/problem.html:226
msgid "Problem type"
msgid_plural "Problem types"
msgstr[0] ""
@@ -4183,16 +4235,16 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-#: templates/problem/problem.html:237
+#: templates/problem/problem.html:239
msgid "Allowed languages"
msgstr ""
-#: templates/problem/problem.html:245
+#: templates/problem/problem.html:247
#, python-format
msgid "No %(lang)s judge online"
msgstr ""
-#: templates/problem/problem.html:256
+#: templates/problem/problem.html:258
msgid "Judge:"
msgid_plural "Judges:"
msgstr[0] ""
@@ -4200,15 +4252,15 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-#: templates/problem/problem.html:273
+#: templates/problem/problem.html:275
msgid "none available"
msgstr ""
-#: templates/problem/problem.html:298
+#: templates/problem/problem.html:300
msgid "Request clarification"
msgstr ""
-#: templates/problem/problem.html:300
+#: templates/problem/problem.html:302
msgid "Report an issue"
msgstr ""
@@ -4253,7 +4305,7 @@ msgstr ""
msgid "Point range"
msgstr ""
-#: templates/problem/search-form.html:63 templates/submission/list.html:329
+#: templates/problem/search-form.html:63 templates/submission/list.html:328
#: templates/ticket/list.html:248
msgid "Go"
msgstr ""
@@ -4302,7 +4354,7 @@ msgid "Invalid username or password."
msgstr ""
#: templates/registration/login.html:53
-#: templates/registration/two_factor_auth.html:86
+#: templates/registration/two_factor_auth.html:92
msgid "Login!"
msgstr ""
@@ -4422,12 +4474,12 @@ msgid "Default language"
msgstr ""
#: templates/registration/registration_form.html:184
-#: templates/user/edit-profile.html:310
+#: templates/user/edit-profile.html:314
msgid "Affiliated organizations"
msgstr ""
#: templates/registration/registration_form.html:190
-#: templates/user/edit-profile.html:324
+#: templates/user/edit-profile.html:328
msgid "Notify me about upcoming contests"
msgstr ""
@@ -4443,57 +4495,93 @@ msgstr ""
msgid "Register!"
msgstr ""
-#: templates/registration/totp_disable.html:38
+#: templates/registration/totp_disable.html:31
msgid "To protect your account, you must first authenticate before you can disable Two Factor Authentication."
msgstr ""
-#: templates/registration/totp_disable.html:45
+#: templates/registration/totp_disable.html:38
msgid "Enter the 6-digit code generated by your app or one of your 16-digit scratch codes:"
msgstr ""
-#: templates/registration/totp_disable.html:48
+#: templates/registration/totp_disable.html:41
msgid "Disable Two Factor Authentication"
msgstr ""
-#: templates/registration/totp_enable.html:75
+#: templates/registration/totp_enable.html:72
msgid "Scan this code with your authenticator app:"
msgstr ""
-#: templates/registration/totp_enable.html:76
+#: templates/registration/totp_enable.html:73
msgid "QR code"
msgstr ""
-#: templates/registration/totp_enable.html:77
+#: templates/registration/totp_enable.html:74
msgid "Or enter this code manually:"
msgstr ""
-#: templates/registration/totp_enable.html:88
+#: templates/registration/totp_enable.html:85
msgid "Enter the 6-digit code generated by your app:"
msgstr ""
-#: templates/registration/totp_enable.html:91
+#: templates/registration/totp_enable.html:90
+msgid "Refresh Two Factor Authentication"
+msgstr ""
+
+#: templates/registration/totp_enable.html:92
msgid "Enable Two Factor Authentication"
msgstr ""
+#: templates/registration/totp_enable.html:98
+msgid "Below is a list of one-time use scratch codes."
+msgstr ""
+
+#: templates/registration/totp_enable.html:99
+msgid "These codes can only be used once and are for emergency use."
+msgstr ""
+
+#: templates/registration/totp_enable.html:100
+msgid "You can use these codes to login to your account or disable two-factor authentication."
+msgstr ""
+
+#: templates/registration/totp_enable.html:101
+msgid "If you ever need more scratch codes, you can regenerate them on the edit profile tab."
+msgstr ""
+
+#: templates/registration/totp_enable.html:102
+msgid "Please write these down and keep them in a secure location."
+msgstr ""
+
+#: templates/registration/totp_enable.html:103
+msgid "These codes will never be shown again after you enable two-factor authentication."
+msgstr ""
+
#: templates/registration/two_factor_auth.html:33
-#: templates/user/edit-profile.html:161
+#: templates/user/edit-profile.html:165
msgid "WebAuthn is not supported by your browser."
msgstr ""
#: templates/registration/two_factor_auth.html:54
-#: templates/user/edit-profile.html:185
+#: templates/user/edit-profile.html:189
msgid "Failed to contact server."
msgstr ""
-#: templates/registration/two_factor_auth.html:77
+#: templates/registration/two_factor_auth.html:79
msgid "Enter the 6-digit code generated by your app or one of your 16-character scratch codes:"
msgstr ""
-#: templates/registration/two_factor_auth.html:83
-msgid "Use security key"
+#: templates/registration/two_factor_auth.html:81
+msgid "Enter one of your 16-character scratch codes:"
msgstr ""
#: templates/registration/two_factor_auth.html:89
+msgid "Use security key"
+msgstr ""
+
+#: templates/registration/two_factor_auth.html:94
+msgid "Use scratch code"
+msgstr ""
+
+#: templates/registration/two_factor_auth.html:97
#, python-format
msgid "If you lost your authentication device and are unable to use your scratch codes, please contact us at %(email)s."
msgstr ""
@@ -4574,15 +4662,15 @@ msgstr ""
msgid "Filter by language..."
msgstr ""
-#: templates/submission/list.html:307
+#: templates/submission/list.html:306
msgid "Filter submissions"
msgstr ""
-#: templates/submission/list.html:343
+#: templates/submission/list.html:342
msgid "Total:"
msgstr ""
-#: templates/submission/list.html:353
+#: templates/submission/list.html:352
msgid "You were disconnected. Refresh to show latest updates."
msgstr ""
@@ -4800,121 +4888,125 @@ msgstr ""
msgid "Search by handle..."
msgstr ""
-#: templates/user/edit-profile.html:109
+#: templates/user/edit-profile.html:113
msgid "Are you sure you want to generate or regenerate your API token?"
msgstr ""
-#: templates/user/edit-profile.html:110
+#: templates/user/edit-profile.html:114
msgid "This will invalidate any previous API tokens."
msgstr ""
-#: templates/user/edit-profile.html:111
+#: templates/user/edit-profile.html:115
msgid "It also allows access to your account without Two-factor Authentication."
msgstr ""
-#: templates/user/edit-profile.html:112
+#: templates/user/edit-profile.html:116
msgid "You will not be able to view your api token after you leave this page!"
msgstr ""
-#: templates/user/edit-profile.html:113 templates/user/edit-profile.html:207
+#: templates/user/edit-profile.html:117 templates/user/edit-profile.html:211
msgid "Generating..."
msgstr ""
-#: templates/user/edit-profile.html:121 templates/user/edit-profile.html:243
-#: templates/user/edit-profile.html:371 templates/user/edit-profile.html:390
+#: templates/user/edit-profile.html:125 templates/user/edit-profile.html:247
+#: templates/user/edit-profile.html:373 templates/user/edit-profile.html:395
msgid "Regenerate"
msgstr ""
-#: templates/user/edit-profile.html:127 templates/user/edit-profile.html:392
+#: templates/user/edit-profile.html:131 templates/user/edit-profile.html:397
msgid "Remove"
msgstr ""
-#: templates/user/edit-profile.html:137
+#: templates/user/edit-profile.html:141
msgid "Are you sure you want to remove your API token?"
msgstr ""
-#: templates/user/edit-profile.html:144 templates/user/edit-profile.html:375
-#: templates/user/edit-profile.html:396
+#: templates/user/edit-profile.html:148 templates/user/edit-profile.html:377
+#: templates/user/edit-profile.html:401
msgid "Generate"
msgstr ""
-#: templates/user/edit-profile.html:190
+#: templates/user/edit-profile.html:194
msgid "Are you sure you want to delete this security key?"
msgstr ""
-#: templates/user/edit-profile.html:280
+#: templates/user/edit-profile.html:284
msgid "Self-description"
msgstr ""
-#: templates/user/edit-profile.html:287
+#: templates/user/edit-profile.html:291
msgid "Select your closest major city"
msgstr ""
-#: templates/user/edit-profile.html:296
+#: templates/user/edit-profile.html:300
msgid "Editor theme"
msgstr ""
-#: templates/user/edit-profile.html:301
+#: templates/user/edit-profile.html:305
msgid "Math engine"
msgstr ""
-#: templates/user/edit-profile.html:335 templates/user/edit-profile.html:337
+#: templates/user/edit-profile.html:339 templates/user/edit-profile.html:341
msgid "Change your avatar"
msgstr ""
-#: templates/user/edit-profile.html:342
+#: templates/user/edit-profile.html:346
msgid "Change your password"
msgstr ""
-#: templates/user/edit-profile.html:356
+#: templates/user/edit-profile.html:359
msgid "Two-factor Authentication is enabled"
msgstr ""
-#: templates/user/edit-profile.html:358
-msgid "Two-factor Authentication is disabled"
+#: templates/user/edit-profile.html:362 templates/user/edit-profile.html:365
+msgid "Disable"
msgstr ""
-#: templates/user/edit-profile.html:363 templates/user/edit-profile.html:365
-msgid "Disable"
+#: templates/user/edit-profile.html:367
+msgid "Refresh"
msgstr ""
-#: templates/user/edit-profile.html:368
+#: templates/user/edit-profile.html:370
msgid "Scratch Codes:"
msgstr ""
-#: templates/user/edit-profile.html:372 templates/user/edit-profile.html:393
+#: templates/user/edit-profile.html:374 templates/user/edit-profile.html:398
msgid "Hidden"
msgstr ""
-#: templates/user/edit-profile.html:381
+#: templates/user/edit-profile.html:384
+msgid "Two-factor Authentication is disabled"
+msgstr ""
+
+#: templates/user/edit-profile.html:385
msgid "Enable"
msgstr ""
-#: templates/user/edit-profile.html:387
+#: templates/user/edit-profile.html:392
msgid "API Token"
msgstr ""
-#: templates/user/edit-profile.html:404
+#: templates/user/edit-profile.html:409
msgid "Security keys"
msgstr ""
-#: templates/user/edit-profile.html:414
+#: templates/user/edit-profile.html:419
msgid "Delete"
msgstr ""
-#: templates/user/edit-profile.html:421
+#: templates/user/edit-profile.html:426
msgid "Enter a name for this key"
msgstr ""
-#: templates/user/edit-profile.html:422
+#: templates/user/edit-profile.html:427
msgid "Add"
msgstr ""
-#: templates/user/edit-profile.html:430
+#: templates/user/edit-profile.html:435
msgid "User-script"
msgstr ""
-#: templates/user/edit-profile.html:434
+#: templates/user/edit-profile.html:439
msgid "Update profile"
msgstr ""
diff --git a/locale/lt/LC_MESSAGES/djangojs.po b/locale/lt/LC_MESSAGES/djangojs.po
index aca7eb20c0..74b395bfa0 100644
--- a/locale/lt/LC_MESSAGES/djangojs.po
+++ b/locale/lt/LC_MESSAGES/djangojs.po
@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: dmoj\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-10-01 23:12+0000\n"
-"PO-Revision-Date: 2021-04-25 00:08\n"
+"PO-Revision-Date: 2021-07-07 00:27\n"
"Last-Translator: \n"
"Language-Team: Lithuanian\n"
"Language: lt_LT\n"
diff --git a/locale/nl/LC_MESSAGES/django.po b/locale/nl/LC_MESSAGES/django.po
index 7260f0bba3..00d1e60a17 100644
--- a/locale/nl/LC_MESSAGES/django.po
+++ b/locale/nl/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: dmoj\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-24 19:15+0000\n"
-"PO-Revision-Date: 2021-04-25 00:08\n"
+"POT-Creation-Date: 2021-06-17 01:38+0000\n"
+"PO-Revision-Date: 2021-07-07 00:27\n"
"Last-Translator: \n"
"Language-Team: Dutch\n"
"Language: nl_NL\n"
@@ -17,75 +17,75 @@ msgstr ""
"X-Crowdin-File: django.po\n"
"X-Crowdin-File-ID: 10\n"
-#: dmoj/settings.py:364
+#: dmoj/settings.py:365
msgid "Catalan"
msgstr ""
-#: dmoj/settings.py:365
+#: dmoj/settings.py:366
msgid "German"
msgstr ""
-#: dmoj/settings.py:366
+#: dmoj/settings.py:367
msgid "English"
msgstr ""
-#: dmoj/settings.py:367
+#: dmoj/settings.py:368
msgid "Spanish"
msgstr ""
-#: dmoj/settings.py:368
+#: dmoj/settings.py:369
msgid "French"
msgstr ""
-#: dmoj/settings.py:369
+#: dmoj/settings.py:370
msgid "Croatian"
msgstr ""
-#: dmoj/settings.py:370
+#: dmoj/settings.py:371
msgid "Hungarian"
msgstr ""
-#: dmoj/settings.py:371
+#: dmoj/settings.py:372
msgid "Japanese"
msgstr ""
-#: dmoj/settings.py:372
+#: dmoj/settings.py:373
msgid "Korean"
msgstr ""
-#: dmoj/settings.py:373
+#: dmoj/settings.py:374
msgid "Brazilian Portuguese"
msgstr ""
-#: dmoj/settings.py:374
+#: dmoj/settings.py:375
msgid "Romanian"
msgstr ""
-#: dmoj/settings.py:375
+#: dmoj/settings.py:376
msgid "Russian"
msgstr ""
-#: dmoj/settings.py:376
+#: dmoj/settings.py:377
msgid "Serbian (Latin)"
msgstr ""
-#: dmoj/settings.py:377
+#: dmoj/settings.py:378
msgid "Turkish"
msgstr ""
-#: dmoj/settings.py:378
+#: dmoj/settings.py:379
msgid "Vietnamese"
msgstr ""
-#: dmoj/settings.py:379
+#: dmoj/settings.py:380
msgid "Simplified Chinese"
msgstr ""
-#: dmoj/settings.py:380
+#: dmoj/settings.py:381
msgid "Traditional Chinese"
msgstr ""
-#: dmoj/urls.py:103 templates/base.html:190
+#: dmoj/urls.py:104 templates/base.html:190
msgid "Home"
msgstr ""
@@ -115,112 +115,112 @@ msgstr ""
msgid "Associated page"
msgstr ""
-#: judge/admin/contest.py:31
+#: judge/admin/contest.py:32
msgid "Included contests"
msgstr ""
-#: judge/admin/contest.py:65 templates/contest/contest.html:83
+#: judge/admin/contest.py:66 templates/contest/contest.html:83
#: templates/contest/moss.html:43 templates/problem/list.html:204
#: templates/problem/list.html:219 templates/user/user-problems.html:58
#: templates/user/user-problems.html:100
msgid "Problem"
msgstr ""
-#: judge/admin/contest.py:114
+#: judge/admin/contest.py:117
msgid "Settings"
msgstr ""
-#: judge/admin/contest.py:116
+#: judge/admin/contest.py:120
msgid "Scheduling"
msgstr ""
-#: judge/admin/contest.py:117
+#: judge/admin/contest.py:121
msgid "Details"
msgstr ""
-#: judge/admin/contest.py:118
+#: judge/admin/contest.py:122
msgid "Format"
msgstr ""
-#: judge/admin/contest.py:119 templates/contest/ranking-table.html:5
+#: judge/admin/contest.py:123 templates/contest/ranking-table.html:5
msgid "Rating"
msgstr ""
-#: judge/admin/contest.py:120
+#: judge/admin/contest.py:124
msgid "Access"
msgstr ""
-#: judge/admin/contest.py:122 judge/admin/problem.py:134
+#: judge/admin/contest.py:126 judge/admin/problem.py:135
msgid "Justice"
msgstr ""
-#: judge/admin/contest.py:211
+#: judge/admin/contest.py:215
#, python-format
msgid "%d contest successfully marked as visible."
msgid_plural "%d contests successfully marked as visible."
msgstr[0] ""
msgstr[1] ""
-#: judge/admin/contest.py:214
+#: judge/admin/contest.py:218
msgid "Mark contests as visible"
msgstr ""
-#: judge/admin/contest.py:220
+#: judge/admin/contest.py:224
#, python-format
msgid "%d contest successfully marked as hidden."
msgid_plural "%d contests successfully marked as hidden."
msgstr[0] ""
msgstr[1] ""
-#: judge/admin/contest.py:223
+#: judge/admin/contest.py:227
msgid "Mark contests as hidden"
msgstr ""
-#: judge/admin/contest.py:229
+#: judge/admin/contest.py:233
#, python-format
msgid "%d contest successfully locked."
msgid_plural "%d contests successfully locked."
msgstr[0] ""
msgstr[1] ""
-#: judge/admin/contest.py:232
+#: judge/admin/contest.py:236
msgid "Lock contest submissions"
msgstr ""
-#: judge/admin/contest.py:238
+#: judge/admin/contest.py:242
#, python-format
msgid "%d contest successfully unlocked."
msgid_plural "%d contests successfully unlocked."
msgstr[0] ""
msgstr[1] ""
-#: judge/admin/contest.py:241
+#: judge/admin/contest.py:245
msgid "Unlock contest submissions"
msgstr ""
-#: judge/admin/contest.py:262 judge/admin/submission.py:170
+#: judge/admin/contest.py:266 judge/admin/submission.py:170
#, python-format
msgid "%d submission was successfully scheduled for rejudging."
msgid_plural "%d submissions were successfully scheduled for rejudging."
msgstr[0] ""
msgstr[1] ""
-#: judge/admin/contest.py:337
+#: judge/admin/contest.py:341
#, python-format
msgid "%d participation recalculated."
msgid_plural "%d participations recalculated."
msgstr[0] ""
msgstr[1] ""
-#: judge/admin/contest.py:340
+#: judge/admin/contest.py:344
msgid "Recalculate results"
msgstr ""
-#: judge/admin/contest.py:344 judge/admin/organization.py:63
+#: judge/admin/contest.py:348 judge/admin/organization.py:63
msgid "username"
msgstr ""
-#: judge/admin/contest.py:349 templates/base.html:258
+#: judge/admin/contest.py:353 templates/base.html:258
msgid "virtual"
msgstr ""
@@ -236,9 +236,9 @@ msgstr ""
msgid "Summary"
msgstr ""
-#: judge/admin/interface.py:113 judge/models/contest.py:383
-#: judge/models/contest.py:509 judge/models/profile.py:244
-#: judge/models/profile.py:268
+#: judge/admin/interface.py:113 judge/models/contest.py:419
+#: judge/models/contest.py:546 judge/models/profile.py:261
+#: judge/models/profile.py:292
msgid "user"
msgstr ""
@@ -246,8 +246,8 @@ msgstr ""
msgid "object"
msgstr ""
-#: judge/admin/organization.py:32 judge/admin/problem.py:181
-#: judge/admin/profile.py:82
+#: judge/admin/organization.py:32 judge/admin/problem.py:182
+#: judge/admin/profile.py:92
msgid "View on site"
msgstr ""
@@ -255,69 +255,69 @@ msgstr ""
msgid "Describe the changes you made (optional)"
msgstr ""
-#: judge/admin/problem.py:129
+#: judge/admin/problem.py:130
msgid "Social Media"
msgstr ""
-#: judge/admin/problem.py:130
+#: judge/admin/problem.py:131
msgid "Taxonomy"
msgstr ""
-#: judge/admin/problem.py:131 templates/contest/contest.html:84
+#: judge/admin/problem.py:132 templates/contest/contest.html:84
#: templates/problem/data.html:385 templates/problem/list.html:209
#: templates/problem/list.html:230 templates/user/base-users-table.html:10
#: templates/user/user-problems.html:60
msgid "Points"
msgstr ""
-#: judge/admin/problem.py:132
+#: judge/admin/problem.py:133
msgid "Limits"
msgstr ""
-#: judge/admin/problem.py:133 judge/admin/submission.py:238
-#: templates/stats/base.html:14 templates/submission/list.html:320
-#: templates/user/edit-profile.html:292
+#: judge/admin/problem.py:134 judge/admin/submission.py:238
+#: templates/stats/base.html:14 templates/submission/list.html:319
+#: templates/user/edit-profile.html:296
msgid "Language"
msgstr ""
-#: judge/admin/problem.py:135
+#: judge/admin/problem.py:136
msgid "History"
msgstr ""
-#: judge/admin/problem.py:178
+#: judge/admin/problem.py:179
msgid "Authors"
msgstr ""
-#: judge/admin/problem.py:191
+#: judge/admin/problem.py:192
#, python-format
msgid "%d problem's publish date successfully updated."
msgid_plural "%d problems' publish date successfully updated."
msgstr[0] ""
msgstr[1] ""
-#: judge/admin/problem.py:195
+#: judge/admin/problem.py:196
msgid "Set publish date to now"
msgstr ""
-#: judge/admin/problem.py:201
+#: judge/admin/problem.py:202
#, python-format
msgid "%d problem successfully marked as public."
msgid_plural "%d problems successfully marked as public."
msgstr[0] ""
msgstr[1] ""
-#: judge/admin/problem.py:205
+#: judge/admin/problem.py:206
msgid "Mark problems as public"
msgstr ""
-#: judge/admin/problem.py:211
+#: judge/admin/problem.py:212
#, python-format
msgid "%d problem successfully marked as private."
msgid_plural "%d problems successfully marked as private."
msgstr[0] ""
msgstr[1] ""
-#: judge/admin/problem.py:215
+#: judge/admin/problem.py:216
msgid "Mark problems as private"
msgstr ""
@@ -325,35 +325,35 @@ msgstr ""
msgid "timezone"
msgstr ""
-#: judge/admin/profile.py:88 judge/admin/submission.py:217
+#: judge/admin/profile.py:98 judge/admin/submission.py:217
#: templates/organization/requests/log.html:9
#: templates/organization/requests/pending.html:12
#: templates/ticket/list.html:261
msgid "User"
msgstr ""
-#: judge/admin/profile.py:93 templates/registration/registration_form.html:143
+#: judge/admin/profile.py:103 templates/registration/registration_form.html:143
msgid "Email"
msgstr ""
-#: judge/admin/profile.py:98 judge/views/register.py:29
+#: judge/admin/profile.py:108 judge/views/register.py:28
#: templates/registration/registration_form.html:171
-#: templates/user/edit-profile.html:288
+#: templates/user/edit-profile.html:292
msgid "Timezone"
msgstr ""
-#: judge/admin/profile.py:103
+#: judge/admin/profile.py:113
msgid "date joined"
msgstr ""
-#: judge/admin/profile.py:110
+#: judge/admin/profile.py:120
#, python-format
msgid "%d user have scores recalculated."
msgid_plural "%d users have scores recalculated."
msgstr[0] ""
msgstr[1] ""
-#: judge/admin/profile.py:113
+#: judge/admin/profile.py:123
msgid "Recalculate scores"
msgstr ""
@@ -506,115 +506,116 @@ msgstr ""
msgid "IOI (pre-2016)"
msgstr ""
-#: judge/forms.py:26
-msgid "Two-factor authentication tokens must be 6 decimal digits."
+#: judge/forms.py:27
+#, python-brace-format
+msgid "Two-factor authentication tokens must be {TOTP_CODE_LENGTH} decimal digits."
msgstr ""
-#: judge/forms.py:29
+#: judge/forms.py:30
msgid "Invalid two-factor authentication token."
msgstr ""
-#: judge/forms.py:32
+#: judge/forms.py:33
msgid "Scratch codes must be 16 base32 characters."
msgstr ""
-#: judge/forms.py:34
+#: judge/forms.py:35 judge/forms.py:264
msgid "Invalid scratch code."
msgstr ""
-#: judge/forms.py:45
+#: judge/forms.py:46
msgid "Subscribe to contest updates"
msgstr ""
-#: judge/forms.py:46
+#: judge/forms.py:47
msgid "Enable experimental features"
msgstr ""
-#: judge/forms.py:71
+#: judge/forms.py:72
msgid "You must solve at least one problem before you can update your profile."
msgstr ""
-#: judge/forms.py:80 judge/views/organization.py:127
+#: judge/forms.py:81 judge/views/organization.py:126
#, python-brace-format
msgid "You may not be part of more than {count} public organizations."
msgstr ""
-#: judge/forms.py:96
+#: judge/forms.py:97
msgid "Download comments?"
msgstr ""
-#: judge/forms.py:97
+#: judge/forms.py:98
msgid "Download submissions?"
msgstr ""
-#: judge/forms.py:98
+#: judge/forms.py:99
msgid "Filter by problem code glob:"
msgstr ""
-#: judge/forms.py:102
+#: judge/forms.py:103
msgid "Leave empty to include all submissions"
msgstr ""
-#: judge/forms.py:105 templates/problem/manage_submission.html:142
+#: judge/forms.py:106 templates/problem/manage_submission.html:142
msgid "Filter by result:"
msgstr ""
-#: judge/forms.py:111
+#: judge/forms.py:112
msgid "Please select at least one thing to download."
msgstr ""
-#: judge/forms.py:137
+#: judge/forms.py:138
msgid "Any judge"
msgstr ""
-#: judge/forms.py:167 judge/views/register.py:26
+#: judge/forms.py:159 judge/views/register.py:25
#: templates/registration/registration_form.html:137
#: templates/user/base-users-table.html:5
msgid "Username"
msgstr ""
-#: judge/forms.py:168 templates/registration/registration_form.html:149
+#: judge/forms.py:160 templates/registration/registration_form.html:149
#: templates/registration/registration_form.html:163
msgid "Password"
msgstr ""
-#: judge/forms.py:201
+#: judge/forms.py:192
msgid "Invalid code length."
msgstr ""
-#: judge/forms.py:219
+#: judge/forms.py:223
msgid "Invalid WebAuthn response."
msgstr ""
-#: judge/forms.py:222
+#: judge/forms.py:226
msgid "No WebAuthn challenge issued."
msgstr ""
-#: judge/forms.py:228
+#: judge/forms.py:232
msgid "Invalid WebAuthn credential ID."
msgstr ""
-#: judge/forms.py:257
+#: judge/forms.py:262
msgid "Invalid two-factor authentication token or scratch code."
msgstr ""
-#: judge/forms.py:259
+#: judge/forms.py:266
msgid "Must specify either totp_token or webauthn_response."
msgstr ""
-#: judge/forms.py:263 judge/models/problem.py:105
+#: judge/forms.py:270 judge/models/problem.py:119
msgid "Problem code must be ^[a-z0-9]+$"
msgstr ""
-#: judge/forms.py:268
+#: judge/forms.py:275
msgid "Problem with code already exists."
msgstr ""
-#: judge/forms.py:273 judge/models/contest.py:66
+#: judge/forms.py:280 judge/models/contest.py:66
msgid "Contest id must be ^[a-z0-9]+$"
msgstr ""
-#: judge/forms.py:278
+#: judge/forms.py:285
msgid "Contest with key already exists."
msgstr ""
@@ -694,7 +695,7 @@ msgid "comments"
msgstr ""
#: judge/models/comment.py:89 judge/models/comment.py:141
-#: judge/models/problem.py:484
+#: judge/models/problem.py:511
#, python-format
msgid "Editorial for %s"
msgstr ""
@@ -735,7 +736,7 @@ msgstr ""
msgid "contest tag"
msgstr ""
-#: judge/models/contest.py:53 judge/models/contest.py:117
+#: judge/models/contest.py:53 judge/models/contest.py:126
msgid "contest tags"
msgstr ""
@@ -760,410 +761,426 @@ msgid "contest name"
msgstr ""
#: judge/models/contest.py:68
-msgid "These people will be able to edit the contest."
+msgid "These users will be able to edit the contest."
msgstr ""
-#: judge/models/contest.py:70 judge/models/runtime.py:136
+#: judge/models/contest.py:70
+msgid "These users will be able to edit the contest, but will not be listed as authors."
+msgstr ""
+
+#: judge/models/contest.py:73
+msgid "These users will be able to view the contest, but not edit it."
+msgstr ""
+
+#: judge/models/contest.py:76 judge/models/runtime.py:136
msgid "description"
msgstr ""
-#: judge/models/contest.py:71 judge/models/problem.py:431
+#: judge/models/contest.py:77 judge/models/problem.py:458
#: judge/models/runtime.py:138
msgid "problems"
msgstr ""
-#: judge/models/contest.py:72 judge/models/contest.py:384
+#: judge/models/contest.py:78 judge/models/contest.py:420
msgid "start time"
msgstr ""
-#: judge/models/contest.py:73
+#: judge/models/contest.py:79
msgid "end time"
msgstr ""
-#: judge/models/contest.py:74 judge/models/problem.py:126
-#: judge/models/problem.py:455
+#: judge/models/contest.py:80 judge/models/problem.py:140
+#: judge/models/problem.py:482
msgid "time limit"
msgstr ""
-#: judge/models/contest.py:75 judge/models/problem.py:144
+#: judge/models/contest.py:81 judge/models/problem.py:158
msgid "publicly visible"
msgstr ""
-#: judge/models/contest.py:76
+#: judge/models/contest.py:82
msgid "Should be set even for organization-private contests, where it determines whether the contest is visible to members of the specified organizations."
msgstr ""
-#: judge/models/contest.py:79
+#: judge/models/contest.py:85
msgid "contest rated"
msgstr ""
-#: judge/models/contest.py:79
+#: judge/models/contest.py:85
msgid "Whether this contest can be rated."
msgstr ""
-#: judge/models/contest.py:81
+#: judge/models/contest.py:87
msgid "view contest scoreboard"
msgstr ""
-#: judge/models/contest.py:83
+#: judge/models/contest.py:89
msgid "These users will be able to view the scoreboard."
msgstr ""
-#: judge/models/contest.py:84
+#: judge/models/contest.py:90
msgid "scoreboard visibility"
msgstr ""
-#: judge/models/contest.py:85
+#: judge/models/contest.py:91
msgid "Scoreboard visibility through the duration of the contest"
msgstr ""
-#: judge/models/contest.py:87
+#: judge/models/contest.py:93
msgid "no comments"
msgstr ""
-#: judge/models/contest.py:88
+#: judge/models/contest.py:94
msgid "Use clarification system instead of comments."
msgstr ""
-#: judge/models/contest.py:90
+#: judge/models/contest.py:96
msgid "Rating floor for contest"
msgstr ""
-#: judge/models/contest.py:92
+#: judge/models/contest.py:98
msgid "Rating ceiling for contest"
msgstr ""
-#: judge/models/contest.py:94
+#: judge/models/contest.py:100
msgid "rate all"
msgstr ""
-#: judge/models/contest.py:94
+#: judge/models/contest.py:100
msgid "Rate all users who joined."
msgstr ""
-#: judge/models/contest.py:95
+#: judge/models/contest.py:101
msgid "exclude from ratings"
msgstr ""
-#: judge/models/contest.py:97
+#: judge/models/contest.py:103
msgid "private to specific users"
msgstr ""
-#: judge/models/contest.py:98
+#: judge/models/contest.py:104
msgid "private contestants"
msgstr ""
-#: judge/models/contest.py:99
+#: judge/models/contest.py:105
msgid "If private, only these users may see the contest"
msgstr ""
-#: judge/models/contest.py:101
+#: judge/models/contest.py:107
msgid "hide problem tags"
msgstr ""
-#: judge/models/contest.py:102
+#: judge/models/contest.py:108
msgid "Whether problem tags should be hidden by default."
msgstr ""
-#: judge/models/contest.py:104
+#: judge/models/contest.py:110
+msgid "hide problem authors"
+msgstr ""
+
+#: judge/models/contest.py:111
+msgid "Whether problem authors should be hidden by default."
+msgstr ""
+
+#: judge/models/contest.py:113
msgid "run pretests only"
msgstr ""
-#: judge/models/contest.py:105
+#: judge/models/contest.py:114
msgid "Whether judges should grade pretests only, versus all testcases. Commonly set during a contest, then unset prior to rejudging user submissions when the contest ends."
msgstr ""
-#: judge/models/contest.py:109 judge/models/problem.py:166
+#: judge/models/contest.py:118 judge/models/problem.py:183
msgid "private to organizations"
msgstr ""
-#: judge/models/contest.py:110 judge/models/problem.py:164
-#: judge/models/profile.py:83
+#: judge/models/contest.py:119 judge/models/problem.py:181
+#: judge/models/profile.py:86
msgid "organizations"
msgstr ""
-#: judge/models/contest.py:111
+#: judge/models/contest.py:120
msgid "If private, only these organizations may see the contest"
msgstr ""
-#: judge/models/contest.py:112 judge/models/problem.py:153
+#: judge/models/contest.py:121 judge/models/problem.py:167
msgid "OpenGraph image"
msgstr ""
-#: judge/models/contest.py:113 judge/models/profile.py:54
+#: judge/models/contest.py:122 judge/models/profile.py:57
msgid "Logo override image"
msgstr ""
-#: judge/models/contest.py:115
+#: judge/models/contest.py:124
msgid "This image will replace the default site logo for users inside the contest."
msgstr ""
-#: judge/models/contest.py:118
+#: judge/models/contest.py:127
msgid "the amount of live participants"
msgstr ""
-#: judge/models/contest.py:119
+#: judge/models/contest.py:128
msgid "contest summary"
msgstr ""
-#: judge/models/contest.py:120 judge/models/problem.py:155
+#: judge/models/contest.py:129 judge/models/problem.py:169
msgid "Plain-text, shown in meta description tag, e.g. for social media."
msgstr ""
-#: judge/models/contest.py:121 judge/models/profile.py:53
+#: judge/models/contest.py:130 judge/models/profile.py:56
msgid "access code"
msgstr ""
-#: judge/models/contest.py:122
+#: judge/models/contest.py:131
msgid "An optional code to prompt contestants before they are allowed to join the contest. Leave it blank to disable."
msgstr ""
-#: judge/models/contest.py:124 judge/models/problem.py:149
+#: judge/models/contest.py:133 judge/models/problem.py:163
msgid "personae non gratae"
msgstr ""
-#: judge/models/contest.py:125
+#: judge/models/contest.py:134
msgid "Bans the selected users from joining this contest."
msgstr ""
-#: judge/models/contest.py:126
+#: judge/models/contest.py:135
msgid "contest format"
msgstr ""
-#: judge/models/contest.py:127
+#: judge/models/contest.py:136
msgid "The contest format module to use."
msgstr ""
-#: judge/models/contest.py:128
+#: judge/models/contest.py:137
msgid "contest format configuration"
msgstr ""
-#: judge/models/contest.py:129
+#: judge/models/contest.py:138
msgid "A JSON object to serve as the configuration for the chosen contest format module. Leave empty to use None. Exact format depends on the contest format selected."
msgstr ""
-#: judge/models/contest.py:136
+#: judge/models/contest.py:145
msgid "contest lock"
msgstr ""
-#: judge/models/contest.py:137
-msgid "Prevent submissions from this contest from being rejudged."
+#: judge/models/contest.py:146
+msgid "Prevent submissions from this contest from being rejudged after this date."
msgstr ""
-#: judge/models/contest.py:138
+#: judge/models/contest.py:148
msgid "precision points"
msgstr ""
-#: judge/models/contest.py:140
+#: judge/models/contest.py:150
msgid "Number of digits to round points to."
msgstr ""
-#: judge/models/contest.py:362
+#: judge/models/contest.py:398
msgid "See private contests"
msgstr ""
-#: judge/models/contest.py:363
+#: judge/models/contest.py:399
msgid "Edit own contests"
msgstr ""
-#: judge/models/contest.py:364
+#: judge/models/contest.py:400
msgid "Edit all contests"
msgstr ""
-#: judge/models/contest.py:365
+#: judge/models/contest.py:401
msgid "Clone contest"
msgstr ""
-#: judge/models/contest.py:366 templates/contest/moss.html:74
+#: judge/models/contest.py:402 templates/contest/moss.html:74
msgid "MOSS contest"
msgstr ""
-#: judge/models/contest.py:367
+#: judge/models/contest.py:403
msgid "Rate contests"
msgstr ""
-#: judge/models/contest.py:368
+#: judge/models/contest.py:404
msgid "Contest access codes"
msgstr ""
-#: judge/models/contest.py:369
+#: judge/models/contest.py:405
msgid "Create private contests"
msgstr ""
-#: judge/models/contest.py:370
+#: judge/models/contest.py:406
msgid "Change contest visibility"
msgstr ""
-#: judge/models/contest.py:371
+#: judge/models/contest.py:407
msgid "Edit contest problem label script"
msgstr ""
-#: judge/models/contest.py:372
+#: judge/models/contest.py:408
msgid "Change lock status of contest"
msgstr ""
-#: judge/models/contest.py:374 judge/models/contest.py:472
-#: judge/models/contest.py:510 judge/models/contest.py:532
-#: judge/models/submission.py:84
+#: judge/models/contest.py:410 judge/models/contest.py:508
+#: judge/models/contest.py:547 judge/models/contest.py:569
+#: judge/models/submission.py:85
msgid "contest"
msgstr ""
-#: judge/models/contest.py:375
+#: judge/models/contest.py:411
msgid "contests"
msgstr ""
-#: judge/models/contest.py:382
+#: judge/models/contest.py:418
msgid "associated contest"
msgstr ""
-#: judge/models/contest.py:385
+#: judge/models/contest.py:421
msgid "score"
msgstr ""
-#: judge/models/contest.py:386
+#: judge/models/contest.py:422
msgid "cumulative time"
msgstr ""
-#: judge/models/contest.py:387
+#: judge/models/contest.py:423
msgid "is disqualified"
msgstr ""
-#: judge/models/contest.py:388
+#: judge/models/contest.py:424
msgid "Whether this participation is disqualified."
msgstr ""
-#: judge/models/contest.py:389
+#: judge/models/contest.py:425
msgid "tie-breaking field"
msgstr ""
-#: judge/models/contest.py:390
+#: judge/models/contest.py:426
msgid "virtual participation id"
msgstr ""
-#: judge/models/contest.py:391
+#: judge/models/contest.py:427
msgid "0 means non-virtual, otherwise the n-th virtual participation."
msgstr ""
-#: judge/models/contest.py:392
+#: judge/models/contest.py:428
msgid "contest format specific data"
msgstr ""
-#: judge/models/contest.py:458
+#: judge/models/contest.py:494
#, python-format
msgid "%s spectating in %s"
msgstr ""
-#: judge/models/contest.py:460
+#: judge/models/contest.py:496
#, python-format
msgid "%s in %s, v%d"
msgstr ""
-#: judge/models/contest.py:461
+#: judge/models/contest.py:497
#, python-format
msgid "%s in %s"
msgstr ""
-#: judge/models/contest.py:464
+#: judge/models/contest.py:500
msgid "contest participation"
msgstr ""
-#: judge/models/contest.py:465
+#: judge/models/contest.py:501
msgid "contest participations"
msgstr ""
-#: judge/models/contest.py:471 judge/models/contest.py:494
-#: judge/models/contest.py:533 judge/models/problem.py:430
-#: judge/models/problem.py:435 judge/models/problem.py:453
+#: judge/models/contest.py:507 judge/models/contest.py:531
+#: judge/models/contest.py:570 judge/models/problem.py:457
+#: judge/models/problem.py:462 judge/models/problem.py:480
#: judge/models/problem_data.py:35
msgid "problem"
msgstr ""
-#: judge/models/contest.py:473 judge/models/contest.py:498
-#: judge/models/problem.py:137
+#: judge/models/contest.py:509 judge/models/contest.py:535
+#: judge/models/problem.py:151
msgid "points"
msgstr ""
-#: judge/models/contest.py:474
+#: judge/models/contest.py:510
msgid "partial"
msgstr ""
-#: judge/models/contest.py:475 judge/models/contest.py:499
+#: judge/models/contest.py:511 judge/models/contest.py:536
msgid "is pretested"
msgstr ""
-#: judge/models/contest.py:476 judge/models/interface.py:43
+#: judge/models/contest.py:512 judge/models/interface.py:43
msgid "order"
msgstr ""
-#: judge/models/contest.py:477
+#: judge/models/contest.py:513
msgid "output prefix length override"
msgstr ""
-#: judge/models/contest.py:479
+#: judge/models/contest.py:515
msgid "Maximum number of submissions for this problem, or leave blank for no limit."
msgstr ""
-#: judge/models/contest.py:482
+#: judge/models/contest.py:518
msgid "Why include a problem you can't submit to?"
msgstr ""
-#: judge/models/contest.py:487
+#: judge/models/contest.py:523
msgid "contest problem"
msgstr ""
-#: judge/models/contest.py:488
+#: judge/models/contest.py:524
msgid "contest problems"
msgstr ""
-#: judge/models/contest.py:492 judge/models/submission.py:207
+#: judge/models/contest.py:529 judge/models/submission.py:218
msgid "submission"
msgstr ""
-#: judge/models/contest.py:496 judge/models/contest.py:511
+#: judge/models/contest.py:533 judge/models/contest.py:548
msgid "participation"
msgstr ""
-#: judge/models/contest.py:500
+#: judge/models/contest.py:537
msgid "Whether this submission was ran only on pretests."
msgstr ""
-#: judge/models/contest.py:504
+#: judge/models/contest.py:541
msgid "contest submission"
msgstr ""
-#: judge/models/contest.py:505
+#: judge/models/contest.py:542
msgid "contest submissions"
msgstr ""
-#: judge/models/contest.py:513
+#: judge/models/contest.py:550
msgid "rank"
msgstr ""
-#: judge/models/contest.py:514
+#: judge/models/contest.py:551
msgid "rating"
msgstr ""
-#: judge/models/contest.py:515
+#: judge/models/contest.py:552
msgid "volatility"
msgstr ""
-#: judge/models/contest.py:516
+#: judge/models/contest.py:553
msgid "last rated"
msgstr ""
-#: judge/models/contest.py:520
+#: judge/models/contest.py:557
msgid "contest rating"
msgstr ""
-#: judge/models/contest.py:521
+#: judge/models/contest.py:558
msgid "contest ratings"
msgstr ""
-#: judge/models/contest.py:540
+#: judge/models/contest.py:577
msgid "contest moss result"
msgstr ""
-#: judge/models/contest.py:541
+#: judge/models/contest.py:578
msgid "contest moss results"
msgstr ""
@@ -1203,7 +1220,7 @@ msgstr ""
msgid "post title"
msgstr ""
-#: judge/models/interface.py:67 judge/models/problem.py:473
+#: judge/models/interface.py:67 judge/models/problem.py:500
msgid "authors"
msgstr ""
@@ -1211,7 +1228,7 @@ msgstr ""
msgid "slug"
msgstr ""
-#: judge/models/interface.py:69 judge/models/problem.py:471
+#: judge/models/interface.py:69 judge/models/problem.py:498
msgid "public visibility"
msgstr ""
@@ -1247,34 +1264,6 @@ msgstr ""
msgid "blog posts"
msgstr ""
-#: judge/models/message.py:11
-msgid "message title"
-msgstr ""
-
-#: judge/models/message.py:12 judge/models/ticket.py:30
-msgid "message body"
-msgstr ""
-
-#: judge/models/message.py:13
-msgid "sender"
-msgstr ""
-
-#: judge/models/message.py:14
-msgid "target"
-msgstr ""
-
-#: judge/models/message.py:15
-msgid "message timestamp"
-msgstr ""
-
-#: judge/models/message.py:16
-msgid "read"
-msgstr ""
-
-#: judge/models/message.py:20
-msgid "messages in the thread"
-msgstr ""
-
#: judge/models/problem.py:30
#, python-format
msgid "Disallowed characters: %(value)s"
@@ -1292,7 +1281,7 @@ msgstr ""
msgid "problem type"
msgstr ""
-#: judge/models/problem.py:44 judge/models/problem.py:121
+#: judge/models/problem.py:44 judge/models/problem.py:135
msgid "problem types"
msgstr ""
@@ -1304,7 +1293,7 @@ msgstr ""
msgid "problem group name"
msgstr ""
-#: judge/models/problem.py:56 judge/models/problem.py:124
+#: judge/models/problem.py:56 judge/models/problem.py:138
msgid "problem group"
msgstr ""
@@ -1324,7 +1313,7 @@ msgstr ""
msgid "full name"
msgstr ""
-#: judge/models/problem.py:65 judge/models/profile.py:41
+#: judge/models/problem.py:65 judge/models/profile.py:44
#: judge/models/runtime.py:24
msgid "short name"
msgstr ""
@@ -1353,232 +1342,252 @@ msgstr ""
msgid "licenses"
msgstr ""
-#: judge/models/problem.py:104
+#: judge/models/problem.py:112
+msgid "Follow global setting"
+msgstr ""
+
+#: judge/models/problem.py:113
+msgid "Always visible"
+msgstr ""
+
+#: judge/models/problem.py:114
+msgid "Visible if problem solved"
+msgstr ""
+
+#: judge/models/problem.py:115
+msgid "Only own submissions"
+msgstr ""
+
+#: judge/models/problem.py:118
msgid "problem code"
msgstr ""
-#: judge/models/problem.py:106
+#: judge/models/problem.py:120
msgid "A short, unique code for the problem, used in the url after /problem/"
msgstr ""
-#: judge/models/problem.py:108
+#: judge/models/problem.py:122
msgid "problem name"
msgstr ""
-#: judge/models/problem.py:109
+#: judge/models/problem.py:123
msgid "The full name of the problem, as shown in the problem list."
msgstr ""
-#: judge/models/problem.py:111
+#: judge/models/problem.py:125
msgid "problem body"
msgstr ""
-#: judge/models/problem.py:112
+#: judge/models/problem.py:126
msgid "creators"
msgstr ""
-#: judge/models/problem.py:113
+#: judge/models/problem.py:127
msgid "These users will be able to edit the problem, and be listed as authors."
msgstr ""
-#: judge/models/problem.py:115
+#: judge/models/problem.py:129
msgid "curators"
msgstr ""
-#: judge/models/problem.py:116
+#: judge/models/problem.py:130
msgid "These users will be able to edit the problem, but not be listed as authors."
msgstr ""
-#: judge/models/problem.py:118
+#: judge/models/problem.py:132
msgid "testers"
msgstr ""
-#: judge/models/problem.py:120
+#: judge/models/problem.py:134
msgid "These users will be able to view the private problem, but not edit it."
msgstr ""
-#: judge/models/problem.py:122
+#: judge/models/problem.py:136
msgid "The type of problem, as shown on the problem's page."
msgstr ""
-#: judge/models/problem.py:125
+#: judge/models/problem.py:139
msgid "The group of problem, shown under Category in the problem list."
msgstr ""
-#: judge/models/problem.py:127
+#: judge/models/problem.py:141
msgid "The time limit for this problem, in seconds. Fractional seconds (e.g. 1.5) are supported."
msgstr ""
-#: judge/models/problem.py:131 judge/models/problem.py:458
+#: judge/models/problem.py:145 judge/models/problem.py:485
msgid "memory limit"
msgstr ""
-#: judge/models/problem.py:132
+#: judge/models/problem.py:146
msgid "The memory limit for this problem, in kilobytes (e.g. 64mb = 65536 kilobytes)."
msgstr ""
-#: judge/models/problem.py:138
+#: judge/models/problem.py:152
msgid "Points awarded for problem completion. Points are displayed with a 'p' suffix if partial."
msgstr ""
-#: judge/models/problem.py:141
+#: judge/models/problem.py:155
msgid "allows partial points"
msgstr ""
-#: judge/models/problem.py:142
+#: judge/models/problem.py:156
msgid "allowed languages"
msgstr ""
-#: judge/models/problem.py:143
+#: judge/models/problem.py:157
msgid "List of allowed submission languages."
msgstr ""
-#: judge/models/problem.py:145
+#: judge/models/problem.py:159
msgid "manually managed"
msgstr ""
-#: judge/models/problem.py:146
+#: judge/models/problem.py:160
msgid "Whether judges should be allowed to manage data or not."
msgstr ""
-#: judge/models/problem.py:147
+#: judge/models/problem.py:161
msgid "date of publishing"
msgstr ""
-#: judge/models/problem.py:148
+#: judge/models/problem.py:162
msgid "Doesn't have magic ability to auto-publish due to backward compatibility"
msgstr ""
-#: judge/models/problem.py:150
+#: judge/models/problem.py:164
msgid "Bans the selected users from submitting to this problem."
msgstr ""
-#: judge/models/problem.py:152
+#: judge/models/problem.py:166
msgid "The license under which this problem is published."
msgstr ""
-#: judge/models/problem.py:154
+#: judge/models/problem.py:168
msgid "problem summary"
msgstr ""
-#: judge/models/problem.py:156
+#: judge/models/problem.py:170
msgid "number of users"
msgstr ""
-#: judge/models/problem.py:157
+#: judge/models/problem.py:171
msgid "The number of users who solved the problem."
msgstr ""
-#: judge/models/problem.py:158
+#: judge/models/problem.py:172
msgid "solve rate"
msgstr ""
-#: judge/models/problem.py:159
+#: judge/models/problem.py:173
msgid "allow full markdown access"
msgstr ""
-#: judge/models/problem.py:165
+#: judge/models/problem.py:174
+msgid "submission source visibility"
+msgstr ""
+
+#: judge/models/problem.py:182
msgid "If private, only these organizations may see the problem."
msgstr ""
-#: judge/models/problem.py:420
+#: judge/models/problem.py:447
msgid "See hidden problems"
msgstr ""
-#: judge/models/problem.py:421
+#: judge/models/problem.py:448
msgid "Edit own problems"
msgstr ""
-#: judge/models/problem.py:422
+#: judge/models/problem.py:449
msgid "Edit all problems"
msgstr ""
-#: judge/models/problem.py:423
+#: judge/models/problem.py:450
msgid "Edit all public problems"
msgstr ""
-#: judge/models/problem.py:424
+#: judge/models/problem.py:451
msgid "Edit problems with full markup"
msgstr ""
-#: judge/models/problem.py:425 templates/problem/problem.html:161
+#: judge/models/problem.py:452 templates/problem/problem.html:161
msgid "Clone problem"
msgstr ""
-#: judge/models/problem.py:426
+#: judge/models/problem.py:453
msgid "Change is_public field"
msgstr ""
-#: judge/models/problem.py:427
+#: judge/models/problem.py:454
msgid "Change is_manually_managed field"
msgstr ""
-#: judge/models/problem.py:428
+#: judge/models/problem.py:455
msgid "See organization-private problems"
msgstr ""
-#: judge/models/problem.py:436 judge/models/problem.py:454
+#: judge/models/problem.py:463 judge/models/problem.py:481
#: judge/models/runtime.py:111
msgid "language"
msgstr ""
-#: judge/models/problem.py:437
+#: judge/models/problem.py:464
msgid "translated name"
msgstr ""
-#: judge/models/problem.py:438
+#: judge/models/problem.py:465
msgid "translated description"
msgstr ""
-#: judge/models/problem.py:442
+#: judge/models/problem.py:469
msgid "problem translation"
msgstr ""
-#: judge/models/problem.py:443
+#: judge/models/problem.py:470
msgid "problem translations"
msgstr ""
-#: judge/models/problem.py:447
+#: judge/models/problem.py:474
msgid "clarified problem"
msgstr ""
-#: judge/models/problem.py:448
+#: judge/models/problem.py:475
msgid "clarification body"
msgstr ""
-#: judge/models/problem.py:449
+#: judge/models/problem.py:476
msgid "clarification timestamp"
msgstr ""
-#: judge/models/problem.py:464
+#: judge/models/problem.py:491
msgid "language-specific resource limit"
msgstr ""
-#: judge/models/problem.py:465
+#: judge/models/problem.py:492
msgid "language-specific resource limits"
msgstr ""
-#: judge/models/problem.py:469
+#: judge/models/problem.py:496
msgid "associated problem"
msgstr ""
-#: judge/models/problem.py:472
+#: judge/models/problem.py:499
msgid "publish date"
msgstr ""
-#: judge/models/problem.py:474
+#: judge/models/problem.py:501
msgid "editorial content"
msgstr ""
-#: judge/models/problem.py:497
+#: judge/models/problem.py:524
msgid "See hidden solutions"
msgstr ""
-#: judge/models/problem.py:499
+#: judge/models/problem.py:526
msgid "solution"
msgstr ""
-#: judge/models/problem.py:500
+#: judge/models/problem.py:527
msgid "solutions"
msgstr ""
@@ -1690,112 +1699,112 @@ msgstr ""
msgid "case is pretest?"
msgstr ""
-#: judge/models/profile.py:38
+#: judge/models/profile.py:41
msgid "organization title"
msgstr ""
-#: judge/models/profile.py:39
+#: judge/models/profile.py:42
msgid "organization slug"
msgstr ""
-#: judge/models/profile.py:40
+#: judge/models/profile.py:43
msgid "Organization name shown in URL"
msgstr ""
-#: judge/models/profile.py:42
+#: judge/models/profile.py:45
msgid "Displayed beside user name during contests"
msgstr ""
-#: judge/models/profile.py:43
+#: judge/models/profile.py:46
msgid "organization description"
msgstr ""
-#: judge/models/profile.py:44
+#: judge/models/profile.py:47
msgid "administrators"
msgstr ""
-#: judge/models/profile.py:45
+#: judge/models/profile.py:48
msgid "Those who can edit this organization"
msgstr ""
-#: judge/models/profile.py:46
+#: judge/models/profile.py:49
msgid "creation date"
msgstr ""
-#: judge/models/profile.py:47
+#: judge/models/profile.py:50
msgid "is open organization?"
msgstr ""
-#: judge/models/profile.py:48
+#: judge/models/profile.py:51
msgid "Allow joining organization"
msgstr ""
-#: judge/models/profile.py:49
+#: judge/models/profile.py:52
msgid "maximum size"
msgstr ""
-#: judge/models/profile.py:50
+#: judge/models/profile.py:53
msgid "Maximum amount of users in this organization, only applicable to private organizations"
msgstr ""
-#: judge/models/profile.py:52
+#: judge/models/profile.py:55
msgid "Student access code"
msgstr ""
-#: judge/models/profile.py:56
+#: judge/models/profile.py:59
msgid "This image will replace the default site logo for users viewing the organization."
msgstr ""
-#: judge/models/profile.py:79
+#: judge/models/profile.py:82
msgid "Administer organizations"
msgstr ""
-#: judge/models/profile.py:80
+#: judge/models/profile.py:83
msgid "Edit all organizations"
msgstr ""
-#: judge/models/profile.py:82 judge/models/profile.py:99
-#: judge/models/profile.py:269
+#: judge/models/profile.py:85 judge/models/profile.py:102
+#: judge/models/profile.py:293
msgid "organization"
msgstr ""
-#: judge/models/profile.py:87
+#: judge/models/profile.py:90
msgid "user associated"
msgstr ""
-#: judge/models/profile.py:88
+#: judge/models/profile.py:91
msgid "self-description"
msgstr ""
-#: judge/models/profile.py:89
+#: judge/models/profile.py:92
msgid "location"
msgstr ""
-#: judge/models/profile.py:91
+#: judge/models/profile.py:94
msgid "preferred language"
msgstr ""
-#: judge/models/profile.py:97
+#: judge/models/profile.py:100
msgid "last access time"
msgstr ""
-#: judge/models/profile.py:98
+#: judge/models/profile.py:101
msgid "last IP"
msgstr ""
-#: judge/models/profile.py:101
+#: judge/models/profile.py:104
msgid "display rank"
msgstr ""
-#: judge/models/profile.py:103
+#: judge/models/profile.py:106
msgid "Normal User"
msgstr ""
-#: judge/models/profile.py:104
+#: judge/models/profile.py:107
msgid "Problem Setter"
msgstr ""
-#: judge/models/profile.py:105 templates/base.html:220
+#: judge/models/profile.py:108 templates/base.html:220
#: templates/comments/list.html:99 templates/contest/contest-list-tabs.html:24
#: templates/contest/ranking-table.html:49
#: templates/problem/problem-list-tabs.html:6
@@ -1804,155 +1813,167 @@ msgstr ""
msgid "Admin"
msgstr ""
-#: judge/models/profile.py:106
+#: judge/models/profile.py:109
msgid "comment mute"
msgstr ""
-#: judge/models/profile.py:106
+#: judge/models/profile.py:109
msgid "Some users are at their best when silent."
msgstr ""
-#: judge/models/profile.py:108
+#: judge/models/profile.py:111
msgid "unlisted user"
msgstr ""
-#: judge/models/profile.py:108
+#: judge/models/profile.py:111
msgid "User will not be ranked."
msgstr ""
-#: judge/models/profile.py:111
+#: judge/models/profile.py:114
msgid "user script"
msgstr ""
-#: judge/models/profile.py:112
+#: judge/models/profile.py:115
msgid "User-defined JavaScript for site customization."
msgstr ""
-#: judge/models/profile.py:113
+#: judge/models/profile.py:116
msgid "current contest"
msgstr ""
-#: judge/models/profile.py:115
+#: judge/models/profile.py:118
msgid "math engine"
msgstr ""
-#: judge/models/profile.py:117
+#: judge/models/profile.py:120
msgid "the rendering engine used to render math"
msgstr ""
-#: judge/models/profile.py:118
+#: judge/models/profile.py:121
msgid "TOTP 2FA enabled"
msgstr ""
-#: judge/models/profile.py:119
+#: judge/models/profile.py:122
msgid "check to enable TOTP-based two-factor authentication"
msgstr ""
-#: judge/models/profile.py:120
+#: judge/models/profile.py:123
msgid "WebAuthn 2FA enabled"
msgstr ""
-#: judge/models/profile.py:121
+#: judge/models/profile.py:124
msgid "check to enable WebAuthn-based two-factor authentication"
msgstr ""
-#: judge/models/profile.py:122
+#: judge/models/profile.py:125
msgid "TOTP key"
msgstr ""
-#: judge/models/profile.py:123
+#: judge/models/profile.py:126
msgid "32 character base32-encoded key for TOTP"
msgstr ""
-#: judge/models/profile.py:125
+#: judge/models/profile.py:128
msgid "TOTP key must be empty or base32"
msgstr ""
-#: judge/models/profile.py:126
+#: judge/models/profile.py:129
msgid "scratch codes"
msgstr ""
-#: judge/models/profile.py:127
+#: judge/models/profile.py:130
msgid "JSON array of 16 character base32-encoded codes for scratch codes"
msgstr ""
-#: judge/models/profile.py:131
+#: judge/models/profile.py:134
msgid "Scratch codes must be empty or a JSON array of 16-character base32 codes"
msgstr ""
-#: judge/models/profile.py:133
+#: judge/models/profile.py:136
+msgid "last TOTP timecode"
+msgstr ""
+
+#: judge/models/profile.py:137
msgid "API token"
msgstr ""
-#: judge/models/profile.py:134
+#: judge/models/profile.py:138
msgid "64 character hex-encoded API access token"
msgstr ""
-#: judge/models/profile.py:136
+#: judge/models/profile.py:140
msgid "API token must be None or hexadecimal"
msgstr ""
-#: judge/models/profile.py:137
+#: judge/models/profile.py:141
msgid "internal notes"
msgstr ""
-#: judge/models/profile.py:138
+#: judge/models/profile.py:142
msgid "Notes for administrators regarding this user."
msgstr ""
-#: judge/models/profile.py:139
+#: judge/models/profile.py:143
msgid "last data download time"
msgstr ""
-#: judge/models/profile.py:236
+#: judge/models/profile.py:253
msgid "Shows in-progress development stuff"
msgstr ""
-#: judge/models/profile.py:237
+#: judge/models/profile.py:254
msgid "Edit TOTP settings"
msgstr ""
-#: judge/models/profile.py:239
+#: judge/models/profile.py:256
msgid "user profile"
msgstr ""
-#: judge/models/profile.py:240
+#: judge/models/profile.py:257
msgid "user profiles"
msgstr ""
-#: judge/models/profile.py:246
+#: judge/models/profile.py:263
msgid "device name"
msgstr ""
-#: judge/models/profile.py:247
+#: judge/models/profile.py:264
msgid "credential ID"
msgstr ""
-#: judge/models/profile.py:248
+#: judge/models/profile.py:265
msgid "public key"
msgstr ""
-#: judge/models/profile.py:249
+#: judge/models/profile.py:266
msgid "sign counter"
msgstr ""
-#: judge/models/profile.py:271
+#: judge/models/profile.py:287
+msgid "WebAuthn credential"
+msgstr ""
+
+#: judge/models/profile.py:288
+msgid "WebAuthn credentials"
+msgstr ""
+
+#: judge/models/profile.py:295
msgid "request time"
msgstr ""
-#: judge/models/profile.py:272
+#: judge/models/profile.py:296
msgid "state"
msgstr ""
-#: judge/models/profile.py:277
+#: judge/models/profile.py:301
msgid "reason"
msgstr ""
-#: judge/models/profile.py:280
+#: judge/models/profile.py:304
msgid "organization join request"
msgstr ""
-#: judge/models/profile.py:281
+#: judge/models/profile.py:305
msgid "organization join requests"
msgstr ""
@@ -2108,210 +2129,210 @@ msgstr ""
msgid "judge"
msgstr ""
-#: judge/models/submission.py:20 judge/models/submission.py:47
+#: judge/models/submission.py:21 judge/models/submission.py:48
#: judge/utils/problems.py:74
msgid "Accepted"
msgstr ""
-#: judge/models/submission.py:21 judge/models/submission.py:48
+#: judge/models/submission.py:22 judge/models/submission.py:49
msgid "Wrong Answer"
msgstr ""
-#: judge/models/submission.py:22 judge/models/submission.py:50
+#: judge/models/submission.py:23 judge/models/submission.py:51
msgid "Time Limit Exceeded"
msgstr ""
-#: judge/models/submission.py:23 judge/models/submission.py:51
+#: judge/models/submission.py:24 judge/models/submission.py:52
msgid "Memory Limit Exceeded"
msgstr ""
-#: judge/models/submission.py:24 judge/models/submission.py:52
+#: judge/models/submission.py:25 judge/models/submission.py:53
msgid "Output Limit Exceeded"
msgstr ""
-#: judge/models/submission.py:25 judge/models/submission.py:53
+#: judge/models/submission.py:26 judge/models/submission.py:54
msgid "Invalid Return"
msgstr ""
-#: judge/models/submission.py:26 judge/models/submission.py:54
+#: judge/models/submission.py:27 judge/models/submission.py:55
msgid "Runtime Error"
msgstr ""
-#: judge/models/submission.py:27 judge/models/submission.py:41
-#: judge/models/submission.py:55 judge/utils/problems.py:76
+#: judge/models/submission.py:28 judge/models/submission.py:42
+#: judge/models/submission.py:56 judge/utils/problems.py:76
msgid "Compile Error"
msgstr ""
-#: judge/models/submission.py:28 judge/models/submission.py:40
+#: judge/models/submission.py:29 judge/models/submission.py:41
msgid "Internal Error"
msgstr ""
-#: judge/models/submission.py:29
+#: judge/models/submission.py:30
msgid "Short circuit"
msgstr ""
-#: judge/models/submission.py:30 judge/models/submission.py:42
-#: judge/models/submission.py:61
+#: judge/models/submission.py:31 judge/models/submission.py:43
+#: judge/models/submission.py:62
msgid "Aborted"
msgstr ""
-#: judge/models/submission.py:36 judge/models/submission.py:57
+#: judge/models/submission.py:37 judge/models/submission.py:58
msgid "Queued"
msgstr ""
-#: judge/models/submission.py:37 judge/models/submission.py:58
+#: judge/models/submission.py:38 judge/models/submission.py:59
msgid "Processing"
msgstr ""
-#: judge/models/submission.py:38 judge/models/submission.py:59
+#: judge/models/submission.py:39 judge/models/submission.py:60
msgid "Grading"
msgstr ""
-#: judge/models/submission.py:39 judge/models/submission.py:60
+#: judge/models/submission.py:40 judge/models/submission.py:61
msgid "Completed"
msgstr ""
-#: judge/models/submission.py:56
+#: judge/models/submission.py:57
msgid "Internal Error (judging server error)"
msgstr ""
-#: judge/models/submission.py:66
+#: judge/models/submission.py:67
msgid "submission time"
msgstr ""
-#: judge/models/submission.py:67 judge/models/submission.py:227
+#: judge/models/submission.py:68 judge/models/submission.py:238
msgid "execution time"
msgstr ""
-#: judge/models/submission.py:68 judge/models/submission.py:228
+#: judge/models/submission.py:69 judge/models/submission.py:239
msgid "memory usage"
msgstr ""
-#: judge/models/submission.py:69 judge/models/submission.py:229
+#: judge/models/submission.py:70 judge/models/submission.py:240
msgid "points granted"
msgstr ""
-#: judge/models/submission.py:70
+#: judge/models/submission.py:71
msgid "submission language"
msgstr ""
-#: judge/models/submission.py:71
+#: judge/models/submission.py:72
msgid "status"
msgstr ""
-#: judge/models/submission.py:72
+#: judge/models/submission.py:73
msgid "result"
msgstr ""
-#: judge/models/submission.py:74
+#: judge/models/submission.py:75
msgid "compile errors"
msgstr ""
-#: judge/models/submission.py:76
+#: judge/models/submission.py:77
msgid "batched cases"
msgstr ""
-#: judge/models/submission.py:77
+#: judge/models/submission.py:78
msgid "test case points"
msgstr ""
-#: judge/models/submission.py:78
+#: judge/models/submission.py:79
msgid "test case total points"
msgstr ""
-#: judge/models/submission.py:79
+#: judge/models/submission.py:80
msgid "judged on"
msgstr ""
-#: judge/models/submission.py:81
+#: judge/models/submission.py:82
msgid "submission judge time"
msgstr ""
-#: judge/models/submission.py:82
-msgid "was rejudged by admin"
+#: judge/models/submission.py:83
+msgid "last rejudge date by admin"
msgstr ""
-#: judge/models/submission.py:83
+#: judge/models/submission.py:84
msgid "was ran on pretests only"
msgstr ""
-#: judge/models/submission.py:86
-msgid "lock submission"
+#: judge/models/submission.py:87
+msgid "submission lock"
msgstr ""
-#: judge/models/submission.py:199
+#: judge/models/submission.py:210
msgid "Abort any submission"
msgstr ""
-#: judge/models/submission.py:200
+#: judge/models/submission.py:211
msgid "Rejudge the submission"
msgstr ""
-#: judge/models/submission.py:201
+#: judge/models/submission.py:212
msgid "Rejudge a lot of submissions"
msgstr ""
-#: judge/models/submission.py:202
+#: judge/models/submission.py:213
msgid "Submit without limit"
msgstr ""
-#: judge/models/submission.py:203
+#: judge/models/submission.py:214
msgid "View all submission"
msgstr ""
-#: judge/models/submission.py:204
+#: judge/models/submission.py:215
msgid "Resubmit others' submission"
msgstr ""
-#: judge/models/submission.py:205
+#: judge/models/submission.py:216
msgid "Change lock status of submission"
msgstr ""
-#: judge/models/submission.py:208 templates/contest/moss.html:58
+#: judge/models/submission.py:219 templates/contest/moss.html:58
msgid "submissions"
msgstr ""
-#: judge/models/submission.py:212 judge/models/submission.py:223
+#: judge/models/submission.py:223 judge/models/submission.py:234
msgid "associated submission"
msgstr ""
-#: judge/models/submission.py:214
+#: judge/models/submission.py:225
msgid "source code"
msgstr ""
-#: judge/models/submission.py:225
+#: judge/models/submission.py:236
msgid "test case ID"
msgstr ""
-#: judge/models/submission.py:226
+#: judge/models/submission.py:237
msgid "status flag"
msgstr ""
-#: judge/models/submission.py:230
+#: judge/models/submission.py:241
msgid "points possible"
msgstr ""
-#: judge/models/submission.py:231
+#: judge/models/submission.py:242
msgid "batch number"
msgstr ""
-#: judge/models/submission.py:232
+#: judge/models/submission.py:243
msgid "judging feedback"
msgstr ""
-#: judge/models/submission.py:233
+#: judge/models/submission.py:244
msgid "extended judging feedback"
msgstr ""
-#: judge/models/submission.py:234
+#: judge/models/submission.py:245
msgid "program output"
msgstr ""
-#: judge/models/submission.py:242
+#: judge/models/submission.py:253
msgid "submission test case"
msgstr ""
-#: judge/models/submission.py:243
+#: judge/models/submission.py:254
msgid "submission test cases"
msgstr ""
@@ -2359,6 +2380,10 @@ msgstr ""
msgid "poster"
msgstr ""
+#: judge/models/ticket.py:30
+msgid "message body"
+msgstr ""
+
#: judge/models/ticket.py:31
msgid "message time"
msgstr ""
@@ -2381,19 +2406,23 @@ msgstr ""
msgid "Running MOSS"
msgstr ""
-#: judge/tasks/submission.py:43
+#: judge/tasks/submission.py:45
msgid "Modifying submissions"
msgstr ""
-#: judge/tasks/submission.py:56
+#: judge/tasks/submission.py:58
msgid "Recalculating user points"
msgstr ""
-#: judge/tasks/user.py:50
+#: judge/tasks/user.py:49
+msgid "Applying filters"
+msgstr ""
+
+#: judge/tasks/user.py:64
msgid "Preparing your submission data"
msgstr ""
-#: judge/tasks/user.py:81
+#: judge/tasks/user.py:95
msgid "Preparing your comment data"
msgstr ""
@@ -2506,7 +2535,7 @@ msgstr ""
msgid "You already voted."
msgstr ""
-#: judge/views/comment.py:129 judge/views/organization.py:298
+#: judge/views/comment.py:129 judge/views/organization.py:297
msgid "Edited from site"
msgstr ""
@@ -2514,125 +2543,130 @@ msgstr ""
msgid "Editing comment"
msgstr ""
-#: judge/views/contests.py:56 judge/views/contests.py:201
-#: judge/views/contests.py:204 judge/views/contests.py:382
+#: judge/views/contests.py:57 judge/views/contests.py:210
+#: judge/views/contests.py:213 judge/views/contests.py:395
msgid "No such contest"
msgstr ""
-#: judge/views/contests.py:57 judge/views/contests.py:202
+#: judge/views/contests.py:58 judge/views/contests.py:211
#, python-format
msgid "Could not find a contest with the key \"%s\"."
msgstr ""
-#: judge/views/contests.py:70
+#: judge/views/contests.py:71
msgid "Contests"
msgstr ""
-#: judge/views/contests.py:205
+#: judge/views/contests.py:214
msgid "Could not find such contest."
msgstr ""
-#: judge/views/contests.py:208
+#: judge/views/contests.py:217
#, python-format
msgid "Access to contest \"%s\" denied"
msgstr ""
-#: judge/views/contests.py:235
+#: judge/views/contests.py:244
msgid "Clone Contest"
msgstr ""
-#: judge/views/contests.py:301
+#: judge/views/contests.py:278
+#, python-format
+msgid "Cloned contest from %s"
+msgstr ""
+
+#: judge/views/contests.py:314
msgid "Contest not ongoing"
msgstr ""
-#: judge/views/contests.py:302
+#: judge/views/contests.py:315
#, python-format
msgid "\"%s\" is not currently ongoing."
msgstr ""
-#: judge/views/contests.py:306
+#: judge/views/contests.py:319
msgid "Already in contest"
msgstr ""
-#: judge/views/contests.py:307
+#: judge/views/contests.py:320
#, python-format
msgid "You are already in a contest: \"%s\"."
msgstr ""
-#: judge/views/contests.py:310
+#: judge/views/contests.py:323
msgid "Banned from joining"
msgstr ""
-#: judge/views/contests.py:311
+#: judge/views/contests.py:324
msgid "You have been declared persona non grata for this contest. You are permanently barred from joining this contest."
msgstr ""
-#: judge/views/contests.py:372
+#: judge/views/contests.py:385
#, python-format
msgid "Enter access code for \"%s\""
msgstr ""
-#: judge/views/contests.py:383
+#: judge/views/contests.py:396
#, python-format
msgid "You are not in contest \"%s\"."
msgstr ""
-#: judge/views/contests.py:402
+#: judge/views/contests.py:415
msgid "ContestCalendar requires integer year and month"
msgstr ""
-#: judge/views/contests.py:442
+#: judge/views/contests.py:455
#, python-format
msgid "Contests in %(month)s"
msgstr ""
-#: judge/views/contests.py:442
+#: judge/views/contests.py:455
msgid "F Y"
msgstr ""
-#: judge/views/contests.py:489
+#: judge/views/contests.py:502
#, python-format
msgid "%s Statistics"
msgstr ""
-#: judge/views/contests.py:662
+#: judge/views/contests.py:675
#, python-format
msgid "%s Rankings"
msgstr ""
-#: judge/views/contests.py:670
+#: judge/views/contests.py:683
msgid "???"
msgstr ""
-#: judge/views/contests.py:686
+#: judge/views/contests.py:699
#, python-format
msgid "Your participation in %s"
msgstr ""
-#: judge/views/contests.py:687
+#: judge/views/contests.py:700
#, python-format
msgid "%s's participation in %s"
msgstr ""
-#: judge/views/contests.py:694
+#: judge/views/contests.py:707
msgid "Live"
msgstr ""
-#: judge/views/contests.py:706 templates/contest/contest-tabs.html:13
+#: judge/views/contests.py:719 templates/contest/contest-tabs.html:13
msgid "Participation"
msgstr ""
-#: judge/views/contests.py:750
+#: judge/views/contests.py:763
#, python-format
msgid "%s MOSS Results"
msgstr ""
-#: judge/views/contests.py:777
+#: judge/views/contests.py:790
#, python-format
msgid "Running MOSS for %s..."
msgstr ""
-#: judge/views/contests.py:800
+#: judge/views/contests.py:813
#, python-format
msgid "Contest tag: %s"
msgstr ""
@@ -2661,163 +2695,177 @@ msgstr ""
msgid "Runtimes"
msgstr ""
-#: judge/views/organization.py:44 judge/views/organization.py:47
+#: judge/views/organization.py:43 judge/views/organization.py:46
msgid "No such organization"
msgstr ""
-#: judge/views/organization.py:45
+#: judge/views/organization.py:44
#, python-format
msgid "Could not find an organization with the key \"%s\"."
msgstr ""
-#: judge/views/organization.py:48
+#: judge/views/organization.py:47
msgid "Could not find such organization."
msgstr ""
-#: judge/views/organization.py:72 judge/views/register.py:34
+#: judge/views/organization.py:71 judge/views/register.py:33
#: templates/organization/list.html:15 templates/user/user-list-tabs.html:5
msgid "Organizations"
msgstr ""
-#: judge/views/organization.py:93
+#: judge/views/organization.py:92
#, python-format
msgid "%s Members"
msgstr ""
-#: judge/views/organization.py:118 judge/views/organization.py:121
-#: judge/views/organization.py:126
+#: judge/views/organization.py:117 judge/views/organization.py:120
+#: judge/views/organization.py:125
msgid "Joining organization"
msgstr ""
-#: judge/views/organization.py:118
+#: judge/views/organization.py:117
msgid "You are already in the organization."
msgstr ""
-#: judge/views/organization.py:121
+#: judge/views/organization.py:120
msgid "This organization is not open."
msgstr ""
-#: judge/views/organization.py:138
+#: judge/views/organization.py:137
msgid "Leaving organization"
msgstr ""
-#: judge/views/organization.py:138
+#: judge/views/organization.py:137
#, python-format
msgid "You are not in \"%s\"."
msgstr ""
-#: judge/views/organization.py:162
+#: judge/views/organization.py:161
#, python-format
msgid "Request to join %s"
msgstr ""
-#: judge/views/organization.py:180
+#: judge/views/organization.py:179
msgid "Join request detail"
msgstr ""
-#: judge/views/organization.py:208
+#: judge/views/organization.py:207
#, python-format
msgid "Managing join requests for %s"
msgstr ""
-#: judge/views/organization.py:239
+#: judge/views/organization.py:238
#, python-format
msgid "Your organization can only receive %d more members. You cannot approve %d users."
msgstr ""
-#: judge/views/organization.py:251
+#: judge/views/organization.py:250
#, python-format
msgid "Approved %d user."
msgid_plural "Approved %d users."
msgstr[0] ""
msgstr[1] ""
-#: judge/views/organization.py:252
+#: judge/views/organization.py:251
#, python-format
msgid "Rejected %d user."
msgid_plural "Rejected %d users."
msgstr[0] ""
msgstr[1] ""
-#: judge/views/organization.py:282
+#: judge/views/organization.py:281
#, python-format
msgid "Editing %s"
msgstr ""
-#: judge/views/organization.py:306 judge/views/organization.py:314
+#: judge/views/organization.py:305 judge/views/organization.py:313
msgid "Can't edit organization"
msgstr ""
-#: judge/views/organization.py:307
+#: judge/views/organization.py:306
msgid "You are not allowed to edit this organization."
msgstr ""
-#: judge/views/organization.py:315
+#: judge/views/organization.py:314
msgid "You are not allowed to kick people from this organization."
msgstr ""
-#: judge/views/organization.py:320 judge/views/organization.py:324
+#: judge/views/organization.py:319 judge/views/organization.py:323
msgid "Can't kick user"
msgstr ""
-#: judge/views/organization.py:321
+#: judge/views/organization.py:320
msgid "The user you are trying to kick does not exist!"
msgstr ""
-#: judge/views/organization.py:325
+#: judge/views/organization.py:324
#, python-format
msgid "The user you are trying to kick is not in organization: %s."
msgstr ""
-#: judge/views/problem.py:67
+#: judge/views/problem.py:68
msgid "No such problem"
msgstr ""
-#: judge/views/problem.py:68
+#: judge/views/problem.py:69
#, python-format
msgid "Could not find a problem with the code \"%s\"."
msgstr ""
-#: judge/views/problem.py:110
+#: judge/views/problem.py:111
#, python-brace-format
msgid "Editorial for {0}"
msgstr ""
-#: judge/views/problem.py:113
+#: judge/views/problem.py:114
#, python-brace-format
msgid "Editorial for {0}"
msgstr ""
-#: judge/views/problem.py:283 templates/contest/contest.html:79
+#: judge/views/problem.py:133
+msgid "No such editorial"
+msgstr ""
+
+#: judge/views/problem.py:134
+#, python-format
+msgid "Could not find an editorial with the code \"%s\"."
+msgstr ""
+
+#: judge/views/problem.py:289 templates/contest/contest.html:79
#: templates/user/user-tabs.html:5 templates/user/users-table.html:23
msgid "Problems"
msgstr ""
-#: judge/views/problem.py:556 judge/views/problem.py:564
+#: judge/views/problem.py:562 judge/views/problem.py:570
#, python-format
msgid "Submit to %s"
msgstr ""
-#: judge/views/problem.py:613
+#: judge/views/problem.py:619
msgid "Banned from submitting"
msgstr ""
-#: judge/views/problem.py:614
+#: judge/views/problem.py:620
msgid "You have been declared persona non grata for this problem. You are permanently barred from submitting this problem."
msgstr ""
-#: judge/views/problem.py:618
+#: judge/views/problem.py:624
msgid "Too many submissions"
msgstr ""
-#: judge/views/problem.py:619
+#: judge/views/problem.py:625
msgid "You have exceeded the submission limit for this problem."
msgstr ""
-#: judge/views/problem.py:681
+#: judge/views/problem.py:693
msgid "Clone Problem"
msgstr ""
+#: judge/views/problem.py:720
+#, python-format
+msgid "Cloned problem from %s"
+msgstr ""
+
#: judge/views/problem_data.py:37
msgid "Checker arguments must be a JSON object"
msgstr ""
@@ -2887,52 +2935,52 @@ msgstr ""
msgid "Best solutions for {0}"
msgstr ""
-#: judge/views/ranked_submission.py:80
+#: judge/views/ranked_submission.py:82
#, python-format
msgid "Best solutions for %(problem)s in %(contest)s"
msgstr ""
-#: judge/views/ranked_submission.py:83
+#: judge/views/ranked_submission.py:85
#, python-format
msgid "Best solutions for problem %(number)s in %(contest)s"
msgstr ""
-#: judge/views/ranked_submission.py:89
+#: judge/views/ranked_submission.py:91
#, python-brace-format
msgid "Best solutions for {0} in {2}"
msgstr ""
-#: judge/views/ranked_submission.py:92
+#: judge/views/ranked_submission.py:94
#, python-brace-format
msgid "Best solutions for problem {0} in {1}"
msgstr ""
-#: judge/views/register.py:27
+#: judge/views/register.py:26
msgid "A username must contain letters, numbers, or underscores"
msgstr ""
-#: judge/views/register.py:31
+#: judge/views/register.py:30
msgid "Preferred language"
msgstr ""
-#: judge/views/register.py:38
+#: judge/views/register.py:37
msgid "Subscribe to newsletter?"
msgstr ""
-#: judge/views/register.py:45
+#: judge/views/register.py:44
#, python-format
msgid "The email address \"%s\" is already taken. Only one registration is allowed per address."
msgstr ""
-#: judge/views/register.py:51
+#: judge/views/register.py:50
msgid "Your email provider is not allowed due to history of abuse. Please use a reputable email provider."
msgstr ""
-#: judge/views/register.py:57 judge/views/register.py:95
+#: judge/views/register.py:56 judge/views/register.py:94
msgid "Registration"
msgstr ""
-#: judge/views/register.py:106
+#: judge/views/register.py:105
msgid "Authentication failure"
msgstr ""
@@ -2940,7 +2988,7 @@ msgstr ""
msgid "Language statistics"
msgstr ""
-#: judge/views/status.py:24 templates/submission/list.html:311
+#: judge/views/status.py:24 templates/submission/list.html:310
msgid "Status"
msgstr ""
@@ -2948,74 +2996,74 @@ msgstr ""
msgid "Version matrix"
msgstr ""
-#: judge/views/submission.py:53 judge/views/submission.py:60
+#: judge/views/submission.py:55 judge/views/submission.py:62
#, python-format
msgid "Submission of %(problem)s by %(user)s"
msgstr ""
-#: judge/views/submission.py:203 judge/views/submission.py:204
+#: judge/views/submission.py:205 judge/views/submission.py:206
#: templates/problem/problem.html:127
msgid "All submissions"
msgstr ""
-#: judge/views/submission.py:349
+#: judge/views/submission.py:355
msgid "All my submissions"
msgstr ""
-#: judge/views/submission.py:350
+#: judge/views/submission.py:356
#, python-format
msgid "All submissions by %s"
msgstr ""
-#: judge/views/submission.py:381
+#: judge/views/submission.py:387
#, python-format
msgid "All submissions for %s"
msgstr ""
-#: judge/views/submission.py:400
+#: judge/views/submission.py:410
msgid "Must pass a problem"
msgstr ""
-#: judge/views/submission.py:439
+#: judge/views/submission.py:449
#, python-format
msgid "My submissions for %(problem)s"
msgstr ""
-#: judge/views/submission.py:440
+#: judge/views/submission.py:450
#, python-format
msgid "%(user)s's submissions for %(problem)s"
msgstr ""
-#: judge/views/submission.py:536
+#: judge/views/submission.py:546
msgid "Must pass a contest"
msgstr ""
-#: judge/views/submission.py:544
+#: judge/views/submission.py:554
#, python-format
msgid "My submissions in %(contest)s"
msgstr ""
-#: judge/views/submission.py:545
+#: judge/views/submission.py:555
#, python-format
msgid "%(user)s's submissions in %(contest)s"
msgstr ""
-#: judge/views/submission.py:559
+#: judge/views/submission.py:569
#, python-brace-format
msgid "My submissions in {0}"
msgstr ""
-#: judge/views/submission.py:561
+#: judge/views/submission.py:571
#, python-brace-format
msgid "{0}'s submissions in {2}"
msgstr ""
-#: judge/views/submission.py:585
+#: judge/views/submission.py:597
#, python-brace-format
msgid "{0}'s submissions for {2} in {4}"
msgstr ""
-#: judge/views/submission.py:590
+#: judge/views/submission.py:602
#, python-brace-format
msgid "{0}'s submissions for problem {2} in {3}"
msgstr ""
@@ -3032,40 +3080,40 @@ msgstr ""
msgid "You must solve at least one problem before you can create a ticket."
msgstr ""
-#: judge/views/ticket.py:87 judge/views/ticket.py:90
+#: judge/views/ticket.py:91 judge/views/ticket.py:94
#, python-format
msgid "New ticket for %s"
msgstr ""
-#: judge/views/ticket.py:144
+#: judge/views/ticket.py:148
#, python-format
msgid "%(title)s - Ticket %(id)d"
msgstr ""
-#: judge/views/ticket.py:249
+#: judge/views/ticket.py:253
#, python-format
msgid "Tickets - Page %(number)d of %(total)d"
msgstr ""
-#: judge/views/ticket.py:298
+#: judge/views/ticket.py:302
#, python-format
msgid "New Ticket: %s"
msgstr ""
-#: judge/views/ticket.py:299
+#: judge/views/ticket.py:303
#, python-format
msgid "#%(id)d, assigned to: %(users)s"
msgstr ""
-#: judge/views/ticket.py:301
+#: judge/views/ticket.py:305
msgid ", "
msgstr ""
-#: judge/views/ticket.py:301
+#: judge/views/ticket.py:305
msgid "no one"
msgstr ""
-#: judge/views/ticket.py:321
+#: judge/views/ticket.py:325
#, python-format
msgid "New Ticket Message For: %s"
msgstr ""
@@ -3074,87 +3122,91 @@ msgstr ""
msgid "Enable Two-factor Authentication"
msgstr ""
-#: judge/views/two_factor.py:99
+#: judge/views/two_factor.py:108
+msgid "Refresh Two-factor Authentication"
+msgstr ""
+
+#: judge/views/two_factor.py:116
msgid "Disable Two-factor Authentication"
msgstr ""
-#: judge/views/two_factor.py:148
+#: judge/views/two_factor.py:165
msgid "Invalid WebAuthn response"
msgstr ""
-#: judge/views/two_factor.py:151
+#: judge/views/two_factor.py:168
msgid "Invalid name"
msgstr ""
-#: judge/views/two_factor.py:204
+#: judge/views/two_factor.py:221
msgid "Staff may not disable 2FA"
msgstr ""
-#: judge/views/two_factor.py:216
+#: judge/views/two_factor.py:229
msgid "Perform Two-factor Authentication"
msgstr ""
-#: judge/views/user.py:79
+#: judge/views/user.py:78
msgid "No such user"
msgstr ""
-#: judge/views/user.py:79
+#: judge/views/user.py:78
#, python-format
msgid "No user handle \"%s\"."
msgstr ""
-#: judge/views/user.py:83
+#: judge/views/user.py:82
msgid "My account"
msgstr ""
-#: judge/views/user.py:84
+#: judge/views/user.py:83
#, python-format
msgid "User %s"
msgstr ""
-#: judge/views/user.py:132
+#: judge/views/user.py:131
msgid "Login"
msgstr ""
-#: judge/views/user.py:173
+#: judge/views/user.py:172
msgid "M j, Y, G:i"
msgstr ""
-#: judge/views/user.py:307
+#: judge/views/user.py:306
msgid "Preparing your data..."
msgstr ""
-#: judge/views/user.py:311 templates/user/edit-profile.html:348
+#: judge/views/user.py:310 templates/user/edit-profile.html:352
msgid "Download your data"
msgstr ""
-#: judge/views/user.py:367
+#: judge/views/user.py:366
msgid "Updated on site"
msgstr ""
-#: judge/views/user.py:400 templates/admin/auth/user/change_form.html:14
+#: judge/views/user.py:399 templates/admin/auth/user/change_form.html:14
#: templates/admin/auth/user/change_form.html:17 templates/base.html:222
#: templates/user/user-tabs.html:16
msgid "Edit profile"
msgstr ""
-#: judge/views/user.py:415
+#: judge/views/user.py:414
msgid "Generated API token for user"
msgstr ""
-#: judge/views/user.py:427
+#: judge/views/user.py:426
msgid "Removed API token for user"
msgstr ""
-#: judge/views/user.py:437
+#: judge/views/user.py:436
msgid "Generated scratch codes for user"
msgstr ""
-#: judge/views/user.py:443 templates/user/user-list-tabs.html:4
+#: judge/views/user.py:442 templates/user/user-list-tabs.html:4
msgid "Leaderboard"
msgstr ""
-#: judge/views/user.py:504
+#: judge/views/user.py:503
msgid "You have been successfully logged out."
msgstr ""
@@ -3279,11 +3331,11 @@ msgstr ""
msgid "posted on {time}"
msgstr ""
-#: templates/blog/list.html:130 templates/problem/problem.html:309
+#: templates/blog/list.html:130 templates/problem/problem.html:311
msgid "Clarifications"
msgstr ""
-#: templates/blog/list.html:146 templates/problem/problem.html:320
+#: templates/blog/list.html:146 templates/problem/problem.html:322
msgid "No clarifications have been made at this time."
msgstr ""
@@ -3476,7 +3528,7 @@ msgid "Info"
msgstr ""
#: templates/contest/contest-tabs.html:6 templates/stats/base.html:9
-#: templates/submission/list.html:337
+#: templates/submission/list.html:336
msgid "Statistics"
msgstr ""
@@ -3679,19 +3731,19 @@ msgstr ""
msgid "Disqualify"
msgstr ""
-#: templates/contest/ranking.html:169
+#: templates/contest/ranking.html:173
msgid "Are you sure you want to disqualify this participation?"
msgstr ""
-#: templates/contest/ranking.html:174
+#: templates/contest/ranking.html:178
msgid "Are you sure you want to un-disqualify this participation?"
msgstr ""
-#: templates/contest/ranking.html:246
+#: templates/contest/ranking.html:250
msgid "View user participation"
msgstr ""
-#: templates/contest/ranking.html:250
+#: templates/contest/ranking.html:254
msgid "Show organizations"
msgstr ""
@@ -3966,7 +4018,7 @@ msgstr ""
msgid "Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence."
msgstr ""
-#: templates/problem/editorial.html:27 templates/problem/problem.html:209
+#: templates/problem/editorial.html:27 templates/problem/problem.html:210
msgid "Author:"
msgid_plural "Authors:"
msgstr[0] ""
@@ -4133,36 +4185,36 @@ msgstr ""
msgid "Memory limit:"
msgstr ""
-#: templates/problem/problem.html:224
+#: templates/problem/problem.html:226
msgid "Problem type"
msgid_plural "Problem types"
msgstr[0] ""
msgstr[1] ""
-#: templates/problem/problem.html:237
+#: templates/problem/problem.html:239
msgid "Allowed languages"
msgstr ""
-#: templates/problem/problem.html:245
+#: templates/problem/problem.html:247
#, python-format
msgid "No %(lang)s judge online"
msgstr ""
-#: templates/problem/problem.html:256
+#: templates/problem/problem.html:258
msgid "Judge:"
msgid_plural "Judges:"
msgstr[0] ""
msgstr[1] ""
-#: templates/problem/problem.html:273
+#: templates/problem/problem.html:275
msgid "none available"
msgstr ""
-#: templates/problem/problem.html:298
+#: templates/problem/problem.html:300
msgid "Request clarification"
msgstr ""
-#: templates/problem/problem.html:300
+#: templates/problem/problem.html:302
msgid "Report an issue"
msgstr ""
@@ -4207,7 +4259,7 @@ msgstr ""
msgid "Point range"
msgstr ""
-#: templates/problem/search-form.html:63 templates/submission/list.html:329
+#: templates/problem/search-form.html:63 templates/submission/list.html:328
#: templates/ticket/list.html:248
msgid "Go"
msgstr ""
@@ -4254,7 +4306,7 @@ msgid "Invalid username or password."
msgstr ""
#: templates/registration/login.html:53
-#: templates/registration/two_factor_auth.html:86
+#: templates/registration/two_factor_auth.html:92
msgid "Login!"
msgstr ""
@@ -4374,12 +4426,12 @@ msgid "Default language"
msgstr ""
#: templates/registration/registration_form.html:184
-#: templates/user/edit-profile.html:310
+#: templates/user/edit-profile.html:314
msgid "Affiliated organizations"
msgstr ""
#: templates/registration/registration_form.html:190
-#: templates/user/edit-profile.html:324
+#: templates/user/edit-profile.html:328
msgid "Notify me about upcoming contests"
msgstr ""
@@ -4395,57 +4447,93 @@ msgstr ""
msgid "Register!"
msgstr ""
-#: templates/registration/totp_disable.html:38
+#: templates/registration/totp_disable.html:31
msgid "To protect your account, you must first authenticate before you can disable Two Factor Authentication."
msgstr ""
-#: templates/registration/totp_disable.html:45
+#: templates/registration/totp_disable.html:38
msgid "Enter the 6-digit code generated by your app or one of your 16-digit scratch codes:"
msgstr ""
-#: templates/registration/totp_disable.html:48
+#: templates/registration/totp_disable.html:41
msgid "Disable Two Factor Authentication"
msgstr ""
-#: templates/registration/totp_enable.html:75
+#: templates/registration/totp_enable.html:72
msgid "Scan this code with your authenticator app:"
msgstr ""
-#: templates/registration/totp_enable.html:76
+#: templates/registration/totp_enable.html:73
msgid "QR code"
msgstr ""
-#: templates/registration/totp_enable.html:77
+#: templates/registration/totp_enable.html:74
msgid "Or enter this code manually:"
msgstr ""
-#: templates/registration/totp_enable.html:88
+#: templates/registration/totp_enable.html:85
msgid "Enter the 6-digit code generated by your app:"
msgstr ""
-#: templates/registration/totp_enable.html:91
+#: templates/registration/totp_enable.html:90
+msgid "Refresh Two Factor Authentication"
+msgstr ""
+
+#: templates/registration/totp_enable.html:92
msgid "Enable Two Factor Authentication"
msgstr ""
+#: templates/registration/totp_enable.html:98
+msgid "Below is a list of one-time use scratch codes."
+msgstr ""
+
+#: templates/registration/totp_enable.html:99
+msgid "These codes can only be used once and are for emergency use."
+msgstr ""
+
+#: templates/registration/totp_enable.html:100
+msgid "You can use these codes to login to your account or disable two-factor authentication."
+msgstr ""
+
+#: templates/registration/totp_enable.html:101
+msgid "If you ever need more scratch codes, you can regenerate them on the edit profile tab."
+msgstr ""
+
+#: templates/registration/totp_enable.html:102
+msgid "Please write these down and keep them in a secure location."
+msgstr ""
+
+#: templates/registration/totp_enable.html:103
+msgid "These codes will never be shown again after you enable two-factor authentication."
+msgstr ""
+
#: templates/registration/two_factor_auth.html:33
-#: templates/user/edit-profile.html:161
+#: templates/user/edit-profile.html:165
msgid "WebAuthn is not supported by your browser."
msgstr ""
#: templates/registration/two_factor_auth.html:54
-#: templates/user/edit-profile.html:185
+#: templates/user/edit-profile.html:189
msgid "Failed to contact server."
msgstr ""
-#: templates/registration/two_factor_auth.html:77
+#: templates/registration/two_factor_auth.html:79
msgid "Enter the 6-digit code generated by your app or one of your 16-character scratch codes:"
msgstr ""
-#: templates/registration/two_factor_auth.html:83
-msgid "Use security key"
+#: templates/registration/two_factor_auth.html:81
+msgid "Enter one of your 16-character scratch codes:"
msgstr ""
#: templates/registration/two_factor_auth.html:89
+msgid "Use security key"
+msgstr ""
+
+#: templates/registration/two_factor_auth.html:94
+msgid "Use scratch code"
+msgstr ""
+
+#: templates/registration/two_factor_auth.html:97
#, python-format
msgid "If you lost your authentication device and are unable to use your scratch codes, please contact us at %(email)s."
msgstr ""
@@ -4526,15 +4614,15 @@ msgstr ""
msgid "Filter by language..."
msgstr ""
-#: templates/submission/list.html:307
+#: templates/submission/list.html:306
msgid "Filter submissions"
msgstr ""
-#: templates/submission/list.html:343
+#: templates/submission/list.html:342
msgid "Total:"
msgstr ""
-#: templates/submission/list.html:353
+#: templates/submission/list.html:352
msgid "You were disconnected. Refresh to show latest updates."
msgstr ""
@@ -4750,121 +4838,125 @@ msgstr ""
msgid "Search by handle..."
msgstr ""
-#: templates/user/edit-profile.html:109
+#: templates/user/edit-profile.html:113
msgid "Are you sure you want to generate or regenerate your API token?"
msgstr ""
-#: templates/user/edit-profile.html:110
+#: templates/user/edit-profile.html:114
msgid "This will invalidate any previous API tokens."
msgstr ""
-#: templates/user/edit-profile.html:111
+#: templates/user/edit-profile.html:115
msgid "It also allows access to your account without Two-factor Authentication."
msgstr ""
-#: templates/user/edit-profile.html:112
+#: templates/user/edit-profile.html:116
msgid "You will not be able to view your api token after you leave this page!"
msgstr ""
-#: templates/user/edit-profile.html:113 templates/user/edit-profile.html:207
+#: templates/user/edit-profile.html:117 templates/user/edit-profile.html:211
msgid "Generating..."
msgstr ""
-#: templates/user/edit-profile.html:121 templates/user/edit-profile.html:243
-#: templates/user/edit-profile.html:371 templates/user/edit-profile.html:390
+#: templates/user/edit-profile.html:125 templates/user/edit-profile.html:247
+#: templates/user/edit-profile.html:373 templates/user/edit-profile.html:395
msgid "Regenerate"
msgstr ""
-#: templates/user/edit-profile.html:127 templates/user/edit-profile.html:392
+#: templates/user/edit-profile.html:131 templates/user/edit-profile.html:397
msgid "Remove"
msgstr ""
-#: templates/user/edit-profile.html:137
+#: templates/user/edit-profile.html:141
msgid "Are you sure you want to remove your API token?"
msgstr ""
-#: templates/user/edit-profile.html:144 templates/user/edit-profile.html:375
-#: templates/user/edit-profile.html:396
+#: templates/user/edit-profile.html:148 templates/user/edit-profile.html:377
+#: templates/user/edit-profile.html:401
msgid "Generate"
msgstr ""
-#: templates/user/edit-profile.html:190
+#: templates/user/edit-profile.html:194
msgid "Are you sure you want to delete this security key?"
msgstr ""
-#: templates/user/edit-profile.html:280
+#: templates/user/edit-profile.html:284
msgid "Self-description"
msgstr ""
-#: templates/user/edit-profile.html:287
+#: templates/user/edit-profile.html:291
msgid "Select your closest major city"
msgstr ""
-#: templates/user/edit-profile.html:296
+#: templates/user/edit-profile.html:300
msgid "Editor theme"
msgstr ""
-#: templates/user/edit-profile.html:301
+#: templates/user/edit-profile.html:305
msgid "Math engine"
msgstr ""
-#: templates/user/edit-profile.html:335 templates/user/edit-profile.html:337
+#: templates/user/edit-profile.html:339 templates/user/edit-profile.html:341
msgid "Change your avatar"
msgstr ""
-#: templates/user/edit-profile.html:342
+#: templates/user/edit-profile.html:346
msgid "Change your password"
msgstr ""
-#: templates/user/edit-profile.html:356
+#: templates/user/edit-profile.html:359
msgid "Two-factor Authentication is enabled"
msgstr ""
-#: templates/user/edit-profile.html:358
-msgid "Two-factor Authentication is disabled"
+#: templates/user/edit-profile.html:362 templates/user/edit-profile.html:365
+msgid "Disable"
msgstr ""
-#: templates/user/edit-profile.html:363 templates/user/edit-profile.html:365
-msgid "Disable"
+#: templates/user/edit-profile.html:367
+msgid "Refresh"
msgstr ""
-#: templates/user/edit-profile.html:368
+#: templates/user/edit-profile.html:370
msgid "Scratch Codes:"
msgstr ""
-#: templates/user/edit-profile.html:372 templates/user/edit-profile.html:393
+#: templates/user/edit-profile.html:374 templates/user/edit-profile.html:398
msgid "Hidden"
msgstr ""
-#: templates/user/edit-profile.html:381
+#: templates/user/edit-profile.html:384
+msgid "Two-factor Authentication is disabled"
+msgstr ""
+
+#: templates/user/edit-profile.html:385
msgid "Enable"
msgstr ""
-#: templates/user/edit-profile.html:387
+#: templates/user/edit-profile.html:392
msgid "API Token"
msgstr ""
-#: templates/user/edit-profile.html:404
+#: templates/user/edit-profile.html:409
msgid "Security keys"
msgstr ""
-#: templates/user/edit-profile.html:414
+#: templates/user/edit-profile.html:419
msgid "Delete"
msgstr ""
-#: templates/user/edit-profile.html:421
+#: templates/user/edit-profile.html:426
msgid "Enter a name for this key"
msgstr ""
-#: templates/user/edit-profile.html:422
+#: templates/user/edit-profile.html:427
msgid "Add"
msgstr ""
-#: templates/user/edit-profile.html:430
+#: templates/user/edit-profile.html:435
msgid "User-script"
msgstr ""
-#: templates/user/edit-profile.html:434
+#: templates/user/edit-profile.html:439
msgid "Update profile"
msgstr ""
diff --git a/locale/nl/LC_MESSAGES/djangojs.po b/locale/nl/LC_MESSAGES/djangojs.po
index 283df8e324..99aa987b88 100644
--- a/locale/nl/LC_MESSAGES/djangojs.po
+++ b/locale/nl/LC_MESSAGES/djangojs.po
@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: dmoj\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-10-01 23:12+0000\n"
-"PO-Revision-Date: 2021-04-25 00:08\n"
+"PO-Revision-Date: 2021-07-07 00:27\n"
"Last-Translator: \n"
"Language-Team: Dutch\n"
"Language: nl_NL\n"
diff --git a/locale/pl/LC_MESSAGES/django.po b/locale/pl/LC_MESSAGES/django.po
index ef9628dc53..d3a8e5305c 100644
--- a/locale/pl/LC_MESSAGES/django.po
+++ b/locale/pl/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: dmoj\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-24 19:15+0000\n"
-"PO-Revision-Date: 2021-04-25 00:08\n"
+"POT-Creation-Date: 2021-06-17 01:38+0000\n"
+"PO-Revision-Date: 2021-07-07 00:27\n"
"Last-Translator: \n"
"Language-Team: Polish\n"
"Language: pl_PL\n"
@@ -17,75 +17,75 @@ msgstr ""
"X-Crowdin-File: django.po\n"
"X-Crowdin-File-ID: 10\n"
-#: dmoj/settings.py:364
+#: dmoj/settings.py:365
msgid "Catalan"
msgstr "kataloński"
-#: dmoj/settings.py:365
+#: dmoj/settings.py:366
msgid "German"
msgstr "Niemiecki"
-#: dmoj/settings.py:366
+#: dmoj/settings.py:367
msgid "English"
msgstr "Angielski"
-#: dmoj/settings.py:367
+#: dmoj/settings.py:368
msgid "Spanish"
msgstr "Hiszpański"
-#: dmoj/settings.py:368
+#: dmoj/settings.py:369
msgid "French"
msgstr "Francuski"
-#: dmoj/settings.py:369
+#: dmoj/settings.py:370
msgid "Croatian"
msgstr "Chorwacki"
-#: dmoj/settings.py:370
+#: dmoj/settings.py:371
msgid "Hungarian"
msgstr "Węgierski"
-#: dmoj/settings.py:371
+#: dmoj/settings.py:372
msgid "Japanese"
msgstr "japoński"
-#: dmoj/settings.py:372
+#: dmoj/settings.py:373
msgid "Korean"
msgstr "Koreański"
-#: dmoj/settings.py:373
+#: dmoj/settings.py:374
msgid "Brazilian Portuguese"
msgstr ""
-#: dmoj/settings.py:374
+#: dmoj/settings.py:375
msgid "Romanian"
msgstr "Rumuński"
-#: dmoj/settings.py:375
+#: dmoj/settings.py:376
msgid "Russian"
msgstr "Rosyjski"
-#: dmoj/settings.py:376
+#: dmoj/settings.py:377
msgid "Serbian (Latin)"
msgstr "Serbski (alfabet łaciński)"
-#: dmoj/settings.py:377
+#: dmoj/settings.py:378
msgid "Turkish"
msgstr "Turecki"
-#: dmoj/settings.py:378
+#: dmoj/settings.py:379
msgid "Vietnamese"
msgstr "Wietnamski"
-#: dmoj/settings.py:379
+#: dmoj/settings.py:380
msgid "Simplified Chinese"
msgstr "Chiński Uproszczony"
-#: dmoj/settings.py:380
+#: dmoj/settings.py:381
msgid "Traditional Chinese"
msgstr "tradycyjny chiński"
-#: dmoj/urls.py:103 templates/base.html:190
+#: dmoj/urls.py:104 templates/base.html:190
msgid "Home"
msgstr "Strona główna"
@@ -119,46 +119,46 @@ msgstr "Pokaż komentarze"
msgid "Associated page"
msgstr "Dołączona strona"
-#: judge/admin/contest.py:31
+#: judge/admin/contest.py:32
msgid "Included contests"
msgstr "Załączniki"
-#: judge/admin/contest.py:65 templates/contest/contest.html:83
+#: judge/admin/contest.py:66 templates/contest/contest.html:83
#: templates/contest/moss.html:43 templates/problem/list.html:204
#: templates/problem/list.html:219 templates/user/user-problems.html:58
#: templates/user/user-problems.html:100
msgid "Problem"
msgstr "Problem"
-#: judge/admin/contest.py:114
+#: judge/admin/contest.py:117
msgid "Settings"
msgstr "Ustawienia"
-#: judge/admin/contest.py:116
+#: judge/admin/contest.py:120
msgid "Scheduling"
msgstr "Planowanie"
-#: judge/admin/contest.py:117
+#: judge/admin/contest.py:121
msgid "Details"
msgstr "Szczegóły"
-#: judge/admin/contest.py:118
+#: judge/admin/contest.py:122
msgid "Format"
msgstr "Format"
-#: judge/admin/contest.py:119 templates/contest/ranking-table.html:5
+#: judge/admin/contest.py:123 templates/contest/ranking-table.html:5
msgid "Rating"
msgstr "Ocena"
-#: judge/admin/contest.py:120
+#: judge/admin/contest.py:124
msgid "Access"
msgstr "Dostęp"
-#: judge/admin/contest.py:122 judge/admin/problem.py:134
+#: judge/admin/contest.py:126 judge/admin/problem.py:135
msgid "Justice"
msgstr ""
-#: judge/admin/contest.py:211
+#: judge/admin/contest.py:215
#, python-format
msgid "%d contest successfully marked as visible."
msgid_plural "%d contests successfully marked as visible."
@@ -167,11 +167,11 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-#: judge/admin/contest.py:214
+#: judge/admin/contest.py:218
msgid "Mark contests as visible"
msgstr ""
-#: judge/admin/contest.py:220
+#: judge/admin/contest.py:224
#, python-format
msgid "%d contest successfully marked as hidden."
msgid_plural "%d contests successfully marked as hidden."
@@ -180,11 +180,11 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-#: judge/admin/contest.py:223
+#: judge/admin/contest.py:227
msgid "Mark contests as hidden"
msgstr ""
-#: judge/admin/contest.py:229
+#: judge/admin/contest.py:233
#, python-format
msgid "%d contest successfully locked."
msgid_plural "%d contests successfully locked."
@@ -193,11 +193,11 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-#: judge/admin/contest.py:232
+#: judge/admin/contest.py:236
msgid "Lock contest submissions"
msgstr ""
-#: judge/admin/contest.py:238
+#: judge/admin/contest.py:242
#, python-format
msgid "%d contest successfully unlocked."
msgid_plural "%d contests successfully unlocked."
@@ -206,11 +206,11 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-#: judge/admin/contest.py:241
+#: judge/admin/contest.py:245
msgid "Unlock contest submissions"
msgstr ""
-#: judge/admin/contest.py:262 judge/admin/submission.py:170
+#: judge/admin/contest.py:266 judge/admin/submission.py:170
#, python-format
msgid "%d submission was successfully scheduled for rejudging."
msgid_plural "%d submissions were successfully scheduled for rejudging."
@@ -219,7 +219,7 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-#: judge/admin/contest.py:337
+#: judge/admin/contest.py:341
#, python-format
msgid "%d participation recalculated."
msgid_plural "%d participations recalculated."
@@ -228,15 +228,15 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-#: judge/admin/contest.py:340
+#: judge/admin/contest.py:344
msgid "Recalculate results"
msgstr ""
-#: judge/admin/contest.py:344 judge/admin/organization.py:63
+#: judge/admin/contest.py:348 judge/admin/organization.py:63
msgid "username"
msgstr "nazwa użytkownika"
-#: judge/admin/contest.py:349 templates/base.html:258
+#: judge/admin/contest.py:353 templates/base.html:258
msgid "virtual"
msgstr ""
@@ -252,9 +252,9 @@ msgstr "Zawartość"
msgid "Summary"
msgstr "Podsumowanie"
-#: judge/admin/interface.py:113 judge/models/contest.py:383
-#: judge/models/contest.py:509 judge/models/profile.py:244
-#: judge/models/profile.py:268
+#: judge/admin/interface.py:113 judge/models/contest.py:419
+#: judge/models/contest.py:546 judge/models/profile.py:261
+#: judge/models/profile.py:292
msgid "user"
msgstr "użytkownik"
@@ -262,8 +262,8 @@ msgstr "użytkownik"
msgid "object"
msgstr "obiekt"
-#: judge/admin/organization.py:32 judge/admin/problem.py:181
-#: judge/admin/profile.py:82
+#: judge/admin/organization.py:32 judge/admin/problem.py:182
+#: judge/admin/profile.py:92
msgid "View on site"
msgstr "Zobacz na stronie"
@@ -271,40 +271,40 @@ msgstr "Zobacz na stronie"
msgid "Describe the changes you made (optional)"
msgstr "Opisz wprowadzone zmiany (opcjonalne)"
-#: judge/admin/problem.py:129
+#: judge/admin/problem.py:130
msgid "Social Media"
msgstr "Media społecznościowe"
-#: judge/admin/problem.py:130
+#: judge/admin/problem.py:131
msgid "Taxonomy"
msgstr "Taksonomia"
-#: judge/admin/problem.py:131 templates/contest/contest.html:84
+#: judge/admin/problem.py:132 templates/contest/contest.html:84
#: templates/problem/data.html:385 templates/problem/list.html:209
#: templates/problem/list.html:230 templates/user/base-users-table.html:10
#: templates/user/user-problems.html:60
msgid "Points"
msgstr "Punkty"
-#: judge/admin/problem.py:132
+#: judge/admin/problem.py:133
msgid "Limits"
msgstr "Limity"
-#: judge/admin/problem.py:133 judge/admin/submission.py:238
-#: templates/stats/base.html:14 templates/submission/list.html:320
-#: templates/user/edit-profile.html:292
+#: judge/admin/problem.py:134 judge/admin/submission.py:238
+#: templates/stats/base.html:14 templates/submission/list.html:319
+#: templates/user/edit-profile.html:296
msgid "Language"
msgstr "Język"
-#: judge/admin/problem.py:135
+#: judge/admin/problem.py:136
msgid "History"
msgstr "Historia"
-#: judge/admin/problem.py:178
+#: judge/admin/problem.py:179
msgid "Authors"
msgstr "Autorzy"
-#: judge/admin/problem.py:191
+#: judge/admin/problem.py:192
#, python-format
msgid "%d problem's publish date successfully updated."
msgid_plural "%d problems' publish date successfully updated."
@@ -313,11 +313,11 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-#: judge/admin/problem.py:195
+#: judge/admin/problem.py:196
msgid "Set publish date to now"
msgstr "Ustaw datę publikacji"
-#: judge/admin/problem.py:201
+#: judge/admin/problem.py:202
#, python-format
msgid "%d problem successfully marked as public."
msgid_plural "%d problems successfully marked as public."
@@ -326,11 +326,11 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-#: judge/admin/problem.py:205
+#: judge/admin/problem.py:206
msgid "Mark problems as public"
msgstr "Oznacz problemy jako publiczne"
-#: judge/admin/problem.py:211
+#: judge/admin/problem.py:212
#, python-format
msgid "%d problem successfully marked as private."
msgid_plural "%d problems successfully marked as private."
@@ -339,7 +339,7 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-#: judge/admin/problem.py:215
+#: judge/admin/problem.py:216
msgid "Mark problems as private"
msgstr ""
@@ -347,28 +347,28 @@ msgstr ""
msgid "timezone"
msgstr "strefa czasowa"
-#: judge/admin/profile.py:88 judge/admin/submission.py:217
+#: judge/admin/profile.py:98 judge/admin/submission.py:217
#: templates/organization/requests/log.html:9
#: templates/organization/requests/pending.html:12
#: templates/ticket/list.html:261
msgid "User"
msgstr "Użytkownik"
-#: judge/admin/profile.py:93 templates/registration/registration_form.html:143
+#: judge/admin/profile.py:103 templates/registration/registration_form.html:143
msgid "Email"
msgstr "Adres e-mail"
-#: judge/admin/profile.py:98 judge/views/register.py:29
+#: judge/admin/profile.py:108 judge/views/register.py:28
#: templates/registration/registration_form.html:171
-#: templates/user/edit-profile.html:288
+#: templates/user/edit-profile.html:292
msgid "Timezone"
msgstr "Strefa czasowa"
-#: judge/admin/profile.py:103
+#: judge/admin/profile.py:113
msgid "date joined"
msgstr "data dołączenia"
-#: judge/admin/profile.py:110
+#: judge/admin/profile.py:120
#, python-format
msgid "%d user have scores recalculated."
msgid_plural "%d users have scores recalculated."
@@ -377,7 +377,7 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-#: judge/admin/profile.py:113
+#: judge/admin/profile.py:123
msgid "Recalculate scores"
msgstr "Przelicz punktację"
@@ -532,115 +532,116 @@ msgstr "IOI"
msgid "IOI (pre-2016)"
msgstr "IOI (przed 2016 r.)"
-#: judge/forms.py:26
-msgid "Two-factor authentication tokens must be 6 decimal digits."
-msgstr "Tokeny uwierzytelniania dwuskładnikowego muszą składać się z 6 cyfr dziesiętnych."
+#: judge/forms.py:27
+#, python-brace-format
+msgid "Two-factor authentication tokens must be {TOTP_CODE_LENGTH} decimal digits."
+msgstr ""
-#: judge/forms.py:29
+#: judge/forms.py:30
msgid "Invalid two-factor authentication token."
msgstr "Nieprawidłowy token uwierzytelniania dwuskładnikowego."
-#: judge/forms.py:32
+#: judge/forms.py:33
msgid "Scratch codes must be 16 base32 characters."
msgstr ""
-#: judge/forms.py:34
+#: judge/forms.py:35 judge/forms.py:264
msgid "Invalid scratch code."
msgstr ""
-#: judge/forms.py:45
+#: judge/forms.py:46
msgid "Subscribe to contest updates"
msgstr ""
-#: judge/forms.py:46
+#: judge/forms.py:47
msgid "Enable experimental features"
msgstr ""
-#: judge/forms.py:71
+#: judge/forms.py:72
msgid "You must solve at least one problem before you can update your profile."
msgstr ""
-#: judge/forms.py:80 judge/views/organization.py:127
+#: judge/forms.py:81 judge/views/organization.py:126
#, python-brace-format
msgid "You may not be part of more than {count} public organizations."
msgstr ""
-#: judge/forms.py:96
+#: judge/forms.py:97
msgid "Download comments?"
msgstr "Pobrać komentarze?"
-#: judge/forms.py:97
+#: judge/forms.py:98
msgid "Download submissions?"
msgstr ""
-#: judge/forms.py:98
+#: judge/forms.py:99
msgid "Filter by problem code glob:"
msgstr ""
-#: judge/forms.py:102
+#: judge/forms.py:103
msgid "Leave empty to include all submissions"
msgstr ""
-#: judge/forms.py:105 templates/problem/manage_submission.html:142
+#: judge/forms.py:106 templates/problem/manage_submission.html:142
msgid "Filter by result:"
msgstr ""
-#: judge/forms.py:111
+#: judge/forms.py:112
msgid "Please select at least one thing to download."
msgstr ""
-#: judge/forms.py:137
+#: judge/forms.py:138
msgid "Any judge"
msgstr "Każdy sędzia"
-#: judge/forms.py:167 judge/views/register.py:26
+#: judge/forms.py:159 judge/views/register.py:25
#: templates/registration/registration_form.html:137
#: templates/user/base-users-table.html:5
msgid "Username"
msgstr "Nazwa użytkownika"
-#: judge/forms.py:168 templates/registration/registration_form.html:149
+#: judge/forms.py:160 templates/registration/registration_form.html:149
#: templates/registration/registration_form.html:163
msgid "Password"
msgstr "Hasło"
-#: judge/forms.py:201
+#: judge/forms.py:192
msgid "Invalid code length."
msgstr "Nieprawidłowa długość kodu."
-#: judge/forms.py:219
+#: judge/forms.py:223
msgid "Invalid WebAuthn response."
msgstr ""
-#: judge/forms.py:222
+#: judge/forms.py:226
msgid "No WebAuthn challenge issued."
msgstr ""
-#: judge/forms.py:228
+#: judge/forms.py:232
msgid "Invalid WebAuthn credential ID."
msgstr ""
-#: judge/forms.py:257
+#: judge/forms.py:262
msgid "Invalid two-factor authentication token or scratch code."
msgstr ""
-#: judge/forms.py:259
+#: judge/forms.py:266
msgid "Must specify either totp_token or webauthn_response."
msgstr ""
-#: judge/forms.py:263 judge/models/problem.py:105
+#: judge/forms.py:270 judge/models/problem.py:119
msgid "Problem code must be ^[a-z0-9]+$"
msgstr ""
-#: judge/forms.py:268
+#: judge/forms.py:275
msgid "Problem with code already exists."
msgstr ""
-#: judge/forms.py:273 judge/models/contest.py:66
+#: judge/forms.py:280 judge/models/contest.py:66
msgid "Contest id must be ^[a-z0-9]+$"
msgstr ""
-#: judge/forms.py:278
+#: judge/forms.py:285
msgid "Contest with key already exists."
msgstr ""
@@ -720,7 +721,7 @@ msgid "comments"
msgstr "komentarze"
#: judge/models/comment.py:89 judge/models/comment.py:141
-#: judge/models/problem.py:484
+#: judge/models/problem.py:511
#, python-format
msgid "Editorial for %s"
msgstr ""
@@ -761,7 +762,7 @@ msgstr "opis tagu"
msgid "contest tag"
msgstr "tag konkursu"
-#: judge/models/contest.py:53 judge/models/contest.py:117
+#: judge/models/contest.py:53 judge/models/contest.py:126
msgid "contest tags"
msgstr "tagi konkursu"
@@ -786,410 +787,426 @@ msgid "contest name"
msgstr "nazwa konkursu"
#: judge/models/contest.py:68
-msgid "These people will be able to edit the contest."
-msgstr "Ci ludzie będą mogli edytować konkurs."
+msgid "These users will be able to edit the contest."
+msgstr ""
-#: judge/models/contest.py:70 judge/models/runtime.py:136
+#: judge/models/contest.py:70
+msgid "These users will be able to edit the contest, but will not be listed as authors."
+msgstr ""
+
+#: judge/models/contest.py:73
+msgid "These users will be able to view the contest, but not edit it."
+msgstr ""
+
+#: judge/models/contest.py:76 judge/models/runtime.py:136
msgid "description"
msgstr "opis"
-#: judge/models/contest.py:71 judge/models/problem.py:431
+#: judge/models/contest.py:77 judge/models/problem.py:458
#: judge/models/runtime.py:138
msgid "problems"
msgstr "problemy"
-#: judge/models/contest.py:72 judge/models/contest.py:384
+#: judge/models/contest.py:78 judge/models/contest.py:420
msgid "start time"
msgstr "Czas rozpoczęcia"
-#: judge/models/contest.py:73
+#: judge/models/contest.py:79
msgid "end time"
msgstr "Godzina zakończenia"
-#: judge/models/contest.py:74 judge/models/problem.py:126
-#: judge/models/problem.py:455
+#: judge/models/contest.py:80 judge/models/problem.py:140
+#: judge/models/problem.py:482
msgid "time limit"
msgstr "Limit czasowy"
-#: judge/models/contest.py:75 judge/models/problem.py:144
+#: judge/models/contest.py:81 judge/models/problem.py:158
msgid "publicly visible"
msgstr "publicznie widoczny"
-#: judge/models/contest.py:76
+#: judge/models/contest.py:82
msgid "Should be set even for organization-private contests, where it determines whether the contest is visible to members of the specified organizations."
msgstr ""
-#: judge/models/contest.py:79
+#: judge/models/contest.py:85
msgid "contest rated"
msgstr ""
-#: judge/models/contest.py:79
+#: judge/models/contest.py:85
msgid "Whether this contest can be rated."
msgstr ""
-#: judge/models/contest.py:81
+#: judge/models/contest.py:87
msgid "view contest scoreboard"
msgstr "zobacz tabelę wyników konkursu"
-#: judge/models/contest.py:83
+#: judge/models/contest.py:89
msgid "These users will be able to view the scoreboard."
msgstr ""
-#: judge/models/contest.py:84
+#: judge/models/contest.py:90
msgid "scoreboard visibility"
msgstr ""
-#: judge/models/contest.py:85
+#: judge/models/contest.py:91
msgid "Scoreboard visibility through the duration of the contest"
msgstr ""
-#: judge/models/contest.py:87
+#: judge/models/contest.py:93
msgid "no comments"
msgstr "brak komentarzy"
-#: judge/models/contest.py:88
+#: judge/models/contest.py:94
msgid "Use clarification system instead of comments."
msgstr ""
-#: judge/models/contest.py:90
+#: judge/models/contest.py:96
msgid "Rating floor for contest"
msgstr ""
-#: judge/models/contest.py:92
+#: judge/models/contest.py:98
msgid "Rating ceiling for contest"
msgstr ""
-#: judge/models/contest.py:94
+#: judge/models/contest.py:100
msgid "rate all"
msgstr "oceń wszystko"
-#: judge/models/contest.py:94
+#: judge/models/contest.py:100
msgid "Rate all users who joined."
msgstr ""
-#: judge/models/contest.py:95
+#: judge/models/contest.py:101
msgid "exclude from ratings"
msgstr ""
-#: judge/models/contest.py:97
+#: judge/models/contest.py:103
msgid "private to specific users"
msgstr ""
-#: judge/models/contest.py:98
+#: judge/models/contest.py:104
msgid "private contestants"
msgstr ""
-#: judge/models/contest.py:99
+#: judge/models/contest.py:105
msgid "If private, only these users may see the contest"
msgstr ""
-#: judge/models/contest.py:101
+#: judge/models/contest.py:107
msgid "hide problem tags"
msgstr "ukryj tagi problemu"
-#: judge/models/contest.py:102
+#: judge/models/contest.py:108
msgid "Whether problem tags should be hidden by default."
msgstr ""
-#: judge/models/contest.py:104
+#: judge/models/contest.py:110
+msgid "hide problem authors"
+msgstr ""
+
+#: judge/models/contest.py:111
+msgid "Whether problem authors should be hidden by default."
+msgstr ""
+
+#: judge/models/contest.py:113
msgid "run pretests only"
msgstr ""
-#: judge/models/contest.py:105
+#: judge/models/contest.py:114
msgid "Whether judges should grade pretests only, versus all testcases. Commonly set during a contest, then unset prior to rejudging user submissions when the contest ends."
msgstr ""
-#: judge/models/contest.py:109 judge/models/problem.py:166
+#: judge/models/contest.py:118 judge/models/problem.py:183
msgid "private to organizations"
msgstr ""
-#: judge/models/contest.py:110 judge/models/problem.py:164
-#: judge/models/profile.py:83
+#: judge/models/contest.py:119 judge/models/problem.py:181
+#: judge/models/profile.py:86
msgid "organizations"
msgstr ""
-#: judge/models/contest.py:111
+#: judge/models/contest.py:120
msgid "If private, only these organizations may see the contest"
msgstr ""
-#: judge/models/contest.py:112 judge/models/problem.py:153
+#: judge/models/contest.py:121 judge/models/problem.py:167
msgid "OpenGraph image"
msgstr ""
-#: judge/models/contest.py:113 judge/models/profile.py:54
+#: judge/models/contest.py:122 judge/models/profile.py:57
msgid "Logo override image"
msgstr ""
-#: judge/models/contest.py:115
+#: judge/models/contest.py:124
msgid "This image will replace the default site logo for users inside the contest."
msgstr ""
-#: judge/models/contest.py:118
+#: judge/models/contest.py:127
msgid "the amount of live participants"
msgstr ""
-#: judge/models/contest.py:119
+#: judge/models/contest.py:128
msgid "contest summary"
msgstr "podsumowanie konkursu"
-#: judge/models/contest.py:120 judge/models/problem.py:155
+#: judge/models/contest.py:129 judge/models/problem.py:169
msgid "Plain-text, shown in meta description tag, e.g. for social media."
msgstr ""
-#: judge/models/contest.py:121 judge/models/profile.py:53
+#: judge/models/contest.py:130 judge/models/profile.py:56
msgid "access code"
msgstr "kod dostępu"
-#: judge/models/contest.py:122
+#: judge/models/contest.py:131
msgid "An optional code to prompt contestants before they are allowed to join the contest. Leave it blank to disable."
msgstr ""
-#: judge/models/contest.py:124 judge/models/problem.py:149
+#: judge/models/contest.py:133 judge/models/problem.py:163
msgid "personae non gratae"
msgstr ""
-#: judge/models/contest.py:125
+#: judge/models/contest.py:134
msgid "Bans the selected users from joining this contest."
msgstr ""
-#: judge/models/contest.py:126
+#: judge/models/contest.py:135
msgid "contest format"
msgstr "format konkursu"
-#: judge/models/contest.py:127
+#: judge/models/contest.py:136
msgid "The contest format module to use."
msgstr ""
-#: judge/models/contest.py:128
+#: judge/models/contest.py:137
msgid "contest format configuration"
msgstr ""
-#: judge/models/contest.py:129
+#: judge/models/contest.py:138
msgid "A JSON object to serve as the configuration for the chosen contest format module. Leave empty to use None. Exact format depends on the contest format selected."
msgstr ""
-#: judge/models/contest.py:136
+#: judge/models/contest.py:145
msgid "contest lock"
msgstr ""
-#: judge/models/contest.py:137
-msgid "Prevent submissions from this contest from being rejudged."
+#: judge/models/contest.py:146
+msgid "Prevent submissions from this contest from being rejudged after this date."
msgstr ""
-#: judge/models/contest.py:138
+#: judge/models/contest.py:148
msgid "precision points"
msgstr ""
-#: judge/models/contest.py:140
+#: judge/models/contest.py:150
msgid "Number of digits to round points to."
msgstr ""
-#: judge/models/contest.py:362
+#: judge/models/contest.py:398
msgid "See private contests"
msgstr ""
-#: judge/models/contest.py:363
+#: judge/models/contest.py:399
msgid "Edit own contests"
msgstr ""
-#: judge/models/contest.py:364
+#: judge/models/contest.py:400
msgid "Edit all contests"
msgstr ""
-#: judge/models/contest.py:365
+#: judge/models/contest.py:401
msgid "Clone contest"
msgstr ""
-#: judge/models/contest.py:366 templates/contest/moss.html:74
+#: judge/models/contest.py:402 templates/contest/moss.html:74
msgid "MOSS contest"
msgstr ""
-#: judge/models/contest.py:367
+#: judge/models/contest.py:403
msgid "Rate contests"
msgstr ""
-#: judge/models/contest.py:368
+#: judge/models/contest.py:404
msgid "Contest access codes"
msgstr ""
-#: judge/models/contest.py:369
+#: judge/models/contest.py:405
msgid "Create private contests"
msgstr ""
-#: judge/models/contest.py:370
+#: judge/models/contest.py:406
msgid "Change contest visibility"
msgstr ""
-#: judge/models/contest.py:371
+#: judge/models/contest.py:407
msgid "Edit contest problem label script"
msgstr ""
-#: judge/models/contest.py:372
+#: judge/models/contest.py:408
msgid "Change lock status of contest"
msgstr ""
-#: judge/models/contest.py:374 judge/models/contest.py:472
-#: judge/models/contest.py:510 judge/models/contest.py:532
-#: judge/models/submission.py:84
+#: judge/models/contest.py:410 judge/models/contest.py:508
+#: judge/models/contest.py:547 judge/models/contest.py:569
+#: judge/models/submission.py:85
msgid "contest"
msgstr "konkurs"
-#: judge/models/contest.py:375
+#: judge/models/contest.py:411
msgid "contests"
msgstr "konkursy"
-#: judge/models/contest.py:382
+#: judge/models/contest.py:418
msgid "associated contest"
msgstr ""
-#: judge/models/contest.py:385
+#: judge/models/contest.py:421
msgid "score"
msgstr "wynik"
-#: judge/models/contest.py:386
+#: judge/models/contest.py:422
msgid "cumulative time"
msgstr ""
-#: judge/models/contest.py:387
+#: judge/models/contest.py:423
msgid "is disqualified"
msgstr ""
-#: judge/models/contest.py:388
+#: judge/models/contest.py:424
msgid "Whether this participation is disqualified."
msgstr ""
-#: judge/models/contest.py:389
+#: judge/models/contest.py:425
msgid "tie-breaking field"
msgstr ""
-#: judge/models/contest.py:390
+#: judge/models/contest.py:426
msgid "virtual participation id"
msgstr ""
-#: judge/models/contest.py:391
+#: judge/models/contest.py:427
msgid "0 means non-virtual, otherwise the n-th virtual participation."
msgstr ""
-#: judge/models/contest.py:392
+#: judge/models/contest.py:428
msgid "contest format specific data"
msgstr ""
-#: judge/models/contest.py:458
+#: judge/models/contest.py:494
#, python-format
msgid "%s spectating in %s"
msgstr ""
-#: judge/models/contest.py:460
+#: judge/models/contest.py:496
#, python-format
msgid "%s in %s, v%d"
msgstr ""
-#: judge/models/contest.py:461
+#: judge/models/contest.py:497
#, python-format
msgid "%s in %s"
msgstr ""
-#: judge/models/contest.py:464
+#: judge/models/contest.py:500
msgid "contest participation"
msgstr ""
-#: judge/models/contest.py:465
+#: judge/models/contest.py:501
msgid "contest participations"
msgstr ""
-#: judge/models/contest.py:471 judge/models/contest.py:494
-#: judge/models/contest.py:533 judge/models/problem.py:430
-#: judge/models/problem.py:435 judge/models/problem.py:453
+#: judge/models/contest.py:507 judge/models/contest.py:531
+#: judge/models/contest.py:570 judge/models/problem.py:457
+#: judge/models/problem.py:462 judge/models/problem.py:480
#: judge/models/problem_data.py:35
msgid "problem"
msgstr "problem"
-#: judge/models/contest.py:473 judge/models/contest.py:498
-#: judge/models/problem.py:137
+#: judge/models/contest.py:509 judge/models/contest.py:535
+#: judge/models/problem.py:151
msgid "points"
msgstr "punkty"
-#: judge/models/contest.py:474
+#: judge/models/contest.py:510
msgid "partial"
msgstr "częściowe"
-#: judge/models/contest.py:475 judge/models/contest.py:499
+#: judge/models/contest.py:511 judge/models/contest.py:536
msgid "is pretested"
msgstr ""
-#: judge/models/contest.py:476 judge/models/interface.py:43
+#: judge/models/contest.py:512 judge/models/interface.py:43
msgid "order"
msgstr ""
-#: judge/models/contest.py:477
+#: judge/models/contest.py:513
msgid "output prefix length override"
msgstr ""
-#: judge/models/contest.py:479
+#: judge/models/contest.py:515
msgid "Maximum number of submissions for this problem, or leave blank for no limit."
msgstr ""
-#: judge/models/contest.py:482
+#: judge/models/contest.py:518
msgid "Why include a problem you can't submit to?"
msgstr ""
-#: judge/models/contest.py:487
+#: judge/models/contest.py:523
msgid "contest problem"
msgstr ""
-#: judge/models/contest.py:488
+#: judge/models/contest.py:524
msgid "contest problems"
msgstr ""
-#: judge/models/contest.py:492 judge/models/submission.py:207
+#: judge/models/contest.py:529 judge/models/submission.py:218
msgid "submission"
msgstr "zgłoszenie"
-#: judge/models/contest.py:496 judge/models/contest.py:511
+#: judge/models/contest.py:533 judge/models/contest.py:548
msgid "participation"
msgstr ""
-#: judge/models/contest.py:500
+#: judge/models/contest.py:537
msgid "Whether this submission was ran only on pretests."
msgstr ""
-#: judge/models/contest.py:504
+#: judge/models/contest.py:541
msgid "contest submission"
msgstr ""
-#: judge/models/contest.py:505
+#: judge/models/contest.py:542
msgid "contest submissions"
msgstr ""
-#: judge/models/contest.py:513
+#: judge/models/contest.py:550
msgid "rank"
msgstr ""
-#: judge/models/contest.py:514
+#: judge/models/contest.py:551
msgid "rating"
msgstr "ocena"
-#: judge/models/contest.py:515
+#: judge/models/contest.py:552
msgid "volatility"
msgstr ""
-#: judge/models/contest.py:516
+#: judge/models/contest.py:553
msgid "last rated"
msgstr ""
-#: judge/models/contest.py:520
+#: judge/models/contest.py:557
msgid "contest rating"
msgstr ""
-#: judge/models/contest.py:521
+#: judge/models/contest.py:558
msgid "contest ratings"
msgstr ""
-#: judge/models/contest.py:540
+#: judge/models/contest.py:577
msgid "contest moss result"
msgstr ""
-#: judge/models/contest.py:541
+#: judge/models/contest.py:578
msgid "contest moss results"
msgstr ""
@@ -1229,7 +1246,7 @@ msgstr ""
msgid "post title"
msgstr ""
-#: judge/models/interface.py:67 judge/models/problem.py:473
+#: judge/models/interface.py:67 judge/models/problem.py:500
msgid "authors"
msgstr "autorzy"
@@ -1237,7 +1254,7 @@ msgstr "autorzy"
msgid "slug"
msgstr ""
-#: judge/models/interface.py:69 judge/models/problem.py:471
+#: judge/models/interface.py:69 judge/models/problem.py:498
msgid "public visibility"
msgstr ""
@@ -1273,34 +1290,6 @@ msgstr ""
msgid "blog posts"
msgstr ""
-#: judge/models/message.py:11
-msgid "message title"
-msgstr ""
-
-#: judge/models/message.py:12 judge/models/ticket.py:30
-msgid "message body"
-msgstr "treść wiadomości"
-
-#: judge/models/message.py:13
-msgid "sender"
-msgstr "nadawca"
-
-#: judge/models/message.py:14
-msgid "target"
-msgstr "odbiorca"
-
-#: judge/models/message.py:15
-msgid "message timestamp"
-msgstr ""
-
-#: judge/models/message.py:16
-msgid "read"
-msgstr "przeczytano"
-
-#: judge/models/message.py:20
-msgid "messages in the thread"
-msgstr "wiadomości w wątku"
-
#: judge/models/problem.py:30
#, python-format
msgid "Disallowed characters: %(value)s"
@@ -1318,7 +1307,7 @@ msgstr ""
msgid "problem type"
msgstr ""
-#: judge/models/problem.py:44 judge/models/problem.py:121
+#: judge/models/problem.py:44 judge/models/problem.py:135
msgid "problem types"
msgstr ""
@@ -1330,7 +1319,7 @@ msgstr ""
msgid "problem group name"
msgstr ""
-#: judge/models/problem.py:56 judge/models/problem.py:124
+#: judge/models/problem.py:56 judge/models/problem.py:138
msgid "problem group"
msgstr ""
@@ -1350,7 +1339,7 @@ msgstr "link"
msgid "full name"
msgstr "pełna nazwa"
-#: judge/models/problem.py:65 judge/models/profile.py:41
+#: judge/models/problem.py:65 judge/models/profile.py:44
#: judge/models/runtime.py:24
msgid "short name"
msgstr "krótka nazwa"
@@ -1379,232 +1368,252 @@ msgstr "licencja"
msgid "licenses"
msgstr "licencje"
-#: judge/models/problem.py:104
+#: judge/models/problem.py:112
+msgid "Follow global setting"
+msgstr ""
+
+#: judge/models/problem.py:113
+msgid "Always visible"
+msgstr ""
+
+#: judge/models/problem.py:114
+msgid "Visible if problem solved"
+msgstr ""
+
+#: judge/models/problem.py:115
+msgid "Only own submissions"
+msgstr ""
+
+#: judge/models/problem.py:118
msgid "problem code"
msgstr "kod problemu"
-#: judge/models/problem.py:106
+#: judge/models/problem.py:120
msgid "A short, unique code for the problem, used in the url after /problem/"
msgstr "Krótki, unikalny kod problemu, używany w adresie url po /problem/"
-#: judge/models/problem.py:108
+#: judge/models/problem.py:122
msgid "problem name"
msgstr "nazwa problemu"
-#: judge/models/problem.py:109
+#: judge/models/problem.py:123
msgid "The full name of the problem, as shown in the problem list."
msgstr "Pełna nazwa problemu, pokazywana na liście problemów."
-#: judge/models/problem.py:111
+#: judge/models/problem.py:125
msgid "problem body"
msgstr "treść problemu"
-#: judge/models/problem.py:112
+#: judge/models/problem.py:126
msgid "creators"
msgstr "twórcy"
-#: judge/models/problem.py:113
+#: judge/models/problem.py:127
msgid "These users will be able to edit the problem, and be listed as authors."
msgstr ""
-#: judge/models/problem.py:115
+#: judge/models/problem.py:129
msgid "curators"
msgstr ""
-#: judge/models/problem.py:116
+#: judge/models/problem.py:130
msgid "These users will be able to edit the problem, but not be listed as authors."
msgstr ""
-#: judge/models/problem.py:118
+#: judge/models/problem.py:132
msgid "testers"
msgstr "testerzy"
-#: judge/models/problem.py:120
+#: judge/models/problem.py:134
msgid "These users will be able to view the private problem, but not edit it."
msgstr ""
-#: judge/models/problem.py:122
+#: judge/models/problem.py:136
msgid "The type of problem, as shown on the problem's page."
msgstr ""
-#: judge/models/problem.py:125
+#: judge/models/problem.py:139
msgid "The group of problem, shown under Category in the problem list."
msgstr ""
-#: judge/models/problem.py:127
+#: judge/models/problem.py:141
msgid "The time limit for this problem, in seconds. Fractional seconds (e.g. 1.5) are supported."
msgstr ""
-#: judge/models/problem.py:131 judge/models/problem.py:458
+#: judge/models/problem.py:145 judge/models/problem.py:485
msgid "memory limit"
msgstr "limit pamięci"
-#: judge/models/problem.py:132
+#: judge/models/problem.py:146
msgid "The memory limit for this problem, in kilobytes (e.g. 64mb = 65536 kilobytes)."
msgstr ""
-#: judge/models/problem.py:138
+#: judge/models/problem.py:152
msgid "Points awarded for problem completion. Points are displayed with a 'p' suffix if partial."
msgstr ""
-#: judge/models/problem.py:141
+#: judge/models/problem.py:155
msgid "allows partial points"
msgstr ""
-#: judge/models/problem.py:142
+#: judge/models/problem.py:156
msgid "allowed languages"
msgstr "dozwolone języki"
-#: judge/models/problem.py:143
+#: judge/models/problem.py:157
msgid "List of allowed submission languages."
msgstr ""
-#: judge/models/problem.py:145
+#: judge/models/problem.py:159
msgid "manually managed"
msgstr ""
-#: judge/models/problem.py:146
+#: judge/models/problem.py:160
msgid "Whether judges should be allowed to manage data or not."
msgstr ""
-#: judge/models/problem.py:147
+#: judge/models/problem.py:161
msgid "date of publishing"
msgstr ""
-#: judge/models/problem.py:148
+#: judge/models/problem.py:162
msgid "Doesn't have magic ability to auto-publish due to backward compatibility"
msgstr ""
-#: judge/models/problem.py:150
+#: judge/models/problem.py:164
msgid "Bans the selected users from submitting to this problem."
msgstr ""
-#: judge/models/problem.py:152
+#: judge/models/problem.py:166
msgid "The license under which this problem is published."
msgstr ""
-#: judge/models/problem.py:154
+#: judge/models/problem.py:168
msgid "problem summary"
msgstr ""
-#: judge/models/problem.py:156
+#: judge/models/problem.py:170
msgid "number of users"
msgstr ""
-#: judge/models/problem.py:157
+#: judge/models/problem.py:171
msgid "The number of users who solved the problem."
msgstr ""
-#: judge/models/problem.py:158
+#: judge/models/problem.py:172
msgid "solve rate"
msgstr ""
-#: judge/models/problem.py:159
+#: judge/models/problem.py:173
msgid "allow full markdown access"
msgstr ""
-#: judge/models/problem.py:165
+#: judge/models/problem.py:174
+msgid "submission source visibility"
+msgstr ""
+
+#: judge/models/problem.py:182
msgid "If private, only these organizations may see the problem."
msgstr ""
-#: judge/models/problem.py:420
+#: judge/models/problem.py:447
msgid "See hidden problems"
msgstr ""
-#: judge/models/problem.py:421
+#: judge/models/problem.py:448
msgid "Edit own problems"
msgstr ""
-#: judge/models/problem.py:422
+#: judge/models/problem.py:449
msgid "Edit all problems"
msgstr ""
-#: judge/models/problem.py:423
+#: judge/models/problem.py:450
msgid "Edit all public problems"
msgstr ""
-#: judge/models/problem.py:424
+#: judge/models/problem.py:451
msgid "Edit problems with full markup"
msgstr ""
-#: judge/models/problem.py:425 templates/problem/problem.html:161
+#: judge/models/problem.py:452 templates/problem/problem.html:161
msgid "Clone problem"
msgstr ""
-#: judge/models/problem.py:426
+#: judge/models/problem.py:453
msgid "Change is_public field"
msgstr ""
-#: judge/models/problem.py:427
+#: judge/models/problem.py:454
msgid "Change is_manually_managed field"
msgstr ""
-#: judge/models/problem.py:428
+#: judge/models/problem.py:455
msgid "See organization-private problems"
msgstr ""
-#: judge/models/problem.py:436 judge/models/problem.py:454
+#: judge/models/problem.py:463 judge/models/problem.py:481
#: judge/models/runtime.py:111
msgid "language"
msgstr ""
-#: judge/models/problem.py:437
+#: judge/models/problem.py:464
msgid "translated name"
msgstr ""
-#: judge/models/problem.py:438
+#: judge/models/problem.py:465
msgid "translated description"
msgstr ""
-#: judge/models/problem.py:442
+#: judge/models/problem.py:469
msgid "problem translation"
msgstr ""
-#: judge/models/problem.py:443
+#: judge/models/problem.py:470
msgid "problem translations"
msgstr ""
-#: judge/models/problem.py:447
+#: judge/models/problem.py:474
msgid "clarified problem"
msgstr ""
-#: judge/models/problem.py:448
+#: judge/models/problem.py:475
msgid "clarification body"
msgstr ""
-#: judge/models/problem.py:449
+#: judge/models/problem.py:476
msgid "clarification timestamp"
msgstr ""
-#: judge/models/problem.py:464
+#: judge/models/problem.py:491
msgid "language-specific resource limit"
msgstr ""
-#: judge/models/problem.py:465
+#: judge/models/problem.py:492
msgid "language-specific resource limits"
msgstr ""
-#: judge/models/problem.py:469
+#: judge/models/problem.py:496
msgid "associated problem"
msgstr ""
-#: judge/models/problem.py:472
+#: judge/models/problem.py:499
msgid "publish date"
msgstr ""
-#: judge/models/problem.py:474
+#: judge/models/problem.py:501
msgid "editorial content"
msgstr ""
-#: judge/models/problem.py:497
+#: judge/models/problem.py:524
msgid "See hidden solutions"
msgstr ""
-#: judge/models/problem.py:499
+#: judge/models/problem.py:526
msgid "solution"
msgstr "rozwiązanie"
-#: judge/models/problem.py:500
+#: judge/models/problem.py:527
msgid "solutions"
msgstr "rozwiązania"
@@ -1716,112 +1725,112 @@ msgstr ""
msgid "case is pretest?"
msgstr ""
-#: judge/models/profile.py:38
+#: judge/models/profile.py:41
msgid "organization title"
msgstr ""
-#: judge/models/profile.py:39
+#: judge/models/profile.py:42
msgid "organization slug"
msgstr ""
-#: judge/models/profile.py:40
+#: judge/models/profile.py:43
msgid "Organization name shown in URL"
msgstr ""
-#: judge/models/profile.py:42
+#: judge/models/profile.py:45
msgid "Displayed beside user name during contests"
msgstr ""
-#: judge/models/profile.py:43
+#: judge/models/profile.py:46
msgid "organization description"
msgstr ""
-#: judge/models/profile.py:44
+#: judge/models/profile.py:47
msgid "administrators"
msgstr ""
-#: judge/models/profile.py:45
+#: judge/models/profile.py:48
msgid "Those who can edit this organization"
msgstr ""
-#: judge/models/profile.py:46
+#: judge/models/profile.py:49
msgid "creation date"
msgstr "data utworzenia"
-#: judge/models/profile.py:47
+#: judge/models/profile.py:50
msgid "is open organization?"
msgstr ""
-#: judge/models/profile.py:48
+#: judge/models/profile.py:51
msgid "Allow joining organization"
msgstr ""
-#: judge/models/profile.py:49
+#: judge/models/profile.py:52
msgid "maximum size"
msgstr ""
-#: judge/models/profile.py:50
+#: judge/models/profile.py:53
msgid "Maximum amount of users in this organization, only applicable to private organizations"
msgstr ""
-#: judge/models/profile.py:52
+#: judge/models/profile.py:55
msgid "Student access code"
msgstr ""
-#: judge/models/profile.py:56
+#: judge/models/profile.py:59
msgid "This image will replace the default site logo for users viewing the organization."
msgstr ""
-#: judge/models/profile.py:79
+#: judge/models/profile.py:82
msgid "Administer organizations"
msgstr ""
-#: judge/models/profile.py:80
+#: judge/models/profile.py:83
msgid "Edit all organizations"
msgstr ""
-#: judge/models/profile.py:82 judge/models/profile.py:99
-#: judge/models/profile.py:269
+#: judge/models/profile.py:85 judge/models/profile.py:102
+#: judge/models/profile.py:293
msgid "organization"
msgstr ""
-#: judge/models/profile.py:87
+#: judge/models/profile.py:90
msgid "user associated"
msgstr ""
-#: judge/models/profile.py:88
+#: judge/models/profile.py:91
msgid "self-description"
msgstr ""
-#: judge/models/profile.py:89
+#: judge/models/profile.py:92
msgid "location"
msgstr ""
-#: judge/models/profile.py:91
+#: judge/models/profile.py:94
msgid "preferred language"
msgstr ""
-#: judge/models/profile.py:97
+#: judge/models/profile.py:100
msgid "last access time"
msgstr ""
-#: judge/models/profile.py:98
+#: judge/models/profile.py:101
msgid "last IP"
msgstr ""
-#: judge/models/profile.py:101
+#: judge/models/profile.py:104
msgid "display rank"
msgstr ""
-#: judge/models/profile.py:103
+#: judge/models/profile.py:106
msgid "Normal User"
msgstr ""
-#: judge/models/profile.py:104
+#: judge/models/profile.py:107
msgid "Problem Setter"
msgstr ""
-#: judge/models/profile.py:105 templates/base.html:220
+#: judge/models/profile.py:108 templates/base.html:220
#: templates/comments/list.html:99 templates/contest/contest-list-tabs.html:24
#: templates/contest/ranking-table.html:49
#: templates/problem/problem-list-tabs.html:6
@@ -1830,155 +1839,167 @@ msgstr ""
msgid "Admin"
msgstr ""
-#: judge/models/profile.py:106
+#: judge/models/profile.py:109
msgid "comment mute"
msgstr ""
-#: judge/models/profile.py:106
+#: judge/models/profile.py:109
msgid "Some users are at their best when silent."
msgstr ""
-#: judge/models/profile.py:108
+#: judge/models/profile.py:111
msgid "unlisted user"
msgstr ""
-#: judge/models/profile.py:108
+#: judge/models/profile.py:111
msgid "User will not be ranked."
msgstr ""
-#: judge/models/profile.py:111
+#: judge/models/profile.py:114
msgid "user script"
msgstr ""
-#: judge/models/profile.py:112
+#: judge/models/profile.py:115
msgid "User-defined JavaScript for site customization."
msgstr ""
-#: judge/models/profile.py:113
+#: judge/models/profile.py:116
msgid "current contest"
msgstr ""
-#: judge/models/profile.py:115
+#: judge/models/profile.py:118
msgid "math engine"
msgstr ""
-#: judge/models/profile.py:117
+#: judge/models/profile.py:120
msgid "the rendering engine used to render math"
msgstr ""
-#: judge/models/profile.py:118
+#: judge/models/profile.py:121
msgid "TOTP 2FA enabled"
msgstr ""
-#: judge/models/profile.py:119
+#: judge/models/profile.py:122
msgid "check to enable TOTP-based two-factor authentication"
msgstr ""
-#: judge/models/profile.py:120
+#: judge/models/profile.py:123
msgid "WebAuthn 2FA enabled"
msgstr ""
-#: judge/models/profile.py:121
+#: judge/models/profile.py:124
msgid "check to enable WebAuthn-based two-factor authentication"
msgstr ""
-#: judge/models/profile.py:122
+#: judge/models/profile.py:125
msgid "TOTP key"
msgstr ""
-#: judge/models/profile.py:123
+#: judge/models/profile.py:126
msgid "32 character base32-encoded key for TOTP"
msgstr ""
-#: judge/models/profile.py:125
+#: judge/models/profile.py:128
msgid "TOTP key must be empty or base32"
msgstr ""
-#: judge/models/profile.py:126
+#: judge/models/profile.py:129
msgid "scratch codes"
msgstr ""
-#: judge/models/profile.py:127
+#: judge/models/profile.py:130
msgid "JSON array of 16 character base32-encoded codes for scratch codes"
msgstr ""
-#: judge/models/profile.py:131
+#: judge/models/profile.py:134
msgid "Scratch codes must be empty or a JSON array of 16-character base32 codes"
msgstr ""
-#: judge/models/profile.py:133
+#: judge/models/profile.py:136
+msgid "last TOTP timecode"
+msgstr ""
+
+#: judge/models/profile.py:137
msgid "API token"
msgstr ""
-#: judge/models/profile.py:134
+#: judge/models/profile.py:138
msgid "64 character hex-encoded API access token"
msgstr ""
-#: judge/models/profile.py:136
+#: judge/models/profile.py:140
msgid "API token must be None or hexadecimal"
msgstr ""
-#: judge/models/profile.py:137
+#: judge/models/profile.py:141
msgid "internal notes"
msgstr ""
-#: judge/models/profile.py:138
+#: judge/models/profile.py:142
msgid "Notes for administrators regarding this user."
msgstr ""
-#: judge/models/profile.py:139
+#: judge/models/profile.py:143
msgid "last data download time"
msgstr ""
-#: judge/models/profile.py:236
+#: judge/models/profile.py:253
msgid "Shows in-progress development stuff"
msgstr ""
-#: judge/models/profile.py:237
+#: judge/models/profile.py:254
msgid "Edit TOTP settings"
msgstr ""
-#: judge/models/profile.py:239
+#: judge/models/profile.py:256
msgid "user profile"
msgstr ""
-#: judge/models/profile.py:240
+#: judge/models/profile.py:257
msgid "user profiles"
msgstr ""
-#: judge/models/profile.py:246
+#: judge/models/profile.py:263
msgid "device name"
msgstr ""
-#: judge/models/profile.py:247
+#: judge/models/profile.py:264
msgid "credential ID"
msgstr ""
-#: judge/models/profile.py:248
+#: judge/models/profile.py:265
msgid "public key"
msgstr ""
-#: judge/models/profile.py:249
+#: judge/models/profile.py:266
msgid "sign counter"
msgstr ""
-#: judge/models/profile.py:271
+#: judge/models/profile.py:287
+msgid "WebAuthn credential"
+msgstr ""
+
+#: judge/models/profile.py:288
+msgid "WebAuthn credentials"
+msgstr ""
+
+#: judge/models/profile.py:295
msgid "request time"
msgstr ""
-#: judge/models/profile.py:272
+#: judge/models/profile.py:296
msgid "state"
msgstr ""
-#: judge/models/profile.py:277
+#: judge/models/profile.py:301
msgid "reason"
msgstr ""
-#: judge/models/profile.py:280
+#: judge/models/profile.py:304
msgid "organization join request"
msgstr ""
-#: judge/models/profile.py:281
+#: judge/models/profile.py:305
msgid "organization join requests"
msgstr ""
@@ -2134,210 +2155,210 @@ msgstr ""
msgid "judge"
msgstr ""
-#: judge/models/submission.py:20 judge/models/submission.py:47
+#: judge/models/submission.py:21 judge/models/submission.py:48
#: judge/utils/problems.py:74
msgid "Accepted"
msgstr ""
-#: judge/models/submission.py:21 judge/models/submission.py:48
+#: judge/models/submission.py:22 judge/models/submission.py:49
msgid "Wrong Answer"
msgstr ""
-#: judge/models/submission.py:22 judge/models/submission.py:50
+#: judge/models/submission.py:23 judge/models/submission.py:51
msgid "Time Limit Exceeded"
msgstr ""
-#: judge/models/submission.py:23 judge/models/submission.py:51
+#: judge/models/submission.py:24 judge/models/submission.py:52
msgid "Memory Limit Exceeded"
msgstr ""
-#: judge/models/submission.py:24 judge/models/submission.py:52
+#: judge/models/submission.py:25 judge/models/submission.py:53
msgid "Output Limit Exceeded"
msgstr ""
-#: judge/models/submission.py:25 judge/models/submission.py:53
+#: judge/models/submission.py:26 judge/models/submission.py:54
msgid "Invalid Return"
msgstr ""
-#: judge/models/submission.py:26 judge/models/submission.py:54
+#: judge/models/submission.py:27 judge/models/submission.py:55
msgid "Runtime Error"
msgstr ""
-#: judge/models/submission.py:27 judge/models/submission.py:41
-#: judge/models/submission.py:55 judge/utils/problems.py:76
+#: judge/models/submission.py:28 judge/models/submission.py:42
+#: judge/models/submission.py:56 judge/utils/problems.py:76
msgid "Compile Error"
msgstr ""
-#: judge/models/submission.py:28 judge/models/submission.py:40
+#: judge/models/submission.py:29 judge/models/submission.py:41
msgid "Internal Error"
msgstr ""
-#: judge/models/submission.py:29
+#: judge/models/submission.py:30
msgid "Short circuit"
msgstr ""
-#: judge/models/submission.py:30 judge/models/submission.py:42
-#: judge/models/submission.py:61
+#: judge/models/submission.py:31 judge/models/submission.py:43
+#: judge/models/submission.py:62
msgid "Aborted"
msgstr ""
-#: judge/models/submission.py:36 judge/models/submission.py:57
+#: judge/models/submission.py:37 judge/models/submission.py:58
msgid "Queued"
msgstr ""
-#: judge/models/submission.py:37 judge/models/submission.py:58
+#: judge/models/submission.py:38 judge/models/submission.py:59
msgid "Processing"
msgstr ""
-#: judge/models/submission.py:38 judge/models/submission.py:59
+#: judge/models/submission.py:39 judge/models/submission.py:60
msgid "Grading"
msgstr ""
-#: judge/models/submission.py:39 judge/models/submission.py:60
+#: judge/models/submission.py:40 judge/models/submission.py:61
msgid "Completed"
msgstr ""
-#: judge/models/submission.py:56
+#: judge/models/submission.py:57
msgid "Internal Error (judging server error)"
msgstr ""
-#: judge/models/submission.py:66
+#: judge/models/submission.py:67
msgid "submission time"
msgstr ""
-#: judge/models/submission.py:67 judge/models/submission.py:227
+#: judge/models/submission.py:68 judge/models/submission.py:238
msgid "execution time"
msgstr ""
-#: judge/models/submission.py:68 judge/models/submission.py:228
+#: judge/models/submission.py:69 judge/models/submission.py:239
msgid "memory usage"
msgstr ""
-#: judge/models/submission.py:69 judge/models/submission.py:229
+#: judge/models/submission.py:70 judge/models/submission.py:240
msgid "points granted"
msgstr ""
-#: judge/models/submission.py:70
+#: judge/models/submission.py:71
msgid "submission language"
msgstr ""
-#: judge/models/submission.py:71
+#: judge/models/submission.py:72
msgid "status"
msgstr ""
-#: judge/models/submission.py:72
+#: judge/models/submission.py:73
msgid "result"
msgstr "wynik"
-#: judge/models/submission.py:74
+#: judge/models/submission.py:75
msgid "compile errors"
msgstr "błędy kompilacji"
-#: judge/models/submission.py:76
+#: judge/models/submission.py:77
msgid "batched cases"
msgstr ""
-#: judge/models/submission.py:77
+#: judge/models/submission.py:78
msgid "test case points"
msgstr ""
-#: judge/models/submission.py:78
+#: judge/models/submission.py:79
msgid "test case total points"
msgstr ""
-#: judge/models/submission.py:79
+#: judge/models/submission.py:80
msgid "judged on"
msgstr ""
-#: judge/models/submission.py:81
+#: judge/models/submission.py:82
msgid "submission judge time"
msgstr ""
-#: judge/models/submission.py:82
-msgid "was rejudged by admin"
+#: judge/models/submission.py:83
+msgid "last rejudge date by admin"
msgstr ""
-#: judge/models/submission.py:83
+#: judge/models/submission.py:84
msgid "was ran on pretests only"
msgstr ""
-#: judge/models/submission.py:86
-msgid "lock submission"
+#: judge/models/submission.py:87
+msgid "submission lock"
msgstr ""
-#: judge/models/submission.py:199
+#: judge/models/submission.py:210
msgid "Abort any submission"
msgstr ""
-#: judge/models/submission.py:200
+#: judge/models/submission.py:211
msgid "Rejudge the submission"
msgstr ""
-#: judge/models/submission.py:201
+#: judge/models/submission.py:212
msgid "Rejudge a lot of submissions"
msgstr ""
-#: judge/models/submission.py:202
+#: judge/models/submission.py:213
msgid "Submit without limit"
msgstr ""
-#: judge/models/submission.py:203
+#: judge/models/submission.py:214
msgid "View all submission"
msgstr ""
-#: judge/models/submission.py:204
+#: judge/models/submission.py:215
msgid "Resubmit others' submission"
msgstr ""
-#: judge/models/submission.py:205
+#: judge/models/submission.py:216
msgid "Change lock status of submission"
msgstr ""
-#: judge/models/submission.py:208 templates/contest/moss.html:58
+#: judge/models/submission.py:219 templates/contest/moss.html:58
msgid "submissions"
msgstr "zgłoszenia"
-#: judge/models/submission.py:212 judge/models/submission.py:223
+#: judge/models/submission.py:223 judge/models/submission.py:234
msgid "associated submission"
msgstr ""
-#: judge/models/submission.py:214
+#: judge/models/submission.py:225
msgid "source code"
msgstr "kod źródłowy"
-#: judge/models/submission.py:225
+#: judge/models/submission.py:236
msgid "test case ID"
msgstr ""
-#: judge/models/submission.py:226
+#: judge/models/submission.py:237
msgid "status flag"
msgstr ""
-#: judge/models/submission.py:230
+#: judge/models/submission.py:241
msgid "points possible"
msgstr ""
-#: judge/models/submission.py:231
+#: judge/models/submission.py:242
msgid "batch number"
msgstr ""
-#: judge/models/submission.py:232
+#: judge/models/submission.py:243
msgid "judging feedback"
msgstr ""
-#: judge/models/submission.py:233
+#: judge/models/submission.py:244
msgid "extended judging feedback"
msgstr ""
-#: judge/models/submission.py:234
+#: judge/models/submission.py:245
msgid "program output"
msgstr ""
-#: judge/models/submission.py:242
+#: judge/models/submission.py:253
msgid "submission test case"
msgstr ""
-#: judge/models/submission.py:243
+#: judge/models/submission.py:254
msgid "submission test cases"
msgstr ""
@@ -2385,6 +2406,10 @@ msgstr ""
msgid "poster"
msgstr ""
+#: judge/models/ticket.py:30
+msgid "message body"
+msgstr "treść wiadomości"
+
#: judge/models/ticket.py:31
msgid "message time"
msgstr ""
@@ -2407,19 +2432,23 @@ msgstr ""
msgid "Running MOSS"
msgstr ""
-#: judge/tasks/submission.py:43
+#: judge/tasks/submission.py:45
msgid "Modifying submissions"
msgstr ""
-#: judge/tasks/submission.py:56
+#: judge/tasks/submission.py:58
msgid "Recalculating user points"
msgstr ""
-#: judge/tasks/user.py:50
+#: judge/tasks/user.py:49
+msgid "Applying filters"
+msgstr ""
+
+#: judge/tasks/user.py:64
msgid "Preparing your submission data"
msgstr ""
-#: judge/tasks/user.py:81
+#: judge/tasks/user.py:95
msgid "Preparing your comment data"
msgstr ""
@@ -2538,7 +2567,7 @@ msgstr ""
msgid "You already voted."
msgstr ""
-#: judge/views/comment.py:129 judge/views/organization.py:298
+#: judge/views/comment.py:129 judge/views/organization.py:297
msgid "Edited from site"
msgstr ""
@@ -2546,125 +2575,130 @@ msgstr ""
msgid "Editing comment"
msgstr ""
-#: judge/views/contests.py:56 judge/views/contests.py:201
-#: judge/views/contests.py:204 judge/views/contests.py:382
+#: judge/views/contests.py:57 judge/views/contests.py:210
+#: judge/views/contests.py:213 judge/views/contests.py:395
msgid "No such contest"
msgstr ""
-#: judge/views/contests.py:57 judge/views/contests.py:202
+#: judge/views/contests.py:58 judge/views/contests.py:211
#, python-format
msgid "Could not find a contest with the key \"%s\"."
msgstr ""
-#: judge/views/contests.py:70
+#: judge/views/contests.py:71
msgid "Contests"
msgstr ""
-#: judge/views/contests.py:205
+#: judge/views/contests.py:214
msgid "Could not find such contest."
msgstr ""
-#: judge/views/contests.py:208
+#: judge/views/contests.py:217
#, python-format
msgid "Access to contest \"%s\" denied"
msgstr ""
-#: judge/views/contests.py:235
+#: judge/views/contests.py:244
msgid "Clone Contest"
msgstr ""
-#: judge/views/contests.py:301
+#: judge/views/contests.py:278
+#, python-format
+msgid "Cloned contest from %s"
+msgstr ""
+
+#: judge/views/contests.py:314
msgid "Contest not ongoing"
msgstr ""
-#: judge/views/contests.py:302
+#: judge/views/contests.py:315
#, python-format
msgid "\"%s\" is not currently ongoing."
msgstr ""
-#: judge/views/contests.py:306
+#: judge/views/contests.py:319
msgid "Already in contest"
msgstr ""
-#: judge/views/contests.py:307
+#: judge/views/contests.py:320
#, python-format
msgid "You are already in a contest: \"%s\"."
msgstr ""
-#: judge/views/contests.py:310
+#: judge/views/contests.py:323
msgid "Banned from joining"
msgstr ""
-#: judge/views/contests.py:311
+#: judge/views/contests.py:324
msgid "You have been declared persona non grata for this contest. You are permanently barred from joining this contest."
msgstr ""
-#: judge/views/contests.py:372
+#: judge/views/contests.py:385
#, python-format
msgid "Enter access code for \"%s\""
msgstr ""
-#: judge/views/contests.py:383
+#: judge/views/contests.py:396
#, python-format
msgid "You are not in contest \"%s\"."
msgstr ""
-#: judge/views/contests.py:402
+#: judge/views/contests.py:415
msgid "ContestCalendar requires integer year and month"
msgstr ""
-#: judge/views/contests.py:442
+#: judge/views/contests.py:455
#, python-format
msgid "Contests in %(month)s"
msgstr ""
-#: judge/views/contests.py:442
+#: judge/views/contests.py:455
msgid "F Y"
msgstr ""
-#: judge/views/contests.py:489
+#: judge/views/contests.py:502
#, python-format
msgid "%s Statistics"
msgstr ""
-#: judge/views/contests.py:662
+#: judge/views/contests.py:675
#, python-format
msgid "%s Rankings"
msgstr ""
-#: judge/views/contests.py:670
+#: judge/views/contests.py:683
msgid "???"
msgstr ""
-#: judge/views/contests.py:686
+#: judge/views/contests.py:699
#, python-format
msgid "Your participation in %s"
msgstr ""
-#: judge/views/contests.py:687
+#: judge/views/contests.py:700
#, python-format
msgid "%s's participation in %s"
msgstr ""
-#: judge/views/contests.py:694
+#: judge/views/contests.py:707
msgid "Live"
msgstr ""
-#: judge/views/contests.py:706 templates/contest/contest-tabs.html:13
+#: judge/views/contests.py:719 templates/contest/contest-tabs.html:13
msgid "Participation"
msgstr ""
-#: judge/views/contests.py:750
+#: judge/views/contests.py:763
#, python-format
msgid "%s MOSS Results"
msgstr ""
-#: judge/views/contests.py:777
+#: judge/views/contests.py:790
#, python-format
msgid "Running MOSS for %s..."
msgstr ""
-#: judge/views/contests.py:800
+#: judge/views/contests.py:813
#, python-format
msgid "Contest tag: %s"
msgstr ""
@@ -2693,71 +2727,71 @@ msgstr ""
msgid "Runtimes"
msgstr ""
-#: judge/views/organization.py:44 judge/views/organization.py:47
+#: judge/views/organization.py:43 judge/views/organization.py:46
msgid "No such organization"
msgstr ""
-#: judge/views/organization.py:45
+#: judge/views/organization.py:44
#, python-format
msgid "Could not find an organization with the key \"%s\"."
msgstr ""
-#: judge/views/organization.py:48
+#: judge/views/organization.py:47
msgid "Could not find such organization."
msgstr ""
-#: judge/views/organization.py:72 judge/views/register.py:34
+#: judge/views/organization.py:71 judge/views/register.py:33
#: templates/organization/list.html:15 templates/user/user-list-tabs.html:5
msgid "Organizations"
msgstr ""
-#: judge/views/organization.py:93
+#: judge/views/organization.py:92
#, python-format
msgid "%s Members"
msgstr ""
-#: judge/views/organization.py:118 judge/views/organization.py:121
-#: judge/views/organization.py:126
+#: judge/views/organization.py:117 judge/views/organization.py:120
+#: judge/views/organization.py:125
msgid "Joining organization"
msgstr ""
-#: judge/views/organization.py:118
+#: judge/views/organization.py:117
msgid "You are already in the organization."
msgstr ""
-#: judge/views/organization.py:121
+#: judge/views/organization.py:120
msgid "This organization is not open."
msgstr ""
-#: judge/views/organization.py:138
+#: judge/views/organization.py:137
msgid "Leaving organization"
msgstr ""
-#: judge/views/organization.py:138
+#: judge/views/organization.py:137
#, python-format
msgid "You are not in \"%s\"."
msgstr ""
-#: judge/views/organization.py:162
+#: judge/views/organization.py:161
#, python-format
msgid "Request to join %s"
msgstr ""
-#: judge/views/organization.py:180
+#: judge/views/organization.py:179
msgid "Join request detail"
msgstr ""
-#: judge/views/organization.py:208
+#: judge/views/organization.py:207
#, python-format
msgid "Managing join requests for %s"
msgstr ""
-#: judge/views/organization.py:239
+#: judge/views/organization.py:238
#, python-format
msgid "Your organization can only receive %d more members. You cannot approve %d users."
msgstr ""
-#: judge/views/organization.py:251
+#: judge/views/organization.py:250
#, python-format
msgid "Approved %d user."
msgid_plural "Approved %d users."
@@ -2766,7 +2800,7 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-#: judge/views/organization.py:252
+#: judge/views/organization.py:251
#, python-format
msgid "Rejected %d user."
msgid_plural "Rejected %d users."
@@ -2775,85 +2809,99 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-#: judge/views/organization.py:282
+#: judge/views/organization.py:281
#, python-format
msgid "Editing %s"
msgstr ""
-#: judge/views/organization.py:306 judge/views/organization.py:314
+#: judge/views/organization.py:305 judge/views/organization.py:313
msgid "Can't edit organization"
msgstr ""
-#: judge/views/organization.py:307
+#: judge/views/organization.py:306
msgid "You are not allowed to edit this organization."
msgstr ""
-#: judge/views/organization.py:315
+#: judge/views/organization.py:314
msgid "You are not allowed to kick people from this organization."
msgstr ""
-#: judge/views/organization.py:320 judge/views/organization.py:324
+#: judge/views/organization.py:319 judge/views/organization.py:323
msgid "Can't kick user"
msgstr ""
-#: judge/views/organization.py:321
+#: judge/views/organization.py:320
msgid "The user you are trying to kick does not exist!"
msgstr ""
-#: judge/views/organization.py:325
+#: judge/views/organization.py:324
#, python-format
msgid "The user you are trying to kick is not in organization: %s."
msgstr ""
-#: judge/views/problem.py:67
+#: judge/views/problem.py:68
msgid "No such problem"
msgstr ""
-#: judge/views/problem.py:68
+#: judge/views/problem.py:69
#, python-format
msgid "Could not find a problem with the code \"%s\"."
msgstr ""
-#: judge/views/problem.py:110
+#: judge/views/problem.py:111
#, python-brace-format
msgid "Editorial for {0}"
msgstr ""
-#: judge/views/problem.py:113
+#: judge/views/problem.py:114
#, python-brace-format
msgid "Editorial for {0}"
msgstr ""
-#: judge/views/problem.py:283 templates/contest/contest.html:79
+#: judge/views/problem.py:133
+msgid "No such editorial"
+msgstr ""
+
+#: judge/views/problem.py:134
+#, python-format
+msgid "Could not find an editorial with the code \"%s\"."
+msgstr ""
+
+#: judge/views/problem.py:289 templates/contest/contest.html:79
#: templates/user/user-tabs.html:5 templates/user/users-table.html:23
msgid "Problems"
msgstr ""
-#: judge/views/problem.py:556 judge/views/problem.py:564
+#: judge/views/problem.py:562 judge/views/problem.py:570
#, python-format
msgid "Submit to %s"
msgstr ""
-#: judge/views/problem.py:613
+#: judge/views/problem.py:619
msgid "Banned from submitting"
msgstr ""
-#: judge/views/problem.py:614
+#: judge/views/problem.py:620
msgid "You have been declared persona non grata for this problem. You are permanently barred from submitting this problem."
msgstr ""
-#: judge/views/problem.py:618
+#: judge/views/problem.py:624
msgid "Too many submissions"
msgstr ""
-#: judge/views/problem.py:619
+#: judge/views/problem.py:625
msgid "You have exceeded the submission limit for this problem."
msgstr ""
-#: judge/views/problem.py:681
+#: judge/views/problem.py:693
msgid "Clone Problem"
msgstr ""
+#: judge/views/problem.py:720
+#, python-format
+msgid "Cloned problem from %s"
+msgstr ""
+
#: judge/views/problem_data.py:37
msgid "Checker arguments must be a JSON object"
msgstr ""
@@ -2925,52 +2973,52 @@ msgstr ""
msgid "Best solutions for {0}"
msgstr ""
-#: judge/views/ranked_submission.py:80
+#: judge/views/ranked_submission.py:82
#, python-format
msgid "Best solutions for %(problem)s in %(contest)s"
msgstr ""
-#: judge/views/ranked_submission.py:83
+#: judge/views/ranked_submission.py:85
#, python-format
msgid "Best solutions for problem %(number)s in %(contest)s"
msgstr ""
-#: judge/views/ranked_submission.py:89
+#: judge/views/ranked_submission.py:91
#, python-brace-format
msgid "Best solutions for {0} in {2}"
msgstr ""
-#: judge/views/ranked_submission.py:92
+#: judge/views/ranked_submission.py:94
#, python-brace-format
msgid "Best solutions for problem {0} in {1}"
msgstr ""
-#: judge/views/register.py:27
+#: judge/views/register.py:26
msgid "A username must contain letters, numbers, or underscores"
msgstr ""
-#: judge/views/register.py:31
+#: judge/views/register.py:30
msgid "Preferred language"
msgstr ""
-#: judge/views/register.py:38
+#: judge/views/register.py:37
msgid "Subscribe to newsletter?"
msgstr ""
-#: judge/views/register.py:45
+#: judge/views/register.py:44
#, python-format
msgid "The email address \"%s\" is already taken. Only one registration is allowed per address."
msgstr ""
-#: judge/views/register.py:51
+#: judge/views/register.py:50
msgid "Your email provider is not allowed due to history of abuse. Please use a reputable email provider."
msgstr ""
-#: judge/views/register.py:57 judge/views/register.py:95
+#: judge/views/register.py:56 judge/views/register.py:94
msgid "Registration"
msgstr ""
-#: judge/views/register.py:106
+#: judge/views/register.py:105
msgid "Authentication failure"
msgstr ""
@@ -2978,7 +3026,7 @@ msgstr ""
msgid "Language statistics"
msgstr ""
-#: judge/views/status.py:24 templates/submission/list.html:311
+#: judge/views/status.py:24 templates/submission/list.html:310
msgid "Status"
msgstr ""
@@ -2986,74 +3034,74 @@ msgstr ""
msgid "Version matrix"
msgstr ""
-#: judge/views/submission.py:53 judge/views/submission.py:60
+#: judge/views/submission.py:55 judge/views/submission.py:62
#, python-format
msgid "Submission of %(problem)s by %(user)s"
msgstr ""
-#: judge/views/submission.py:203 judge/views/submission.py:204
+#: judge/views/submission.py:205 judge/views/submission.py:206
#: templates/problem/problem.html:127
msgid "All submissions"
msgstr ""
-#: judge/views/submission.py:349
+#: judge/views/submission.py:355
msgid "All my submissions"
msgstr ""
-#: judge/views/submission.py:350
+#: judge/views/submission.py:356
#, python-format
msgid "All submissions by %s"
msgstr ""
-#: judge/views/submission.py:381
+#: judge/views/submission.py:387
#, python-format
msgid "All submissions for %s"
msgstr ""
-#: judge/views/submission.py:400
+#: judge/views/submission.py:410
msgid "Must pass a problem"
msgstr ""
-#: judge/views/submission.py:439
+#: judge/views/submission.py:449
#, python-format
msgid "My submissions for %(problem)s"
msgstr ""
-#: judge/views/submission.py:440
+#: judge/views/submission.py:450
#, python-format
msgid "%(user)s's submissions for %(problem)s"
msgstr ""
-#: judge/views/submission.py:536
+#: judge/views/submission.py:546
msgid "Must pass a contest"
msgstr ""
-#: judge/views/submission.py:544
+#: judge/views/submission.py:554
#, python-format
msgid "My submissions in %(contest)s"
msgstr ""
-#: judge/views/submission.py:545
+#: judge/views/submission.py:555
#, python-format
msgid "%(user)s's submissions in %(contest)s"
msgstr ""
-#: judge/views/submission.py:559
+#: judge/views/submission.py:569
#, python-brace-format
msgid "My submissions in {0}"
msgstr ""
-#: judge/views/submission.py:561
+#: judge/views/submission.py:571
#, python-brace-format
msgid "{0}'s submissions in {2}"
msgstr ""
-#: judge/views/submission.py:585
+#: judge/views/submission.py:597
#, python-brace-format
msgid "{0}'s submissions for {2} in {4}"
msgstr ""
-#: judge/views/submission.py:590
+#: judge/views/submission.py:602
#, python-brace-format
msgid "{0}'s submissions for problem {2} in {3}"
msgstr ""
@@ -3070,40 +3118,40 @@ msgstr ""
msgid "You must solve at least one problem before you can create a ticket."
msgstr ""
-#: judge/views/ticket.py:87 judge/views/ticket.py:90
+#: judge/views/ticket.py:91 judge/views/ticket.py:94
#, python-format
msgid "New ticket for %s"
msgstr ""
-#: judge/views/ticket.py:144
+#: judge/views/ticket.py:148
#, python-format
msgid "%(title)s - Ticket %(id)d"
msgstr ""
-#: judge/views/ticket.py:249
+#: judge/views/ticket.py:253
#, python-format
msgid "Tickets - Page %(number)d of %(total)d"
msgstr ""
-#: judge/views/ticket.py:298
+#: judge/views/ticket.py:302
#, python-format
msgid "New Ticket: %s"
msgstr ""
-#: judge/views/ticket.py:299
+#: judge/views/ticket.py:303
#, python-format
msgid "#%(id)d, assigned to: %(users)s"
msgstr ""
-#: judge/views/ticket.py:301
+#: judge/views/ticket.py:305
msgid ", "
msgstr ""
-#: judge/views/ticket.py:301
+#: judge/views/ticket.py:305
msgid "no one"
msgstr ""
-#: judge/views/ticket.py:321
+#: judge/views/ticket.py:325
#, python-format
msgid "New Ticket Message For: %s"
msgstr ""
@@ -3112,87 +3160,91 @@ msgstr ""
msgid "Enable Two-factor Authentication"
msgstr ""
-#: judge/views/two_factor.py:99
+#: judge/views/two_factor.py:108
+msgid "Refresh Two-factor Authentication"
+msgstr ""
+
+#: judge/views/two_factor.py:116
msgid "Disable Two-factor Authentication"
msgstr ""
-#: judge/views/two_factor.py:148
+#: judge/views/two_factor.py:165
msgid "Invalid WebAuthn response"
msgstr ""
-#: judge/views/two_factor.py:151
+#: judge/views/two_factor.py:168
msgid "Invalid name"
msgstr ""
-#: judge/views/two_factor.py:204
+#: judge/views/two_factor.py:221
msgid "Staff may not disable 2FA"
msgstr ""
-#: judge/views/two_factor.py:216
+#: judge/views/two_factor.py:229
msgid "Perform Two-factor Authentication"
msgstr ""
-#: judge/views/user.py:79
+#: judge/views/user.py:78
msgid "No such user"
msgstr ""
-#: judge/views/user.py:79
+#: judge/views/user.py:78
#, python-format
msgid "No user handle \"%s\"."
msgstr ""
-#: judge/views/user.py:83
+#: judge/views/user.py:82
msgid "My account"
msgstr ""
-#: judge/views/user.py:84
+#: judge/views/user.py:83
#, python-format
msgid "User %s"
msgstr ""
-#: judge/views/user.py:132
+#: judge/views/user.py:131
msgid "Login"
msgstr "Logowanie"
-#: judge/views/user.py:173
+#: judge/views/user.py:172
msgid "M j, Y, G:i"
msgstr ""
-#: judge/views/user.py:307
+#: judge/views/user.py:306
msgid "Preparing your data..."
msgstr ""
-#: judge/views/user.py:311 templates/user/edit-profile.html:348
+#: judge/views/user.py:310 templates/user/edit-profile.html:352
msgid "Download your data"
msgstr ""
-#: judge/views/user.py:367
+#: judge/views/user.py:366
msgid "Updated on site"
msgstr ""
-#: judge/views/user.py:400 templates/admin/auth/user/change_form.html:14
+#: judge/views/user.py:399 templates/admin/auth/user/change_form.html:14
#: templates/admin/auth/user/change_form.html:17 templates/base.html:222
#: templates/user/user-tabs.html:16
msgid "Edit profile"
msgstr ""
-#: judge/views/user.py:415
+#: judge/views/user.py:414
msgid "Generated API token for user"
msgstr ""
-#: judge/views/user.py:427
+#: judge/views/user.py:426
msgid "Removed API token for user"
msgstr ""
-#: judge/views/user.py:437
+#: judge/views/user.py:436
msgid "Generated scratch codes for user"
msgstr ""
-#: judge/views/user.py:443 templates/user/user-list-tabs.html:4
+#: judge/views/user.py:442 templates/user/user-list-tabs.html:4
msgid "Leaderboard"
msgstr ""
-#: judge/views/user.py:504
+#: judge/views/user.py:503
msgid "You have been successfully logged out."
msgstr ""
@@ -3317,11 +3369,11 @@ msgstr ""
msgid "posted on {time}"
msgstr ""
-#: templates/blog/list.html:130 templates/problem/problem.html:309
+#: templates/blog/list.html:130 templates/problem/problem.html:311
msgid "Clarifications"
msgstr ""
-#: templates/blog/list.html:146 templates/problem/problem.html:320
+#: templates/blog/list.html:146 templates/problem/problem.html:322
msgid "No clarifications have been made at this time."
msgstr ""
@@ -3514,7 +3566,7 @@ msgid "Info"
msgstr ""
#: templates/contest/contest-tabs.html:6 templates/stats/base.html:9
-#: templates/submission/list.html:337
+#: templates/submission/list.html:336
msgid "Statistics"
msgstr ""
@@ -3717,19 +3769,19 @@ msgstr ""
msgid "Disqualify"
msgstr ""
-#: templates/contest/ranking.html:169
+#: templates/contest/ranking.html:173
msgid "Are you sure you want to disqualify this participation?"
msgstr ""
-#: templates/contest/ranking.html:174
+#: templates/contest/ranking.html:178
msgid "Are you sure you want to un-disqualify this participation?"
msgstr ""
-#: templates/contest/ranking.html:246
+#: templates/contest/ranking.html:250
msgid "View user participation"
msgstr ""
-#: templates/contest/ranking.html:250
+#: templates/contest/ranking.html:254
msgid "Show organizations"
msgstr ""
@@ -4004,7 +4056,7 @@ msgstr ""
msgid "Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence."
msgstr ""
-#: templates/problem/editorial.html:27 templates/problem/problem.html:209
+#: templates/problem/editorial.html:27 templates/problem/problem.html:210
msgid "Author:"
msgid_plural "Authors:"
msgstr[0] ""
@@ -4175,7 +4227,7 @@ msgstr ""
msgid "Memory limit:"
msgstr ""
-#: templates/problem/problem.html:224
+#: templates/problem/problem.html:226
msgid "Problem type"
msgid_plural "Problem types"
msgstr[0] ""
@@ -4183,16 +4235,16 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-#: templates/problem/problem.html:237
+#: templates/problem/problem.html:239
msgid "Allowed languages"
msgstr ""
-#: templates/problem/problem.html:245
+#: templates/problem/problem.html:247
#, python-format
msgid "No %(lang)s judge online"
msgstr ""
-#: templates/problem/problem.html:256
+#: templates/problem/problem.html:258
msgid "Judge:"
msgid_plural "Judges:"
msgstr[0] ""
@@ -4200,15 +4252,15 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-#: templates/problem/problem.html:273
+#: templates/problem/problem.html:275
msgid "none available"
msgstr ""
-#: templates/problem/problem.html:298
+#: templates/problem/problem.html:300
msgid "Request clarification"
msgstr ""
-#: templates/problem/problem.html:300
+#: templates/problem/problem.html:302
msgid "Report an issue"
msgstr ""
@@ -4253,7 +4305,7 @@ msgstr ""
msgid "Point range"
msgstr ""
-#: templates/problem/search-form.html:63 templates/submission/list.html:329
+#: templates/problem/search-form.html:63 templates/submission/list.html:328
#: templates/ticket/list.html:248
msgid "Go"
msgstr ""
@@ -4302,7 +4354,7 @@ msgid "Invalid username or password."
msgstr ""
#: templates/registration/login.html:53
-#: templates/registration/two_factor_auth.html:86
+#: templates/registration/two_factor_auth.html:92
msgid "Login!"
msgstr ""
@@ -4422,12 +4474,12 @@ msgid "Default language"
msgstr ""
#: templates/registration/registration_form.html:184
-#: templates/user/edit-profile.html:310
+#: templates/user/edit-profile.html:314
msgid "Affiliated organizations"
msgstr ""
#: templates/registration/registration_form.html:190
-#: templates/user/edit-profile.html:324
+#: templates/user/edit-profile.html:328
msgid "Notify me about upcoming contests"
msgstr ""
@@ -4443,57 +4495,93 @@ msgstr ""
msgid "Register!"
msgstr ""
-#: templates/registration/totp_disable.html:38
+#: templates/registration/totp_disable.html:31
msgid "To protect your account, you must first authenticate before you can disable Two Factor Authentication."
msgstr ""
-#: templates/registration/totp_disable.html:45
+#: templates/registration/totp_disable.html:38
msgid "Enter the 6-digit code generated by your app or one of your 16-digit scratch codes:"
msgstr ""
-#: templates/registration/totp_disable.html:48
+#: templates/registration/totp_disable.html:41
msgid "Disable Two Factor Authentication"
msgstr ""
-#: templates/registration/totp_enable.html:75
+#: templates/registration/totp_enable.html:72
msgid "Scan this code with your authenticator app:"
msgstr ""
-#: templates/registration/totp_enable.html:76
+#: templates/registration/totp_enable.html:73
msgid "QR code"
msgstr ""
-#: templates/registration/totp_enable.html:77
+#: templates/registration/totp_enable.html:74
msgid "Or enter this code manually:"
msgstr ""
-#: templates/registration/totp_enable.html:88
+#: templates/registration/totp_enable.html:85
msgid "Enter the 6-digit code generated by your app:"
msgstr ""
-#: templates/registration/totp_enable.html:91
+#: templates/registration/totp_enable.html:90
+msgid "Refresh Two Factor Authentication"
+msgstr ""
+
+#: templates/registration/totp_enable.html:92
msgid "Enable Two Factor Authentication"
msgstr ""
+#: templates/registration/totp_enable.html:98
+msgid "Below is a list of one-time use scratch codes."
+msgstr ""
+
+#: templates/registration/totp_enable.html:99
+msgid "These codes can only be used once and are for emergency use."
+msgstr ""
+
+#: templates/registration/totp_enable.html:100
+msgid "You can use these codes to login to your account or disable two-factor authentication."
+msgstr ""
+
+#: templates/registration/totp_enable.html:101
+msgid "If you ever need more scratch codes, you can regenerate them on the edit profile tab."
+msgstr ""
+
+#: templates/registration/totp_enable.html:102
+msgid "Please write these down and keep them in a secure location."
+msgstr ""
+
+#: templates/registration/totp_enable.html:103
+msgid "These codes will never be shown again after you enable two-factor authentication."
+msgstr ""
+
#: templates/registration/two_factor_auth.html:33
-#: templates/user/edit-profile.html:161
+#: templates/user/edit-profile.html:165
msgid "WebAuthn is not supported by your browser."
msgstr ""
#: templates/registration/two_factor_auth.html:54
-#: templates/user/edit-profile.html:185
+#: templates/user/edit-profile.html:189
msgid "Failed to contact server."
msgstr ""
-#: templates/registration/two_factor_auth.html:77
+#: templates/registration/two_factor_auth.html:79
msgid "Enter the 6-digit code generated by your app or one of your 16-character scratch codes:"
msgstr ""
-#: templates/registration/two_factor_auth.html:83
-msgid "Use security key"
+#: templates/registration/two_factor_auth.html:81
+msgid "Enter one of your 16-character scratch codes:"
msgstr ""
#: templates/registration/two_factor_auth.html:89
+msgid "Use security key"
+msgstr ""
+
+#: templates/registration/two_factor_auth.html:94
+msgid "Use scratch code"
+msgstr ""
+
+#: templates/registration/two_factor_auth.html:97
#, python-format
msgid "If you lost your authentication device and are unable to use your scratch codes, please contact us at %(email)s."
msgstr ""
@@ -4574,15 +4662,15 @@ msgstr ""
msgid "Filter by language..."
msgstr ""
-#: templates/submission/list.html:307
+#: templates/submission/list.html:306
msgid "Filter submissions"
msgstr ""
-#: templates/submission/list.html:343
+#: templates/submission/list.html:342
msgid "Total:"
msgstr ""
-#: templates/submission/list.html:353
+#: templates/submission/list.html:352
msgid "You were disconnected. Refresh to show latest updates."
msgstr ""
@@ -4800,121 +4888,125 @@ msgstr ""
msgid "Search by handle..."
msgstr ""
-#: templates/user/edit-profile.html:109
+#: templates/user/edit-profile.html:113
msgid "Are you sure you want to generate or regenerate your API token?"
msgstr ""
-#: templates/user/edit-profile.html:110
+#: templates/user/edit-profile.html:114
msgid "This will invalidate any previous API tokens."
msgstr ""
-#: templates/user/edit-profile.html:111
+#: templates/user/edit-profile.html:115
msgid "It also allows access to your account without Two-factor Authentication."
msgstr ""
-#: templates/user/edit-profile.html:112
+#: templates/user/edit-profile.html:116
msgid "You will not be able to view your api token after you leave this page!"
msgstr ""
-#: templates/user/edit-profile.html:113 templates/user/edit-profile.html:207
+#: templates/user/edit-profile.html:117 templates/user/edit-profile.html:211
msgid "Generating..."
msgstr ""
-#: templates/user/edit-profile.html:121 templates/user/edit-profile.html:243
-#: templates/user/edit-profile.html:371 templates/user/edit-profile.html:390
+#: templates/user/edit-profile.html:125 templates/user/edit-profile.html:247
+#: templates/user/edit-profile.html:373 templates/user/edit-profile.html:395
msgid "Regenerate"
msgstr ""
-#: templates/user/edit-profile.html:127 templates/user/edit-profile.html:392
+#: templates/user/edit-profile.html:131 templates/user/edit-profile.html:397
msgid "Remove"
msgstr ""
-#: templates/user/edit-profile.html:137
+#: templates/user/edit-profile.html:141
msgid "Are you sure you want to remove your API token?"
msgstr ""
-#: templates/user/edit-profile.html:144 templates/user/edit-profile.html:375
-#: templates/user/edit-profile.html:396
+#: templates/user/edit-profile.html:148 templates/user/edit-profile.html:377
+#: templates/user/edit-profile.html:401
msgid "Generate"
msgstr ""
-#: templates/user/edit-profile.html:190
+#: templates/user/edit-profile.html:194
msgid "Are you sure you want to delete this security key?"
msgstr ""
-#: templates/user/edit-profile.html:280
+#: templates/user/edit-profile.html:284
msgid "Self-description"
msgstr ""
-#: templates/user/edit-profile.html:287
+#: templates/user/edit-profile.html:291
msgid "Select your closest major city"
msgstr ""
-#: templates/user/edit-profile.html:296
+#: templates/user/edit-profile.html:300
msgid "Editor theme"
msgstr ""
-#: templates/user/edit-profile.html:301
+#: templates/user/edit-profile.html:305
msgid "Math engine"
msgstr ""
-#: templates/user/edit-profile.html:335 templates/user/edit-profile.html:337
+#: templates/user/edit-profile.html:339 templates/user/edit-profile.html:341
msgid "Change your avatar"
msgstr ""
-#: templates/user/edit-profile.html:342
+#: templates/user/edit-profile.html:346
msgid "Change your password"
msgstr ""
-#: templates/user/edit-profile.html:356
+#: templates/user/edit-profile.html:359
msgid "Two-factor Authentication is enabled"
msgstr ""
-#: templates/user/edit-profile.html:358
-msgid "Two-factor Authentication is disabled"
+#: templates/user/edit-profile.html:362 templates/user/edit-profile.html:365
+msgid "Disable"
msgstr ""
-#: templates/user/edit-profile.html:363 templates/user/edit-profile.html:365
-msgid "Disable"
+#: templates/user/edit-profile.html:367
+msgid "Refresh"
msgstr ""
-#: templates/user/edit-profile.html:368
+#: templates/user/edit-profile.html:370
msgid "Scratch Codes:"
msgstr ""
-#: templates/user/edit-profile.html:372 templates/user/edit-profile.html:393
+#: templates/user/edit-profile.html:374 templates/user/edit-profile.html:398
msgid "Hidden"
msgstr ""
-#: templates/user/edit-profile.html:381
+#: templates/user/edit-profile.html:384
+msgid "Two-factor Authentication is disabled"
+msgstr ""
+
+#: templates/user/edit-profile.html:385
msgid "Enable"
msgstr ""
-#: templates/user/edit-profile.html:387
+#: templates/user/edit-profile.html:392
msgid "API Token"
msgstr ""
-#: templates/user/edit-profile.html:404
+#: templates/user/edit-profile.html:409
msgid "Security keys"
msgstr ""
-#: templates/user/edit-profile.html:414
+#: templates/user/edit-profile.html:419
msgid "Delete"
msgstr ""
-#: templates/user/edit-profile.html:421
+#: templates/user/edit-profile.html:426
msgid "Enter a name for this key"
msgstr ""
-#: templates/user/edit-profile.html:422
+#: templates/user/edit-profile.html:427
msgid "Add"
msgstr ""
-#: templates/user/edit-profile.html:430
+#: templates/user/edit-profile.html:435
msgid "User-script"
msgstr ""
-#: templates/user/edit-profile.html:434
+#: templates/user/edit-profile.html:439
msgid "Update profile"
msgstr ""
diff --git a/locale/pl/LC_MESSAGES/djangojs.po b/locale/pl/LC_MESSAGES/djangojs.po
index 62a3714cb2..96683efb78 100644
--- a/locale/pl/LC_MESSAGES/djangojs.po
+++ b/locale/pl/LC_MESSAGES/djangojs.po
@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: dmoj\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-10-01 23:12+0000\n"
-"PO-Revision-Date: 2021-04-25 00:08\n"
+"PO-Revision-Date: 2021-07-07 00:27\n"
"Last-Translator: \n"
"Language-Team: Polish\n"
"Language: pl_PL\n"
diff --git a/locale/pt/LC_MESSAGES/django.po b/locale/pt/LC_MESSAGES/django.po
index 367b7cd883..14812696c6 100644
--- a/locale/pt/LC_MESSAGES/django.po
+++ b/locale/pt/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: dmoj\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-24 19:15+0000\n"
-"PO-Revision-Date: 2021-04-25 00:08\n"
+"POT-Creation-Date: 2021-06-17 01:38+0000\n"
+"PO-Revision-Date: 2021-07-07 00:27\n"
"Last-Translator: \n"
"Language-Team: Portuguese, Brazilian\n"
"Language: pt_BR\n"
@@ -17,75 +17,75 @@ msgstr ""
"X-Crowdin-File: django.po\n"
"X-Crowdin-File-ID: 10\n"
-#: dmoj/settings.py:364
+#: dmoj/settings.py:365
msgid "Catalan"
msgstr ""
-#: dmoj/settings.py:365
+#: dmoj/settings.py:366
msgid "German"
msgstr ""
-#: dmoj/settings.py:366
+#: dmoj/settings.py:367
msgid "English"
msgstr ""
-#: dmoj/settings.py:367
+#: dmoj/settings.py:368
msgid "Spanish"
msgstr ""
-#: dmoj/settings.py:368
+#: dmoj/settings.py:369
msgid "French"
msgstr ""
-#: dmoj/settings.py:369
+#: dmoj/settings.py:370
msgid "Croatian"
msgstr ""
-#: dmoj/settings.py:370
+#: dmoj/settings.py:371
msgid "Hungarian"
msgstr ""
-#: dmoj/settings.py:371
+#: dmoj/settings.py:372
msgid "Japanese"
msgstr ""
-#: dmoj/settings.py:372
+#: dmoj/settings.py:373
msgid "Korean"
msgstr ""
-#: dmoj/settings.py:373
+#: dmoj/settings.py:374
msgid "Brazilian Portuguese"
msgstr ""
-#: dmoj/settings.py:374
+#: dmoj/settings.py:375
msgid "Romanian"
msgstr ""
-#: dmoj/settings.py:375
+#: dmoj/settings.py:376
msgid "Russian"
msgstr ""
-#: dmoj/settings.py:376
+#: dmoj/settings.py:377
msgid "Serbian (Latin)"
msgstr ""
-#: dmoj/settings.py:377
+#: dmoj/settings.py:378
msgid "Turkish"
msgstr ""
-#: dmoj/settings.py:378
+#: dmoj/settings.py:379
msgid "Vietnamese"
msgstr ""
-#: dmoj/settings.py:379
+#: dmoj/settings.py:380
msgid "Simplified Chinese"
msgstr ""
-#: dmoj/settings.py:380
+#: dmoj/settings.py:381
msgid "Traditional Chinese"
msgstr ""
-#: dmoj/urls.py:103 templates/base.html:190
+#: dmoj/urls.py:104 templates/base.html:190
msgid "Home"
msgstr ""
@@ -115,112 +115,112 @@ msgstr ""
msgid "Associated page"
msgstr ""
-#: judge/admin/contest.py:31
+#: judge/admin/contest.py:32
msgid "Included contests"
msgstr ""
-#: judge/admin/contest.py:65 templates/contest/contest.html:83
+#: judge/admin/contest.py:66 templates/contest/contest.html:83
#: templates/contest/moss.html:43 templates/problem/list.html:204
#: templates/problem/list.html:219 templates/user/user-problems.html:58
#: templates/user/user-problems.html:100
msgid "Problem"
msgstr ""
-#: judge/admin/contest.py:114
+#: judge/admin/contest.py:117
msgid "Settings"
msgstr ""
-#: judge/admin/contest.py:116
+#: judge/admin/contest.py:120
msgid "Scheduling"
msgstr ""
-#: judge/admin/contest.py:117
+#: judge/admin/contest.py:121
msgid "Details"
msgstr ""
-#: judge/admin/contest.py:118
+#: judge/admin/contest.py:122
msgid "Format"
msgstr ""
-#: judge/admin/contest.py:119 templates/contest/ranking-table.html:5
+#: judge/admin/contest.py:123 templates/contest/ranking-table.html:5
msgid "Rating"
msgstr ""
-#: judge/admin/contest.py:120
+#: judge/admin/contest.py:124
msgid "Access"
msgstr ""
-#: judge/admin/contest.py:122 judge/admin/problem.py:134
+#: judge/admin/contest.py:126 judge/admin/problem.py:135
msgid "Justice"
msgstr ""
-#: judge/admin/contest.py:211
+#: judge/admin/contest.py:215
#, python-format
msgid "%d contest successfully marked as visible."
msgid_plural "%d contests successfully marked as visible."
msgstr[0] ""
msgstr[1] ""
-#: judge/admin/contest.py:214
+#: judge/admin/contest.py:218
msgid "Mark contests as visible"
msgstr ""
-#: judge/admin/contest.py:220
+#: judge/admin/contest.py:224
#, python-format
msgid "%d contest successfully marked as hidden."
msgid_plural "%d contests successfully marked as hidden."
msgstr[0] ""
msgstr[1] ""
-#: judge/admin/contest.py:223
+#: judge/admin/contest.py:227
msgid "Mark contests as hidden"
msgstr ""
-#: judge/admin/contest.py:229
+#: judge/admin/contest.py:233
#, python-format
msgid "%d contest successfully locked."
msgid_plural "%d contests successfully locked."
msgstr[0] ""
msgstr[1] ""
-#: judge/admin/contest.py:232
+#: judge/admin/contest.py:236
msgid "Lock contest submissions"
msgstr ""
-#: judge/admin/contest.py:238
+#: judge/admin/contest.py:242
#, python-format
msgid "%d contest successfully unlocked."
msgid_plural "%d contests successfully unlocked."
msgstr[0] ""
msgstr[1] ""
-#: judge/admin/contest.py:241
+#: judge/admin/contest.py:245
msgid "Unlock contest submissions"
msgstr ""
-#: judge/admin/contest.py:262 judge/admin/submission.py:170
+#: judge/admin/contest.py:266 judge/admin/submission.py:170
#, python-format
msgid "%d submission was successfully scheduled for rejudging."
msgid_plural "%d submissions were successfully scheduled for rejudging."
msgstr[0] ""
msgstr[1] ""
-#: judge/admin/contest.py:337
+#: judge/admin/contest.py:341
#, python-format
msgid "%d participation recalculated."
msgid_plural "%d participations recalculated."
msgstr[0] ""
msgstr[1] ""
-#: judge/admin/contest.py:340
+#: judge/admin/contest.py:344
msgid "Recalculate results"
msgstr ""
-#: judge/admin/contest.py:344 judge/admin/organization.py:63
+#: judge/admin/contest.py:348 judge/admin/organization.py:63
msgid "username"
msgstr ""
-#: judge/admin/contest.py:349 templates/base.html:258
+#: judge/admin/contest.py:353 templates/base.html:258
msgid "virtual"
msgstr ""
@@ -236,9 +236,9 @@ msgstr ""
msgid "Summary"
msgstr ""
-#: judge/admin/interface.py:113 judge/models/contest.py:383
-#: judge/models/contest.py:509 judge/models/profile.py:244
-#: judge/models/profile.py:268
+#: judge/admin/interface.py:113 judge/models/contest.py:419
+#: judge/models/contest.py:546 judge/models/profile.py:261
+#: judge/models/profile.py:292
msgid "user"
msgstr ""
@@ -246,8 +246,8 @@ msgstr ""
msgid "object"
msgstr ""
-#: judge/admin/organization.py:32 judge/admin/problem.py:181
-#: judge/admin/profile.py:82
+#: judge/admin/organization.py:32 judge/admin/problem.py:182
+#: judge/admin/profile.py:92
msgid "View on site"
msgstr ""
@@ -255,69 +255,69 @@ msgstr ""
msgid "Describe the changes you made (optional)"
msgstr ""
-#: judge/admin/problem.py:129
+#: judge/admin/problem.py:130
msgid "Social Media"
msgstr ""
-#: judge/admin/problem.py:130
+#: judge/admin/problem.py:131
msgid "Taxonomy"
msgstr ""
-#: judge/admin/problem.py:131 templates/contest/contest.html:84
+#: judge/admin/problem.py:132 templates/contest/contest.html:84
#: templates/problem/data.html:385 templates/problem/list.html:209
#: templates/problem/list.html:230 templates/user/base-users-table.html:10
#: templates/user/user-problems.html:60
msgid "Points"
msgstr ""
-#: judge/admin/problem.py:132
+#: judge/admin/problem.py:133
msgid "Limits"
msgstr ""
-#: judge/admin/problem.py:133 judge/admin/submission.py:238
-#: templates/stats/base.html:14 templates/submission/list.html:320
-#: templates/user/edit-profile.html:292
+#: judge/admin/problem.py:134 judge/admin/submission.py:238
+#: templates/stats/base.html:14 templates/submission/list.html:319
+#: templates/user/edit-profile.html:296
msgid "Language"
msgstr ""
-#: judge/admin/problem.py:135
+#: judge/admin/problem.py:136
msgid "History"
msgstr ""
-#: judge/admin/problem.py:178
+#: judge/admin/problem.py:179
msgid "Authors"
msgstr ""
-#: judge/admin/problem.py:191
+#: judge/admin/problem.py:192
#, python-format
msgid "%d problem's publish date successfully updated."
msgid_plural "%d problems' publish date successfully updated."
msgstr[0] ""
msgstr[1] ""
-#: judge/admin/problem.py:195
+#: judge/admin/problem.py:196
msgid "Set publish date to now"
msgstr ""
-#: judge/admin/problem.py:201
+#: judge/admin/problem.py:202
#, python-format
msgid "%d problem successfully marked as public."
msgid_plural "%d problems successfully marked as public."
msgstr[0] ""
msgstr[1] ""
-#: judge/admin/problem.py:205
+#: judge/admin/problem.py:206
msgid "Mark problems as public"
msgstr ""
-#: judge/admin/problem.py:211
+#: judge/admin/problem.py:212
#, python-format
msgid "%d problem successfully marked as private."
msgid_plural "%d problems successfully marked as private."
msgstr[0] ""
msgstr[1] ""
-#: judge/admin/problem.py:215
+#: judge/admin/problem.py:216
msgid "Mark problems as private"
msgstr ""
@@ -325,35 +325,35 @@ msgstr ""
msgid "timezone"
msgstr ""
-#: judge/admin/profile.py:88 judge/admin/submission.py:217
+#: judge/admin/profile.py:98 judge/admin/submission.py:217
#: templates/organization/requests/log.html:9
#: templates/organization/requests/pending.html:12
#: templates/ticket/list.html:261
msgid "User"
msgstr ""
-#: judge/admin/profile.py:93 templates/registration/registration_form.html:143
+#: judge/admin/profile.py:103 templates/registration/registration_form.html:143
msgid "Email"
msgstr ""
-#: judge/admin/profile.py:98 judge/views/register.py:29
+#: judge/admin/profile.py:108 judge/views/register.py:28
#: templates/registration/registration_form.html:171
-#: templates/user/edit-profile.html:288
+#: templates/user/edit-profile.html:292
msgid "Timezone"
msgstr ""
-#: judge/admin/profile.py:103
+#: judge/admin/profile.py:113
msgid "date joined"
msgstr ""
-#: judge/admin/profile.py:110
+#: judge/admin/profile.py:120
#, python-format
msgid "%d user have scores recalculated."
msgid_plural "%d users have scores recalculated."
msgstr[0] ""
msgstr[1] ""
-#: judge/admin/profile.py:113
+#: judge/admin/profile.py:123
msgid "Recalculate scores"
msgstr ""
@@ -506,115 +506,116 @@ msgstr ""
msgid "IOI (pre-2016)"
msgstr ""
-#: judge/forms.py:26
-msgid "Two-factor authentication tokens must be 6 decimal digits."
+#: judge/forms.py:27
+#, python-brace-format
+msgid "Two-factor authentication tokens must be {TOTP_CODE_LENGTH} decimal digits."
msgstr ""
-#: judge/forms.py:29
+#: judge/forms.py:30
msgid "Invalid two-factor authentication token."
msgstr ""
-#: judge/forms.py:32
+#: judge/forms.py:33
msgid "Scratch codes must be 16 base32 characters."
msgstr ""
-#: judge/forms.py:34
+#: judge/forms.py:35 judge/forms.py:264
msgid "Invalid scratch code."
msgstr ""
-#: judge/forms.py:45
+#: judge/forms.py:46
msgid "Subscribe to contest updates"
msgstr ""
-#: judge/forms.py:46
+#: judge/forms.py:47
msgid "Enable experimental features"
msgstr ""
-#: judge/forms.py:71
+#: judge/forms.py:72
msgid "You must solve at least one problem before you can update your profile."
msgstr ""
-#: judge/forms.py:80 judge/views/organization.py:127
+#: judge/forms.py:81 judge/views/organization.py:126
#, python-brace-format
msgid "You may not be part of more than {count} public organizations."
msgstr ""
-#: judge/forms.py:96
+#: judge/forms.py:97
msgid "Download comments?"
msgstr ""
-#: judge/forms.py:97
+#: judge/forms.py:98
msgid "Download submissions?"
msgstr ""
-#: judge/forms.py:98
+#: judge/forms.py:99
msgid "Filter by problem code glob:"
msgstr ""
-#: judge/forms.py:102
+#: judge/forms.py:103
msgid "Leave empty to include all submissions"
msgstr ""
-#: judge/forms.py:105 templates/problem/manage_submission.html:142
+#: judge/forms.py:106 templates/problem/manage_submission.html:142
msgid "Filter by result:"
msgstr ""
-#: judge/forms.py:111
+#: judge/forms.py:112
msgid "Please select at least one thing to download."
msgstr ""
-#: judge/forms.py:137
+#: judge/forms.py:138
msgid "Any judge"
msgstr ""
-#: judge/forms.py:167 judge/views/register.py:26
+#: judge/forms.py:159 judge/views/register.py:25
#: templates/registration/registration_form.html:137
#: templates/user/base-users-table.html:5
msgid "Username"
msgstr ""
-#: judge/forms.py:168 templates/registration/registration_form.html:149
+#: judge/forms.py:160 templates/registration/registration_form.html:149
#: templates/registration/registration_form.html:163
msgid "Password"
msgstr ""
-#: judge/forms.py:201
+#: judge/forms.py:192
msgid "Invalid code length."
msgstr ""
-#: judge/forms.py:219
+#: judge/forms.py:223
msgid "Invalid WebAuthn response."
msgstr ""
-#: judge/forms.py:222
+#: judge/forms.py:226
msgid "No WebAuthn challenge issued."
msgstr ""
-#: judge/forms.py:228
+#: judge/forms.py:232
msgid "Invalid WebAuthn credential ID."
msgstr ""
-#: judge/forms.py:257
+#: judge/forms.py:262
msgid "Invalid two-factor authentication token or scratch code."
msgstr ""
-#: judge/forms.py:259
+#: judge/forms.py:266
msgid "Must specify either totp_token or webauthn_response."
msgstr ""
-#: judge/forms.py:263 judge/models/problem.py:105
+#: judge/forms.py:270 judge/models/problem.py:119
msgid "Problem code must be ^[a-z0-9]+$"
msgstr ""
-#: judge/forms.py:268
+#: judge/forms.py:275
msgid "Problem with code already exists."
msgstr ""
-#: judge/forms.py:273 judge/models/contest.py:66
+#: judge/forms.py:280 judge/models/contest.py:66
msgid "Contest id must be ^[a-z0-9]+$"
msgstr ""
-#: judge/forms.py:278
+#: judge/forms.py:285
msgid "Contest with key already exists."
msgstr ""
@@ -694,7 +695,7 @@ msgid "comments"
msgstr ""
#: judge/models/comment.py:89 judge/models/comment.py:141
-#: judge/models/problem.py:484
+#: judge/models/problem.py:511
#, python-format
msgid "Editorial for %s"
msgstr ""
@@ -735,7 +736,7 @@ msgstr ""
msgid "contest tag"
msgstr ""
-#: judge/models/contest.py:53 judge/models/contest.py:117
+#: judge/models/contest.py:53 judge/models/contest.py:126
msgid "contest tags"
msgstr ""
@@ -760,410 +761,426 @@ msgid "contest name"
msgstr ""
#: judge/models/contest.py:68
-msgid "These people will be able to edit the contest."
+msgid "These users will be able to edit the contest."
msgstr ""
-#: judge/models/contest.py:70 judge/models/runtime.py:136
+#: judge/models/contest.py:70
+msgid "These users will be able to edit the contest, but will not be listed as authors."
+msgstr ""
+
+#: judge/models/contest.py:73
+msgid "These users will be able to view the contest, but not edit it."
+msgstr ""
+
+#: judge/models/contest.py:76 judge/models/runtime.py:136
msgid "description"
msgstr ""
-#: judge/models/contest.py:71 judge/models/problem.py:431
+#: judge/models/contest.py:77 judge/models/problem.py:458
#: judge/models/runtime.py:138
msgid "problems"
msgstr ""
-#: judge/models/contest.py:72 judge/models/contest.py:384
+#: judge/models/contest.py:78 judge/models/contest.py:420
msgid "start time"
msgstr ""
-#: judge/models/contest.py:73
+#: judge/models/contest.py:79
msgid "end time"
msgstr ""
-#: judge/models/contest.py:74 judge/models/problem.py:126
-#: judge/models/problem.py:455
+#: judge/models/contest.py:80 judge/models/problem.py:140
+#: judge/models/problem.py:482
msgid "time limit"
msgstr ""
-#: judge/models/contest.py:75 judge/models/problem.py:144
+#: judge/models/contest.py:81 judge/models/problem.py:158
msgid "publicly visible"
msgstr ""
-#: judge/models/contest.py:76
+#: judge/models/contest.py:82
msgid "Should be set even for organization-private contests, where it determines whether the contest is visible to members of the specified organizations."
msgstr ""
-#: judge/models/contest.py:79
+#: judge/models/contest.py:85
msgid "contest rated"
msgstr ""
-#: judge/models/contest.py:79
+#: judge/models/contest.py:85
msgid "Whether this contest can be rated."
msgstr ""
-#: judge/models/contest.py:81
+#: judge/models/contest.py:87
msgid "view contest scoreboard"
msgstr ""
-#: judge/models/contest.py:83
+#: judge/models/contest.py:89
msgid "These users will be able to view the scoreboard."
msgstr ""
-#: judge/models/contest.py:84
+#: judge/models/contest.py:90
msgid "scoreboard visibility"
msgstr ""
-#: judge/models/contest.py:85
+#: judge/models/contest.py:91
msgid "Scoreboard visibility through the duration of the contest"
msgstr ""
-#: judge/models/contest.py:87
+#: judge/models/contest.py:93
msgid "no comments"
msgstr ""
-#: judge/models/contest.py:88
+#: judge/models/contest.py:94
msgid "Use clarification system instead of comments."
msgstr ""
-#: judge/models/contest.py:90
+#: judge/models/contest.py:96
msgid "Rating floor for contest"
msgstr ""
-#: judge/models/contest.py:92
+#: judge/models/contest.py:98
msgid "Rating ceiling for contest"
msgstr ""
-#: judge/models/contest.py:94
+#: judge/models/contest.py:100
msgid "rate all"
msgstr ""
-#: judge/models/contest.py:94
+#: judge/models/contest.py:100
msgid "Rate all users who joined."
msgstr ""
-#: judge/models/contest.py:95
+#: judge/models/contest.py:101
msgid "exclude from ratings"
msgstr ""
-#: judge/models/contest.py:97
+#: judge/models/contest.py:103
msgid "private to specific users"
msgstr ""
-#: judge/models/contest.py:98
+#: judge/models/contest.py:104
msgid "private contestants"
msgstr ""
-#: judge/models/contest.py:99
+#: judge/models/contest.py:105
msgid "If private, only these users may see the contest"
msgstr ""
-#: judge/models/contest.py:101
+#: judge/models/contest.py:107
msgid "hide problem tags"
msgstr ""
-#: judge/models/contest.py:102
+#: judge/models/contest.py:108
msgid "Whether problem tags should be hidden by default."
msgstr ""
-#: judge/models/contest.py:104
+#: judge/models/contest.py:110
+msgid "hide problem authors"
+msgstr ""
+
+#: judge/models/contest.py:111
+msgid "Whether problem authors should be hidden by default."
+msgstr ""
+
+#: judge/models/contest.py:113
msgid "run pretests only"
msgstr ""
-#: judge/models/contest.py:105
+#: judge/models/contest.py:114
msgid "Whether judges should grade pretests only, versus all testcases. Commonly set during a contest, then unset prior to rejudging user submissions when the contest ends."
msgstr ""
-#: judge/models/contest.py:109 judge/models/problem.py:166
+#: judge/models/contest.py:118 judge/models/problem.py:183
msgid "private to organizations"
msgstr ""
-#: judge/models/contest.py:110 judge/models/problem.py:164
-#: judge/models/profile.py:83
+#: judge/models/contest.py:119 judge/models/problem.py:181
+#: judge/models/profile.py:86
msgid "organizations"
msgstr ""
-#: judge/models/contest.py:111
+#: judge/models/contest.py:120
msgid "If private, only these organizations may see the contest"
msgstr ""
-#: judge/models/contest.py:112 judge/models/problem.py:153
+#: judge/models/contest.py:121 judge/models/problem.py:167
msgid "OpenGraph image"
msgstr ""
-#: judge/models/contest.py:113 judge/models/profile.py:54
+#: judge/models/contest.py:122 judge/models/profile.py:57
msgid "Logo override image"
msgstr ""
-#: judge/models/contest.py:115
+#: judge/models/contest.py:124
msgid "This image will replace the default site logo for users inside the contest."
msgstr ""
-#: judge/models/contest.py:118
+#: judge/models/contest.py:127
msgid "the amount of live participants"
msgstr ""
-#: judge/models/contest.py:119
+#: judge/models/contest.py:128
msgid "contest summary"
msgstr ""
-#: judge/models/contest.py:120 judge/models/problem.py:155
+#: judge/models/contest.py:129 judge/models/problem.py:169
msgid "Plain-text, shown in meta description tag, e.g. for social media."
msgstr ""
-#: judge/models/contest.py:121 judge/models/profile.py:53
+#: judge/models/contest.py:130 judge/models/profile.py:56
msgid "access code"
msgstr ""
-#: judge/models/contest.py:122
+#: judge/models/contest.py:131
msgid "An optional code to prompt contestants before they are allowed to join the contest. Leave it blank to disable."
msgstr ""
-#: judge/models/contest.py:124 judge/models/problem.py:149
+#: judge/models/contest.py:133 judge/models/problem.py:163
msgid "personae non gratae"
msgstr ""
-#: judge/models/contest.py:125
+#: judge/models/contest.py:134
msgid "Bans the selected users from joining this contest."
msgstr ""
-#: judge/models/contest.py:126
+#: judge/models/contest.py:135
msgid "contest format"
msgstr ""
-#: judge/models/contest.py:127
+#: judge/models/contest.py:136
msgid "The contest format module to use."
msgstr ""
-#: judge/models/contest.py:128
+#: judge/models/contest.py:137
msgid "contest format configuration"
msgstr ""
-#: judge/models/contest.py:129
+#: judge/models/contest.py:138
msgid "A JSON object to serve as the configuration for the chosen contest format module. Leave empty to use None. Exact format depends on the contest format selected."
msgstr ""
-#: judge/models/contest.py:136
+#: judge/models/contest.py:145
msgid "contest lock"
msgstr ""
-#: judge/models/contest.py:137
-msgid "Prevent submissions from this contest from being rejudged."
+#: judge/models/contest.py:146
+msgid "Prevent submissions from this contest from being rejudged after this date."
msgstr ""
-#: judge/models/contest.py:138
+#: judge/models/contest.py:148
msgid "precision points"
msgstr ""
-#: judge/models/contest.py:140
+#: judge/models/contest.py:150
msgid "Number of digits to round points to."
msgstr ""
-#: judge/models/contest.py:362
+#: judge/models/contest.py:398
msgid "See private contests"
msgstr ""
-#: judge/models/contest.py:363
+#: judge/models/contest.py:399
msgid "Edit own contests"
msgstr ""
-#: judge/models/contest.py:364
+#: judge/models/contest.py:400
msgid "Edit all contests"
msgstr ""
-#: judge/models/contest.py:365
+#: judge/models/contest.py:401
msgid "Clone contest"
msgstr ""
-#: judge/models/contest.py:366 templates/contest/moss.html:74
+#: judge/models/contest.py:402 templates/contest/moss.html:74
msgid "MOSS contest"
msgstr ""
-#: judge/models/contest.py:367
+#: judge/models/contest.py:403
msgid "Rate contests"
msgstr ""
-#: judge/models/contest.py:368
+#: judge/models/contest.py:404
msgid "Contest access codes"
msgstr ""
-#: judge/models/contest.py:369
+#: judge/models/contest.py:405
msgid "Create private contests"
msgstr ""
-#: judge/models/contest.py:370
+#: judge/models/contest.py:406
msgid "Change contest visibility"
msgstr ""
-#: judge/models/contest.py:371
+#: judge/models/contest.py:407
msgid "Edit contest problem label script"
msgstr ""
-#: judge/models/contest.py:372
+#: judge/models/contest.py:408
msgid "Change lock status of contest"
msgstr ""
-#: judge/models/contest.py:374 judge/models/contest.py:472
-#: judge/models/contest.py:510 judge/models/contest.py:532
-#: judge/models/submission.py:84
+#: judge/models/contest.py:410 judge/models/contest.py:508
+#: judge/models/contest.py:547 judge/models/contest.py:569
+#: judge/models/submission.py:85
msgid "contest"
msgstr ""
-#: judge/models/contest.py:375
+#: judge/models/contest.py:411
msgid "contests"
msgstr ""
-#: judge/models/contest.py:382
+#: judge/models/contest.py:418
msgid "associated contest"
msgstr ""
-#: judge/models/contest.py:385
+#: judge/models/contest.py:421
msgid "score"
msgstr ""
-#: judge/models/contest.py:386
+#: judge/models/contest.py:422
msgid "cumulative time"
msgstr ""
-#: judge/models/contest.py:387
+#: judge/models/contest.py:423
msgid "is disqualified"
msgstr ""
-#: judge/models/contest.py:388
+#: judge/models/contest.py:424
msgid "Whether this participation is disqualified."
msgstr ""
-#: judge/models/contest.py:389
+#: judge/models/contest.py:425
msgid "tie-breaking field"
msgstr ""
-#: judge/models/contest.py:390
+#: judge/models/contest.py:426
msgid "virtual participation id"
msgstr ""
-#: judge/models/contest.py:391
+#: judge/models/contest.py:427
msgid "0 means non-virtual, otherwise the n-th virtual participation."
msgstr ""
-#: judge/models/contest.py:392
+#: judge/models/contest.py:428
msgid "contest format specific data"
msgstr ""
-#: judge/models/contest.py:458
+#: judge/models/contest.py:494
#, python-format
msgid "%s spectating in %s"
msgstr ""
-#: judge/models/contest.py:460
+#: judge/models/contest.py:496
#, python-format
msgid "%s in %s, v%d"
msgstr ""
-#: judge/models/contest.py:461
+#: judge/models/contest.py:497
#, python-format
msgid "%s in %s"
msgstr ""
-#: judge/models/contest.py:464
+#: judge/models/contest.py:500
msgid "contest participation"
msgstr ""
-#: judge/models/contest.py:465
+#: judge/models/contest.py:501
msgid "contest participations"
msgstr ""
-#: judge/models/contest.py:471 judge/models/contest.py:494
-#: judge/models/contest.py:533 judge/models/problem.py:430
-#: judge/models/problem.py:435 judge/models/problem.py:453
+#: judge/models/contest.py:507 judge/models/contest.py:531
+#: judge/models/contest.py:570 judge/models/problem.py:457
+#: judge/models/problem.py:462 judge/models/problem.py:480
#: judge/models/problem_data.py:35
msgid "problem"
msgstr ""
-#: judge/models/contest.py:473 judge/models/contest.py:498
-#: judge/models/problem.py:137
+#: judge/models/contest.py:509 judge/models/contest.py:535
+#: judge/models/problem.py:151
msgid "points"
msgstr ""
-#: judge/models/contest.py:474
+#: judge/models/contest.py:510
msgid "partial"
msgstr ""
-#: judge/models/contest.py:475 judge/models/contest.py:499
+#: judge/models/contest.py:511 judge/models/contest.py:536
msgid "is pretested"
msgstr ""
-#: judge/models/contest.py:476 judge/models/interface.py:43
+#: judge/models/contest.py:512 judge/models/interface.py:43
msgid "order"
msgstr ""
-#: judge/models/contest.py:477
+#: judge/models/contest.py:513
msgid "output prefix length override"
msgstr ""
-#: judge/models/contest.py:479
+#: judge/models/contest.py:515
msgid "Maximum number of submissions for this problem, or leave blank for no limit."
msgstr ""
-#: judge/models/contest.py:482
+#: judge/models/contest.py:518
msgid "Why include a problem you can't submit to?"
msgstr ""
-#: judge/models/contest.py:487
+#: judge/models/contest.py:523
msgid "contest problem"
msgstr ""
-#: judge/models/contest.py:488
+#: judge/models/contest.py:524
msgid "contest problems"
msgstr ""
-#: judge/models/contest.py:492 judge/models/submission.py:207
+#: judge/models/contest.py:529 judge/models/submission.py:218
msgid "submission"
msgstr ""
-#: judge/models/contest.py:496 judge/models/contest.py:511
+#: judge/models/contest.py:533 judge/models/contest.py:548
msgid "participation"
msgstr ""
-#: judge/models/contest.py:500
+#: judge/models/contest.py:537
msgid "Whether this submission was ran only on pretests."
msgstr ""
-#: judge/models/contest.py:504
+#: judge/models/contest.py:541
msgid "contest submission"
msgstr ""
-#: judge/models/contest.py:505
+#: judge/models/contest.py:542
msgid "contest submissions"
msgstr ""
-#: judge/models/contest.py:513
+#: judge/models/contest.py:550
msgid "rank"
msgstr ""
-#: judge/models/contest.py:514
+#: judge/models/contest.py:551
msgid "rating"
msgstr ""
-#: judge/models/contest.py:515
+#: judge/models/contest.py:552
msgid "volatility"
msgstr ""
-#: judge/models/contest.py:516
+#: judge/models/contest.py:553
msgid "last rated"
msgstr ""
-#: judge/models/contest.py:520
+#: judge/models/contest.py:557
msgid "contest rating"
msgstr ""
-#: judge/models/contest.py:521
+#: judge/models/contest.py:558
msgid "contest ratings"
msgstr ""
-#: judge/models/contest.py:540
+#: judge/models/contest.py:577
msgid "contest moss result"
msgstr ""
-#: judge/models/contest.py:541
+#: judge/models/contest.py:578
msgid "contest moss results"
msgstr ""
@@ -1203,7 +1220,7 @@ msgstr ""
msgid "post title"
msgstr ""
-#: judge/models/interface.py:67 judge/models/problem.py:473
+#: judge/models/interface.py:67 judge/models/problem.py:500
msgid "authors"
msgstr ""
@@ -1211,7 +1228,7 @@ msgstr ""
msgid "slug"
msgstr ""
-#: judge/models/interface.py:69 judge/models/problem.py:471
+#: judge/models/interface.py:69 judge/models/problem.py:498
msgid "public visibility"
msgstr ""
@@ -1247,34 +1264,6 @@ msgstr ""
msgid "blog posts"
msgstr ""
-#: judge/models/message.py:11
-msgid "message title"
-msgstr ""
-
-#: judge/models/message.py:12 judge/models/ticket.py:30
-msgid "message body"
-msgstr ""
-
-#: judge/models/message.py:13
-msgid "sender"
-msgstr ""
-
-#: judge/models/message.py:14
-msgid "target"
-msgstr ""
-
-#: judge/models/message.py:15
-msgid "message timestamp"
-msgstr ""
-
-#: judge/models/message.py:16
-msgid "read"
-msgstr ""
-
-#: judge/models/message.py:20
-msgid "messages in the thread"
-msgstr ""
-
#: judge/models/problem.py:30
#, python-format
msgid "Disallowed characters: %(value)s"
@@ -1292,7 +1281,7 @@ msgstr ""
msgid "problem type"
msgstr ""
-#: judge/models/problem.py:44 judge/models/problem.py:121
+#: judge/models/problem.py:44 judge/models/problem.py:135
msgid "problem types"
msgstr ""
@@ -1304,7 +1293,7 @@ msgstr ""
msgid "problem group name"
msgstr ""
-#: judge/models/problem.py:56 judge/models/problem.py:124
+#: judge/models/problem.py:56 judge/models/problem.py:138
msgid "problem group"
msgstr ""
@@ -1324,7 +1313,7 @@ msgstr ""
msgid "full name"
msgstr ""
-#: judge/models/problem.py:65 judge/models/profile.py:41
+#: judge/models/problem.py:65 judge/models/profile.py:44
#: judge/models/runtime.py:24
msgid "short name"
msgstr ""
@@ -1353,232 +1342,252 @@ msgstr ""
msgid "licenses"
msgstr ""
-#: judge/models/problem.py:104
+#: judge/models/problem.py:112
+msgid "Follow global setting"
+msgstr ""
+
+#: judge/models/problem.py:113
+msgid "Always visible"
+msgstr ""
+
+#: judge/models/problem.py:114
+msgid "Visible if problem solved"
+msgstr ""
+
+#: judge/models/problem.py:115
+msgid "Only own submissions"
+msgstr ""
+
+#: judge/models/problem.py:118
msgid "problem code"
msgstr ""
-#: judge/models/problem.py:106
+#: judge/models/problem.py:120
msgid "A short, unique code for the problem, used in the url after /problem/"
msgstr ""
-#: judge/models/problem.py:108
+#: judge/models/problem.py:122
msgid "problem name"
msgstr ""
-#: judge/models/problem.py:109
+#: judge/models/problem.py:123
msgid "The full name of the problem, as shown in the problem list."
msgstr ""
-#: judge/models/problem.py:111
+#: judge/models/problem.py:125
msgid "problem body"
msgstr ""
-#: judge/models/problem.py:112
+#: judge/models/problem.py:126
msgid "creators"
msgstr ""
-#: judge/models/problem.py:113
+#: judge/models/problem.py:127
msgid "These users will be able to edit the problem, and be listed as authors."
msgstr ""
-#: judge/models/problem.py:115
+#: judge/models/problem.py:129
msgid "curators"
msgstr ""
-#: judge/models/problem.py:116
+#: judge/models/problem.py:130
msgid "These users will be able to edit the problem, but not be listed as authors."
msgstr ""
-#: judge/models/problem.py:118
+#: judge/models/problem.py:132
msgid "testers"
msgstr ""
-#: judge/models/problem.py:120
+#: judge/models/problem.py:134
msgid "These users will be able to view the private problem, but not edit it."
msgstr ""
-#: judge/models/problem.py:122
+#: judge/models/problem.py:136
msgid "The type of problem, as shown on the problem's page."
msgstr ""
-#: judge/models/problem.py:125
+#: judge/models/problem.py:139
msgid "The group of problem, shown under Category in the problem list."
msgstr ""
-#: judge/models/problem.py:127
+#: judge/models/problem.py:141
msgid "The time limit for this problem, in seconds. Fractional seconds (e.g. 1.5) are supported."
msgstr ""
-#: judge/models/problem.py:131 judge/models/problem.py:458
+#: judge/models/problem.py:145 judge/models/problem.py:485
msgid "memory limit"
msgstr ""
-#: judge/models/problem.py:132
+#: judge/models/problem.py:146
msgid "The memory limit for this problem, in kilobytes (e.g. 64mb = 65536 kilobytes)."
msgstr ""
-#: judge/models/problem.py:138
+#: judge/models/problem.py:152
msgid "Points awarded for problem completion. Points are displayed with a 'p' suffix if partial."
msgstr ""
-#: judge/models/problem.py:141
+#: judge/models/problem.py:155
msgid "allows partial points"
msgstr ""
-#: judge/models/problem.py:142
+#: judge/models/problem.py:156
msgid "allowed languages"
msgstr ""
-#: judge/models/problem.py:143
+#: judge/models/problem.py:157
msgid "List of allowed submission languages."
msgstr ""
-#: judge/models/problem.py:145
+#: judge/models/problem.py:159
msgid "manually managed"
msgstr ""
-#: judge/models/problem.py:146
+#: judge/models/problem.py:160
msgid "Whether judges should be allowed to manage data or not."
msgstr ""
-#: judge/models/problem.py:147
+#: judge/models/problem.py:161
msgid "date of publishing"
msgstr ""
-#: judge/models/problem.py:148
+#: judge/models/problem.py:162
msgid "Doesn't have magic ability to auto-publish due to backward compatibility"
msgstr ""
-#: judge/models/problem.py:150
+#: judge/models/problem.py:164
msgid "Bans the selected users from submitting to this problem."
msgstr ""
-#: judge/models/problem.py:152
+#: judge/models/problem.py:166
msgid "The license under which this problem is published."
msgstr ""
-#: judge/models/problem.py:154
+#: judge/models/problem.py:168
msgid "problem summary"
msgstr ""
-#: judge/models/problem.py:156
+#: judge/models/problem.py:170
msgid "number of users"
msgstr ""
-#: judge/models/problem.py:157
+#: judge/models/problem.py:171
msgid "The number of users who solved the problem."
msgstr ""
-#: judge/models/problem.py:158
+#: judge/models/problem.py:172
msgid "solve rate"
msgstr ""
-#: judge/models/problem.py:159
+#: judge/models/problem.py:173
msgid "allow full markdown access"
msgstr ""
-#: judge/models/problem.py:165
+#: judge/models/problem.py:174
+msgid "submission source visibility"
+msgstr ""
+
+#: judge/models/problem.py:182
msgid "If private, only these organizations may see the problem."
msgstr ""
-#: judge/models/problem.py:420
+#: judge/models/problem.py:447
msgid "See hidden problems"
msgstr ""
-#: judge/models/problem.py:421
+#: judge/models/problem.py:448
msgid "Edit own problems"
msgstr ""
-#: judge/models/problem.py:422
+#: judge/models/problem.py:449
msgid "Edit all problems"
msgstr ""
-#: judge/models/problem.py:423
+#: judge/models/problem.py:450
msgid "Edit all public problems"
msgstr ""
-#: judge/models/problem.py:424
+#: judge/models/problem.py:451
msgid "Edit problems with full markup"
msgstr ""
-#: judge/models/problem.py:425 templates/problem/problem.html:161
+#: judge/models/problem.py:452 templates/problem/problem.html:161
msgid "Clone problem"
msgstr ""
-#: judge/models/problem.py:426
+#: judge/models/problem.py:453
msgid "Change is_public field"
msgstr ""
-#: judge/models/problem.py:427
+#: judge/models/problem.py:454
msgid "Change is_manually_managed field"
msgstr ""
-#: judge/models/problem.py:428
+#: judge/models/problem.py:455
msgid "See organization-private problems"
msgstr ""
-#: judge/models/problem.py:436 judge/models/problem.py:454
+#: judge/models/problem.py:463 judge/models/problem.py:481
#: judge/models/runtime.py:111
msgid "language"
msgstr ""
-#: judge/models/problem.py:437
+#: judge/models/problem.py:464
msgid "translated name"
msgstr ""
-#: judge/models/problem.py:438
+#: judge/models/problem.py:465
msgid "translated description"
msgstr ""
-#: judge/models/problem.py:442
+#: judge/models/problem.py:469
msgid "problem translation"
msgstr ""
-#: judge/models/problem.py:443
+#: judge/models/problem.py:470
msgid "problem translations"
msgstr ""
-#: judge/models/problem.py:447
+#: judge/models/problem.py:474
msgid "clarified problem"
msgstr ""
-#: judge/models/problem.py:448
+#: judge/models/problem.py:475
msgid "clarification body"
msgstr ""
-#: judge/models/problem.py:449
+#: judge/models/problem.py:476
msgid "clarification timestamp"
msgstr ""
-#: judge/models/problem.py:464
+#: judge/models/problem.py:491
msgid "language-specific resource limit"
msgstr ""
-#: judge/models/problem.py:465
+#: judge/models/problem.py:492
msgid "language-specific resource limits"
msgstr ""
-#: judge/models/problem.py:469
+#: judge/models/problem.py:496
msgid "associated problem"
msgstr ""
-#: judge/models/problem.py:472
+#: judge/models/problem.py:499
msgid "publish date"
msgstr ""
-#: judge/models/problem.py:474
+#: judge/models/problem.py:501
msgid "editorial content"
msgstr ""
-#: judge/models/problem.py:497
+#: judge/models/problem.py:524
msgid "See hidden solutions"
msgstr ""
-#: judge/models/problem.py:499
+#: judge/models/problem.py:526
msgid "solution"
msgstr ""
-#: judge/models/problem.py:500
+#: judge/models/problem.py:527
msgid "solutions"
msgstr ""
@@ -1690,112 +1699,112 @@ msgstr ""
msgid "case is pretest?"
msgstr ""
-#: judge/models/profile.py:38
+#: judge/models/profile.py:41
msgid "organization title"
msgstr ""
-#: judge/models/profile.py:39
+#: judge/models/profile.py:42
msgid "organization slug"
msgstr ""
-#: judge/models/profile.py:40
+#: judge/models/profile.py:43
msgid "Organization name shown in URL"
msgstr ""
-#: judge/models/profile.py:42
+#: judge/models/profile.py:45
msgid "Displayed beside user name during contests"
msgstr ""
-#: judge/models/profile.py:43
+#: judge/models/profile.py:46
msgid "organization description"
msgstr ""
-#: judge/models/profile.py:44
+#: judge/models/profile.py:47
msgid "administrators"
msgstr ""
-#: judge/models/profile.py:45
+#: judge/models/profile.py:48
msgid "Those who can edit this organization"
msgstr ""
-#: judge/models/profile.py:46
+#: judge/models/profile.py:49
msgid "creation date"
msgstr ""
-#: judge/models/profile.py:47
+#: judge/models/profile.py:50
msgid "is open organization?"
msgstr ""
-#: judge/models/profile.py:48
+#: judge/models/profile.py:51
msgid "Allow joining organization"
msgstr ""
-#: judge/models/profile.py:49
+#: judge/models/profile.py:52
msgid "maximum size"
msgstr ""
-#: judge/models/profile.py:50
+#: judge/models/profile.py:53
msgid "Maximum amount of users in this organization, only applicable to private organizations"
msgstr ""
-#: judge/models/profile.py:52
+#: judge/models/profile.py:55
msgid "Student access code"
msgstr ""
-#: judge/models/profile.py:56
+#: judge/models/profile.py:59
msgid "This image will replace the default site logo for users viewing the organization."
msgstr ""
-#: judge/models/profile.py:79
+#: judge/models/profile.py:82
msgid "Administer organizations"
msgstr ""
-#: judge/models/profile.py:80
+#: judge/models/profile.py:83
msgid "Edit all organizations"
msgstr ""
-#: judge/models/profile.py:82 judge/models/profile.py:99
-#: judge/models/profile.py:269
+#: judge/models/profile.py:85 judge/models/profile.py:102
+#: judge/models/profile.py:293
msgid "organization"
msgstr ""
-#: judge/models/profile.py:87
+#: judge/models/profile.py:90
msgid "user associated"
msgstr ""
-#: judge/models/profile.py:88
+#: judge/models/profile.py:91
msgid "self-description"
msgstr ""
-#: judge/models/profile.py:89
+#: judge/models/profile.py:92
msgid "location"
msgstr ""
-#: judge/models/profile.py:91
+#: judge/models/profile.py:94
msgid "preferred language"
msgstr ""
-#: judge/models/profile.py:97
+#: judge/models/profile.py:100
msgid "last access time"
msgstr ""
-#: judge/models/profile.py:98
+#: judge/models/profile.py:101
msgid "last IP"
msgstr ""
-#: judge/models/profile.py:101
+#: judge/models/profile.py:104
msgid "display rank"
msgstr ""
-#: judge/models/profile.py:103
+#: judge/models/profile.py:106
msgid "Normal User"
msgstr ""
-#: judge/models/profile.py:104
+#: judge/models/profile.py:107
msgid "Problem Setter"
msgstr ""
-#: judge/models/profile.py:105 templates/base.html:220
+#: judge/models/profile.py:108 templates/base.html:220
#: templates/comments/list.html:99 templates/contest/contest-list-tabs.html:24
#: templates/contest/ranking-table.html:49
#: templates/problem/problem-list-tabs.html:6
@@ -1804,155 +1813,167 @@ msgstr ""
msgid "Admin"
msgstr ""
-#: judge/models/profile.py:106
+#: judge/models/profile.py:109
msgid "comment mute"
msgstr ""
-#: judge/models/profile.py:106
+#: judge/models/profile.py:109
msgid "Some users are at their best when silent."
msgstr ""
-#: judge/models/profile.py:108
+#: judge/models/profile.py:111
msgid "unlisted user"
msgstr ""
-#: judge/models/profile.py:108
+#: judge/models/profile.py:111
msgid "User will not be ranked."
msgstr ""
-#: judge/models/profile.py:111
+#: judge/models/profile.py:114
msgid "user script"
msgstr ""
-#: judge/models/profile.py:112
+#: judge/models/profile.py:115
msgid "User-defined JavaScript for site customization."
msgstr ""
-#: judge/models/profile.py:113
+#: judge/models/profile.py:116
msgid "current contest"
msgstr ""
-#: judge/models/profile.py:115
+#: judge/models/profile.py:118
msgid "math engine"
msgstr ""
-#: judge/models/profile.py:117
+#: judge/models/profile.py:120
msgid "the rendering engine used to render math"
msgstr ""
-#: judge/models/profile.py:118
+#: judge/models/profile.py:121
msgid "TOTP 2FA enabled"
msgstr ""
-#: judge/models/profile.py:119
+#: judge/models/profile.py:122
msgid "check to enable TOTP-based two-factor authentication"
msgstr ""
-#: judge/models/profile.py:120
+#: judge/models/profile.py:123
msgid "WebAuthn 2FA enabled"
msgstr ""
-#: judge/models/profile.py:121
+#: judge/models/profile.py:124
msgid "check to enable WebAuthn-based two-factor authentication"
msgstr ""
-#: judge/models/profile.py:122
+#: judge/models/profile.py:125
msgid "TOTP key"
msgstr ""
-#: judge/models/profile.py:123
+#: judge/models/profile.py:126
msgid "32 character base32-encoded key for TOTP"
msgstr ""
-#: judge/models/profile.py:125
+#: judge/models/profile.py:128
msgid "TOTP key must be empty or base32"
msgstr ""
-#: judge/models/profile.py:126
+#: judge/models/profile.py:129
msgid "scratch codes"
msgstr ""
-#: judge/models/profile.py:127
+#: judge/models/profile.py:130
msgid "JSON array of 16 character base32-encoded codes for scratch codes"
msgstr ""
-#: judge/models/profile.py:131
+#: judge/models/profile.py:134
msgid "Scratch codes must be empty or a JSON array of 16-character base32 codes"
msgstr ""
-#: judge/models/profile.py:133
+#: judge/models/profile.py:136
+msgid "last TOTP timecode"
+msgstr ""
+
+#: judge/models/profile.py:137
msgid "API token"
msgstr ""
-#: judge/models/profile.py:134
+#: judge/models/profile.py:138
msgid "64 character hex-encoded API access token"
msgstr ""
-#: judge/models/profile.py:136
+#: judge/models/profile.py:140
msgid "API token must be None or hexadecimal"
msgstr ""
-#: judge/models/profile.py:137
+#: judge/models/profile.py:141
msgid "internal notes"
msgstr ""
-#: judge/models/profile.py:138
+#: judge/models/profile.py:142
msgid "Notes for administrators regarding this user."
msgstr ""
-#: judge/models/profile.py:139
+#: judge/models/profile.py:143
msgid "last data download time"
msgstr ""
-#: judge/models/profile.py:236
+#: judge/models/profile.py:253
msgid "Shows in-progress development stuff"
msgstr ""
-#: judge/models/profile.py:237
+#: judge/models/profile.py:254
msgid "Edit TOTP settings"
msgstr ""
-#: judge/models/profile.py:239
+#: judge/models/profile.py:256
msgid "user profile"
msgstr ""
-#: judge/models/profile.py:240
+#: judge/models/profile.py:257
msgid "user profiles"
msgstr ""
-#: judge/models/profile.py:246
+#: judge/models/profile.py:263
msgid "device name"
msgstr ""
-#: judge/models/profile.py:247
+#: judge/models/profile.py:264
msgid "credential ID"
msgstr ""
-#: judge/models/profile.py:248
+#: judge/models/profile.py:265
msgid "public key"
msgstr ""
-#: judge/models/profile.py:249
+#: judge/models/profile.py:266
msgid "sign counter"
msgstr ""
-#: judge/models/profile.py:271
+#: judge/models/profile.py:287
+msgid "WebAuthn credential"
+msgstr ""
+
+#: judge/models/profile.py:288
+msgid "WebAuthn credentials"
+msgstr ""
+
+#: judge/models/profile.py:295
msgid "request time"
msgstr ""
-#: judge/models/profile.py:272
+#: judge/models/profile.py:296
msgid "state"
msgstr ""
-#: judge/models/profile.py:277
+#: judge/models/profile.py:301
msgid "reason"
msgstr ""
-#: judge/models/profile.py:280
+#: judge/models/profile.py:304
msgid "organization join request"
msgstr ""
-#: judge/models/profile.py:281
+#: judge/models/profile.py:305
msgid "organization join requests"
msgstr ""
@@ -2108,210 +2129,210 @@ msgstr ""
msgid "judge"
msgstr ""
-#: judge/models/submission.py:20 judge/models/submission.py:47
+#: judge/models/submission.py:21 judge/models/submission.py:48
#: judge/utils/problems.py:74
msgid "Accepted"
msgstr ""
-#: judge/models/submission.py:21 judge/models/submission.py:48
+#: judge/models/submission.py:22 judge/models/submission.py:49
msgid "Wrong Answer"
msgstr ""
-#: judge/models/submission.py:22 judge/models/submission.py:50
+#: judge/models/submission.py:23 judge/models/submission.py:51
msgid "Time Limit Exceeded"
msgstr ""
-#: judge/models/submission.py:23 judge/models/submission.py:51
+#: judge/models/submission.py:24 judge/models/submission.py:52
msgid "Memory Limit Exceeded"
msgstr ""
-#: judge/models/submission.py:24 judge/models/submission.py:52
+#: judge/models/submission.py:25 judge/models/submission.py:53
msgid "Output Limit Exceeded"
msgstr ""
-#: judge/models/submission.py:25 judge/models/submission.py:53
+#: judge/models/submission.py:26 judge/models/submission.py:54
msgid "Invalid Return"
msgstr ""
-#: judge/models/submission.py:26 judge/models/submission.py:54
+#: judge/models/submission.py:27 judge/models/submission.py:55
msgid "Runtime Error"
msgstr ""
-#: judge/models/submission.py:27 judge/models/submission.py:41
-#: judge/models/submission.py:55 judge/utils/problems.py:76
+#: judge/models/submission.py:28 judge/models/submission.py:42
+#: judge/models/submission.py:56 judge/utils/problems.py:76
msgid "Compile Error"
msgstr ""
-#: judge/models/submission.py:28 judge/models/submission.py:40
+#: judge/models/submission.py:29 judge/models/submission.py:41
msgid "Internal Error"
msgstr ""
-#: judge/models/submission.py:29
+#: judge/models/submission.py:30
msgid "Short circuit"
msgstr ""
-#: judge/models/submission.py:30 judge/models/submission.py:42
-#: judge/models/submission.py:61
+#: judge/models/submission.py:31 judge/models/submission.py:43
+#: judge/models/submission.py:62
msgid "Aborted"
msgstr ""
-#: judge/models/submission.py:36 judge/models/submission.py:57
+#: judge/models/submission.py:37 judge/models/submission.py:58
msgid "Queued"
msgstr ""
-#: judge/models/submission.py:37 judge/models/submission.py:58
+#: judge/models/submission.py:38 judge/models/submission.py:59
msgid "Processing"
msgstr ""
-#: judge/models/submission.py:38 judge/models/submission.py:59
+#: judge/models/submission.py:39 judge/models/submission.py:60
msgid "Grading"
msgstr ""
-#: judge/models/submission.py:39 judge/models/submission.py:60
+#: judge/models/submission.py:40 judge/models/submission.py:61
msgid "Completed"
msgstr ""
-#: judge/models/submission.py:56
+#: judge/models/submission.py:57
msgid "Internal Error (judging server error)"
msgstr ""
-#: judge/models/submission.py:66
+#: judge/models/submission.py:67
msgid "submission time"
msgstr ""
-#: judge/models/submission.py:67 judge/models/submission.py:227
+#: judge/models/submission.py:68 judge/models/submission.py:238
msgid "execution time"
msgstr ""
-#: judge/models/submission.py:68 judge/models/submission.py:228
+#: judge/models/submission.py:69 judge/models/submission.py:239
msgid "memory usage"
msgstr ""
-#: judge/models/submission.py:69 judge/models/submission.py:229
+#: judge/models/submission.py:70 judge/models/submission.py:240
msgid "points granted"
msgstr ""
-#: judge/models/submission.py:70
+#: judge/models/submission.py:71
msgid "submission language"
msgstr ""
-#: judge/models/submission.py:71
+#: judge/models/submission.py:72
msgid "status"
msgstr ""
-#: judge/models/submission.py:72
+#: judge/models/submission.py:73
msgid "result"
msgstr ""
-#: judge/models/submission.py:74
+#: judge/models/submission.py:75
msgid "compile errors"
msgstr ""
-#: judge/models/submission.py:76
+#: judge/models/submission.py:77
msgid "batched cases"
msgstr ""
-#: judge/models/submission.py:77
+#: judge/models/submission.py:78
msgid "test case points"
msgstr ""
-#: judge/models/submission.py:78
+#: judge/models/submission.py:79
msgid "test case total points"
msgstr ""
-#: judge/models/submission.py:79
+#: judge/models/submission.py:80
msgid "judged on"
msgstr ""
-#: judge/models/submission.py:81
+#: judge/models/submission.py:82
msgid "submission judge time"
msgstr ""
-#: judge/models/submission.py:82
-msgid "was rejudged by admin"
+#: judge/models/submission.py:83
+msgid "last rejudge date by admin"
msgstr ""
-#: judge/models/submission.py:83
+#: judge/models/submission.py:84
msgid "was ran on pretests only"
msgstr ""
-#: judge/models/submission.py:86
-msgid "lock submission"
+#: judge/models/submission.py:87
+msgid "submission lock"
msgstr ""
-#: judge/models/submission.py:199
+#: judge/models/submission.py:210
msgid "Abort any submission"
msgstr ""
-#: judge/models/submission.py:200
+#: judge/models/submission.py:211
msgid "Rejudge the submission"
msgstr ""
-#: judge/models/submission.py:201
+#: judge/models/submission.py:212
msgid "Rejudge a lot of submissions"
msgstr ""
-#: judge/models/submission.py:202
+#: judge/models/submission.py:213
msgid "Submit without limit"
msgstr ""
-#: judge/models/submission.py:203
+#: judge/models/submission.py:214
msgid "View all submission"
msgstr ""
-#: judge/models/submission.py:204
+#: judge/models/submission.py:215
msgid "Resubmit others' submission"
msgstr ""
-#: judge/models/submission.py:205
+#: judge/models/submission.py:216
msgid "Change lock status of submission"
msgstr ""
-#: judge/models/submission.py:208 templates/contest/moss.html:58
+#: judge/models/submission.py:219 templates/contest/moss.html:58
msgid "submissions"
msgstr ""
-#: judge/models/submission.py:212 judge/models/submission.py:223
+#: judge/models/submission.py:223 judge/models/submission.py:234
msgid "associated submission"
msgstr ""
-#: judge/models/submission.py:214
+#: judge/models/submission.py:225
msgid "source code"
msgstr ""
-#: judge/models/submission.py:225
+#: judge/models/submission.py:236
msgid "test case ID"
msgstr ""
-#: judge/models/submission.py:226
+#: judge/models/submission.py:237
msgid "status flag"
msgstr ""
-#: judge/models/submission.py:230
+#: judge/models/submission.py:241
msgid "points possible"
msgstr ""
-#: judge/models/submission.py:231
+#: judge/models/submission.py:242
msgid "batch number"
msgstr ""
-#: judge/models/submission.py:232
+#: judge/models/submission.py:243
msgid "judging feedback"
msgstr ""
-#: judge/models/submission.py:233
+#: judge/models/submission.py:244
msgid "extended judging feedback"
msgstr ""
-#: judge/models/submission.py:234
+#: judge/models/submission.py:245
msgid "program output"
msgstr ""
-#: judge/models/submission.py:242
+#: judge/models/submission.py:253
msgid "submission test case"
msgstr ""
-#: judge/models/submission.py:243
+#: judge/models/submission.py:254
msgid "submission test cases"
msgstr ""
@@ -2359,6 +2380,10 @@ msgstr ""
msgid "poster"
msgstr ""
+#: judge/models/ticket.py:30
+msgid "message body"
+msgstr ""
+
#: judge/models/ticket.py:31
msgid "message time"
msgstr ""
@@ -2381,19 +2406,23 @@ msgstr ""
msgid "Running MOSS"
msgstr ""
-#: judge/tasks/submission.py:43
+#: judge/tasks/submission.py:45
msgid "Modifying submissions"
msgstr ""
-#: judge/tasks/submission.py:56
+#: judge/tasks/submission.py:58
msgid "Recalculating user points"
msgstr ""
-#: judge/tasks/user.py:50
+#: judge/tasks/user.py:49
+msgid "Applying filters"
+msgstr ""
+
+#: judge/tasks/user.py:64
msgid "Preparing your submission data"
msgstr ""
-#: judge/tasks/user.py:81
+#: judge/tasks/user.py:95
msgid "Preparing your comment data"
msgstr ""
@@ -2506,7 +2535,7 @@ msgstr ""
msgid "You already voted."
msgstr ""
-#: judge/views/comment.py:129 judge/views/organization.py:298
+#: judge/views/comment.py:129 judge/views/organization.py:297
msgid "Edited from site"
msgstr ""
@@ -2514,125 +2543,130 @@ msgstr ""
msgid "Editing comment"
msgstr ""
-#: judge/views/contests.py:56 judge/views/contests.py:201
-#: judge/views/contests.py:204 judge/views/contests.py:382
+#: judge/views/contests.py:57 judge/views/contests.py:210
+#: judge/views/contests.py:213 judge/views/contests.py:395
msgid "No such contest"
msgstr ""
-#: judge/views/contests.py:57 judge/views/contests.py:202
+#: judge/views/contests.py:58 judge/views/contests.py:211
#, python-format
msgid "Could not find a contest with the key \"%s\"."
msgstr ""
-#: judge/views/contests.py:70
+#: judge/views/contests.py:71
msgid "Contests"
msgstr ""
-#: judge/views/contests.py:205
+#: judge/views/contests.py:214
msgid "Could not find such contest."
msgstr ""
-#: judge/views/contests.py:208
+#: judge/views/contests.py:217
#, python-format
msgid "Access to contest \"%s\" denied"
msgstr ""
-#: judge/views/contests.py:235
+#: judge/views/contests.py:244
msgid "Clone Contest"
msgstr ""
-#: judge/views/contests.py:301
+#: judge/views/contests.py:278
+#, python-format
+msgid "Cloned contest from %s"
+msgstr ""
+
+#: judge/views/contests.py:314
msgid "Contest not ongoing"
msgstr ""
-#: judge/views/contests.py:302
+#: judge/views/contests.py:315
#, python-format
msgid "\"%s\" is not currently ongoing."
msgstr ""
-#: judge/views/contests.py:306
+#: judge/views/contests.py:319
msgid "Already in contest"
msgstr ""
-#: judge/views/contests.py:307
+#: judge/views/contests.py:320
#, python-format
msgid "You are already in a contest: \"%s\"."
msgstr ""
-#: judge/views/contests.py:310
+#: judge/views/contests.py:323
msgid "Banned from joining"
msgstr ""
-#: judge/views/contests.py:311
+#: judge/views/contests.py:324
msgid "You have been declared persona non grata for this contest. You are permanently barred from joining this contest."
msgstr ""
-#: judge/views/contests.py:372
+#: judge/views/contests.py:385
#, python-format
msgid "Enter access code for \"%s\""
msgstr ""
-#: judge/views/contests.py:383
+#: judge/views/contests.py:396
#, python-format
msgid "You are not in contest \"%s\"."
msgstr ""
-#: judge/views/contests.py:402
+#: judge/views/contests.py:415
msgid "ContestCalendar requires integer year and month"
msgstr ""
-#: judge/views/contests.py:442
+#: judge/views/contests.py:455
#, python-format
msgid "Contests in %(month)s"
msgstr ""
-#: judge/views/contests.py:442
+#: judge/views/contests.py:455
msgid "F Y"
msgstr ""
-#: judge/views/contests.py:489
+#: judge/views/contests.py:502
#, python-format
msgid "%s Statistics"
msgstr ""
-#: judge/views/contests.py:662
+#: judge/views/contests.py:675
#, python-format
msgid "%s Rankings"
msgstr ""
-#: judge/views/contests.py:670
+#: judge/views/contests.py:683
msgid "???"
msgstr ""
-#: judge/views/contests.py:686
+#: judge/views/contests.py:699
#, python-format
msgid "Your participation in %s"
msgstr ""
-#: judge/views/contests.py:687
+#: judge/views/contests.py:700
#, python-format
msgid "%s's participation in %s"
msgstr ""
-#: judge/views/contests.py:694
+#: judge/views/contests.py:707
msgid "Live"
msgstr ""
-#: judge/views/contests.py:706 templates/contest/contest-tabs.html:13
+#: judge/views/contests.py:719 templates/contest/contest-tabs.html:13
msgid "Participation"
msgstr ""
-#: judge/views/contests.py:750
+#: judge/views/contests.py:763
#, python-format
msgid "%s MOSS Results"
msgstr ""
-#: judge/views/contests.py:777
+#: judge/views/contests.py:790
#, python-format
msgid "Running MOSS for %s..."
msgstr ""
-#: judge/views/contests.py:800
+#: judge/views/contests.py:813
#, python-format
msgid "Contest tag: %s"
msgstr ""
@@ -2661,163 +2695,177 @@ msgstr ""
msgid "Runtimes"
msgstr ""
-#: judge/views/organization.py:44 judge/views/organization.py:47
+#: judge/views/organization.py:43 judge/views/organization.py:46
msgid "No such organization"
msgstr ""
-#: judge/views/organization.py:45
+#: judge/views/organization.py:44
#, python-format
msgid "Could not find an organization with the key \"%s\"."
msgstr ""
-#: judge/views/organization.py:48
+#: judge/views/organization.py:47
msgid "Could not find such organization."
msgstr ""
-#: judge/views/organization.py:72 judge/views/register.py:34
+#: judge/views/organization.py:71 judge/views/register.py:33
#: templates/organization/list.html:15 templates/user/user-list-tabs.html:5
msgid "Organizations"
msgstr ""
-#: judge/views/organization.py:93
+#: judge/views/organization.py:92
#, python-format
msgid "%s Members"
msgstr ""
-#: judge/views/organization.py:118 judge/views/organization.py:121
-#: judge/views/organization.py:126
+#: judge/views/organization.py:117 judge/views/organization.py:120
+#: judge/views/organization.py:125
msgid "Joining organization"
msgstr ""
-#: judge/views/organization.py:118
+#: judge/views/organization.py:117
msgid "You are already in the organization."
msgstr ""
-#: judge/views/organization.py:121
+#: judge/views/organization.py:120
msgid "This organization is not open."
msgstr ""
-#: judge/views/organization.py:138
+#: judge/views/organization.py:137
msgid "Leaving organization"
msgstr ""
-#: judge/views/organization.py:138
+#: judge/views/organization.py:137
#, python-format
msgid "You are not in \"%s\"."
msgstr ""
-#: judge/views/organization.py:162
+#: judge/views/organization.py:161
#, python-format
msgid "Request to join %s"
msgstr ""
-#: judge/views/organization.py:180
+#: judge/views/organization.py:179
msgid "Join request detail"
msgstr ""
-#: judge/views/organization.py:208
+#: judge/views/organization.py:207
#, python-format
msgid "Managing join requests for %s"
msgstr ""
-#: judge/views/organization.py:239
+#: judge/views/organization.py:238
#, python-format
msgid "Your organization can only receive %d more members. You cannot approve %d users."
msgstr ""
-#: judge/views/organization.py:251
+#: judge/views/organization.py:250
#, python-format
msgid "Approved %d user."
msgid_plural "Approved %d users."
msgstr[0] ""
msgstr[1] ""
-#: judge/views/organization.py:252
+#: judge/views/organization.py:251
#, python-format
msgid "Rejected %d user."
msgid_plural "Rejected %d users."
msgstr[0] ""
msgstr[1] ""
-#: judge/views/organization.py:282
+#: judge/views/organization.py:281
#, python-format
msgid "Editing %s"
msgstr ""
-#: judge/views/organization.py:306 judge/views/organization.py:314
+#: judge/views/organization.py:305 judge/views/organization.py:313
msgid "Can't edit organization"
msgstr ""
-#: judge/views/organization.py:307
+#: judge/views/organization.py:306
msgid "You are not allowed to edit this organization."
msgstr ""
-#: judge/views/organization.py:315
+#: judge/views/organization.py:314
msgid "You are not allowed to kick people from this organization."
msgstr ""
-#: judge/views/organization.py:320 judge/views/organization.py:324
+#: judge/views/organization.py:319 judge/views/organization.py:323
msgid "Can't kick user"
msgstr ""
-#: judge/views/organization.py:321
+#: judge/views/organization.py:320
msgid "The user you are trying to kick does not exist!"
msgstr ""
-#: judge/views/organization.py:325
+#: judge/views/organization.py:324
#, python-format
msgid "The user you are trying to kick is not in organization: %s."
msgstr ""
-#: judge/views/problem.py:67
+#: judge/views/problem.py:68
msgid "No such problem"
msgstr ""
-#: judge/views/problem.py:68
+#: judge/views/problem.py:69
#, python-format
msgid "Could not find a problem with the code \"%s\"."
msgstr ""
-#: judge/views/problem.py:110
+#: judge/views/problem.py:111
#, python-brace-format
msgid "Editorial for {0}"
msgstr ""
-#: judge/views/problem.py:113
+#: judge/views/problem.py:114
#, python-brace-format
msgid "Editorial for {0}"
msgstr ""
-#: judge/views/problem.py:283 templates/contest/contest.html:79
+#: judge/views/problem.py:133
+msgid "No such editorial"
+msgstr ""
+
+#: judge/views/problem.py:134
+#, python-format
+msgid "Could not find an editorial with the code \"%s\"."
+msgstr ""
+
+#: judge/views/problem.py:289 templates/contest/contest.html:79
#: templates/user/user-tabs.html:5 templates/user/users-table.html:23
msgid "Problems"
msgstr ""
-#: judge/views/problem.py:556 judge/views/problem.py:564
+#: judge/views/problem.py:562 judge/views/problem.py:570
#, python-format
msgid "Submit to %s"
msgstr ""
-#: judge/views/problem.py:613
+#: judge/views/problem.py:619
msgid "Banned from submitting"
msgstr ""
-#: judge/views/problem.py:614
+#: judge/views/problem.py:620
msgid "You have been declared persona non grata for this problem. You are permanently barred from submitting this problem."
msgstr ""
-#: judge/views/problem.py:618
+#: judge/views/problem.py:624
msgid "Too many submissions"
msgstr ""
-#: judge/views/problem.py:619
+#: judge/views/problem.py:625
msgid "You have exceeded the submission limit for this problem."
msgstr ""
-#: judge/views/problem.py:681
+#: judge/views/problem.py:693
msgid "Clone Problem"
msgstr ""
+#: judge/views/problem.py:720
+#, python-format
+msgid "Cloned problem from %s"
+msgstr ""
+
#: judge/views/problem_data.py:37
msgid "Checker arguments must be a JSON object"
msgstr ""
@@ -2887,52 +2935,52 @@ msgstr ""
msgid "Best solutions for {0}"
msgstr ""
-#: judge/views/ranked_submission.py:80
+#: judge/views/ranked_submission.py:82
#, python-format
msgid "Best solutions for %(problem)s in %(contest)s"
msgstr ""
-#: judge/views/ranked_submission.py:83
+#: judge/views/ranked_submission.py:85
#, python-format
msgid "Best solutions for problem %(number)s in %(contest)s"
msgstr ""
-#: judge/views/ranked_submission.py:89
+#: judge/views/ranked_submission.py:91
#, python-brace-format
msgid "Best solutions for {0} in {2}"
msgstr ""
-#: judge/views/ranked_submission.py:92
+#: judge/views/ranked_submission.py:94
#, python-brace-format
msgid "Best solutions for problem {0} in {1}"
msgstr ""
-#: judge/views/register.py:27
+#: judge/views/register.py:26
msgid "A username must contain letters, numbers, or underscores"
msgstr ""
-#: judge/views/register.py:31
+#: judge/views/register.py:30
msgid "Preferred language"
msgstr ""
-#: judge/views/register.py:38
+#: judge/views/register.py:37
msgid "Subscribe to newsletter?"
msgstr ""
-#: judge/views/register.py:45
+#: judge/views/register.py:44
#, python-format
msgid "The email address \"%s\" is already taken. Only one registration is allowed per address."
msgstr ""
-#: judge/views/register.py:51
+#: judge/views/register.py:50
msgid "Your email provider is not allowed due to history of abuse. Please use a reputable email provider."
msgstr ""
-#: judge/views/register.py:57 judge/views/register.py:95
+#: judge/views/register.py:56 judge/views/register.py:94
msgid "Registration"
msgstr ""
-#: judge/views/register.py:106
+#: judge/views/register.py:105
msgid "Authentication failure"
msgstr ""
@@ -2940,7 +2988,7 @@ msgstr ""
msgid "Language statistics"
msgstr ""
-#: judge/views/status.py:24 templates/submission/list.html:311
+#: judge/views/status.py:24 templates/submission/list.html:310
msgid "Status"
msgstr ""
@@ -2948,74 +2996,74 @@ msgstr ""
msgid "Version matrix"
msgstr ""
-#: judge/views/submission.py:53 judge/views/submission.py:60
+#: judge/views/submission.py:55 judge/views/submission.py:62
#, python-format
msgid "Submission of %(problem)s by %(user)s"
msgstr ""
-#: judge/views/submission.py:203 judge/views/submission.py:204
+#: judge/views/submission.py:205 judge/views/submission.py:206
#: templates/problem/problem.html:127
msgid "All submissions"
msgstr ""
-#: judge/views/submission.py:349
+#: judge/views/submission.py:355
msgid "All my submissions"
msgstr ""
-#: judge/views/submission.py:350
+#: judge/views/submission.py:356
#, python-format
msgid "All submissions by %s"
msgstr ""
-#: judge/views/submission.py:381
+#: judge/views/submission.py:387
#, python-format
msgid "All submissions for %s"
msgstr ""
-#: judge/views/submission.py:400
+#: judge/views/submission.py:410
msgid "Must pass a problem"
msgstr ""
-#: judge/views/submission.py:439
+#: judge/views/submission.py:449
#, python-format
msgid "My submissions for %(problem)s"
msgstr ""
-#: judge/views/submission.py:440
+#: judge/views/submission.py:450
#, python-format
msgid "%(user)s's submissions for %(problem)s"
msgstr ""
-#: judge/views/submission.py:536
+#: judge/views/submission.py:546
msgid "Must pass a contest"
msgstr ""
-#: judge/views/submission.py:544
+#: judge/views/submission.py:554
#, python-format
msgid "My submissions in %(contest)s"
msgstr ""
-#: judge/views/submission.py:545
+#: judge/views/submission.py:555
#, python-format
msgid "%(user)s's submissions in %(contest)s"
msgstr ""
-#: judge/views/submission.py:559
+#: judge/views/submission.py:569
#, python-brace-format
msgid "My submissions in {0}"
msgstr ""
-#: judge/views/submission.py:561
+#: judge/views/submission.py:571
#, python-brace-format
msgid "{0}'s submissions in {2}"
msgstr ""
-#: judge/views/submission.py:585
+#: judge/views/submission.py:597
#, python-brace-format
msgid "{0}'s submissions for {2} in {4}"
msgstr ""
-#: judge/views/submission.py:590
+#: judge/views/submission.py:602
#, python-brace-format
msgid "{0}'s submissions for problem {2} in {3}"
msgstr ""
@@ -3032,40 +3080,40 @@ msgstr ""
msgid "You must solve at least one problem before you can create a ticket."
msgstr ""
-#: judge/views/ticket.py:87 judge/views/ticket.py:90
+#: judge/views/ticket.py:91 judge/views/ticket.py:94
#, python-format
msgid "New ticket for %s"
msgstr ""
-#: judge/views/ticket.py:144
+#: judge/views/ticket.py:148
#, python-format
msgid "%(title)s - Ticket %(id)d"
msgstr ""
-#: judge/views/ticket.py:249
+#: judge/views/ticket.py:253
#, python-format
msgid "Tickets - Page %(number)d of %(total)d"
msgstr ""
-#: judge/views/ticket.py:298
+#: judge/views/ticket.py:302
#, python-format
msgid "New Ticket: %s"
msgstr ""
-#: judge/views/ticket.py:299
+#: judge/views/ticket.py:303
#, python-format
msgid "#%(id)d, assigned to: %(users)s"
msgstr ""
-#: judge/views/ticket.py:301
+#: judge/views/ticket.py:305
msgid ", "
msgstr ""
-#: judge/views/ticket.py:301
+#: judge/views/ticket.py:305
msgid "no one"
msgstr ""
-#: judge/views/ticket.py:321
+#: judge/views/ticket.py:325
#, python-format
msgid "New Ticket Message For: %s"
msgstr ""
@@ -3074,87 +3122,91 @@ msgstr ""
msgid "Enable Two-factor Authentication"
msgstr ""
-#: judge/views/two_factor.py:99
+#: judge/views/two_factor.py:108
+msgid "Refresh Two-factor Authentication"
+msgstr ""
+
+#: judge/views/two_factor.py:116
msgid "Disable Two-factor Authentication"
msgstr ""
-#: judge/views/two_factor.py:148
+#: judge/views/two_factor.py:165
msgid "Invalid WebAuthn response"
msgstr ""
-#: judge/views/two_factor.py:151
+#: judge/views/two_factor.py:168
msgid "Invalid name"
msgstr ""
-#: judge/views/two_factor.py:204
+#: judge/views/two_factor.py:221
msgid "Staff may not disable 2FA"
msgstr ""
-#: judge/views/two_factor.py:216
+#: judge/views/two_factor.py:229
msgid "Perform Two-factor Authentication"
msgstr ""
-#: judge/views/user.py:79
+#: judge/views/user.py:78
msgid "No such user"
msgstr ""
-#: judge/views/user.py:79
+#: judge/views/user.py:78
#, python-format
msgid "No user handle \"%s\"."
msgstr ""
-#: judge/views/user.py:83
+#: judge/views/user.py:82
msgid "My account"
msgstr ""
-#: judge/views/user.py:84
+#: judge/views/user.py:83
#, python-format
msgid "User %s"
msgstr ""
-#: judge/views/user.py:132
+#: judge/views/user.py:131
msgid "Login"
msgstr ""
-#: judge/views/user.py:173
+#: judge/views/user.py:172
msgid "M j, Y, G:i"
msgstr ""
-#: judge/views/user.py:307
+#: judge/views/user.py:306
msgid "Preparing your data..."
msgstr ""
-#: judge/views/user.py:311 templates/user/edit-profile.html:348
+#: judge/views/user.py:310 templates/user/edit-profile.html:352
msgid "Download your data"
msgstr ""
-#: judge/views/user.py:367
+#: judge/views/user.py:366
msgid "Updated on site"
msgstr ""
-#: judge/views/user.py:400 templates/admin/auth/user/change_form.html:14
+#: judge/views/user.py:399 templates/admin/auth/user/change_form.html:14
#: templates/admin/auth/user/change_form.html:17 templates/base.html:222
#: templates/user/user-tabs.html:16
msgid "Edit profile"
msgstr ""
-#: judge/views/user.py:415
+#: judge/views/user.py:414
msgid "Generated API token for user"
msgstr ""
-#: judge/views/user.py:427
+#: judge/views/user.py:426
msgid "Removed API token for user"
msgstr ""
-#: judge/views/user.py:437
+#: judge/views/user.py:436
msgid "Generated scratch codes for user"
msgstr ""
-#: judge/views/user.py:443 templates/user/user-list-tabs.html:4
+#: judge/views/user.py:442 templates/user/user-list-tabs.html:4
msgid "Leaderboard"
msgstr ""
-#: judge/views/user.py:504
+#: judge/views/user.py:503
msgid "You have been successfully logged out."
msgstr ""
@@ -3279,11 +3331,11 @@ msgstr ""
msgid "posted on {time}"
msgstr ""
-#: templates/blog/list.html:130 templates/problem/problem.html:309
+#: templates/blog/list.html:130 templates/problem/problem.html:311
msgid "Clarifications"
msgstr ""
-#: templates/blog/list.html:146 templates/problem/problem.html:320
+#: templates/blog/list.html:146 templates/problem/problem.html:322
msgid "No clarifications have been made at this time."
msgstr ""
@@ -3476,7 +3528,7 @@ msgid "Info"
msgstr ""
#: templates/contest/contest-tabs.html:6 templates/stats/base.html:9
-#: templates/submission/list.html:337
+#: templates/submission/list.html:336
msgid "Statistics"
msgstr ""
@@ -3679,19 +3731,19 @@ msgstr ""
msgid "Disqualify"
msgstr ""
-#: templates/contest/ranking.html:169
+#: templates/contest/ranking.html:173
msgid "Are you sure you want to disqualify this participation?"
msgstr ""
-#: templates/contest/ranking.html:174
+#: templates/contest/ranking.html:178
msgid "Are you sure you want to un-disqualify this participation?"
msgstr ""
-#: templates/contest/ranking.html:246
+#: templates/contest/ranking.html:250
msgid "View user participation"
msgstr ""
-#: templates/contest/ranking.html:250
+#: templates/contest/ranking.html:254
msgid "Show organizations"
msgstr ""
@@ -3966,7 +4018,7 @@ msgstr ""
msgid "Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence."
msgstr ""
-#: templates/problem/editorial.html:27 templates/problem/problem.html:209
+#: templates/problem/editorial.html:27 templates/problem/problem.html:210
msgid "Author:"
msgid_plural "Authors:"
msgstr[0] ""
@@ -4133,36 +4185,36 @@ msgstr ""
msgid "Memory limit:"
msgstr ""
-#: templates/problem/problem.html:224
+#: templates/problem/problem.html:226
msgid "Problem type"
msgid_plural "Problem types"
msgstr[0] ""
msgstr[1] ""
-#: templates/problem/problem.html:237
+#: templates/problem/problem.html:239
msgid "Allowed languages"
msgstr ""
-#: templates/problem/problem.html:245
+#: templates/problem/problem.html:247
#, python-format
msgid "No %(lang)s judge online"
msgstr ""
-#: templates/problem/problem.html:256
+#: templates/problem/problem.html:258
msgid "Judge:"
msgid_plural "Judges:"
msgstr[0] ""
msgstr[1] ""
-#: templates/problem/problem.html:273
+#: templates/problem/problem.html:275
msgid "none available"
msgstr ""
-#: templates/problem/problem.html:298
+#: templates/problem/problem.html:300
msgid "Request clarification"
msgstr ""
-#: templates/problem/problem.html:300
+#: templates/problem/problem.html:302
msgid "Report an issue"
msgstr ""
@@ -4207,7 +4259,7 @@ msgstr ""
msgid "Point range"
msgstr ""
-#: templates/problem/search-form.html:63 templates/submission/list.html:329
+#: templates/problem/search-form.html:63 templates/submission/list.html:328
#: templates/ticket/list.html:248
msgid "Go"
msgstr ""
@@ -4254,7 +4306,7 @@ msgid "Invalid username or password."
msgstr ""
#: templates/registration/login.html:53
-#: templates/registration/two_factor_auth.html:86
+#: templates/registration/two_factor_auth.html:92
msgid "Login!"
msgstr ""
@@ -4374,12 +4426,12 @@ msgid "Default language"
msgstr ""
#: templates/registration/registration_form.html:184
-#: templates/user/edit-profile.html:310
+#: templates/user/edit-profile.html:314
msgid "Affiliated organizations"
msgstr ""
#: templates/registration/registration_form.html:190
-#: templates/user/edit-profile.html:324
+#: templates/user/edit-profile.html:328
msgid "Notify me about upcoming contests"
msgstr ""
@@ -4395,57 +4447,93 @@ msgstr ""
msgid "Register!"
msgstr ""
-#: templates/registration/totp_disable.html:38
+#: templates/registration/totp_disable.html:31
msgid "To protect your account, you must first authenticate before you can disable Two Factor Authentication."
msgstr ""
-#: templates/registration/totp_disable.html:45
+#: templates/registration/totp_disable.html:38
msgid "Enter the 6-digit code generated by your app or one of your 16-digit scratch codes:"
msgstr ""
-#: templates/registration/totp_disable.html:48
+#: templates/registration/totp_disable.html:41
msgid "Disable Two Factor Authentication"
msgstr ""
-#: templates/registration/totp_enable.html:75
+#: templates/registration/totp_enable.html:72
msgid "Scan this code with your authenticator app:"
msgstr ""
-#: templates/registration/totp_enable.html:76
+#: templates/registration/totp_enable.html:73
msgid "QR code"
msgstr ""
-#: templates/registration/totp_enable.html:77
+#: templates/registration/totp_enable.html:74
msgid "Or enter this code manually:"
msgstr ""
-#: templates/registration/totp_enable.html:88
+#: templates/registration/totp_enable.html:85
msgid "Enter the 6-digit code generated by your app:"
msgstr ""
-#: templates/registration/totp_enable.html:91
+#: templates/registration/totp_enable.html:90
+msgid "Refresh Two Factor Authentication"
+msgstr ""
+
+#: templates/registration/totp_enable.html:92
msgid "Enable Two Factor Authentication"
msgstr ""
+#: templates/registration/totp_enable.html:98
+msgid "Below is a list of one-time use scratch codes."
+msgstr ""
+
+#: templates/registration/totp_enable.html:99
+msgid "These codes can only be used once and are for emergency use."
+msgstr ""
+
+#: templates/registration/totp_enable.html:100
+msgid "You can use these codes to login to your account or disable two-factor authentication."
+msgstr ""
+
+#: templates/registration/totp_enable.html:101
+msgid "If you ever need more scratch codes, you can regenerate them on the edit profile tab."
+msgstr ""
+
+#: templates/registration/totp_enable.html:102
+msgid "Please write these down and keep them in a secure location."
+msgstr ""
+
+#: templates/registration/totp_enable.html:103
+msgid "These codes will never be shown again after you enable two-factor authentication."
+msgstr ""
+
#: templates/registration/two_factor_auth.html:33
-#: templates/user/edit-profile.html:161
+#: templates/user/edit-profile.html:165
msgid "WebAuthn is not supported by your browser."
msgstr ""
#: templates/registration/two_factor_auth.html:54
-#: templates/user/edit-profile.html:185
+#: templates/user/edit-profile.html:189
msgid "Failed to contact server."
msgstr ""
-#: templates/registration/two_factor_auth.html:77
+#: templates/registration/two_factor_auth.html:79
msgid "Enter the 6-digit code generated by your app or one of your 16-character scratch codes:"
msgstr ""
-#: templates/registration/two_factor_auth.html:83
-msgid "Use security key"
+#: templates/registration/two_factor_auth.html:81
+msgid "Enter one of your 16-character scratch codes:"
msgstr ""
#: templates/registration/two_factor_auth.html:89
+msgid "Use security key"
+msgstr ""
+
+#: templates/registration/two_factor_auth.html:94
+msgid "Use scratch code"
+msgstr ""
+
+#: templates/registration/two_factor_auth.html:97
#, python-format
msgid "If you lost your authentication device and are unable to use your scratch codes, please contact us at %(email)s."
msgstr ""
@@ -4526,15 +4614,15 @@ msgstr ""
msgid "Filter by language..."
msgstr ""
-#: templates/submission/list.html:307
+#: templates/submission/list.html:306
msgid "Filter submissions"
msgstr ""
-#: templates/submission/list.html:343
+#: templates/submission/list.html:342
msgid "Total:"
msgstr ""
-#: templates/submission/list.html:353
+#: templates/submission/list.html:352
msgid "You were disconnected. Refresh to show latest updates."
msgstr ""
@@ -4750,121 +4838,125 @@ msgstr ""
msgid "Search by handle..."
msgstr ""
-#: templates/user/edit-profile.html:109
+#: templates/user/edit-profile.html:113
msgid "Are you sure you want to generate or regenerate your API token?"
msgstr ""
-#: templates/user/edit-profile.html:110
+#: templates/user/edit-profile.html:114
msgid "This will invalidate any previous API tokens."
msgstr ""
-#: templates/user/edit-profile.html:111
+#: templates/user/edit-profile.html:115
msgid "It also allows access to your account without Two-factor Authentication."
msgstr ""
-#: templates/user/edit-profile.html:112
+#: templates/user/edit-profile.html:116
msgid "You will not be able to view your api token after you leave this page!"
msgstr ""
-#: templates/user/edit-profile.html:113 templates/user/edit-profile.html:207
+#: templates/user/edit-profile.html:117 templates/user/edit-profile.html:211
msgid "Generating..."
msgstr ""
-#: templates/user/edit-profile.html:121 templates/user/edit-profile.html:243
-#: templates/user/edit-profile.html:371 templates/user/edit-profile.html:390
+#: templates/user/edit-profile.html:125 templates/user/edit-profile.html:247
+#: templates/user/edit-profile.html:373 templates/user/edit-profile.html:395
msgid "Regenerate"
msgstr ""
-#: templates/user/edit-profile.html:127 templates/user/edit-profile.html:392
+#: templates/user/edit-profile.html:131 templates/user/edit-profile.html:397
msgid "Remove"
msgstr ""
-#: templates/user/edit-profile.html:137
+#: templates/user/edit-profile.html:141
msgid "Are you sure you want to remove your API token?"
msgstr ""
-#: templates/user/edit-profile.html:144 templates/user/edit-profile.html:375
-#: templates/user/edit-profile.html:396
+#: templates/user/edit-profile.html:148 templates/user/edit-profile.html:377
+#: templates/user/edit-profile.html:401
msgid "Generate"
msgstr ""
-#: templates/user/edit-profile.html:190
+#: templates/user/edit-profile.html:194
msgid "Are you sure you want to delete this security key?"
msgstr ""
-#: templates/user/edit-profile.html:280
+#: templates/user/edit-profile.html:284
msgid "Self-description"
msgstr ""
-#: templates/user/edit-profile.html:287
+#: templates/user/edit-profile.html:291
msgid "Select your closest major city"
msgstr ""
-#: templates/user/edit-profile.html:296
+#: templates/user/edit-profile.html:300
msgid "Editor theme"
msgstr ""
-#: templates/user/edit-profile.html:301
+#: templates/user/edit-profile.html:305
msgid "Math engine"
msgstr ""
-#: templates/user/edit-profile.html:335 templates/user/edit-profile.html:337
+#: templates/user/edit-profile.html:339 templates/user/edit-profile.html:341
msgid "Change your avatar"
msgstr ""
-#: templates/user/edit-profile.html:342
+#: templates/user/edit-profile.html:346
msgid "Change your password"
msgstr ""
-#: templates/user/edit-profile.html:356
+#: templates/user/edit-profile.html:359
msgid "Two-factor Authentication is enabled"
msgstr ""
-#: templates/user/edit-profile.html:358
-msgid "Two-factor Authentication is disabled"
+#: templates/user/edit-profile.html:362 templates/user/edit-profile.html:365
+msgid "Disable"
msgstr ""
-#: templates/user/edit-profile.html:363 templates/user/edit-profile.html:365
-msgid "Disable"
+#: templates/user/edit-profile.html:367
+msgid "Refresh"
msgstr ""
-#: templates/user/edit-profile.html:368
+#: templates/user/edit-profile.html:370
msgid "Scratch Codes:"
msgstr ""
-#: templates/user/edit-profile.html:372 templates/user/edit-profile.html:393
+#: templates/user/edit-profile.html:374 templates/user/edit-profile.html:398
msgid "Hidden"
msgstr ""
-#: templates/user/edit-profile.html:381
+#: templates/user/edit-profile.html:384
+msgid "Two-factor Authentication is disabled"
+msgstr ""
+
+#: templates/user/edit-profile.html:385
msgid "Enable"
msgstr ""
-#: templates/user/edit-profile.html:387
+#: templates/user/edit-profile.html:392
msgid "API Token"
msgstr ""
-#: templates/user/edit-profile.html:404
+#: templates/user/edit-profile.html:409
msgid "Security keys"
msgstr ""
-#: templates/user/edit-profile.html:414
+#: templates/user/edit-profile.html:419
msgid "Delete"
msgstr ""
-#: templates/user/edit-profile.html:421
+#: templates/user/edit-profile.html:426
msgid "Enter a name for this key"
msgstr ""
-#: templates/user/edit-profile.html:422
+#: templates/user/edit-profile.html:427
msgid "Add"
msgstr ""
-#: templates/user/edit-profile.html:430
+#: templates/user/edit-profile.html:435
msgid "User-script"
msgstr ""
-#: templates/user/edit-profile.html:434
+#: templates/user/edit-profile.html:439
msgid "Update profile"
msgstr ""
diff --git a/locale/pt/LC_MESSAGES/djangojs.po b/locale/pt/LC_MESSAGES/djangojs.po
index 8dd8a4db48..34e6cf81ca 100644
--- a/locale/pt/LC_MESSAGES/djangojs.po
+++ b/locale/pt/LC_MESSAGES/djangojs.po
@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: dmoj\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-10-01 23:12+0000\n"
-"PO-Revision-Date: 2021-04-25 00:08\n"
+"PO-Revision-Date: 2021-07-07 00:27\n"
"Last-Translator: \n"
"Language-Team: Portuguese, Brazilian\n"
"Language: pt_BR\n"
diff --git a/locale/ro/LC_MESSAGES/django.po b/locale/ro/LC_MESSAGES/django.po
index 56235448fd..214a821e8f 100644
--- a/locale/ro/LC_MESSAGES/django.po
+++ b/locale/ro/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: dmoj\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-24 19:15+0000\n"
-"PO-Revision-Date: 2021-04-25 00:08\n"
+"POT-Creation-Date: 2021-06-17 01:38+0000\n"
+"PO-Revision-Date: 2021-07-07 00:27\n"
"Last-Translator: \n"
"Language-Team: Romanian\n"
"Language: ro_RO\n"
@@ -17,75 +17,75 @@ msgstr ""
"X-Crowdin-File: django.po\n"
"X-Crowdin-File-ID: 10\n"
-#: dmoj/settings.py:364
+#: dmoj/settings.py:365
msgid "Catalan"
msgstr "Catalană"
-#: dmoj/settings.py:365
+#: dmoj/settings.py:366
msgid "German"
msgstr "Germană"
-#: dmoj/settings.py:366
+#: dmoj/settings.py:367
msgid "English"
msgstr "Engleză"
-#: dmoj/settings.py:367
+#: dmoj/settings.py:368
msgid "Spanish"
msgstr "Spaniolă"
-#: dmoj/settings.py:368
+#: dmoj/settings.py:369
msgid "French"
msgstr "Franceză"
-#: dmoj/settings.py:369
+#: dmoj/settings.py:370
msgid "Croatian"
msgstr "Croată"
-#: dmoj/settings.py:370
+#: dmoj/settings.py:371
msgid "Hungarian"
msgstr "Maghiară"
-#: dmoj/settings.py:371
+#: dmoj/settings.py:372
msgid "Japanese"
msgstr "Japoneză"
-#: dmoj/settings.py:372
+#: dmoj/settings.py:373
msgid "Korean"
msgstr "Coreeană"
-#: dmoj/settings.py:373
+#: dmoj/settings.py:374
msgid "Brazilian Portuguese"
msgstr "Portugheză braziliană"
-#: dmoj/settings.py:374
+#: dmoj/settings.py:375
msgid "Romanian"
msgstr "Română"
-#: dmoj/settings.py:375
+#: dmoj/settings.py:376
msgid "Russian"
msgstr "Rusă"
-#: dmoj/settings.py:376
+#: dmoj/settings.py:377
msgid "Serbian (Latin)"
msgstr "Sârbă (Latină)"
-#: dmoj/settings.py:377
+#: dmoj/settings.py:378
msgid "Turkish"
msgstr "Turcă"
-#: dmoj/settings.py:378
+#: dmoj/settings.py:379
msgid "Vietnamese"
msgstr "Vietnameză"
-#: dmoj/settings.py:379
+#: dmoj/settings.py:380
msgid "Simplified Chinese"
msgstr "Chineză simplificată"
-#: dmoj/settings.py:380
+#: dmoj/settings.py:381
msgid "Traditional Chinese"
msgstr "Chineză Tradiţională"
-#: dmoj/urls.py:103 templates/base.html:190
+#: dmoj/urls.py:104 templates/base.html:190
msgid "Home"
msgstr "Start"
@@ -117,46 +117,46 @@ msgstr "Reafişează comentariile"
msgid "Associated page"
msgstr "Pagină asociată"
-#: judge/admin/contest.py:31
+#: judge/admin/contest.py:32
msgid "Included contests"
msgstr "Concursuri incluse"
-#: judge/admin/contest.py:65 templates/contest/contest.html:83
+#: judge/admin/contest.py:66 templates/contest/contest.html:83
#: templates/contest/moss.html:43 templates/problem/list.html:204
#: templates/problem/list.html:219 templates/user/user-problems.html:58
#: templates/user/user-problems.html:100
msgid "Problem"
msgstr "Problemă"
-#: judge/admin/contest.py:114
+#: judge/admin/contest.py:117
msgid "Settings"
msgstr "Setări"
-#: judge/admin/contest.py:116
+#: judge/admin/contest.py:120
msgid "Scheduling"
msgstr "Programare"
-#: judge/admin/contest.py:117
+#: judge/admin/contest.py:121
msgid "Details"
msgstr "Detalii"
-#: judge/admin/contest.py:118
+#: judge/admin/contest.py:122
msgid "Format"
msgstr ""
-#: judge/admin/contest.py:119 templates/contest/ranking-table.html:5
+#: judge/admin/contest.py:123 templates/contest/ranking-table.html:5
msgid "Rating"
msgstr "Rating"
-#: judge/admin/contest.py:120
+#: judge/admin/contest.py:124
msgid "Access"
msgstr "Acces"
-#: judge/admin/contest.py:122 judge/admin/problem.py:134
+#: judge/admin/contest.py:126 judge/admin/problem.py:135
msgid "Justice"
msgstr "Justiţie"
-#: judge/admin/contest.py:211
+#: judge/admin/contest.py:215
#, python-format
msgid "%d contest successfully marked as visible."
msgid_plural "%d contests successfully marked as visible."
@@ -164,11 +164,11 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-#: judge/admin/contest.py:214
+#: judge/admin/contest.py:218
msgid "Mark contests as visible"
msgstr "Marchează concursurile ca și vizibile"
-#: judge/admin/contest.py:220
+#: judge/admin/contest.py:224
#, python-format
msgid "%d contest successfully marked as hidden."
msgid_plural "%d contests successfully marked as hidden."
@@ -176,11 +176,11 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-#: judge/admin/contest.py:223
+#: judge/admin/contest.py:227
msgid "Mark contests as hidden"
msgstr "Marchează concursurile ca ascunse"
-#: judge/admin/contest.py:229
+#: judge/admin/contest.py:233
#, python-format
msgid "%d contest successfully locked."
msgid_plural "%d contests successfully locked."
@@ -188,11 +188,11 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-#: judge/admin/contest.py:232
+#: judge/admin/contest.py:236
msgid "Lock contest submissions"
msgstr "Blochează submiterea în concurs"
-#: judge/admin/contest.py:238
+#: judge/admin/contest.py:242
#, python-format
msgid "%d contest successfully unlocked."
msgid_plural "%d contests successfully unlocked."
@@ -200,11 +200,11 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-#: judge/admin/contest.py:241
+#: judge/admin/contest.py:245
msgid "Unlock contest submissions"
msgstr "Deblochează submisiile către concurs."
-#: judge/admin/contest.py:262 judge/admin/submission.py:170
+#: judge/admin/contest.py:266 judge/admin/submission.py:170
#, python-format
msgid "%d submission was successfully scheduled for rejudging."
msgid_plural "%d submissions were successfully scheduled for rejudging."
@@ -212,7 +212,7 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-#: judge/admin/contest.py:337
+#: judge/admin/contest.py:341
#, python-format
msgid "%d participation recalculated."
msgid_plural "%d participations recalculated."
@@ -220,15 +220,15 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-#: judge/admin/contest.py:340
+#: judge/admin/contest.py:344
msgid "Recalculate results"
msgstr ""
-#: judge/admin/contest.py:344 judge/admin/organization.py:63
+#: judge/admin/contest.py:348 judge/admin/organization.py:63
msgid "username"
msgstr ""
-#: judge/admin/contest.py:349 templates/base.html:258
+#: judge/admin/contest.py:353 templates/base.html:258
msgid "virtual"
msgstr ""
@@ -244,9 +244,9 @@ msgstr "Conţinut"
msgid "Summary"
msgstr "Rezumat"
-#: judge/admin/interface.py:113 judge/models/contest.py:383
-#: judge/models/contest.py:509 judge/models/profile.py:244
-#: judge/models/profile.py:268
+#: judge/admin/interface.py:113 judge/models/contest.py:419
+#: judge/models/contest.py:546 judge/models/profile.py:261
+#: judge/models/profile.py:292
msgid "user"
msgstr ""
@@ -254,8 +254,8 @@ msgstr ""
msgid "object"
msgstr ""
-#: judge/admin/organization.py:32 judge/admin/problem.py:181
-#: judge/admin/profile.py:82
+#: judge/admin/organization.py:32 judge/admin/problem.py:182
+#: judge/admin/profile.py:92
msgid "View on site"
msgstr "Vezi pe site"
@@ -263,40 +263,40 @@ msgstr "Vezi pe site"
msgid "Describe the changes you made (optional)"
msgstr "Descrie modificările făcute (opţional)"
-#: judge/admin/problem.py:129
+#: judge/admin/problem.py:130
msgid "Social Media"
msgstr ""
-#: judge/admin/problem.py:130
+#: judge/admin/problem.py:131
msgid "Taxonomy"
msgstr "Taxonomie"
-#: judge/admin/problem.py:131 templates/contest/contest.html:84
+#: judge/admin/problem.py:132 templates/contest/contest.html:84
#: templates/problem/data.html:385 templates/problem/list.html:209
#: templates/problem/list.html:230 templates/user/base-users-table.html:10
#: templates/user/user-problems.html:60
msgid "Points"
msgstr "Puncte"
-#: judge/admin/problem.py:132
+#: judge/admin/problem.py:133
msgid "Limits"
msgstr "Limite"
-#: judge/admin/problem.py:133 judge/admin/submission.py:238
-#: templates/stats/base.html:14 templates/submission/list.html:320
-#: templates/user/edit-profile.html:292
+#: judge/admin/problem.py:134 judge/admin/submission.py:238
+#: templates/stats/base.html:14 templates/submission/list.html:319
+#: templates/user/edit-profile.html:296
msgid "Language"
msgstr "Limbaj"
-#: judge/admin/problem.py:135
+#: judge/admin/problem.py:136
msgid "History"
msgstr "Istoric"
-#: judge/admin/problem.py:178
+#: judge/admin/problem.py:179
msgid "Authors"
msgstr "Autori"
-#: judge/admin/problem.py:191
+#: judge/admin/problem.py:192
#, python-format
msgid "%d problem's publish date successfully updated."
msgid_plural "%d problems' publish date successfully updated."
@@ -304,11 +304,11 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-#: judge/admin/problem.py:195
+#: judge/admin/problem.py:196
msgid "Set publish date to now"
msgstr ""
-#: judge/admin/problem.py:201
+#: judge/admin/problem.py:202
#, python-format
msgid "%d problem successfully marked as public."
msgid_plural "%d problems successfully marked as public."
@@ -316,11 +316,11 @@ msgstr[0] "%d problemă marcată ca publică cu succes."
msgstr[1] "%d problemă marcată ca publică cu succes."
msgstr[2] "%d probleme marcate ca publice cu succes."
-#: judge/admin/problem.py:205
+#: judge/admin/problem.py:206
msgid "Mark problems as public"
msgstr "Marchează probleme ca publice"
-#: judge/admin/problem.py:211
+#: judge/admin/problem.py:212
#, python-format
msgid "%d problem successfully marked as private."
msgid_plural "%d problems successfully marked as private."
@@ -328,7 +328,7 @@ msgstr[0] "%d problemă marcată ca privată cu succes."
msgstr[1] "%d problemă marcată ca privată cu succes."
msgstr[2] "%d probleme marcate ca private cu succes."
-#: judge/admin/problem.py:215
+#: judge/admin/problem.py:216
msgid "Mark problems as private"
msgstr "Marchează probleme ca private"
@@ -336,28 +336,28 @@ msgstr "Marchează probleme ca private"
msgid "timezone"
msgstr ""
-#: judge/admin/profile.py:88 judge/admin/submission.py:217
+#: judge/admin/profile.py:98 judge/admin/submission.py:217
#: templates/organization/requests/log.html:9
#: templates/organization/requests/pending.html:12
#: templates/ticket/list.html:261
msgid "User"
msgstr "Utilizator"
-#: judge/admin/profile.py:93 templates/registration/registration_form.html:143
+#: judge/admin/profile.py:103 templates/registration/registration_form.html:143
msgid "Email"
msgstr "Email"
-#: judge/admin/profile.py:98 judge/views/register.py:29
+#: judge/admin/profile.py:108 judge/views/register.py:28
#: templates/registration/registration_form.html:171
-#: templates/user/edit-profile.html:288
+#: templates/user/edit-profile.html:292
msgid "Timezone"
msgstr "Fus orar"
-#: judge/admin/profile.py:103
+#: judge/admin/profile.py:113
msgid "date joined"
msgstr ""
-#: judge/admin/profile.py:110
+#: judge/admin/profile.py:120
#, python-format
msgid "%d user have scores recalculated."
msgid_plural "%d users have scores recalculated."
@@ -365,7 +365,7 @@ msgstr[0] "%d utilizator au scoruri recalculate."
msgstr[1] "%d utilizator au scoruri recalculate."
msgstr[2] "%d utilizatorii au scoruri recalculate."
-#: judge/admin/profile.py:113
+#: judge/admin/profile.py:123
msgid "Recalculate scores"
msgstr "Recalculați scorurile"
@@ -519,115 +519,116 @@ msgstr "IOI"
msgid "IOI (pre-2016)"
msgstr ""
-#: judge/forms.py:26
-msgid "Two-factor authentication tokens must be 6 decimal digits."
+#: judge/forms.py:27
+#, python-brace-format
+msgid "Two-factor authentication tokens must be {TOTP_CODE_LENGTH} decimal digits."
msgstr ""
-#: judge/forms.py:29
+#: judge/forms.py:30
msgid "Invalid two-factor authentication token."
msgstr ""
-#: judge/forms.py:32
+#: judge/forms.py:33
msgid "Scratch codes must be 16 base32 characters."
msgstr ""
-#: judge/forms.py:34
+#: judge/forms.py:35 judge/forms.py:264
msgid "Invalid scratch code."
msgstr ""
-#: judge/forms.py:45
+#: judge/forms.py:46
msgid "Subscribe to contest updates"
msgstr ""
-#: judge/forms.py:46
+#: judge/forms.py:47
msgid "Enable experimental features"
msgstr ""
-#: judge/forms.py:71
+#: judge/forms.py:72
msgid "You must solve at least one problem before you can update your profile."
msgstr ""
-#: judge/forms.py:80 judge/views/organization.py:127
+#: judge/forms.py:81 judge/views/organization.py:126
#, python-brace-format
msgid "You may not be part of more than {count} public organizations."
msgstr ""
-#: judge/forms.py:96
+#: judge/forms.py:97
msgid "Download comments?"
msgstr ""
-#: judge/forms.py:97
+#: judge/forms.py:98
msgid "Download submissions?"
msgstr ""
-#: judge/forms.py:98
+#: judge/forms.py:99
msgid "Filter by problem code glob:"
msgstr ""
-#: judge/forms.py:102
+#: judge/forms.py:103
msgid "Leave empty to include all submissions"
msgstr ""
-#: judge/forms.py:105 templates/problem/manage_submission.html:142
+#: judge/forms.py:106 templates/problem/manage_submission.html:142
msgid "Filter by result:"
msgstr ""
-#: judge/forms.py:111
+#: judge/forms.py:112
msgid "Please select at least one thing to download."
msgstr ""
-#: judge/forms.py:137
+#: judge/forms.py:138
msgid "Any judge"
msgstr ""
-#: judge/forms.py:167 judge/views/register.py:26
+#: judge/forms.py:159 judge/views/register.py:25
#: templates/registration/registration_form.html:137
#: templates/user/base-users-table.html:5
msgid "Username"
msgstr "Nume de utilizator"
-#: judge/forms.py:168 templates/registration/registration_form.html:149
+#: judge/forms.py:160 templates/registration/registration_form.html:149
#: templates/registration/registration_form.html:163
msgid "Password"
msgstr ""
-#: judge/forms.py:201
+#: judge/forms.py:192
msgid "Invalid code length."
msgstr ""
-#: judge/forms.py:219
+#: judge/forms.py:223
msgid "Invalid WebAuthn response."
msgstr ""
-#: judge/forms.py:222
+#: judge/forms.py:226
msgid "No WebAuthn challenge issued."
msgstr ""
-#: judge/forms.py:228
+#: judge/forms.py:232
msgid "Invalid WebAuthn credential ID."
msgstr ""
-#: judge/forms.py:257
+#: judge/forms.py:262
msgid "Invalid two-factor authentication token or scratch code."
msgstr ""
-#: judge/forms.py:259
+#: judge/forms.py:266
msgid "Must specify either totp_token or webauthn_response."
msgstr ""
-#: judge/forms.py:263 judge/models/problem.py:105
+#: judge/forms.py:270 judge/models/problem.py:119
msgid "Problem code must be ^[a-z0-9]+$"
msgstr "Codul problemei trebuie să fie ^[a-z0-9]+$"
-#: judge/forms.py:268
+#: judge/forms.py:275
msgid "Problem with code already exists."
msgstr ""
-#: judge/forms.py:273 judge/models/contest.py:66
+#: judge/forms.py:280 judge/models/contest.py:66
msgid "Contest id must be ^[a-z0-9]+$"
msgstr "Identificatorul de concurs trebuie să fie ^[a-z0-9]+$"
-#: judge/forms.py:278
+#: judge/forms.py:285
msgid "Contest with key already exists."
msgstr ""
@@ -707,7 +708,7 @@ msgid "comments"
msgstr "comentarii"
#: judge/models/comment.py:89 judge/models/comment.py:141
-#: judge/models/problem.py:484
+#: judge/models/problem.py:511
#, python-format
msgid "Editorial for %s"
msgstr ""
@@ -748,7 +749,7 @@ msgstr "descrierea etichetei"
msgid "contest tag"
msgstr "eticheta concursului"
-#: judge/models/contest.py:53 judge/models/contest.py:117
+#: judge/models/contest.py:53 judge/models/contest.py:126
msgid "contest tags"
msgstr "etichetele concursului"
@@ -773,410 +774,426 @@ msgid "contest name"
msgstr ""
#: judge/models/contest.py:68
-msgid "These people will be able to edit the contest."
-msgstr "Aceste persoane vor putea să editeze concursul."
+msgid "These users will be able to edit the contest."
+msgstr ""
+
+#: judge/models/contest.py:70
+msgid "These users will be able to edit the contest, but will not be listed as authors."
+msgstr ""
-#: judge/models/contest.py:70 judge/models/runtime.py:136
+#: judge/models/contest.py:73
+msgid "These users will be able to view the contest, but not edit it."
+msgstr ""
+
+#: judge/models/contest.py:76 judge/models/runtime.py:136
msgid "description"
msgstr ""
-#: judge/models/contest.py:71 judge/models/problem.py:431
+#: judge/models/contest.py:77 judge/models/problem.py:458
#: judge/models/runtime.py:138
msgid "problems"
msgstr "probleme"
-#: judge/models/contest.py:72 judge/models/contest.py:384
+#: judge/models/contest.py:78 judge/models/contest.py:420
msgid "start time"
msgstr ""
-#: judge/models/contest.py:73
+#: judge/models/contest.py:79
msgid "end time"
msgstr ""
-#: judge/models/contest.py:74 judge/models/problem.py:126
-#: judge/models/problem.py:455
+#: judge/models/contest.py:80 judge/models/problem.py:140
+#: judge/models/problem.py:482
msgid "time limit"
msgstr ""
-#: judge/models/contest.py:75 judge/models/problem.py:144
+#: judge/models/contest.py:81 judge/models/problem.py:158
msgid "publicly visible"
msgstr ""
-#: judge/models/contest.py:76
+#: judge/models/contest.py:82
msgid "Should be set even for organization-private contests, where it determines whether the contest is visible to members of the specified organizations."
msgstr ""
-#: judge/models/contest.py:79
+#: judge/models/contest.py:85
msgid "contest rated"
msgstr ""
-#: judge/models/contest.py:79
+#: judge/models/contest.py:85
msgid "Whether this contest can be rated."
msgstr "Dacă acest concurs poate fi evaluat."
-#: judge/models/contest.py:81
+#: judge/models/contest.py:87
msgid "view contest scoreboard"
msgstr ""
-#: judge/models/contest.py:83
+#: judge/models/contest.py:89
msgid "These users will be able to view the scoreboard."
msgstr ""
-#: judge/models/contest.py:84
+#: judge/models/contest.py:90
msgid "scoreboard visibility"
msgstr ""
-#: judge/models/contest.py:85
+#: judge/models/contest.py:91
msgid "Scoreboard visibility through the duration of the contest"
msgstr ""
-#: judge/models/contest.py:87
+#: judge/models/contest.py:93
msgid "no comments"
msgstr ""
-#: judge/models/contest.py:88
+#: judge/models/contest.py:94
msgid "Use clarification system instead of comments."
msgstr ""
-#: judge/models/contest.py:90
+#: judge/models/contest.py:96
msgid "Rating floor for contest"
msgstr ""
-#: judge/models/contest.py:92
+#: judge/models/contest.py:98
msgid "Rating ceiling for contest"
msgstr ""
-#: judge/models/contest.py:94
+#: judge/models/contest.py:100
msgid "rate all"
msgstr ""
-#: judge/models/contest.py:94
+#: judge/models/contest.py:100
msgid "Rate all users who joined."
msgstr "Evaluează toţi utilizatorii care s-au inscris."
-#: judge/models/contest.py:95
+#: judge/models/contest.py:101
msgid "exclude from ratings"
msgstr ""
-#: judge/models/contest.py:97
+#: judge/models/contest.py:103
msgid "private to specific users"
msgstr ""
-#: judge/models/contest.py:98
+#: judge/models/contest.py:104
msgid "private contestants"
msgstr ""
-#: judge/models/contest.py:99
+#: judge/models/contest.py:105
msgid "If private, only these users may see the contest"
msgstr ""
-#: judge/models/contest.py:101
+#: judge/models/contest.py:107
msgid "hide problem tags"
msgstr ""
-#: judge/models/contest.py:102
+#: judge/models/contest.py:108
msgid "Whether problem tags should be hidden by default."
msgstr ""
-#: judge/models/contest.py:104
+#: judge/models/contest.py:110
+msgid "hide problem authors"
+msgstr ""
+
+#: judge/models/contest.py:111
+msgid "Whether problem authors should be hidden by default."
+msgstr ""
+
+#: judge/models/contest.py:113
msgid "run pretests only"
msgstr ""
-#: judge/models/contest.py:105
+#: judge/models/contest.py:114
msgid "Whether judges should grade pretests only, versus all testcases. Commonly set during a contest, then unset prior to rejudging user submissions when the contest ends."
msgstr ""
-#: judge/models/contest.py:109 judge/models/problem.py:166
+#: judge/models/contest.py:118 judge/models/problem.py:183
msgid "private to organizations"
msgstr ""
-#: judge/models/contest.py:110 judge/models/problem.py:164
-#: judge/models/profile.py:83
+#: judge/models/contest.py:119 judge/models/problem.py:181
+#: judge/models/profile.py:86
msgid "organizations"
msgstr "organizații"
-#: judge/models/contest.py:111
+#: judge/models/contest.py:120
msgid "If private, only these organizations may see the contest"
msgstr "Dacă e privat, doar aceste organizaţii pot vedea acest concurs"
-#: judge/models/contest.py:112 judge/models/problem.py:153
+#: judge/models/contest.py:121 judge/models/problem.py:167
msgid "OpenGraph image"
msgstr "Imagine OpenGraph"
-#: judge/models/contest.py:113 judge/models/profile.py:54
+#: judge/models/contest.py:122 judge/models/profile.py:57
msgid "Logo override image"
msgstr ""
-#: judge/models/contest.py:115
+#: judge/models/contest.py:124
msgid "This image will replace the default site logo for users inside the contest."
msgstr ""
-#: judge/models/contest.py:118
+#: judge/models/contest.py:127
msgid "the amount of live participants"
msgstr ""
-#: judge/models/contest.py:119
+#: judge/models/contest.py:128
msgid "contest summary"
msgstr ""
-#: judge/models/contest.py:120 judge/models/problem.py:155
+#: judge/models/contest.py:129 judge/models/problem.py:169
msgid "Plain-text, shown in meta description tag, e.g. for social media."
msgstr ""
-#: judge/models/contest.py:121 judge/models/profile.py:53
+#: judge/models/contest.py:130 judge/models/profile.py:56
msgid "access code"
msgstr ""
-#: judge/models/contest.py:122
+#: judge/models/contest.py:131
msgid "An optional code to prompt contestants before they are allowed to join the contest. Leave it blank to disable."
msgstr ""
-#: judge/models/contest.py:124 judge/models/problem.py:149
+#: judge/models/contest.py:133 judge/models/problem.py:163
msgid "personae non gratae"
msgstr ""
-#: judge/models/contest.py:125
+#: judge/models/contest.py:134
msgid "Bans the selected users from joining this contest."
msgstr ""
-#: judge/models/contest.py:126
+#: judge/models/contest.py:135
msgid "contest format"
msgstr ""
-#: judge/models/contest.py:127
+#: judge/models/contest.py:136
msgid "The contest format module to use."
msgstr ""
-#: judge/models/contest.py:128
+#: judge/models/contest.py:137
msgid "contest format configuration"
msgstr ""
-#: judge/models/contest.py:129
+#: judge/models/contest.py:138
msgid "A JSON object to serve as the configuration for the chosen contest format module. Leave empty to use None. Exact format depends on the contest format selected."
msgstr ""
-#: judge/models/contest.py:136
+#: judge/models/contest.py:145
msgid "contest lock"
msgstr ""
-#: judge/models/contest.py:137
-msgid "Prevent submissions from this contest from being rejudged."
+#: judge/models/contest.py:146
+msgid "Prevent submissions from this contest from being rejudged after this date."
msgstr ""
-#: judge/models/contest.py:138
+#: judge/models/contest.py:148
msgid "precision points"
msgstr ""
-#: judge/models/contest.py:140
+#: judge/models/contest.py:150
msgid "Number of digits to round points to."
msgstr ""
-#: judge/models/contest.py:362
+#: judge/models/contest.py:398
msgid "See private contests"
msgstr ""
-#: judge/models/contest.py:363
+#: judge/models/contest.py:399
msgid "Edit own contests"
msgstr ""
-#: judge/models/contest.py:364
+#: judge/models/contest.py:400
msgid "Edit all contests"
msgstr ""
-#: judge/models/contest.py:365
+#: judge/models/contest.py:401
msgid "Clone contest"
msgstr ""
-#: judge/models/contest.py:366 templates/contest/moss.html:74
+#: judge/models/contest.py:402 templates/contest/moss.html:74
msgid "MOSS contest"
msgstr ""
-#: judge/models/contest.py:367
+#: judge/models/contest.py:403
msgid "Rate contests"
msgstr ""
-#: judge/models/contest.py:368
+#: judge/models/contest.py:404
msgid "Contest access codes"
msgstr ""
-#: judge/models/contest.py:369
+#: judge/models/contest.py:405
msgid "Create private contests"
msgstr ""
-#: judge/models/contest.py:370
+#: judge/models/contest.py:406
msgid "Change contest visibility"
msgstr ""
-#: judge/models/contest.py:371
+#: judge/models/contest.py:407
msgid "Edit contest problem label script"
msgstr ""
-#: judge/models/contest.py:372
+#: judge/models/contest.py:408
msgid "Change lock status of contest"
msgstr ""
-#: judge/models/contest.py:374 judge/models/contest.py:472
-#: judge/models/contest.py:510 judge/models/contest.py:532
-#: judge/models/submission.py:84
+#: judge/models/contest.py:410 judge/models/contest.py:508
+#: judge/models/contest.py:547 judge/models/contest.py:569
+#: judge/models/submission.py:85
msgid "contest"
msgstr "concurs"
-#: judge/models/contest.py:375
+#: judge/models/contest.py:411
msgid "contests"
msgstr "concursuri"
-#: judge/models/contest.py:382
+#: judge/models/contest.py:418
msgid "associated contest"
msgstr ""
-#: judge/models/contest.py:385
+#: judge/models/contest.py:421
msgid "score"
msgstr "scor"
-#: judge/models/contest.py:386
+#: judge/models/contest.py:422
msgid "cumulative time"
msgstr ""
-#: judge/models/contest.py:387
+#: judge/models/contest.py:423
msgid "is disqualified"
msgstr ""
-#: judge/models/contest.py:388
+#: judge/models/contest.py:424
msgid "Whether this participation is disqualified."
msgstr ""
-#: judge/models/contest.py:389
+#: judge/models/contest.py:425
msgid "tie-breaking field"
msgstr ""
-#: judge/models/contest.py:390
+#: judge/models/contest.py:426
msgid "virtual participation id"
msgstr ""
-#: judge/models/contest.py:391
+#: judge/models/contest.py:427
msgid "0 means non-virtual, otherwise the n-th virtual participation."
msgstr ""
-#: judge/models/contest.py:392
+#: judge/models/contest.py:428
msgid "contest format specific data"
msgstr ""
-#: judge/models/contest.py:458
+#: judge/models/contest.py:494
#, python-format
msgid "%s spectating in %s"
msgstr ""
-#: judge/models/contest.py:460
+#: judge/models/contest.py:496
#, python-format
msgid "%s in %s, v%d"
msgstr ""
-#: judge/models/contest.py:461
+#: judge/models/contest.py:497
#, python-format
msgid "%s in %s"
msgstr ""
-#: judge/models/contest.py:464
+#: judge/models/contest.py:500
msgid "contest participation"
msgstr "participarea la concurs"
-#: judge/models/contest.py:465
+#: judge/models/contest.py:501
msgid "contest participations"
msgstr "participările la concurs"
-#: judge/models/contest.py:471 judge/models/contest.py:494
-#: judge/models/contest.py:533 judge/models/problem.py:430
-#: judge/models/problem.py:435 judge/models/problem.py:453
+#: judge/models/contest.py:507 judge/models/contest.py:531
+#: judge/models/contest.py:570 judge/models/problem.py:457
+#: judge/models/problem.py:462 judge/models/problem.py:480
#: judge/models/problem_data.py:35
msgid "problem"
msgstr "problemă"
-#: judge/models/contest.py:473 judge/models/contest.py:498
-#: judge/models/problem.py:137
+#: judge/models/contest.py:509 judge/models/contest.py:535
+#: judge/models/problem.py:151
msgid "points"
msgstr "puncte"
-#: judge/models/contest.py:474
+#: judge/models/contest.py:510
msgid "partial"
msgstr ""
-#: judge/models/contest.py:475 judge/models/contest.py:499
+#: judge/models/contest.py:511 judge/models/contest.py:536
msgid "is pretested"
msgstr ""
-#: judge/models/contest.py:476 judge/models/interface.py:43
+#: judge/models/contest.py:512 judge/models/interface.py:43
msgid "order"
msgstr ""
-#: judge/models/contest.py:477
+#: judge/models/contest.py:513
msgid "output prefix length override"
msgstr ""
-#: judge/models/contest.py:479
+#: judge/models/contest.py:515
msgid "Maximum number of submissions for this problem, or leave blank for no limit."
msgstr ""
-#: judge/models/contest.py:482
+#: judge/models/contest.py:518
msgid "Why include a problem you can't submit to?"
msgstr ""
-#: judge/models/contest.py:487
+#: judge/models/contest.py:523
msgid "contest problem"
msgstr "problema din concurs"
-#: judge/models/contest.py:488
+#: judge/models/contest.py:524
msgid "contest problems"
msgstr "problemele din concurs"
-#: judge/models/contest.py:492 judge/models/submission.py:207
+#: judge/models/contest.py:529 judge/models/submission.py:218
msgid "submission"
msgstr "submisie"
-#: judge/models/contest.py:496 judge/models/contest.py:511
+#: judge/models/contest.py:533 judge/models/contest.py:548
msgid "participation"
msgstr ""
-#: judge/models/contest.py:500
+#: judge/models/contest.py:537
msgid "Whether this submission was ran only on pretests."
msgstr ""
-#: judge/models/contest.py:504
+#: judge/models/contest.py:541
msgid "contest submission"
msgstr "submisie de concurs"
-#: judge/models/contest.py:505
+#: judge/models/contest.py:542
msgid "contest submissions"
msgstr "submisii de concurs"
-#: judge/models/contest.py:513
+#: judge/models/contest.py:550
msgid "rank"
msgstr ""
-#: judge/models/contest.py:514
+#: judge/models/contest.py:551
msgid "rating"
msgstr ""
-#: judge/models/contest.py:515
+#: judge/models/contest.py:552
msgid "volatility"
msgstr ""
-#: judge/models/contest.py:516
+#: judge/models/contest.py:553
msgid "last rated"
msgstr ""
-#: judge/models/contest.py:520
+#: judge/models/contest.py:557
msgid "contest rating"
msgstr "rating de la concurs"
-#: judge/models/contest.py:521
+#: judge/models/contest.py:558
msgid "contest ratings"
msgstr "ratinguri de la concurs"
-#: judge/models/contest.py:540
+#: judge/models/contest.py:577
msgid "contest moss result"
msgstr ""
-#: judge/models/contest.py:541
+#: judge/models/contest.py:578
msgid "contest moss results"
msgstr ""
@@ -1216,7 +1233,7 @@ msgstr ""
msgid "post title"
msgstr ""
-#: judge/models/interface.py:67 judge/models/problem.py:473
+#: judge/models/interface.py:67 judge/models/problem.py:500
msgid "authors"
msgstr ""
@@ -1224,7 +1241,7 @@ msgstr ""
msgid "slug"
msgstr ""
-#: judge/models/interface.py:69 judge/models/problem.py:471
+#: judge/models/interface.py:69 judge/models/problem.py:498
msgid "public visibility"
msgstr ""
@@ -1260,34 +1277,6 @@ msgstr "postare pe blog"
msgid "blog posts"
msgstr "postări pe blog"
-#: judge/models/message.py:11
-msgid "message title"
-msgstr ""
-
-#: judge/models/message.py:12 judge/models/ticket.py:30
-msgid "message body"
-msgstr ""
-
-#: judge/models/message.py:13
-msgid "sender"
-msgstr ""
-
-#: judge/models/message.py:14
-msgid "target"
-msgstr ""
-
-#: judge/models/message.py:15
-msgid "message timestamp"
-msgstr ""
-
-#: judge/models/message.py:16
-msgid "read"
-msgstr ""
-
-#: judge/models/message.py:20
-msgid "messages in the thread"
-msgstr ""
-
#: judge/models/problem.py:30
#, python-format
msgid "Disallowed characters: %(value)s"
@@ -1305,7 +1294,7 @@ msgstr ""
msgid "problem type"
msgstr "tipul problemei"
-#: judge/models/problem.py:44 judge/models/problem.py:121
+#: judge/models/problem.py:44 judge/models/problem.py:135
msgid "problem types"
msgstr "tipurile problemei"
@@ -1317,7 +1306,7 @@ msgstr ""
msgid "problem group name"
msgstr ""
-#: judge/models/problem.py:56 judge/models/problem.py:124
+#: judge/models/problem.py:56 judge/models/problem.py:138
msgid "problem group"
msgstr "grupul problemei"
@@ -1337,7 +1326,7 @@ msgstr ""
msgid "full name"
msgstr "nume complet"
-#: judge/models/problem.py:65 judge/models/profile.py:41
+#: judge/models/problem.py:65 judge/models/profile.py:44
#: judge/models/runtime.py:24
msgid "short name"
msgstr ""
@@ -1366,232 +1355,252 @@ msgstr "licență"
msgid "licenses"
msgstr "licențe"
-#: judge/models/problem.py:104
+#: judge/models/problem.py:112
+msgid "Follow global setting"
+msgstr ""
+
+#: judge/models/problem.py:113
+msgid "Always visible"
+msgstr ""
+
+#: judge/models/problem.py:114
+msgid "Visible if problem solved"
+msgstr ""
+
+#: judge/models/problem.py:115
+msgid "Only own submissions"
+msgstr ""
+
+#: judge/models/problem.py:118
msgid "problem code"
msgstr "codul problemei"
-#: judge/models/problem.py:106
+#: judge/models/problem.py:120
msgid "A short, unique code for the problem, used in the url after /problem/"
msgstr ""
-#: judge/models/problem.py:108
+#: judge/models/problem.py:122
msgid "problem name"
msgstr "numele problemei"
-#: judge/models/problem.py:109
+#: judge/models/problem.py:123
msgid "The full name of the problem, as shown in the problem list."
msgstr ""
-#: judge/models/problem.py:111
+#: judge/models/problem.py:125
msgid "problem body"
msgstr ""
-#: judge/models/problem.py:112
+#: judge/models/problem.py:126
msgid "creators"
msgstr ""
-#: judge/models/problem.py:113
+#: judge/models/problem.py:127
msgid "These users will be able to edit the problem, and be listed as authors."
msgstr ""
-#: judge/models/problem.py:115
+#: judge/models/problem.py:129
msgid "curators"
msgstr ""
-#: judge/models/problem.py:116
+#: judge/models/problem.py:130
msgid "These users will be able to edit the problem, but not be listed as authors."
msgstr ""
-#: judge/models/problem.py:118
+#: judge/models/problem.py:132
msgid "testers"
msgstr ""
-#: judge/models/problem.py:120
+#: judge/models/problem.py:134
msgid "These users will be able to view the private problem, but not edit it."
msgstr ""
-#: judge/models/problem.py:122
+#: judge/models/problem.py:136
msgid "The type of problem, as shown on the problem's page."
msgstr ""
-#: judge/models/problem.py:125
+#: judge/models/problem.py:139
msgid "The group of problem, shown under Category in the problem list."
msgstr ""
-#: judge/models/problem.py:127
+#: judge/models/problem.py:141
msgid "The time limit for this problem, in seconds. Fractional seconds (e.g. 1.5) are supported."
msgstr ""
-#: judge/models/problem.py:131 judge/models/problem.py:458
+#: judge/models/problem.py:145 judge/models/problem.py:485
msgid "memory limit"
msgstr ""
-#: judge/models/problem.py:132
+#: judge/models/problem.py:146
msgid "The memory limit for this problem, in kilobytes (e.g. 64mb = 65536 kilobytes)."
msgstr ""
-#: judge/models/problem.py:138
+#: judge/models/problem.py:152
msgid "Points awarded for problem completion. Points are displayed with a 'p' suffix if partial."
msgstr ""
-#: judge/models/problem.py:141
+#: judge/models/problem.py:155
msgid "allows partial points"
msgstr ""
-#: judge/models/problem.py:142
+#: judge/models/problem.py:156
msgid "allowed languages"
msgstr ""
-#: judge/models/problem.py:143
+#: judge/models/problem.py:157
msgid "List of allowed submission languages."
msgstr ""
-#: judge/models/problem.py:145
+#: judge/models/problem.py:159
msgid "manually managed"
msgstr ""
-#: judge/models/problem.py:146
+#: judge/models/problem.py:160
msgid "Whether judges should be allowed to manage data or not."
msgstr ""
-#: judge/models/problem.py:147
+#: judge/models/problem.py:161
msgid "date of publishing"
msgstr ""
-#: judge/models/problem.py:148
+#: judge/models/problem.py:162
msgid "Doesn't have magic ability to auto-publish due to backward compatibility"
msgstr ""
-#: judge/models/problem.py:150
+#: judge/models/problem.py:164
msgid "Bans the selected users from submitting to this problem."
msgstr ""
-#: judge/models/problem.py:152
+#: judge/models/problem.py:166
msgid "The license under which this problem is published."
msgstr ""
-#: judge/models/problem.py:154
+#: judge/models/problem.py:168
msgid "problem summary"
msgstr ""
-#: judge/models/problem.py:156
+#: judge/models/problem.py:170
msgid "number of users"
msgstr ""
-#: judge/models/problem.py:157
+#: judge/models/problem.py:171
msgid "The number of users who solved the problem."
msgstr ""
-#: judge/models/problem.py:158
+#: judge/models/problem.py:172
msgid "solve rate"
msgstr ""
-#: judge/models/problem.py:159
+#: judge/models/problem.py:173
msgid "allow full markdown access"
msgstr ""
-#: judge/models/problem.py:165
+#: judge/models/problem.py:174
+msgid "submission source visibility"
+msgstr ""
+
+#: judge/models/problem.py:182
msgid "If private, only these organizations may see the problem."
msgstr ""
-#: judge/models/problem.py:420
+#: judge/models/problem.py:447
msgid "See hidden problems"
msgstr ""
-#: judge/models/problem.py:421
+#: judge/models/problem.py:448
msgid "Edit own problems"
msgstr ""
-#: judge/models/problem.py:422
+#: judge/models/problem.py:449
msgid "Edit all problems"
msgstr ""
-#: judge/models/problem.py:423
+#: judge/models/problem.py:450
msgid "Edit all public problems"
msgstr ""
-#: judge/models/problem.py:424
+#: judge/models/problem.py:451
msgid "Edit problems with full markup"
msgstr ""
-#: judge/models/problem.py:425 templates/problem/problem.html:161
+#: judge/models/problem.py:452 templates/problem/problem.html:161
msgid "Clone problem"
msgstr "Duplică problemă"
-#: judge/models/problem.py:426
+#: judge/models/problem.py:453
msgid "Change is_public field"
msgstr ""
-#: judge/models/problem.py:427
+#: judge/models/problem.py:454
msgid "Change is_manually_managed field"
msgstr ""
-#: judge/models/problem.py:428
+#: judge/models/problem.py:455
msgid "See organization-private problems"
msgstr ""
-#: judge/models/problem.py:436 judge/models/problem.py:454
+#: judge/models/problem.py:463 judge/models/problem.py:481
#: judge/models/runtime.py:111
msgid "language"
msgstr "limbaj"
-#: judge/models/problem.py:437
+#: judge/models/problem.py:464
msgid "translated name"
msgstr ""
-#: judge/models/problem.py:438
+#: judge/models/problem.py:465
msgid "translated description"
msgstr ""
-#: judge/models/problem.py:442
+#: judge/models/problem.py:469
msgid "problem translation"
msgstr ""
-#: judge/models/problem.py:443
+#: judge/models/problem.py:470
msgid "problem translations"
msgstr ""
-#: judge/models/problem.py:447
+#: judge/models/problem.py:474
msgid "clarified problem"
msgstr ""
-#: judge/models/problem.py:448
+#: judge/models/problem.py:475
msgid "clarification body"
msgstr ""
-#: judge/models/problem.py:449
+#: judge/models/problem.py:476
msgid "clarification timestamp"
msgstr ""
-#: judge/models/problem.py:464
+#: judge/models/problem.py:491
msgid "language-specific resource limit"
msgstr "limita de resurse specifică limbii"
-#: judge/models/problem.py:465
+#: judge/models/problem.py:492
msgid "language-specific resource limits"
msgstr "limite de resurse specifică limbii"
-#: judge/models/problem.py:469
+#: judge/models/problem.py:496
msgid "associated problem"
msgstr ""
-#: judge/models/problem.py:472
+#: judge/models/problem.py:499
msgid "publish date"
msgstr ""
-#: judge/models/problem.py:474
+#: judge/models/problem.py:501
msgid "editorial content"
msgstr ""
-#: judge/models/problem.py:497
+#: judge/models/problem.py:524
msgid "See hidden solutions"
msgstr ""
-#: judge/models/problem.py:499
+#: judge/models/problem.py:526
msgid "solution"
msgstr "soluţie"
-#: judge/models/problem.py:500
+#: judge/models/problem.py:527
msgid "solutions"
msgstr "soluţii"
@@ -1703,112 +1712,112 @@ msgstr ""
msgid "case is pretest?"
msgstr ""
-#: judge/models/profile.py:38
+#: judge/models/profile.py:41
msgid "organization title"
msgstr ""
-#: judge/models/profile.py:39
+#: judge/models/profile.py:42
msgid "organization slug"
msgstr ""
-#: judge/models/profile.py:40
+#: judge/models/profile.py:43
msgid "Organization name shown in URL"
msgstr ""
-#: judge/models/profile.py:42
+#: judge/models/profile.py:45
msgid "Displayed beside user name during contests"
msgstr "Afişat lângă numele de utilizator în timpul concursurilor"
-#: judge/models/profile.py:43
+#: judge/models/profile.py:46
msgid "organization description"
msgstr ""
-#: judge/models/profile.py:44
+#: judge/models/profile.py:47
msgid "administrators"
msgstr ""
-#: judge/models/profile.py:45
+#: judge/models/profile.py:48
msgid "Those who can edit this organization"
msgstr "Cei care pot edita această organizaţie"
-#: judge/models/profile.py:46
+#: judge/models/profile.py:49
msgid "creation date"
msgstr ""
-#: judge/models/profile.py:47
+#: judge/models/profile.py:50
msgid "is open organization?"
msgstr ""
-#: judge/models/profile.py:48
+#: judge/models/profile.py:51
msgid "Allow joining organization"
msgstr "Permite aderarea la organizaţie"
-#: judge/models/profile.py:49
+#: judge/models/profile.py:52
msgid "maximum size"
msgstr ""
-#: judge/models/profile.py:50
+#: judge/models/profile.py:53
msgid "Maximum amount of users in this organization, only applicable to private organizations"
msgstr ""
-#: judge/models/profile.py:52
+#: judge/models/profile.py:55
msgid "Student access code"
msgstr ""
-#: judge/models/profile.py:56
+#: judge/models/profile.py:59
msgid "This image will replace the default site logo for users viewing the organization."
msgstr ""
-#: judge/models/profile.py:79
+#: judge/models/profile.py:82
msgid "Administer organizations"
msgstr ""
-#: judge/models/profile.py:80
+#: judge/models/profile.py:83
msgid "Edit all organizations"
msgstr ""
-#: judge/models/profile.py:82 judge/models/profile.py:99
-#: judge/models/profile.py:269
+#: judge/models/profile.py:85 judge/models/profile.py:102
+#: judge/models/profile.py:293
msgid "organization"
msgstr "organizație"
-#: judge/models/profile.py:87
+#: judge/models/profile.py:90
msgid "user associated"
msgstr ""
-#: judge/models/profile.py:88
+#: judge/models/profile.py:91
msgid "self-description"
msgstr ""
-#: judge/models/profile.py:89
+#: judge/models/profile.py:92
msgid "location"
msgstr ""
-#: judge/models/profile.py:91
+#: judge/models/profile.py:94
msgid "preferred language"
msgstr ""
-#: judge/models/profile.py:97
+#: judge/models/profile.py:100
msgid "last access time"
msgstr ""
-#: judge/models/profile.py:98
+#: judge/models/profile.py:101
msgid "last IP"
msgstr "ultimul IP"
-#: judge/models/profile.py:101
+#: judge/models/profile.py:104
msgid "display rank"
msgstr ""
-#: judge/models/profile.py:103
+#: judge/models/profile.py:106
msgid "Normal User"
msgstr ""
-#: judge/models/profile.py:104
+#: judge/models/profile.py:107
msgid "Problem Setter"
msgstr ""
-#: judge/models/profile.py:105 templates/base.html:220
+#: judge/models/profile.py:108 templates/base.html:220
#: templates/comments/list.html:99 templates/contest/contest-list-tabs.html:24
#: templates/contest/ranking-table.html:49
#: templates/problem/problem-list-tabs.html:6
@@ -1817,155 +1826,167 @@ msgstr ""
msgid "Admin"
msgstr "Administrare"
-#: judge/models/profile.py:106
+#: judge/models/profile.py:109
msgid "comment mute"
msgstr ""
-#: judge/models/profile.py:106
+#: judge/models/profile.py:109
msgid "Some users are at their best when silent."
msgstr "Pe unii utilizatori e preferabil sa nu ȋi auzi."
-#: judge/models/profile.py:108
+#: judge/models/profile.py:111
msgid "unlisted user"
msgstr ""
-#: judge/models/profile.py:108
+#: judge/models/profile.py:111
msgid "User will not be ranked."
msgstr ""
-#: judge/models/profile.py:111
+#: judge/models/profile.py:114
msgid "user script"
msgstr ""
-#: judge/models/profile.py:112
+#: judge/models/profile.py:115
msgid "User-defined JavaScript for site customization."
msgstr "JavaScript definit de utilizator pentru personalizarea site-ului."
-#: judge/models/profile.py:113
+#: judge/models/profile.py:116
msgid "current contest"
msgstr ""
-#: judge/models/profile.py:115
+#: judge/models/profile.py:118
msgid "math engine"
msgstr ""
-#: judge/models/profile.py:117
+#: judge/models/profile.py:120
msgid "the rendering engine used to render math"
msgstr ""
-#: judge/models/profile.py:118
+#: judge/models/profile.py:121
msgid "TOTP 2FA enabled"
msgstr ""
-#: judge/models/profile.py:119
+#: judge/models/profile.py:122
msgid "check to enable TOTP-based two-factor authentication"
msgstr ""
-#: judge/models/profile.py:120
+#: judge/models/profile.py:123
msgid "WebAuthn 2FA enabled"
msgstr ""
-#: judge/models/profile.py:121
+#: judge/models/profile.py:124
msgid "check to enable WebAuthn-based two-factor authentication"
msgstr ""
-#: judge/models/profile.py:122
+#: judge/models/profile.py:125
msgid "TOTP key"
msgstr ""
-#: judge/models/profile.py:123
+#: judge/models/profile.py:126
msgid "32 character base32-encoded key for TOTP"
msgstr ""
-#: judge/models/profile.py:125
+#: judge/models/profile.py:128
msgid "TOTP key must be empty or base32"
msgstr ""
-#: judge/models/profile.py:126
+#: judge/models/profile.py:129
msgid "scratch codes"
msgstr ""
-#: judge/models/profile.py:127
+#: judge/models/profile.py:130
msgid "JSON array of 16 character base32-encoded codes for scratch codes"
msgstr ""
-#: judge/models/profile.py:131
+#: judge/models/profile.py:134
msgid "Scratch codes must be empty or a JSON array of 16-character base32 codes"
msgstr ""
-#: judge/models/profile.py:133
+#: judge/models/profile.py:136
+msgid "last TOTP timecode"
+msgstr ""
+
+#: judge/models/profile.py:137
msgid "API token"
msgstr ""
-#: judge/models/profile.py:134
+#: judge/models/profile.py:138
msgid "64 character hex-encoded API access token"
msgstr ""
-#: judge/models/profile.py:136
+#: judge/models/profile.py:140
msgid "API token must be None or hexadecimal"
msgstr ""
-#: judge/models/profile.py:137
+#: judge/models/profile.py:141
msgid "internal notes"
msgstr ""
-#: judge/models/profile.py:138
+#: judge/models/profile.py:142
msgid "Notes for administrators regarding this user."
msgstr ""
-#: judge/models/profile.py:139
+#: judge/models/profile.py:143
msgid "last data download time"
msgstr ""
-#: judge/models/profile.py:236
+#: judge/models/profile.py:253
msgid "Shows in-progress development stuff"
msgstr ""
-#: judge/models/profile.py:237
+#: judge/models/profile.py:254
msgid "Edit TOTP settings"
msgstr ""
-#: judge/models/profile.py:239
+#: judge/models/profile.py:256
msgid "user profile"
msgstr "profil utilizator"
-#: judge/models/profile.py:240
+#: judge/models/profile.py:257
msgid "user profiles"
msgstr "profiluri utilizatori"
-#: judge/models/profile.py:246
+#: judge/models/profile.py:263
msgid "device name"
msgstr ""
-#: judge/models/profile.py:247
+#: judge/models/profile.py:264
msgid "credential ID"
msgstr ""
-#: judge/models/profile.py:248
+#: judge/models/profile.py:265
msgid "public key"
msgstr ""
-#: judge/models/profile.py:249
+#: judge/models/profile.py:266
msgid "sign counter"
msgstr ""
-#: judge/models/profile.py:271
+#: judge/models/profile.py:287
+msgid "WebAuthn credential"
+msgstr ""
+
+#: judge/models/profile.py:288
+msgid "WebAuthn credentials"
+msgstr ""
+
+#: judge/models/profile.py:295
msgid "request time"
msgstr ""
-#: judge/models/profile.py:272
+#: judge/models/profile.py:296
msgid "state"
msgstr ""
-#: judge/models/profile.py:277
+#: judge/models/profile.py:301
msgid "reason"
msgstr ""
-#: judge/models/profile.py:280
+#: judge/models/profile.py:304
msgid "organization join request"
msgstr "cerere de a se alătura organizaţiei"
-#: judge/models/profile.py:281
+#: judge/models/profile.py:305
msgid "organization join requests"
msgstr "cereri de a se alătura organizaţiei"
@@ -2121,210 +2142,210 @@ msgstr "evaluatoare"
msgid "judge"
msgstr "evaluator"
-#: judge/models/submission.py:20 judge/models/submission.py:47
+#: judge/models/submission.py:21 judge/models/submission.py:48
#: judge/utils/problems.py:74
msgid "Accepted"
msgstr "Accepted"
-#: judge/models/submission.py:21 judge/models/submission.py:48
+#: judge/models/submission.py:22 judge/models/submission.py:49
msgid "Wrong Answer"
msgstr "Wrong Answer"
-#: judge/models/submission.py:22 judge/models/submission.py:50
+#: judge/models/submission.py:23 judge/models/submission.py:51
msgid "Time Limit Exceeded"
msgstr "Time Limit Exceeded"
-#: judge/models/submission.py:23 judge/models/submission.py:51
+#: judge/models/submission.py:24 judge/models/submission.py:52
msgid "Memory Limit Exceeded"
msgstr "Memory Limit Exceeded"
-#: judge/models/submission.py:24 judge/models/submission.py:52
+#: judge/models/submission.py:25 judge/models/submission.py:53
msgid "Output Limit Exceeded"
msgstr "Output Limit Exceeded"
-#: judge/models/submission.py:25 judge/models/submission.py:53
+#: judge/models/submission.py:26 judge/models/submission.py:54
msgid "Invalid Return"
msgstr "Invalid Return"
-#: judge/models/submission.py:26 judge/models/submission.py:54
+#: judge/models/submission.py:27 judge/models/submission.py:55
msgid "Runtime Error"
msgstr "Runtime Error"
-#: judge/models/submission.py:27 judge/models/submission.py:41
-#: judge/models/submission.py:55 judge/utils/problems.py:76
+#: judge/models/submission.py:28 judge/models/submission.py:42
+#: judge/models/submission.py:56 judge/utils/problems.py:76
msgid "Compile Error"
msgstr "Compile Error"
-#: judge/models/submission.py:28 judge/models/submission.py:40
+#: judge/models/submission.py:29 judge/models/submission.py:41
msgid "Internal Error"
msgstr "Internal Error"
-#: judge/models/submission.py:29
+#: judge/models/submission.py:30
msgid "Short circuit"
msgstr "Short circuit"
-#: judge/models/submission.py:30 judge/models/submission.py:42
-#: judge/models/submission.py:61
+#: judge/models/submission.py:31 judge/models/submission.py:43
+#: judge/models/submission.py:62
msgid "Aborted"
msgstr "Aborted"
-#: judge/models/submission.py:36 judge/models/submission.py:57
+#: judge/models/submission.py:37 judge/models/submission.py:58
msgid "Queued"
msgstr "Queued"
-#: judge/models/submission.py:37 judge/models/submission.py:58
+#: judge/models/submission.py:38 judge/models/submission.py:59
msgid "Processing"
msgstr "Processing"
-#: judge/models/submission.py:38 judge/models/submission.py:59
+#: judge/models/submission.py:39 judge/models/submission.py:60
msgid "Grading"
msgstr "Grading"
-#: judge/models/submission.py:39 judge/models/submission.py:60
+#: judge/models/submission.py:40 judge/models/submission.py:61
msgid "Completed"
msgstr "Completed"
-#: judge/models/submission.py:56
+#: judge/models/submission.py:57
msgid "Internal Error (judging server error)"
msgstr "Internal Error (judging server error)"
-#: judge/models/submission.py:66
+#: judge/models/submission.py:67
msgid "submission time"
msgstr ""
-#: judge/models/submission.py:67 judge/models/submission.py:227
+#: judge/models/submission.py:68 judge/models/submission.py:238
msgid "execution time"
msgstr ""
-#: judge/models/submission.py:68 judge/models/submission.py:228
+#: judge/models/submission.py:69 judge/models/submission.py:239
msgid "memory usage"
msgstr ""
-#: judge/models/submission.py:69 judge/models/submission.py:229
+#: judge/models/submission.py:70 judge/models/submission.py:240
msgid "points granted"
msgstr ""
-#: judge/models/submission.py:70
+#: judge/models/submission.py:71
msgid "submission language"
msgstr ""
-#: judge/models/submission.py:71
+#: judge/models/submission.py:72
msgid "status"
msgstr ""
-#: judge/models/submission.py:72
+#: judge/models/submission.py:73
msgid "result"
msgstr ""
-#: judge/models/submission.py:74
+#: judge/models/submission.py:75
msgid "compile errors"
msgstr ""
-#: judge/models/submission.py:76
+#: judge/models/submission.py:77
msgid "batched cases"
msgstr ""
-#: judge/models/submission.py:77
+#: judge/models/submission.py:78
msgid "test case points"
msgstr ""
-#: judge/models/submission.py:78
+#: judge/models/submission.py:79
msgid "test case total points"
msgstr ""
-#: judge/models/submission.py:79
+#: judge/models/submission.py:80
msgid "judged on"
msgstr ""
-#: judge/models/submission.py:81
+#: judge/models/submission.py:82
msgid "submission judge time"
msgstr ""
-#: judge/models/submission.py:82
-msgid "was rejudged by admin"
+#: judge/models/submission.py:83
+msgid "last rejudge date by admin"
msgstr ""
-#: judge/models/submission.py:83
+#: judge/models/submission.py:84
msgid "was ran on pretests only"
msgstr ""
-#: judge/models/submission.py:86
-msgid "lock submission"
+#: judge/models/submission.py:87
+msgid "submission lock"
msgstr ""
-#: judge/models/submission.py:199
+#: judge/models/submission.py:210
msgid "Abort any submission"
msgstr ""
-#: judge/models/submission.py:200
+#: judge/models/submission.py:211
msgid "Rejudge the submission"
msgstr ""
-#: judge/models/submission.py:201
+#: judge/models/submission.py:212
msgid "Rejudge a lot of submissions"
msgstr ""
-#: judge/models/submission.py:202
+#: judge/models/submission.py:213
msgid "Submit without limit"
msgstr ""
-#: judge/models/submission.py:203
+#: judge/models/submission.py:214
msgid "View all submission"
msgstr ""
-#: judge/models/submission.py:204
+#: judge/models/submission.py:215
msgid "Resubmit others' submission"
msgstr ""
-#: judge/models/submission.py:205
+#: judge/models/submission.py:216
msgid "Change lock status of submission"
msgstr ""
-#: judge/models/submission.py:208 templates/contest/moss.html:58
+#: judge/models/submission.py:219 templates/contest/moss.html:58
msgid "submissions"
msgstr "submisii"
-#: judge/models/submission.py:212 judge/models/submission.py:223
+#: judge/models/submission.py:223 judge/models/submission.py:234
msgid "associated submission"
msgstr ""
-#: judge/models/submission.py:214
+#: judge/models/submission.py:225
msgid "source code"
msgstr ""
-#: judge/models/submission.py:225
+#: judge/models/submission.py:236
msgid "test case ID"
msgstr ""
-#: judge/models/submission.py:226
+#: judge/models/submission.py:237
msgid "status flag"
msgstr ""
-#: judge/models/submission.py:230
+#: judge/models/submission.py:241
msgid "points possible"
msgstr ""
-#: judge/models/submission.py:231
+#: judge/models/submission.py:242
msgid "batch number"
msgstr ""
-#: judge/models/submission.py:232
+#: judge/models/submission.py:243
msgid "judging feedback"
msgstr ""
-#: judge/models/submission.py:233
+#: judge/models/submission.py:244
msgid "extended judging feedback"
msgstr ""
-#: judge/models/submission.py:234
+#: judge/models/submission.py:245
msgid "program output"
msgstr ""
-#: judge/models/submission.py:242
+#: judge/models/submission.py:253
msgid "submission test case"
msgstr "testul submisiei"
-#: judge/models/submission.py:243
+#: judge/models/submission.py:254
msgid "submission test cases"
msgstr "testele submisiei"
@@ -2372,6 +2393,10 @@ msgstr ""
msgid "poster"
msgstr ""
+#: judge/models/ticket.py:30
+msgid "message body"
+msgstr ""
+
#: judge/models/ticket.py:31
msgid "message time"
msgstr ""
@@ -2394,19 +2419,23 @@ msgstr ""
msgid "Running MOSS"
msgstr ""
-#: judge/tasks/submission.py:43
+#: judge/tasks/submission.py:45
msgid "Modifying submissions"
msgstr ""
-#: judge/tasks/submission.py:56
+#: judge/tasks/submission.py:58
msgid "Recalculating user points"
msgstr ""
-#: judge/tasks/user.py:50
+#: judge/tasks/user.py:49
+msgid "Applying filters"
+msgstr ""
+
+#: judge/tasks/user.py:64
msgid "Preparing your submission data"
msgstr ""
-#: judge/tasks/user.py:81
+#: judge/tasks/user.py:95
msgid "Preparing your comment data"
msgstr ""
@@ -2522,7 +2551,7 @@ msgstr ""
msgid "You already voted."
msgstr "Ai votat deja."
-#: judge/views/comment.py:129 judge/views/organization.py:298
+#: judge/views/comment.py:129 judge/views/organization.py:297
msgid "Edited from site"
msgstr "Editat de pe site"
@@ -2530,125 +2559,130 @@ msgstr "Editat de pe site"
msgid "Editing comment"
msgstr ""
-#: judge/views/contests.py:56 judge/views/contests.py:201
-#: judge/views/contests.py:204 judge/views/contests.py:382
+#: judge/views/contests.py:57 judge/views/contests.py:210
+#: judge/views/contests.py:213 judge/views/contests.py:395
msgid "No such contest"
msgstr "Niciun concurs de acest fel"
-#: judge/views/contests.py:57 judge/views/contests.py:202
+#: judge/views/contests.py:58 judge/views/contests.py:211
#, python-format
msgid "Could not find a contest with the key \"%s\"."
msgstr "Niciun concurs găsit cu cheia \"%s\"."
-#: judge/views/contests.py:70
+#: judge/views/contests.py:71
msgid "Contests"
msgstr "Concursuri"
-#: judge/views/contests.py:205
+#: judge/views/contests.py:214
msgid "Could not find such contest."
msgstr "Nu am putut găsi un concurs de acest fel."
-#: judge/views/contests.py:208
+#: judge/views/contests.py:217
#, python-format
msgid "Access to contest \"%s\" denied"
msgstr "Nu aveți acces la concursul \"%s\""
-#: judge/views/contests.py:235
+#: judge/views/contests.py:244
msgid "Clone Contest"
msgstr ""
-#: judge/views/contests.py:301
+#: judge/views/contests.py:278
+#, python-format
+msgid "Cloned contest from %s"
+msgstr ""
+
+#: judge/views/contests.py:314
msgid "Contest not ongoing"
msgstr "Concursul nu este în curs de desfăşurare"
-#: judge/views/contests.py:302
+#: judge/views/contests.py:315
#, python-format
msgid "\"%s\" is not currently ongoing."
msgstr "Momentan, \"%s\" nu este în curs de desfăşurare."
-#: judge/views/contests.py:306
+#: judge/views/contests.py:319
msgid "Already in contest"
msgstr "Deja în concurs"
-#: judge/views/contests.py:307
+#: judge/views/contests.py:320
#, python-format
msgid "You are already in a contest: \"%s\"."
msgstr "Sunteţi deja într-un concurs: \"%s\"."
-#: judge/views/contests.py:310
+#: judge/views/contests.py:323
msgid "Banned from joining"
msgstr ""
-#: judge/views/contests.py:311
+#: judge/views/contests.py:324
msgid "You have been declared persona non grata for this contest. You are permanently barred from joining this contest."
msgstr ""
-#: judge/views/contests.py:372
+#: judge/views/contests.py:385
#, python-format
msgid "Enter access code for \"%s\""
msgstr ""
-#: judge/views/contests.py:383
+#: judge/views/contests.py:396
#, python-format
msgid "You are not in contest \"%s\"."
msgstr "Nu sunteţi în concursul \"%s\"."
-#: judge/views/contests.py:402
+#: judge/views/contests.py:415
msgid "ContestCalendar requires integer year and month"
msgstr ""
-#: judge/views/contests.py:442
+#: judge/views/contests.py:455
#, python-format
msgid "Contests in %(month)s"
msgstr "Concursuri în %(month)s"
-#: judge/views/contests.py:442
+#: judge/views/contests.py:455
msgid "F Y"
msgstr ""
-#: judge/views/contests.py:489
+#: judge/views/contests.py:502
#, python-format
msgid "%s Statistics"
msgstr ""
-#: judge/views/contests.py:662
+#: judge/views/contests.py:675
#, python-format
msgid "%s Rankings"
msgstr ""
-#: judge/views/contests.py:670
+#: judge/views/contests.py:683
msgid "???"
msgstr ""
-#: judge/views/contests.py:686
+#: judge/views/contests.py:699
#, python-format
msgid "Your participation in %s"
msgstr ""
-#: judge/views/contests.py:687
+#: judge/views/contests.py:700
#, python-format
msgid "%s's participation in %s"
msgstr ""
-#: judge/views/contests.py:694
+#: judge/views/contests.py:707
msgid "Live"
msgstr ""
-#: judge/views/contests.py:706 templates/contest/contest-tabs.html:13
+#: judge/views/contests.py:719 templates/contest/contest-tabs.html:13
msgid "Participation"
msgstr ""
-#: judge/views/contests.py:750
+#: judge/views/contests.py:763
#, python-format
msgid "%s MOSS Results"
msgstr ""
-#: judge/views/contests.py:777
+#: judge/views/contests.py:790
#, python-format
msgid "Running MOSS for %s..."
msgstr ""
-#: judge/views/contests.py:800
+#: judge/views/contests.py:813
#, python-format
msgid "Contest tag: %s"
msgstr ""
@@ -2677,71 +2711,71 @@ msgstr "pagina corupta %s"
msgid "Runtimes"
msgstr "Limbaje"
-#: judge/views/organization.py:44 judge/views/organization.py:47
+#: judge/views/organization.py:43 judge/views/organization.py:46
msgid "No such organization"
msgstr "Nicio organizaţie de acest fel"
-#: judge/views/organization.py:45
+#: judge/views/organization.py:44
#, python-format
msgid "Could not find an organization with the key \"%s\"."
msgstr "Nicio organizaţie găsită cu cheia \"%s\"."
-#: judge/views/organization.py:48
+#: judge/views/organization.py:47
msgid "Could not find such organization."
msgstr "Nu am putut găsi organizaţii de acest fel."
-#: judge/views/organization.py:72 judge/views/register.py:34
+#: judge/views/organization.py:71 judge/views/register.py:33
#: templates/organization/list.html:15 templates/user/user-list-tabs.html:5
msgid "Organizations"
msgstr "Organizaţii"
-#: judge/views/organization.py:93
+#: judge/views/organization.py:92
#, python-format
msgid "%s Members"
msgstr "%s Membri"
-#: judge/views/organization.py:118 judge/views/organization.py:121
-#: judge/views/organization.py:126
+#: judge/views/organization.py:117 judge/views/organization.py:120
+#: judge/views/organization.py:125
msgid "Joining organization"
msgstr "Aderarea la organizaţie"
-#: judge/views/organization.py:118
+#: judge/views/organization.py:117
msgid "You are already in the organization."
msgstr "Sunteţi deja în organizaţie."
-#: judge/views/organization.py:121
+#: judge/views/organization.py:120
msgid "This organization is not open."
msgstr "Această organizaţie nu este deschisă."
-#: judge/views/organization.py:138
+#: judge/views/organization.py:137
msgid "Leaving organization"
msgstr "Părăsire organizaţie"
-#: judge/views/organization.py:138
+#: judge/views/organization.py:137
#, python-format
msgid "You are not in \"%s\"."
msgstr "Nu sunteţi în \"%s\"."
-#: judge/views/organization.py:162
+#: judge/views/organization.py:161
#, python-format
msgid "Request to join %s"
msgstr "Cerere de adăugare la %s"
-#: judge/views/organization.py:180
+#: judge/views/organization.py:179
msgid "Join request detail"
msgstr "Detalii despre cererea de adăugare"
-#: judge/views/organization.py:208
+#: judge/views/organization.py:207
#, python-format
msgid "Managing join requests for %s"
msgstr "Gestionarea cererilor de asociere cu %s"
-#: judge/views/organization.py:239
+#: judge/views/organization.py:238
#, python-format
msgid "Your organization can only receive %d more members. You cannot approve %d users."
msgstr ""
-#: judge/views/organization.py:251
+#: judge/views/organization.py:250
#, python-format
msgid "Approved %d user."
msgid_plural "Approved %d users."
@@ -2749,7 +2783,7 @@ msgstr[0] "Aprobat %d utilizator."
msgstr[1] "Aprobat %d utilizatori."
msgstr[2] "Aprobat %d utilizatori."
-#: judge/views/organization.py:252
+#: judge/views/organization.py:251
#, python-format
msgid "Rejected %d user."
msgid_plural "Rejected %d users."
@@ -2757,85 +2791,99 @@ msgstr[0] "Respins %d utilizator."
msgstr[1] "Respins %d utilizatori."
msgstr[2] "Respins %d utilizatori."
-#: judge/views/organization.py:282
+#: judge/views/organization.py:281
#, python-format
msgid "Editing %s"
msgstr "Editare %s"
-#: judge/views/organization.py:306 judge/views/organization.py:314
+#: judge/views/organization.py:305 judge/views/organization.py:313
msgid "Can't edit organization"
msgstr "Nu puteţi edita organizaţia"
-#: judge/views/organization.py:307
+#: judge/views/organization.py:306
msgid "You are not allowed to edit this organization."
msgstr "Nu aveţi permisiunea pentru a edita această organizaţie."
-#: judge/views/organization.py:315
+#: judge/views/organization.py:314
msgid "You are not allowed to kick people from this organization."
msgstr ""
-#: judge/views/organization.py:320 judge/views/organization.py:324
+#: judge/views/organization.py:319 judge/views/organization.py:323
msgid "Can't kick user"
msgstr ""
-#: judge/views/organization.py:321
+#: judge/views/organization.py:320
msgid "The user you are trying to kick does not exist!"
msgstr ""
-#: judge/views/organization.py:325
+#: judge/views/organization.py:324
#, python-format
msgid "The user you are trying to kick is not in organization: %s."
msgstr ""
-#: judge/views/problem.py:67
+#: judge/views/problem.py:68
msgid "No such problem"
msgstr "Nicio problemă de acest fel"
-#: judge/views/problem.py:68
+#: judge/views/problem.py:69
#, python-format
msgid "Could not find a problem with the code \"%s\"."
msgstr "Imposibil de găsit probleme cu codul \"%s\"."
-#: judge/views/problem.py:110
+#: judge/views/problem.py:111
#, python-brace-format
msgid "Editorial for {0}"
msgstr ""
-#: judge/views/problem.py:113
+#: judge/views/problem.py:114
#, python-brace-format
msgid "Editorial for {0}"
msgstr ""
-#: judge/views/problem.py:283 templates/contest/contest.html:79
+#: judge/views/problem.py:133
+msgid "No such editorial"
+msgstr ""
+
+#: judge/views/problem.py:134
+#, python-format
+msgid "Could not find an editorial with the code \"%s\"."
+msgstr ""
+
+#: judge/views/problem.py:289 templates/contest/contest.html:79
#: templates/user/user-tabs.html:5 templates/user/users-table.html:23
msgid "Problems"
msgstr "Probleme"
-#: judge/views/problem.py:556 judge/views/problem.py:564
+#: judge/views/problem.py:562 judge/views/problem.py:570
#, python-format
msgid "Submit to %s"
msgstr ""
-#: judge/views/problem.py:613
+#: judge/views/problem.py:619
msgid "Banned from submitting"
msgstr ""
-#: judge/views/problem.py:614
+#: judge/views/problem.py:620
msgid "You have been declared persona non grata for this problem. You are permanently barred from submitting this problem."
msgstr "Ați fost declarat \"persoană neacceptată\" pentru această problemă. Sunteți exclus definitiv de la submiterea acestei probleme."
-#: judge/views/problem.py:618
+#: judge/views/problem.py:624
msgid "Too many submissions"
msgstr ""
-#: judge/views/problem.py:619
+#: judge/views/problem.py:625
msgid "You have exceeded the submission limit for this problem."
msgstr ""
-#: judge/views/problem.py:681
+#: judge/views/problem.py:693
msgid "Clone Problem"
msgstr ""
+#: judge/views/problem.py:720
+#, python-format
+msgid "Cloned problem from %s"
+msgstr ""
+
#: judge/views/problem_data.py:37
msgid "Checker arguments must be a JSON object"
msgstr ""
@@ -2906,52 +2954,52 @@ msgstr "Cele mai bune soluţii pentru %s"
msgid "Best solutions for {0}"
msgstr "Cele mai bune soluţii pentru {0}"
-#: judge/views/ranked_submission.py:80
+#: judge/views/ranked_submission.py:82
#, python-format
msgid "Best solutions for %(problem)s in %(contest)s"
msgstr "Cele mai bune soluţii pentru %(problem)s în %(contest)s"
-#: judge/views/ranked_submission.py:83
+#: judge/views/ranked_submission.py:85
#, python-format
msgid "Best solutions for problem %(number)s in %(contest)s"
msgstr ""
-#: judge/views/ranked_submission.py:89
+#: judge/views/ranked_submission.py:91
#, python-brace-format
msgid "Best solutions for {0} in {2}"
msgstr "Cele mai bune soluţii pentru {0} în {2}"
-#: judge/views/ranked_submission.py:92
+#: judge/views/ranked_submission.py:94
#, python-brace-format
msgid "Best solutions for problem {0} in {1}"
msgstr ""
-#: judge/views/register.py:27
+#: judge/views/register.py:26
msgid "A username must contain letters, numbers, or underscores"
msgstr "Numele de utilizator trebuie să conţină litere, numere sau caractere de subliniere"
-#: judge/views/register.py:31
+#: judge/views/register.py:30
msgid "Preferred language"
msgstr "Limba preferată"
-#: judge/views/register.py:38
+#: judge/views/register.py:37
msgid "Subscribe to newsletter?"
msgstr ""
-#: judge/views/register.py:45
+#: judge/views/register.py:44
#, python-format
msgid "The email address \"%s\" is already taken. Only one registration is allowed per address."
msgstr "Adresa de email \"%s\" a fost deja folosită. O singură înregistrare este permisă pe fiecare adresă."
-#: judge/views/register.py:51
+#: judge/views/register.py:50
msgid "Your email provider is not allowed due to history of abuse. Please use a reputable email provider."
msgstr "Furnizorul dvs. de e-mail nu este permis datorită istoriei de abuz. Vă rugăm să folosiţi un furnizor de e-mail respectabil."
-#: judge/views/register.py:57 judge/views/register.py:95
+#: judge/views/register.py:56 judge/views/register.py:94
msgid "Registration"
msgstr "Înregistrare"
-#: judge/views/register.py:106
+#: judge/views/register.py:105
msgid "Authentication failure"
msgstr "Problemă la autentificare"
@@ -2959,7 +3007,7 @@ msgstr "Problemă la autentificare"
msgid "Language statistics"
msgstr "Statistici ale limbei"
-#: judge/views/status.py:24 templates/submission/list.html:311
+#: judge/views/status.py:24 templates/submission/list.html:310
msgid "Status"
msgstr "Stare"
@@ -2967,74 +3015,74 @@ msgstr "Stare"
msgid "Version matrix"
msgstr ""
-#: judge/views/submission.py:53 judge/views/submission.py:60
+#: judge/views/submission.py:55 judge/views/submission.py:62
#, python-format
msgid "Submission of %(problem)s by %(user)s"
msgstr "Soluţia problemei %(problem)s de %(user)s"
-#: judge/views/submission.py:203 judge/views/submission.py:204
+#: judge/views/submission.py:205 judge/views/submission.py:206
#: templates/problem/problem.html:127
msgid "All submissions"
msgstr "Toate soluţile"
-#: judge/views/submission.py:349
+#: judge/views/submission.py:355
msgid "All my submissions"
msgstr ""
-#: judge/views/submission.py:350
+#: judge/views/submission.py:356
#, python-format
msgid "All submissions by %s"
msgstr "Toate soluţiile submise de %s"
-#: judge/views/submission.py:381
+#: judge/views/submission.py:387
#, python-format
msgid "All submissions for %s"
msgstr "Toate soluţiile pentru %s"
-#: judge/views/submission.py:400
+#: judge/views/submission.py:410
msgid "Must pass a problem"
msgstr "Trebuie să rezolvaţi o problemă"
-#: judge/views/submission.py:439
+#: judge/views/submission.py:449
#, python-format
msgid "My submissions for %(problem)s"
msgstr ""
-#: judge/views/submission.py:440
+#: judge/views/submission.py:450
#, python-format
msgid "%(user)s's submissions for %(problem)s"
msgstr "Soluţiile lui %(user)s pentru %(problem)s"
-#: judge/views/submission.py:536
+#: judge/views/submission.py:546
msgid "Must pass a contest"
msgstr "Trebuie să completaţi un concurs"
-#: judge/views/submission.py:544
+#: judge/views/submission.py:554
#, python-format
msgid "My submissions in %(contest)s"
msgstr ""
-#: judge/views/submission.py:545
+#: judge/views/submission.py:555
#, python-format
msgid "%(user)s's submissions in %(contest)s"
msgstr ""
-#: judge/views/submission.py:559
+#: judge/views/submission.py:569
#, python-brace-format
msgid "My submissions in {0}"
msgstr ""
-#: judge/views/submission.py:561
+#: judge/views/submission.py:571
#, python-brace-format
msgid "{0}'s submissions in {2}"
msgstr ""
-#: judge/views/submission.py:585
+#: judge/views/submission.py:597
#, python-brace-format
msgid "{0}'s submissions for {2} in {4}"
msgstr "Soluţiile lui {0} pentru {2} în {4}"
-#: judge/views/submission.py:590
+#: judge/views/submission.py:602
#, python-brace-format
msgid "{0}'s submissions for problem {2} in {3}"
msgstr ""
@@ -3051,40 +3099,40 @@ msgstr ""
msgid "You must solve at least one problem before you can create a ticket."
msgstr ""
-#: judge/views/ticket.py:87 judge/views/ticket.py:90
+#: judge/views/ticket.py:91 judge/views/ticket.py:94
#, python-format
msgid "New ticket for %s"
msgstr ""
-#: judge/views/ticket.py:144
+#: judge/views/ticket.py:148
#, python-format
msgid "%(title)s - Ticket %(id)d"
msgstr ""
-#: judge/views/ticket.py:249
+#: judge/views/ticket.py:253
#, python-format
msgid "Tickets - Page %(number)d of %(total)d"
msgstr ""
-#: judge/views/ticket.py:298
+#: judge/views/ticket.py:302
#, python-format
msgid "New Ticket: %s"
msgstr ""
-#: judge/views/ticket.py:299
+#: judge/views/ticket.py:303
#, python-format
msgid "#%(id)d, assigned to: %(users)s"
msgstr ""
-#: judge/views/ticket.py:301
+#: judge/views/ticket.py:305
msgid ", "
msgstr ""
-#: judge/views/ticket.py:301
+#: judge/views/ticket.py:305
msgid "no one"
msgstr ""
-#: judge/views/ticket.py:321
+#: judge/views/ticket.py:325
#, python-format
msgid "New Ticket Message For: %s"
msgstr ""
@@ -3093,87 +3141,91 @@ msgstr ""
msgid "Enable Two-factor Authentication"
msgstr ""
-#: judge/views/two_factor.py:99
+#: judge/views/two_factor.py:108
+msgid "Refresh Two-factor Authentication"
+msgstr ""
+
+#: judge/views/two_factor.py:116
msgid "Disable Two-factor Authentication"
msgstr ""
-#: judge/views/two_factor.py:148
+#: judge/views/two_factor.py:165
msgid "Invalid WebAuthn response"
msgstr ""
-#: judge/views/two_factor.py:151
+#: judge/views/two_factor.py:168
msgid "Invalid name"
msgstr ""
-#: judge/views/two_factor.py:204
+#: judge/views/two_factor.py:221
msgid "Staff may not disable 2FA"
msgstr ""
-#: judge/views/two_factor.py:216
+#: judge/views/two_factor.py:229
msgid "Perform Two-factor Authentication"
msgstr ""
-#: judge/views/user.py:79
+#: judge/views/user.py:78
msgid "No such user"
msgstr "Niciun astfel de utilizator"
-#: judge/views/user.py:79
+#: judge/views/user.py:78
#, python-format
msgid "No user handle \"%s\"."
msgstr "Porecla de utilizator \"%s\" nu există."
-#: judge/views/user.py:83
+#: judge/views/user.py:82
msgid "My account"
msgstr ""
-#: judge/views/user.py:84
+#: judge/views/user.py:83
#, python-format
msgid "User %s"
msgstr "Utilizatorul %s"
-#: judge/views/user.py:132
+#: judge/views/user.py:131
msgid "Login"
msgstr "Login"
-#: judge/views/user.py:173
+#: judge/views/user.py:172
msgid "M j, Y, G:i"
msgstr "M j, Y, G:i"
-#: judge/views/user.py:307
+#: judge/views/user.py:306
msgid "Preparing your data..."
msgstr ""
-#: judge/views/user.py:311 templates/user/edit-profile.html:348
+#: judge/views/user.py:310 templates/user/edit-profile.html:352
msgid "Download your data"
msgstr ""
-#: judge/views/user.py:367
+#: judge/views/user.py:366
msgid "Updated on site"
msgstr "Actualizat pe loc"
-#: judge/views/user.py:400 templates/admin/auth/user/change_form.html:14
+#: judge/views/user.py:399 templates/admin/auth/user/change_form.html:14
#: templates/admin/auth/user/change_form.html:17 templates/base.html:222
#: templates/user/user-tabs.html:16
msgid "Edit profile"
msgstr "Editează-ți profilul"
-#: judge/views/user.py:415
+#: judge/views/user.py:414
msgid "Generated API token for user"
msgstr ""
-#: judge/views/user.py:427
+#: judge/views/user.py:426
msgid "Removed API token for user"
msgstr ""
-#: judge/views/user.py:437
+#: judge/views/user.py:436
msgid "Generated scratch codes for user"
msgstr ""
-#: judge/views/user.py:443 templates/user/user-list-tabs.html:4
+#: judge/views/user.py:442 templates/user/user-list-tabs.html:4
msgid "Leaderboard"
msgstr ""
-#: judge/views/user.py:504
+#: judge/views/user.py:503
msgid "You have been successfully logged out."
msgstr ""
@@ -3298,11 +3350,11 @@ msgstr ""
msgid "posted on {time}"
msgstr ""
-#: templates/blog/list.html:130 templates/problem/problem.html:309
+#: templates/blog/list.html:130 templates/problem/problem.html:311
msgid "Clarifications"
msgstr ""
-#: templates/blog/list.html:146 templates/problem/problem.html:320
+#: templates/blog/list.html:146 templates/problem/problem.html:322
msgid "No clarifications have been made at this time."
msgstr ""
@@ -3495,7 +3547,7 @@ msgid "Info"
msgstr ""
#: templates/contest/contest-tabs.html:6 templates/stats/base.html:9
-#: templates/submission/list.html:337
+#: templates/submission/list.html:336
msgid "Statistics"
msgstr "Stastici"
@@ -3698,19 +3750,19 @@ msgstr ""
msgid "Disqualify"
msgstr ""
-#: templates/contest/ranking.html:169
+#: templates/contest/ranking.html:173
msgid "Are you sure you want to disqualify this participation?"
msgstr ""
-#: templates/contest/ranking.html:174
+#: templates/contest/ranking.html:178
msgid "Are you sure you want to un-disqualify this participation?"
msgstr ""
-#: templates/contest/ranking.html:246
+#: templates/contest/ranking.html:250
msgid "View user participation"
msgstr ""
-#: templates/contest/ranking.html:250
+#: templates/contest/ranking.html:254
msgid "Show organizations"
msgstr ""
@@ -3985,7 +4037,7 @@ msgstr ""
msgid "Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence."
msgstr ""
-#: templates/problem/editorial.html:27 templates/problem/problem.html:209
+#: templates/problem/editorial.html:27 templates/problem/problem.html:210
msgid "Author:"
msgid_plural "Authors:"
msgstr[0] "Autor:"
@@ -4154,38 +4206,38 @@ msgstr "Limita de timp:"
msgid "Memory limit:"
msgstr "Limita de memorie:"
-#: templates/problem/problem.html:224
+#: templates/problem/problem.html:226
msgid "Problem type"
msgid_plural "Problem types"
msgstr[0] "Tip de problemă"
msgstr[1] "Tipuri de probleme"
msgstr[2] "Tipuri de probleme"
-#: templates/problem/problem.html:237
+#: templates/problem/problem.html:239
msgid "Allowed languages"
msgstr "Limbajele acceptate"
-#: templates/problem/problem.html:245
+#: templates/problem/problem.html:247
#, python-format
msgid "No %(lang)s judge online"
msgstr "Nici un judge pentru %(lang)s e online"
-#: templates/problem/problem.html:256
+#: templates/problem/problem.html:258
msgid "Judge:"
msgid_plural "Judges:"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-#: templates/problem/problem.html:273
+#: templates/problem/problem.html:275
msgid "none available"
msgstr ""
-#: templates/problem/problem.html:298
+#: templates/problem/problem.html:300
msgid "Request clarification"
msgstr ""
-#: templates/problem/problem.html:300
+#: templates/problem/problem.html:302
msgid "Report an issue"
msgstr ""
@@ -4230,7 +4282,7 @@ msgstr ""
msgid "Point range"
msgstr ""
-#: templates/problem/search-form.html:63 templates/submission/list.html:329
+#: templates/problem/search-form.html:63 templates/submission/list.html:328
#: templates/ticket/list.html:248
msgid "Go"
msgstr "Caută"
@@ -4278,7 +4330,7 @@ msgid "Invalid username or password."
msgstr "Nume de utilizator sau parolă invalide."
#: templates/registration/login.html:53
-#: templates/registration/two_factor_auth.html:86
+#: templates/registration/two_factor_auth.html:92
msgid "Login!"
msgstr "Conectaţi-vă!"
@@ -4398,12 +4450,12 @@ msgid "Default language"
msgstr ""
#: templates/registration/registration_form.html:184
-#: templates/user/edit-profile.html:310
+#: templates/user/edit-profile.html:314
msgid "Affiliated organizations"
msgstr ""
#: templates/registration/registration_form.html:190
-#: templates/user/edit-profile.html:324
+#: templates/user/edit-profile.html:328
msgid "Notify me about upcoming contests"
msgstr ""
@@ -4419,57 +4471,93 @@ msgstr ""
msgid "Register!"
msgstr "Înscrie-te!"
-#: templates/registration/totp_disable.html:38
+#: templates/registration/totp_disable.html:31
msgid "To protect your account, you must first authenticate before you can disable Two Factor Authentication."
msgstr ""
-#: templates/registration/totp_disable.html:45
+#: templates/registration/totp_disable.html:38
msgid "Enter the 6-digit code generated by your app or one of your 16-digit scratch codes:"
msgstr ""
-#: templates/registration/totp_disable.html:48
+#: templates/registration/totp_disable.html:41
msgid "Disable Two Factor Authentication"
msgstr ""
-#: templates/registration/totp_enable.html:75
+#: templates/registration/totp_enable.html:72
msgid "Scan this code with your authenticator app:"
msgstr ""
-#: templates/registration/totp_enable.html:76
+#: templates/registration/totp_enable.html:73
msgid "QR code"
msgstr ""
-#: templates/registration/totp_enable.html:77
+#: templates/registration/totp_enable.html:74
msgid "Or enter this code manually:"
msgstr ""
-#: templates/registration/totp_enable.html:88
+#: templates/registration/totp_enable.html:85
msgid "Enter the 6-digit code generated by your app:"
msgstr ""
-#: templates/registration/totp_enable.html:91
+#: templates/registration/totp_enable.html:90
+msgid "Refresh Two Factor Authentication"
+msgstr ""
+
+#: templates/registration/totp_enable.html:92
msgid "Enable Two Factor Authentication"
msgstr ""
+#: templates/registration/totp_enable.html:98
+msgid "Below is a list of one-time use scratch codes."
+msgstr ""
+
+#: templates/registration/totp_enable.html:99
+msgid "These codes can only be used once and are for emergency use."
+msgstr ""
+
+#: templates/registration/totp_enable.html:100
+msgid "You can use these codes to login to your account or disable two-factor authentication."
+msgstr ""
+
+#: templates/registration/totp_enable.html:101
+msgid "If you ever need more scratch codes, you can regenerate them on the edit profile tab."
+msgstr ""
+
+#: templates/registration/totp_enable.html:102
+msgid "Please write these down and keep them in a secure location."
+msgstr ""
+
+#: templates/registration/totp_enable.html:103
+msgid "These codes will never be shown again after you enable two-factor authentication."
+msgstr ""
+
#: templates/registration/two_factor_auth.html:33
-#: templates/user/edit-profile.html:161
+#: templates/user/edit-profile.html:165
msgid "WebAuthn is not supported by your browser."
msgstr ""
#: templates/registration/two_factor_auth.html:54
-#: templates/user/edit-profile.html:185
+#: templates/user/edit-profile.html:189
msgid "Failed to contact server."
msgstr ""
-#: templates/registration/two_factor_auth.html:77
+#: templates/registration/two_factor_auth.html:79
msgid "Enter the 6-digit code generated by your app or one of your 16-character scratch codes:"
msgstr ""
-#: templates/registration/two_factor_auth.html:83
-msgid "Use security key"
+#: templates/registration/two_factor_auth.html:81
+msgid "Enter one of your 16-character scratch codes:"
msgstr ""
#: templates/registration/two_factor_auth.html:89
+msgid "Use security key"
+msgstr ""
+
+#: templates/registration/two_factor_auth.html:94
+msgid "Use scratch code"
+msgstr ""
+
+#: templates/registration/two_factor_auth.html:97
#, python-format
msgid "If you lost your authentication device and are unable to use your scratch codes, please contact us at %(email)s."
msgstr ""
@@ -4550,15 +4638,15 @@ msgstr ""
msgid "Filter by language..."
msgstr ""
-#: templates/submission/list.html:307
+#: templates/submission/list.html:306
msgid "Filter submissions"
msgstr ""
-#: templates/submission/list.html:343
+#: templates/submission/list.html:342
msgid "Total:"
msgstr ""
-#: templates/submission/list.html:353
+#: templates/submission/list.html:352
msgid "You were disconnected. Refresh to show latest updates."
msgstr ""
@@ -4775,121 +4863,125 @@ msgstr "Rang"
msgid "Search by handle..."
msgstr ""
-#: templates/user/edit-profile.html:109
+#: templates/user/edit-profile.html:113
msgid "Are you sure you want to generate or regenerate your API token?"
msgstr ""
-#: templates/user/edit-profile.html:110
+#: templates/user/edit-profile.html:114
msgid "This will invalidate any previous API tokens."
msgstr ""
-#: templates/user/edit-profile.html:111
+#: templates/user/edit-profile.html:115
msgid "It also allows access to your account without Two-factor Authentication."
msgstr ""
-#: templates/user/edit-profile.html:112
+#: templates/user/edit-profile.html:116
msgid "You will not be able to view your api token after you leave this page!"
msgstr ""
-#: templates/user/edit-profile.html:113 templates/user/edit-profile.html:207
+#: templates/user/edit-profile.html:117 templates/user/edit-profile.html:211
msgid "Generating..."
msgstr ""
-#: templates/user/edit-profile.html:121 templates/user/edit-profile.html:243
-#: templates/user/edit-profile.html:371 templates/user/edit-profile.html:390
+#: templates/user/edit-profile.html:125 templates/user/edit-profile.html:247
+#: templates/user/edit-profile.html:373 templates/user/edit-profile.html:395
msgid "Regenerate"
msgstr ""
-#: templates/user/edit-profile.html:127 templates/user/edit-profile.html:392
+#: templates/user/edit-profile.html:131 templates/user/edit-profile.html:397
msgid "Remove"
msgstr ""
-#: templates/user/edit-profile.html:137
+#: templates/user/edit-profile.html:141
msgid "Are you sure you want to remove your API token?"
msgstr ""
-#: templates/user/edit-profile.html:144 templates/user/edit-profile.html:375
-#: templates/user/edit-profile.html:396
+#: templates/user/edit-profile.html:148 templates/user/edit-profile.html:377
+#: templates/user/edit-profile.html:401
msgid "Generate"
msgstr ""
-#: templates/user/edit-profile.html:190
+#: templates/user/edit-profile.html:194
msgid "Are you sure you want to delete this security key?"
msgstr ""
-#: templates/user/edit-profile.html:280
+#: templates/user/edit-profile.html:284
msgid "Self-description"
msgstr "Auto-descriere"
-#: templates/user/edit-profile.html:287
+#: templates/user/edit-profile.html:291
msgid "Select your closest major city"
msgstr ""
-#: templates/user/edit-profile.html:296
+#: templates/user/edit-profile.html:300
msgid "Editor theme"
msgstr ""
-#: templates/user/edit-profile.html:301
+#: templates/user/edit-profile.html:305
msgid "Math engine"
msgstr ""
-#: templates/user/edit-profile.html:335 templates/user/edit-profile.html:337
+#: templates/user/edit-profile.html:339 templates/user/edit-profile.html:341
msgid "Change your avatar"
msgstr "Schimbați avatarul"
-#: templates/user/edit-profile.html:342
+#: templates/user/edit-profile.html:346
msgid "Change your password"
msgstr "Schimbați parola"
-#: templates/user/edit-profile.html:356
+#: templates/user/edit-profile.html:359
msgid "Two-factor Authentication is enabled"
msgstr ""
-#: templates/user/edit-profile.html:358
-msgid "Two-factor Authentication is disabled"
+#: templates/user/edit-profile.html:362 templates/user/edit-profile.html:365
+msgid "Disable"
msgstr ""
-#: templates/user/edit-profile.html:363 templates/user/edit-profile.html:365
-msgid "Disable"
+#: templates/user/edit-profile.html:367
+msgid "Refresh"
msgstr ""
-#: templates/user/edit-profile.html:368
+#: templates/user/edit-profile.html:370
msgid "Scratch Codes:"
msgstr ""
-#: templates/user/edit-profile.html:372 templates/user/edit-profile.html:393
+#: templates/user/edit-profile.html:374 templates/user/edit-profile.html:398
msgid "Hidden"
msgstr ""
-#: templates/user/edit-profile.html:381
+#: templates/user/edit-profile.html:384
+msgid "Two-factor Authentication is disabled"
+msgstr ""
+
+#: templates/user/edit-profile.html:385
msgid "Enable"
msgstr ""
-#: templates/user/edit-profile.html:387
+#: templates/user/edit-profile.html:392
msgid "API Token"
msgstr ""
-#: templates/user/edit-profile.html:404
+#: templates/user/edit-profile.html:409
msgid "Security keys"
msgstr ""
-#: templates/user/edit-profile.html:414
+#: templates/user/edit-profile.html:419
msgid "Delete"
msgstr ""
-#: templates/user/edit-profile.html:421
+#: templates/user/edit-profile.html:426
msgid "Enter a name for this key"
msgstr ""
-#: templates/user/edit-profile.html:422
+#: templates/user/edit-profile.html:427
msgid "Add"
msgstr ""
-#: templates/user/edit-profile.html:430
+#: templates/user/edit-profile.html:435
msgid "User-script"
msgstr "Script de utilizator"
-#: templates/user/edit-profile.html:434
+#: templates/user/edit-profile.html:439
msgid "Update profile"
msgstr "Actualizați profilul"
diff --git a/locale/ro/LC_MESSAGES/djangojs.po b/locale/ro/LC_MESSAGES/djangojs.po
index d632ea3892..4c0fa99301 100644
--- a/locale/ro/LC_MESSAGES/djangojs.po
+++ b/locale/ro/LC_MESSAGES/djangojs.po
@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: dmoj\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-10-01 23:12+0000\n"
-"PO-Revision-Date: 2021-04-25 00:08\n"
+"PO-Revision-Date: 2021-07-07 00:27\n"
"Last-Translator: \n"
"Language-Team: Romanian\n"
"Language: ro_RO\n"
diff --git a/locale/ru/LC_MESSAGES/django.po b/locale/ru/LC_MESSAGES/django.po
index 74dcf1abff..291594d72c 100644
--- a/locale/ru/LC_MESSAGES/django.po
+++ b/locale/ru/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: dmoj\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-24 19:15+0000\n"
-"PO-Revision-Date: 2021-04-25 00:08\n"
+"POT-Creation-Date: 2021-06-17 01:38+0000\n"
+"PO-Revision-Date: 2021-07-23 00:29\n"
"Last-Translator: \n"
"Language-Team: Russian\n"
"Language: ru_RU\n"
@@ -17,75 +17,75 @@ msgstr ""
"X-Crowdin-File: django.po\n"
"X-Crowdin-File-ID: 10\n"
-#: dmoj/settings.py:364
+#: dmoj/settings.py:365
msgid "Catalan"
-msgstr ""
+msgstr "Каталанский"
-#: dmoj/settings.py:365
+#: dmoj/settings.py:366
msgid "German"
msgstr "немецкий"
-#: dmoj/settings.py:366
+#: dmoj/settings.py:367
msgid "English"
msgstr "английский"
-#: dmoj/settings.py:367
+#: dmoj/settings.py:368
msgid "Spanish"
msgstr "Испанский"
-#: dmoj/settings.py:368
+#: dmoj/settings.py:369
msgid "French"
msgstr "французский"
-#: dmoj/settings.py:369
+#: dmoj/settings.py:370
msgid "Croatian"
msgstr "Хорватский"
-#: dmoj/settings.py:370
+#: dmoj/settings.py:371
msgid "Hungarian"
msgstr "Венгерский"
-#: dmoj/settings.py:371
+#: dmoj/settings.py:372
msgid "Japanese"
msgstr "Японский"
-#: dmoj/settings.py:372
+#: dmoj/settings.py:373
msgid "Korean"
msgstr "Корейский"
-#: dmoj/settings.py:373
+#: dmoj/settings.py:374
msgid "Brazilian Portuguese"
msgstr "Бразильский португальский"
-#: dmoj/settings.py:374
+#: dmoj/settings.py:375
msgid "Romanian"
msgstr "Румынский"
-#: dmoj/settings.py:375
+#: dmoj/settings.py:376
msgid "Russian"
msgstr "русский"
-#: dmoj/settings.py:376
+#: dmoj/settings.py:377
msgid "Serbian (Latin)"
msgstr "Сербский (латиница)"
-#: dmoj/settings.py:377
+#: dmoj/settings.py:378
msgid "Turkish"
msgstr "Турецкий"
-#: dmoj/settings.py:378
+#: dmoj/settings.py:379
msgid "Vietnamese"
msgstr "Вьетнамский"
-#: dmoj/settings.py:379
+#: dmoj/settings.py:380
msgid "Simplified Chinese"
msgstr "Упрощенный китайский"
-#: dmoj/settings.py:380
+#: dmoj/settings.py:381
msgid "Traditional Chinese"
msgstr "Традиционный китайский"
-#: dmoj/urls.py:103 templates/base.html:190
+#: dmoj/urls.py:104 templates/base.html:190
msgid "Home"
msgstr "Главная"
@@ -119,46 +119,46 @@ msgstr "Показать комментарии"
msgid "Associated page"
msgstr "Связанная страница"
-#: judge/admin/contest.py:31
+#: judge/admin/contest.py:32
msgid "Included contests"
msgstr "Включены конкурсы"
-#: judge/admin/contest.py:65 templates/contest/contest.html:83
+#: judge/admin/contest.py:66 templates/contest/contest.html:83
#: templates/contest/moss.html:43 templates/problem/list.html:204
#: templates/problem/list.html:219 templates/user/user-problems.html:58
#: templates/user/user-problems.html:100
msgid "Problem"
msgstr "Проблема"
-#: judge/admin/contest.py:114
+#: judge/admin/contest.py:117
msgid "Settings"
msgstr "Настройки"
-#: judge/admin/contest.py:116
+#: judge/admin/contest.py:120
msgid "Scheduling"
msgstr "Расписание"
-#: judge/admin/contest.py:117
+#: judge/admin/contest.py:121
msgid "Details"
msgstr "Детали"
-#: judge/admin/contest.py:118
+#: judge/admin/contest.py:122
msgid "Format"
msgstr "Формат"
-#: judge/admin/contest.py:119 templates/contest/ranking-table.html:5
+#: judge/admin/contest.py:123 templates/contest/ranking-table.html:5
msgid "Rating"
msgstr "Рейтинг"
-#: judge/admin/contest.py:120
+#: judge/admin/contest.py:124
msgid "Access"
msgstr "Доступ"
-#: judge/admin/contest.py:122 judge/admin/problem.py:134
+#: judge/admin/contest.py:126 judge/admin/problem.py:135
msgid "Justice"
msgstr "Судья"
-#: judge/admin/contest.py:211
+#: judge/admin/contest.py:215
#, python-format
msgid "%d contest successfully marked as visible."
msgid_plural "%d contests successfully marked as visible."
@@ -167,59 +167,59 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-#: judge/admin/contest.py:214
+#: judge/admin/contest.py:218
msgid "Mark contests as visible"
-msgstr ""
+msgstr "Отметьте соревнования как видимые"
-#: judge/admin/contest.py:220
+#: judge/admin/contest.py:224
#, python-format
msgid "%d contest successfully marked as hidden."
msgid_plural "%d contests successfully marked as hidden."
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "%d соревнование успешно помечено как скрытое"
+msgstr[1] "%d соревнований помечены как скрытые"
+msgstr[2] "%d соревнований помечены как скрытые"
+msgstr[3] "%d соревнования успешно помечены как скрытые"
-#: judge/admin/contest.py:223
+#: judge/admin/contest.py:227
msgid "Mark contests as hidden"
-msgstr ""
+msgstr "Отметьте соревнования как скрытые"
-#: judge/admin/contest.py:229
+#: judge/admin/contest.py:233
#, python-format
msgid "%d contest successfully locked."
msgid_plural "%d contests successfully locked."
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "%d соревнование успешно заблокировано"
+msgstr[1] "%d соревнований успешно скрыто"
+msgstr[2] "%d соревнований успешно скрыто"
+msgstr[3] "%d соревнования успешно скрыты"
-#: judge/admin/contest.py:232
+#: judge/admin/contest.py:236
msgid "Lock contest submissions"
-msgstr ""
+msgstr "заблокировать решения соревования"
-#: judge/admin/contest.py:238
+#: judge/admin/contest.py:242
#, python-format
msgid "%d contest successfully unlocked."
msgid_plural "%d contests successfully unlocked."
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "%d соревнование успешно разблокировано"
+msgstr[1] "%d соревнований успешно разблокировано"
+msgstr[2] "%d соревнований успешно разблокировано"
+msgstr[3] "%d соревнования успешно разблокированы"
-#: judge/admin/contest.py:241
+#: judge/admin/contest.py:245
msgid "Unlock contest submissions"
-msgstr ""
+msgstr "разблокировать решения соревования"
-#: judge/admin/contest.py:262 judge/admin/submission.py:170
+#: judge/admin/contest.py:266 judge/admin/submission.py:170
#, python-format
msgid "%d submission was successfully scheduled for rejudging."
msgid_plural "%d submissions were successfully scheduled for rejudging."
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "%d решение было успешно запланировано для повторного тестирования"
+msgstr[1] "%d решений было успешно запланировано для повторного тестирования"
+msgstr[2] "%d решений было успешно запланировано для повторного тестирования"
+msgstr[3] "%d решения были успешно запланированы для повторного тестирования"
-#: judge/admin/contest.py:337
+#: judge/admin/contest.py:341
#, python-format
msgid "%d participation recalculated."
msgid_plural "%d participations recalculated."
@@ -228,15 +228,15 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-#: judge/admin/contest.py:340
+#: judge/admin/contest.py:344
msgid "Recalculate results"
-msgstr ""
+msgstr "Пересчитать результаты"
-#: judge/admin/contest.py:344 judge/admin/organization.py:63
+#: judge/admin/contest.py:348 judge/admin/organization.py:63
msgid "username"
msgstr "имя пользователя"
-#: judge/admin/contest.py:349 templates/base.html:258
+#: judge/admin/contest.py:353 templates/base.html:258
msgid "virtual"
msgstr "виртуальный"
@@ -252,18 +252,18 @@ msgstr "Содержание"
msgid "Summary"
msgstr "Сводка"
-#: judge/admin/interface.py:113 judge/models/contest.py:383
-#: judge/models/contest.py:509 judge/models/profile.py:244
-#: judge/models/profile.py:268
+#: judge/admin/interface.py:113 judge/models/contest.py:419
+#: judge/models/contest.py:546 judge/models/profile.py:261
+#: judge/models/profile.py:292
msgid "user"
msgstr "пользователь"
#: judge/admin/interface.py:154
msgid "object"
-msgstr ""
+msgstr "объект"
-#: judge/admin/organization.py:32 judge/admin/problem.py:181
-#: judge/admin/profile.py:82
+#: judge/admin/organization.py:32 judge/admin/problem.py:182
+#: judge/admin/profile.py:92
msgid "View on site"
msgstr "Посмотреть на сайте"
@@ -271,53 +271,53 @@ msgstr "Посмотреть на сайте"
msgid "Describe the changes you made (optional)"
msgstr "Опишите изменения, которые вы сделали (не обязательно)"
-#: judge/admin/problem.py:129
+#: judge/admin/problem.py:130
msgid "Social Media"
msgstr "Социальные сети"
-#: judge/admin/problem.py:130
+#: judge/admin/problem.py:131
msgid "Taxonomy"
-msgstr ""
+msgstr "Таксономия"
-#: judge/admin/problem.py:131 templates/contest/contest.html:84
+#: judge/admin/problem.py:132 templates/contest/contest.html:84
#: templates/problem/data.html:385 templates/problem/list.html:209
#: templates/problem/list.html:230 templates/user/base-users-table.html:10
#: templates/user/user-problems.html:60
msgid "Points"
msgstr "Очки"
-#: judge/admin/problem.py:132
+#: judge/admin/problem.py:133
msgid "Limits"
msgstr "Ограничения"
-#: judge/admin/problem.py:133 judge/admin/submission.py:238
-#: templates/stats/base.html:14 templates/submission/list.html:320
-#: templates/user/edit-profile.html:292
+#: judge/admin/problem.py:134 judge/admin/submission.py:238
+#: templates/stats/base.html:14 templates/submission/list.html:319
+#: templates/user/edit-profile.html:296
msgid "Language"
msgstr "Язык"
-#: judge/admin/problem.py:135
+#: judge/admin/problem.py:136
msgid "History"
msgstr "История"
-#: judge/admin/problem.py:178
+#: judge/admin/problem.py:179
msgid "Authors"
msgstr "Авторы"
-#: judge/admin/problem.py:191
+#: judge/admin/problem.py:192
#, python-format
msgid "%d problem's publish date successfully updated."
msgid_plural "%d problems' publish date successfully updated."
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "%d дата публикации успешно обновлена."
+msgstr[1] "%d дат публикации успешно обновлено."
+msgstr[2] "%d дат публикации успешно обновлено."
+msgstr[3] "%d даты публикации успешно обновлены."
-#: judge/admin/problem.py:195
+#: judge/admin/problem.py:196
msgid "Set publish date to now"
-msgstr ""
+msgstr "Установить дату публикации"
-#: judge/admin/problem.py:201
+#: judge/admin/problem.py:202
#, python-format
msgid "%d problem successfully marked as public."
msgid_plural "%d problems successfully marked as public."
@@ -326,11 +326,11 @@ msgstr[1] "%d задачи успешно сделаны публичными."
msgstr[2] "%d задачи успешно сделаны публичными."
msgstr[3] "%d задачи успешно сделаны публичными."
-#: judge/admin/problem.py:205
+#: judge/admin/problem.py:206
msgid "Mark problems as public"
msgstr "Пометить задачу как публичную"
-#: judge/admin/problem.py:211
+#: judge/admin/problem.py:212
#, python-format
msgid "%d problem successfully marked as private."
msgid_plural "%d problems successfully marked as private."
@@ -339,7 +339,7 @@ msgstr[1] "%d задачи успешно сдаланы приватными."
msgstr[2] "%d задачи успешно сделаны приватными."
msgstr[3] "%d задачи успешно сделаны приватными."
-#: judge/admin/problem.py:215
+#: judge/admin/problem.py:216
msgid "Mark problems as private"
msgstr "Пометить задачу как приватную"
@@ -347,43 +347,43 @@ msgstr "Пометить задачу как приватную"
msgid "timezone"
msgstr "часовой пояс"
-#: judge/admin/profile.py:88 judge/admin/submission.py:217
+#: judge/admin/profile.py:98 judge/admin/submission.py:217
#: templates/organization/requests/log.html:9
#: templates/organization/requests/pending.html:12
#: templates/ticket/list.html:261
msgid "User"
msgstr "Пользователь"
-#: judge/admin/profile.py:93 templates/registration/registration_form.html:143
+#: judge/admin/profile.py:103 templates/registration/registration_form.html:143
msgid "Email"
msgstr "Эл. почта"
-#: judge/admin/profile.py:98 judge/views/register.py:29
+#: judge/admin/profile.py:108 judge/views/register.py:28
#: templates/registration/registration_form.html:171
-#: templates/user/edit-profile.html:288
+#: templates/user/edit-profile.html:292
msgid "Timezone"
msgstr "Часовой пояс"
-#: judge/admin/profile.py:103
+#: judge/admin/profile.py:113
msgid "date joined"
msgstr "дата регистрации"
-#: judge/admin/profile.py:110
+#: judge/admin/profile.py:120
#, python-format
msgid "%d user have scores recalculated."
msgid_plural "%d users have scores recalculated."
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "У %d пользователя пересчитаны баллы."
+msgstr[1] "У %d пользователей пересчитаны баллы."
+msgstr[2] "У %d пользователей пересчитаны баллы."
+msgstr[3] "У %d пользователей пересчитали баллы."
-#: judge/admin/profile.py:113
+#: judge/admin/profile.py:123
msgid "Recalculate scores"
msgstr "Пересчитать баллы"
#: judge/admin/runtime.py:19
msgid "Disallowed problems"
-msgstr ""
+msgstr "Запрещенные задачи"
#: judge/admin/runtime.py:22
msgid "These problems are NOT allowed to be submitted in this language"
@@ -412,7 +412,7 @@ msgstr "Не сделано"
#: judge/admin/submission.py:23
msgid "Exceptional"
-msgstr ""
+msgstr "Исключительный"
#: judge/admin/submission.py:42
msgid "Unaccepted"
@@ -440,14 +440,14 @@ msgstr "Перетестировать выбранные посылки"
#, python-format
msgid "%d submission were successfully rescored."
msgid_plural "%d submissions were successfully rescored."
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "%d решение было пересчитано."
+msgstr[1] "%d решений были переоценены."
+msgstr[2] "%d решений были переоценены."
+msgstr[3] "%d решения были переоценены."
#: judge/admin/submission.py:202
msgid "Rescore the selected submissions"
-msgstr ""
+msgstr "Пересчитать выбранные решения"
#: judge/admin/submission.py:206
msgid "Problem code"
@@ -478,7 +478,7 @@ msgstr "Память"
#: judge/admin/taxon.py:11 judge/admin/taxon.py:34
msgid "Included problems"
-msgstr ""
+msgstr "Включенные задачи"
#: judge/admin/taxon.py:14
msgid "These problems are included in this group of problems"
@@ -498,7 +498,7 @@ msgstr "Содержание комментария"
#: judge/comments.py:47 judge/views/comment.py:40 judge/views/ticket.py:46
msgid "Your part is silent, little toad."
-msgstr ""
+msgstr "Твоя роль-молчание, маленькая жаба."
#: judge/comments.py:49 templates/comments/list.html:142
msgid "You need to have solved at least one problem before your voice can be heard."
@@ -506,143 +506,144 @@ msgstr "Вам нужно решить хотя бы одну задачу, чт
#: judge/comments.py:93
msgid "Posted comment"
-msgstr ""
+msgstr "Опубликованный комментарий"
#: judge/contest_format/atcoder.py:19
msgid "AtCoder"
-msgstr ""
+msgstr "AtCoder"
#: judge/contest_format/default.py:18
msgid "Default"
-msgstr ""
+msgstr "Стандартный"
#: judge/contest_format/ecoo.py:18
msgid "ECOO"
-msgstr ""
+msgstr "ОКОО (ECOO)"
#: judge/contest_format/icpc.py:19
msgid "ICPC"
-msgstr ""
+msgstr "МСОП (ICPC)"
#: judge/contest_format/ioi.py:11
msgid "IOI"
-msgstr ""
+msgstr "IOI"
#: judge/contest_format/legacy_ioi.py:18
msgid "IOI (pre-2016)"
-msgstr ""
+msgstr "IOI (до 2016)"
-#: judge/forms.py:26
-msgid "Two-factor authentication tokens must be 6 decimal digits."
-msgstr ""
+#: judge/forms.py:27
+#, python-brace-format
+msgid "Two-factor authentication tokens must be {TOTP_CODE_LENGTH} decimal digits."
+msgstr "Маркеры двухфакторной аутентификации должны содержать {TOTP_CODE_LENGTH} десятичных знаков."
-#: judge/forms.py:29
+#: judge/forms.py:30
msgid "Invalid two-factor authentication token."
-msgstr ""
+msgstr "Недействительный двухфакторный код аутентификации."
-#: judge/forms.py:32
+#: judge/forms.py:33
msgid "Scratch codes must be 16 base32 characters."
-msgstr ""
+msgstr "Коды Scratch должны содержать 16 символов base32."
-#: judge/forms.py:34
+#: judge/forms.py:35 judge/forms.py:264
msgid "Invalid scratch code."
-msgstr ""
+msgstr "Неверный scratch-код."
-#: judge/forms.py:45
+#: judge/forms.py:46
msgid "Subscribe to contest updates"
msgstr "Уведомлять об изменениях в соревновании"
-#: judge/forms.py:46
+#: judge/forms.py:47
msgid "Enable experimental features"
msgstr "Включить экспериментальные возможности"
-#: judge/forms.py:71
+#: judge/forms.py:72
msgid "You must solve at least one problem before you can update your profile."
-msgstr ""
+msgstr "Вы должны решить хотя бы одну проблему, прежде чем вы сможете обновить свой профиль."
-#: judge/forms.py:80 judge/views/organization.py:127
+#: judge/forms.py:81 judge/views/organization.py:126
#, python-brace-format
msgid "You may not be part of more than {count} public organizations."
msgstr "Вы не можете состоять более чем в {count} публичных организациях."
-#: judge/forms.py:96
+#: judge/forms.py:97
msgid "Download comments?"
-msgstr ""
+msgstr "Загрузить комментарии?"
-#: judge/forms.py:97
+#: judge/forms.py:98
msgid "Download submissions?"
-msgstr ""
+msgstr "Загрузить решения?"
-#: judge/forms.py:98
+#: judge/forms.py:99
msgid "Filter by problem code glob:"
-msgstr ""
+msgstr "Фильтр по коду задач:"
-#: judge/forms.py:102
+#: judge/forms.py:103
msgid "Leave empty to include all submissions"
-msgstr ""
+msgstr "Оставьте пустым, чтобы включить все сданные решения"
-#: judge/forms.py:105 templates/problem/manage_submission.html:142
+#: judge/forms.py:106 templates/problem/manage_submission.html:142
msgid "Filter by result:"
-msgstr ""
+msgstr "Фильтр по результату:"
-#: judge/forms.py:111
+#: judge/forms.py:112
msgid "Please select at least one thing to download."
-msgstr ""
+msgstr "Пожалуйста, выберите хотя бы одну вещь для загрузки."
-#: judge/forms.py:137
+#: judge/forms.py:138
msgid "Any judge"
-msgstr ""
+msgstr "Любой судья"
-#: judge/forms.py:167 judge/views/register.py:26
+#: judge/forms.py:159 judge/views/register.py:25
#: templates/registration/registration_form.html:137
#: templates/user/base-users-table.html:5
msgid "Username"
msgstr "Имя пользователя"
-#: judge/forms.py:168 templates/registration/registration_form.html:149
+#: judge/forms.py:160 templates/registration/registration_form.html:149
#: templates/registration/registration_form.html:163
msgid "Password"
msgstr "Пароль"
-#: judge/forms.py:201
+#: judge/forms.py:192
msgid "Invalid code length."
-msgstr ""
+msgstr "Неверная длина кода."
-#: judge/forms.py:219
+#: judge/forms.py:223
msgid "Invalid WebAuthn response."
-msgstr ""
+msgstr "Недействительный WebAuthn ответ."
-#: judge/forms.py:222
+#: judge/forms.py:226
msgid "No WebAuthn challenge issued."
msgstr ""
-#: judge/forms.py:228
+#: judge/forms.py:232
msgid "Invalid WebAuthn credential ID."
-msgstr ""
+msgstr "Неверный идентификатор учетных данных WebAuthn."
-#: judge/forms.py:257
+#: judge/forms.py:262
msgid "Invalid two-factor authentication token or scratch code."
-msgstr ""
+msgstr "Неверный токен двухфакторной аутентификации или scratch-код."
-#: judge/forms.py:259
+#: judge/forms.py:266
msgid "Must specify either totp_token or webauthn_response."
-msgstr ""
+msgstr "Необходимо указать totp_token или webauthn_response."
-#: judge/forms.py:263 judge/models/problem.py:105
+#: judge/forms.py:270 judge/models/problem.py:119
msgid "Problem code must be ^[a-z0-9]+$"
-msgstr ""
+msgstr "Код задачи должен быть ^[a-z0-9]+$"
-#: judge/forms.py:268
+#: judge/forms.py:275
msgid "Problem with code already exists."
-msgstr ""
+msgstr "Задача с кодом уже существует."
-#: judge/forms.py:273 judge/models/contest.py:66
+#: judge/forms.py:280 judge/models/contest.py:66
msgid "Contest id must be ^[a-z0-9]+$"
-msgstr ""
+msgstr "Идентификатор соревнования должен быть ^[a-z0-9]+$"
-#: judge/forms.py:278
+#: judge/forms.py:285
msgid "Contest with key already exists."
-msgstr ""
+msgstr "Соревнование с ключом уже существует."
#: judge/jinja2/datetime.py:26 templates/blog/content.html:27
#: templates/blog/dashboard.html:21
@@ -665,7 +666,7 @@ msgstr "Оставить LaTeX"
#: judge/models/choices.py:60
msgid "SVG with PNG fallback"
-msgstr ""
+msgstr "SVG с резервным вариантом PNG"
#: judge/models/choices.py:61
msgid "MathML only"
@@ -673,15 +674,15 @@ msgstr "Только MathML"
#: judge/models/choices.py:62
msgid "MathJax with SVG/PNG fallback"
-msgstr ""
+msgstr "MathJax с резервным вариантом SVG/PNG"
#: judge/models/choices.py:63
msgid "Detect best quality"
-msgstr ""
+msgstr "Определить лучшее качество"
#: judge/models/comment.py:25
msgid "Page code must be ^[pcs]:[a-z0-9]+$|^b:\\d+$"
-msgstr ""
+msgstr "Код страницы должен быть ^[pcs]:[a-z0-9]+$|^b:\\d+$"
#: judge/models/comment.py:41
msgid "commenter"
@@ -693,7 +694,7 @@ msgstr "время публикации"
#: judge/models/comment.py:43 judge/models/comment.py:196
msgid "associated page"
-msgstr ""
+msgstr "связанная страница"
#: judge/models/comment.py:45
msgid "votes"
@@ -720,7 +721,7 @@ msgid "comments"
msgstr "комментарии"
#: judge/models/comment.py:89 judge/models/comment.py:141
-#: judge/models/problem.py:484
+#: judge/models/problem.py:511
#, python-format
msgid "Editorial for %s"
msgstr "Разбор задач для %s"
@@ -761,7 +762,7 @@ msgstr "описание тега"
msgid "contest tag"
msgstr "тег соревнования"
-#: judge/models/contest.py:53 judge/models/contest.py:117
+#: judge/models/contest.py:53 judge/models/contest.py:126
msgid "contest tags"
msgstr "теги соревнования"
@@ -786,410 +787,426 @@ msgid "contest name"
msgstr "название соревнования"
#: judge/models/contest.py:68
-msgid "These people will be able to edit the contest."
-msgstr "Эти люди будут иметь право изменять соревнование."
+msgid "These users will be able to edit the contest."
+msgstr ""
-#: judge/models/contest.py:70 judge/models/runtime.py:136
+#: judge/models/contest.py:70
+msgid "These users will be able to edit the contest, but will not be listed as authors."
+msgstr ""
+
+#: judge/models/contest.py:73
+msgid "These users will be able to view the contest, but not edit it."
+msgstr ""
+
+#: judge/models/contest.py:76 judge/models/runtime.py:136
msgid "description"
msgstr "описание"
-#: judge/models/contest.py:71 judge/models/problem.py:431
+#: judge/models/contest.py:77 judge/models/problem.py:458
#: judge/models/runtime.py:138
msgid "problems"
msgstr "задачи"
-#: judge/models/contest.py:72 judge/models/contest.py:384
+#: judge/models/contest.py:78 judge/models/contest.py:420
msgid "start time"
msgstr "время начала"
-#: judge/models/contest.py:73
+#: judge/models/contest.py:79
msgid "end time"
msgstr "время конца"
-#: judge/models/contest.py:74 judge/models/problem.py:126
-#: judge/models/problem.py:455
+#: judge/models/contest.py:80 judge/models/problem.py:140
+#: judge/models/problem.py:482
msgid "time limit"
msgstr "ограничение по памяти"
-#: judge/models/contest.py:75 judge/models/problem.py:144
+#: judge/models/contest.py:81 judge/models/problem.py:158
msgid "publicly visible"
msgstr ""
-#: judge/models/contest.py:76
+#: judge/models/contest.py:82
msgid "Should be set even for organization-private contests, where it determines whether the contest is visible to members of the specified organizations."
msgstr ""
-#: judge/models/contest.py:79
+#: judge/models/contest.py:85
msgid "contest rated"
msgstr "соревнование рейтинговое"
-#: judge/models/contest.py:79
+#: judge/models/contest.py:85
msgid "Whether this contest can be rated."
msgstr "Будте ли соревнование рейтинговым."
-#: judge/models/contest.py:81
+#: judge/models/contest.py:87
msgid "view contest scoreboard"
msgstr ""
-#: judge/models/contest.py:83
+#: judge/models/contest.py:89
msgid "These users will be able to view the scoreboard."
msgstr ""
-#: judge/models/contest.py:84
+#: judge/models/contest.py:90
msgid "scoreboard visibility"
msgstr ""
-#: judge/models/contest.py:85
+#: judge/models/contest.py:91
msgid "Scoreboard visibility through the duration of the contest"
msgstr ""
-#: judge/models/contest.py:87
+#: judge/models/contest.py:93
msgid "no comments"
msgstr "без комментариев"
-#: judge/models/contest.py:88
+#: judge/models/contest.py:94
msgid "Use clarification system instead of comments."
msgstr "Используйте систему кларов вместо комментариев."
-#: judge/models/contest.py:90
+#: judge/models/contest.py:96
msgid "Rating floor for contest"
msgstr ""
-#: judge/models/contest.py:92
+#: judge/models/contest.py:98
msgid "Rating ceiling for contest"
msgstr ""
-#: judge/models/contest.py:94
+#: judge/models/contest.py:100
msgid "rate all"
msgstr ""
-#: judge/models/contest.py:94
+#: judge/models/contest.py:100
msgid "Rate all users who joined."
msgstr ""
-#: judge/models/contest.py:95
+#: judge/models/contest.py:101
msgid "exclude from ratings"
msgstr ""
-#: judge/models/contest.py:97
+#: judge/models/contest.py:103
msgid "private to specific users"
msgstr ""
-#: judge/models/contest.py:98
+#: judge/models/contest.py:104
msgid "private contestants"
msgstr ""
-#: judge/models/contest.py:99
+#: judge/models/contest.py:105
msgid "If private, only these users may see the contest"
msgstr ""
-#: judge/models/contest.py:101
+#: judge/models/contest.py:107
msgid "hide problem tags"
msgstr "спрятать тэги задач"
-#: judge/models/contest.py:102
+#: judge/models/contest.py:108
msgid "Whether problem tags should be hidden by default."
msgstr ""
-#: judge/models/contest.py:104
+#: judge/models/contest.py:110
+msgid "hide problem authors"
+msgstr ""
+
+#: judge/models/contest.py:111
+msgid "Whether problem authors should be hidden by default."
+msgstr ""
+
+#: judge/models/contest.py:113
msgid "run pretests only"
msgstr "запустить только претесты"
-#: judge/models/contest.py:105
+#: judge/models/contest.py:114
msgid "Whether judges should grade pretests only, versus all testcases. Commonly set during a contest, then unset prior to rejudging user submissions when the contest ends."
msgstr ""
-#: judge/models/contest.py:109 judge/models/problem.py:166
+#: judge/models/contest.py:118 judge/models/problem.py:183
msgid "private to organizations"
msgstr ""
-#: judge/models/contest.py:110 judge/models/problem.py:164
-#: judge/models/profile.py:83
+#: judge/models/contest.py:119 judge/models/problem.py:181
+#: judge/models/profile.py:86
msgid "organizations"
msgstr "организации"
-#: judge/models/contest.py:111
+#: judge/models/contest.py:120
msgid "If private, only these organizations may see the contest"
msgstr ""
-#: judge/models/contest.py:112 judge/models/problem.py:153
+#: judge/models/contest.py:121 judge/models/problem.py:167
msgid "OpenGraph image"
msgstr ""
-#: judge/models/contest.py:113 judge/models/profile.py:54
+#: judge/models/contest.py:122 judge/models/profile.py:57
msgid "Logo override image"
msgstr ""
-#: judge/models/contest.py:115
+#: judge/models/contest.py:124
msgid "This image will replace the default site logo for users inside the contest."
msgstr ""
-#: judge/models/contest.py:118
+#: judge/models/contest.py:127
msgid "the amount of live participants"
msgstr ""
-#: judge/models/contest.py:119
+#: judge/models/contest.py:128
msgid "contest summary"
msgstr ""
-#: judge/models/contest.py:120 judge/models/problem.py:155
+#: judge/models/contest.py:129 judge/models/problem.py:169
msgid "Plain-text, shown in meta description tag, e.g. for social media."
msgstr ""
-#: judge/models/contest.py:121 judge/models/profile.py:53
+#: judge/models/contest.py:130 judge/models/profile.py:56
msgid "access code"
msgstr ""
-#: judge/models/contest.py:122
+#: judge/models/contest.py:131
msgid "An optional code to prompt contestants before they are allowed to join the contest. Leave it blank to disable."
msgstr ""
-#: judge/models/contest.py:124 judge/models/problem.py:149
+#: judge/models/contest.py:133 judge/models/problem.py:163
msgid "personae non gratae"
msgstr ""
-#: judge/models/contest.py:125
+#: judge/models/contest.py:134
msgid "Bans the selected users from joining this contest."
msgstr ""
-#: judge/models/contest.py:126
+#: judge/models/contest.py:135
msgid "contest format"
msgstr ""
-#: judge/models/contest.py:127
+#: judge/models/contest.py:136
msgid "The contest format module to use."
msgstr ""
-#: judge/models/contest.py:128
+#: judge/models/contest.py:137
msgid "contest format configuration"
msgstr ""
-#: judge/models/contest.py:129
+#: judge/models/contest.py:138
msgid "A JSON object to serve as the configuration for the chosen contest format module. Leave empty to use None. Exact format depends on the contest format selected."
msgstr ""
-#: judge/models/contest.py:136
+#: judge/models/contest.py:145
msgid "contest lock"
msgstr ""
-#: judge/models/contest.py:137
-msgid "Prevent submissions from this contest from being rejudged."
+#: judge/models/contest.py:146
+msgid "Prevent submissions from this contest from being rejudged after this date."
msgstr ""
-#: judge/models/contest.py:138
+#: judge/models/contest.py:148
msgid "precision points"
msgstr ""
-#: judge/models/contest.py:140
+#: judge/models/contest.py:150
msgid "Number of digits to round points to."
msgstr ""
-#: judge/models/contest.py:362
+#: judge/models/contest.py:398
msgid "See private contests"
msgstr ""
-#: judge/models/contest.py:363
+#: judge/models/contest.py:399
msgid "Edit own contests"
msgstr ""
-#: judge/models/contest.py:364
+#: judge/models/contest.py:400
msgid "Edit all contests"
msgstr ""
-#: judge/models/contest.py:365
+#: judge/models/contest.py:401
msgid "Clone contest"
msgstr ""
-#: judge/models/contest.py:366 templates/contest/moss.html:74
+#: judge/models/contest.py:402 templates/contest/moss.html:74
msgid "MOSS contest"
msgstr ""
-#: judge/models/contest.py:367
+#: judge/models/contest.py:403
msgid "Rate contests"
msgstr ""
-#: judge/models/contest.py:368
+#: judge/models/contest.py:404
msgid "Contest access codes"
msgstr ""
-#: judge/models/contest.py:369
+#: judge/models/contest.py:405
msgid "Create private contests"
msgstr ""
-#: judge/models/contest.py:370
+#: judge/models/contest.py:406
msgid "Change contest visibility"
msgstr ""
-#: judge/models/contest.py:371
+#: judge/models/contest.py:407
msgid "Edit contest problem label script"
msgstr ""
-#: judge/models/contest.py:372
+#: judge/models/contest.py:408
msgid "Change lock status of contest"
msgstr ""
-#: judge/models/contest.py:374 judge/models/contest.py:472
-#: judge/models/contest.py:510 judge/models/contest.py:532
-#: judge/models/submission.py:84
+#: judge/models/contest.py:410 judge/models/contest.py:508
+#: judge/models/contest.py:547 judge/models/contest.py:569
+#: judge/models/submission.py:85
msgid "contest"
msgstr "соревнование"
-#: judge/models/contest.py:375
+#: judge/models/contest.py:411
msgid "contests"
msgstr "соревнования"
-#: judge/models/contest.py:382
+#: judge/models/contest.py:418
msgid "associated contest"
msgstr ""
-#: judge/models/contest.py:385
+#: judge/models/contest.py:421
msgid "score"
msgstr ""
-#: judge/models/contest.py:386
+#: judge/models/contest.py:422
msgid "cumulative time"
msgstr ""
-#: judge/models/contest.py:387
+#: judge/models/contest.py:423
msgid "is disqualified"
msgstr ""
-#: judge/models/contest.py:388
+#: judge/models/contest.py:424
msgid "Whether this participation is disqualified."
msgstr ""
-#: judge/models/contest.py:389
+#: judge/models/contest.py:425
msgid "tie-breaking field"
msgstr ""
-#: judge/models/contest.py:390
+#: judge/models/contest.py:426
msgid "virtual participation id"
msgstr ""
-#: judge/models/contest.py:391
+#: judge/models/contest.py:427
msgid "0 means non-virtual, otherwise the n-th virtual participation."
msgstr ""
-#: judge/models/contest.py:392
+#: judge/models/contest.py:428
msgid "contest format specific data"
msgstr ""
-#: judge/models/contest.py:458
+#: judge/models/contest.py:494
#, python-format
msgid "%s spectating in %s"
msgstr ""
-#: judge/models/contest.py:460
+#: judge/models/contest.py:496
#, python-format
msgid "%s in %s, v%d"
msgstr ""
-#: judge/models/contest.py:461
+#: judge/models/contest.py:497
#, python-format
msgid "%s in %s"
msgstr ""
-#: judge/models/contest.py:464
+#: judge/models/contest.py:500
msgid "contest participation"
msgstr "участие в соревновании"
-#: judge/models/contest.py:465
+#: judge/models/contest.py:501
msgid "contest participations"
msgstr ""
-#: judge/models/contest.py:471 judge/models/contest.py:494
-#: judge/models/contest.py:533 judge/models/problem.py:430
-#: judge/models/problem.py:435 judge/models/problem.py:453
+#: judge/models/contest.py:507 judge/models/contest.py:531
+#: judge/models/contest.py:570 judge/models/problem.py:457
+#: judge/models/problem.py:462 judge/models/problem.py:480
#: judge/models/problem_data.py:35
msgid "problem"
msgstr "задача"
-#: judge/models/contest.py:473 judge/models/contest.py:498
-#: judge/models/problem.py:137
+#: judge/models/contest.py:509 judge/models/contest.py:535
+#: judge/models/problem.py:151
msgid "points"
msgstr "очки"
-#: judge/models/contest.py:474
+#: judge/models/contest.py:510
msgid "partial"
msgstr "частичный"
-#: judge/models/contest.py:475 judge/models/contest.py:499
+#: judge/models/contest.py:511 judge/models/contest.py:536
msgid "is pretested"
msgstr ""
-#: judge/models/contest.py:476 judge/models/interface.py:43
+#: judge/models/contest.py:512 judge/models/interface.py:43
msgid "order"
msgstr "порядок"
-#: judge/models/contest.py:477
+#: judge/models/contest.py:513
msgid "output prefix length override"
msgstr ""
-#: judge/models/contest.py:479
+#: judge/models/contest.py:515
msgid "Maximum number of submissions for this problem, or leave blank for no limit."
msgstr ""
-#: judge/models/contest.py:482
+#: judge/models/contest.py:518
msgid "Why include a problem you can't submit to?"
msgstr ""
-#: judge/models/contest.py:487
+#: judge/models/contest.py:523
msgid "contest problem"
msgstr ""
-#: judge/models/contest.py:488
+#: judge/models/contest.py:524
msgid "contest problems"
msgstr ""
-#: judge/models/contest.py:492 judge/models/submission.py:207
+#: judge/models/contest.py:529 judge/models/submission.py:218
msgid "submission"
msgstr "посылка"
-#: judge/models/contest.py:496 judge/models/contest.py:511
+#: judge/models/contest.py:533 judge/models/contest.py:548
msgid "participation"
msgstr "участие"
-#: judge/models/contest.py:500
+#: judge/models/contest.py:537
msgid "Whether this submission was ran only on pretests."
msgstr ""
-#: judge/models/contest.py:504
+#: judge/models/contest.py:541
msgid "contest submission"
msgstr ""
-#: judge/models/contest.py:505
+#: judge/models/contest.py:542
msgid "contest submissions"
msgstr ""
-#: judge/models/contest.py:513
+#: judge/models/contest.py:550
msgid "rank"
msgstr "ранг"
-#: judge/models/contest.py:514
+#: judge/models/contest.py:551
msgid "rating"
msgstr "рейтинг"
-#: judge/models/contest.py:515
+#: judge/models/contest.py:552
msgid "volatility"
msgstr ""
-#: judge/models/contest.py:516
+#: judge/models/contest.py:553
msgid "last rated"
msgstr ""
-#: judge/models/contest.py:520
+#: judge/models/contest.py:557
msgid "contest rating"
msgstr ""
-#: judge/models/contest.py:521
+#: judge/models/contest.py:558
msgid "contest ratings"
msgstr ""
-#: judge/models/contest.py:540
+#: judge/models/contest.py:577
msgid "contest moss result"
msgstr ""
-#: judge/models/contest.py:541
+#: judge/models/contest.py:578
msgid "contest moss results"
msgstr ""
@@ -1229,7 +1246,7 @@ msgstr ""
msgid "post title"
msgstr ""
-#: judge/models/interface.py:67 judge/models/problem.py:473
+#: judge/models/interface.py:67 judge/models/problem.py:500
msgid "authors"
msgstr "авторы"
@@ -1237,7 +1254,7 @@ msgstr "авторы"
msgid "slug"
msgstr ""
-#: judge/models/interface.py:69 judge/models/problem.py:471
+#: judge/models/interface.py:69 judge/models/problem.py:498
msgid "public visibility"
msgstr ""
@@ -1273,34 +1290,6 @@ msgstr ""
msgid "blog posts"
msgstr ""
-#: judge/models/message.py:11
-msgid "message title"
-msgstr "заголовок сообщения"
-
-#: judge/models/message.py:12 judge/models/ticket.py:30
-msgid "message body"
-msgstr "тело сообщения"
-
-#: judge/models/message.py:13
-msgid "sender"
-msgstr ""
-
-#: judge/models/message.py:14
-msgid "target"
-msgstr ""
-
-#: judge/models/message.py:15
-msgid "message timestamp"
-msgstr ""
-
-#: judge/models/message.py:16
-msgid "read"
-msgstr ""
-
-#: judge/models/message.py:20
-msgid "messages in the thread"
-msgstr ""
-
#: judge/models/problem.py:30
#, python-format
msgid "Disallowed characters: %(value)s"
@@ -1318,7 +1307,7 @@ msgstr ""
msgid "problem type"
msgstr ""
-#: judge/models/problem.py:44 judge/models/problem.py:121
+#: judge/models/problem.py:44 judge/models/problem.py:135
msgid "problem types"
msgstr ""
@@ -1330,7 +1319,7 @@ msgstr ""
msgid "problem group name"
msgstr ""
-#: judge/models/problem.py:56 judge/models/problem.py:124
+#: judge/models/problem.py:56 judge/models/problem.py:138
msgid "problem group"
msgstr ""
@@ -1350,7 +1339,7 @@ msgstr ""
msgid "full name"
msgstr ""
-#: judge/models/problem.py:65 judge/models/profile.py:41
+#: judge/models/problem.py:65 judge/models/profile.py:44
#: judge/models/runtime.py:24
msgid "short name"
msgstr ""
@@ -1379,232 +1368,252 @@ msgstr ""
msgid "licenses"
msgstr ""
-#: judge/models/problem.py:104
+#: judge/models/problem.py:112
+msgid "Follow global setting"
+msgstr ""
+
+#: judge/models/problem.py:113
+msgid "Always visible"
+msgstr ""
+
+#: judge/models/problem.py:114
+msgid "Visible if problem solved"
+msgstr ""
+
+#: judge/models/problem.py:115
+msgid "Only own submissions"
+msgstr ""
+
+#: judge/models/problem.py:118
msgid "problem code"
msgstr ""
-#: judge/models/problem.py:106
+#: judge/models/problem.py:120
msgid "A short, unique code for the problem, used in the url after /problem/"
msgstr ""
-#: judge/models/problem.py:108
+#: judge/models/problem.py:122
msgid "problem name"
msgstr ""
-#: judge/models/problem.py:109
+#: judge/models/problem.py:123
msgid "The full name of the problem, as shown in the problem list."
msgstr ""
-#: judge/models/problem.py:111
+#: judge/models/problem.py:125
msgid "problem body"
msgstr ""
-#: judge/models/problem.py:112
+#: judge/models/problem.py:126
msgid "creators"
msgstr ""
-#: judge/models/problem.py:113
+#: judge/models/problem.py:127
msgid "These users will be able to edit the problem, and be listed as authors."
msgstr ""
-#: judge/models/problem.py:115
+#: judge/models/problem.py:129
msgid "curators"
msgstr ""
-#: judge/models/problem.py:116
+#: judge/models/problem.py:130
msgid "These users will be able to edit the problem, but not be listed as authors."
msgstr ""
-#: judge/models/problem.py:118
+#: judge/models/problem.py:132
msgid "testers"
msgstr ""
-#: judge/models/problem.py:120
+#: judge/models/problem.py:134
msgid "These users will be able to view the private problem, but not edit it."
msgstr ""
-#: judge/models/problem.py:122
+#: judge/models/problem.py:136
msgid "The type of problem, as shown on the problem's page."
msgstr ""
-#: judge/models/problem.py:125
+#: judge/models/problem.py:139
msgid "The group of problem, shown under Category in the problem list."
msgstr ""
-#: judge/models/problem.py:127
+#: judge/models/problem.py:141
msgid "The time limit for this problem, in seconds. Fractional seconds (e.g. 1.5) are supported."
msgstr ""
-#: judge/models/problem.py:131 judge/models/problem.py:458
+#: judge/models/problem.py:145 judge/models/problem.py:485
msgid "memory limit"
msgstr ""
-#: judge/models/problem.py:132
+#: judge/models/problem.py:146
msgid "The memory limit for this problem, in kilobytes (e.g. 64mb = 65536 kilobytes)."
msgstr ""
-#: judge/models/problem.py:138
+#: judge/models/problem.py:152
msgid "Points awarded for problem completion. Points are displayed with a 'p' suffix if partial."
msgstr ""
-#: judge/models/problem.py:141
+#: judge/models/problem.py:155
msgid "allows partial points"
msgstr ""
-#: judge/models/problem.py:142
+#: judge/models/problem.py:156
msgid "allowed languages"
msgstr ""
-#: judge/models/problem.py:143
+#: judge/models/problem.py:157
msgid "List of allowed submission languages."
msgstr ""
-#: judge/models/problem.py:145
+#: judge/models/problem.py:159
msgid "manually managed"
msgstr ""
-#: judge/models/problem.py:146
+#: judge/models/problem.py:160
msgid "Whether judges should be allowed to manage data or not."
msgstr ""
-#: judge/models/problem.py:147
+#: judge/models/problem.py:161
msgid "date of publishing"
msgstr ""
-#: judge/models/problem.py:148
+#: judge/models/problem.py:162
msgid "Doesn't have magic ability to auto-publish due to backward compatibility"
msgstr ""
-#: judge/models/problem.py:150
+#: judge/models/problem.py:164
msgid "Bans the selected users from submitting to this problem."
msgstr ""
-#: judge/models/problem.py:152
+#: judge/models/problem.py:166
msgid "The license under which this problem is published."
msgstr ""
-#: judge/models/problem.py:154
+#: judge/models/problem.py:168
msgid "problem summary"
msgstr ""
-#: judge/models/problem.py:156
+#: judge/models/problem.py:170
msgid "number of users"
msgstr ""
-#: judge/models/problem.py:157
+#: judge/models/problem.py:171
msgid "The number of users who solved the problem."
msgstr ""
-#: judge/models/problem.py:158
+#: judge/models/problem.py:172
msgid "solve rate"
msgstr ""
-#: judge/models/problem.py:159
+#: judge/models/problem.py:173
msgid "allow full markdown access"
msgstr ""
-#: judge/models/problem.py:165
+#: judge/models/problem.py:174
+msgid "submission source visibility"
+msgstr ""
+
+#: judge/models/problem.py:182
msgid "If private, only these organizations may see the problem."
msgstr ""
-#: judge/models/problem.py:420
+#: judge/models/problem.py:447
msgid "See hidden problems"
msgstr ""
-#: judge/models/problem.py:421
+#: judge/models/problem.py:448
msgid "Edit own problems"
msgstr ""
-#: judge/models/problem.py:422
+#: judge/models/problem.py:449
msgid "Edit all problems"
msgstr ""
-#: judge/models/problem.py:423
+#: judge/models/problem.py:450
msgid "Edit all public problems"
msgstr ""
-#: judge/models/problem.py:424
+#: judge/models/problem.py:451
msgid "Edit problems with full markup"
msgstr ""
-#: judge/models/problem.py:425 templates/problem/problem.html:161
+#: judge/models/problem.py:452 templates/problem/problem.html:161
msgid "Clone problem"
msgstr ""
-#: judge/models/problem.py:426
+#: judge/models/problem.py:453
msgid "Change is_public field"
msgstr ""
-#: judge/models/problem.py:427
+#: judge/models/problem.py:454
msgid "Change is_manually_managed field"
msgstr ""
-#: judge/models/problem.py:428
+#: judge/models/problem.py:455
msgid "See organization-private problems"
msgstr ""
-#: judge/models/problem.py:436 judge/models/problem.py:454
+#: judge/models/problem.py:463 judge/models/problem.py:481
#: judge/models/runtime.py:111
msgid "language"
msgstr "язык"
-#: judge/models/problem.py:437
+#: judge/models/problem.py:464
msgid "translated name"
msgstr ""
-#: judge/models/problem.py:438
+#: judge/models/problem.py:465
msgid "translated description"
msgstr ""
-#: judge/models/problem.py:442
+#: judge/models/problem.py:469
msgid "problem translation"
msgstr ""
-#: judge/models/problem.py:443
+#: judge/models/problem.py:470
msgid "problem translations"
msgstr ""
-#: judge/models/problem.py:447
+#: judge/models/problem.py:474
msgid "clarified problem"
msgstr ""
-#: judge/models/problem.py:448
+#: judge/models/problem.py:475
msgid "clarification body"
msgstr ""
-#: judge/models/problem.py:449
+#: judge/models/problem.py:476
msgid "clarification timestamp"
msgstr ""
-#: judge/models/problem.py:464
+#: judge/models/problem.py:491
msgid "language-specific resource limit"
msgstr ""
-#: judge/models/problem.py:465
+#: judge/models/problem.py:492
msgid "language-specific resource limits"
msgstr ""
-#: judge/models/problem.py:469
+#: judge/models/problem.py:496
msgid "associated problem"
msgstr ""
-#: judge/models/problem.py:472
+#: judge/models/problem.py:499
msgid "publish date"
msgstr ""
-#: judge/models/problem.py:474
+#: judge/models/problem.py:501
msgid "editorial content"
msgstr ""
-#: judge/models/problem.py:497
+#: judge/models/problem.py:524
msgid "See hidden solutions"
msgstr ""
-#: judge/models/problem.py:499
+#: judge/models/problem.py:526
msgid "solution"
msgstr ""
-#: judge/models/problem.py:500
+#: judge/models/problem.py:527
msgid "solutions"
msgstr ""
@@ -1716,112 +1725,112 @@ msgstr ""
msgid "case is pretest?"
msgstr ""
-#: judge/models/profile.py:38
+#: judge/models/profile.py:41
msgid "organization title"
msgstr ""
-#: judge/models/profile.py:39
+#: judge/models/profile.py:42
msgid "organization slug"
msgstr ""
-#: judge/models/profile.py:40
+#: judge/models/profile.py:43
msgid "Organization name shown in URL"
msgstr ""
-#: judge/models/profile.py:42
+#: judge/models/profile.py:45
msgid "Displayed beside user name during contests"
msgstr ""
-#: judge/models/profile.py:43
+#: judge/models/profile.py:46
msgid "organization description"
msgstr ""
-#: judge/models/profile.py:44
+#: judge/models/profile.py:47
msgid "administrators"
msgstr ""
-#: judge/models/profile.py:45
+#: judge/models/profile.py:48
msgid "Those who can edit this organization"
msgstr ""
-#: judge/models/profile.py:46
+#: judge/models/profile.py:49
msgid "creation date"
msgstr ""
-#: judge/models/profile.py:47
+#: judge/models/profile.py:50
msgid "is open organization?"
msgstr ""
-#: judge/models/profile.py:48
+#: judge/models/profile.py:51
msgid "Allow joining organization"
msgstr ""
-#: judge/models/profile.py:49
+#: judge/models/profile.py:52
msgid "maximum size"
msgstr ""
-#: judge/models/profile.py:50
+#: judge/models/profile.py:53
msgid "Maximum amount of users in this organization, only applicable to private organizations"
msgstr ""
-#: judge/models/profile.py:52
+#: judge/models/profile.py:55
msgid "Student access code"
msgstr ""
-#: judge/models/profile.py:56
+#: judge/models/profile.py:59
msgid "This image will replace the default site logo for users viewing the organization."
msgstr ""
-#: judge/models/profile.py:79
+#: judge/models/profile.py:82
msgid "Administer organizations"
msgstr ""
-#: judge/models/profile.py:80
+#: judge/models/profile.py:83
msgid "Edit all organizations"
msgstr ""
-#: judge/models/profile.py:82 judge/models/profile.py:99
-#: judge/models/profile.py:269
+#: judge/models/profile.py:85 judge/models/profile.py:102
+#: judge/models/profile.py:293
msgid "organization"
msgstr ""
-#: judge/models/profile.py:87
+#: judge/models/profile.py:90
msgid "user associated"
msgstr ""
-#: judge/models/profile.py:88
+#: judge/models/profile.py:91
msgid "self-description"
msgstr ""
-#: judge/models/profile.py:89
+#: judge/models/profile.py:92
msgid "location"
msgstr ""
-#: judge/models/profile.py:91
+#: judge/models/profile.py:94
msgid "preferred language"
msgstr ""
-#: judge/models/profile.py:97
+#: judge/models/profile.py:100
msgid "last access time"
msgstr ""
-#: judge/models/profile.py:98
+#: judge/models/profile.py:101
msgid "last IP"
msgstr ""
-#: judge/models/profile.py:101
+#: judge/models/profile.py:104
msgid "display rank"
msgstr ""
-#: judge/models/profile.py:103
+#: judge/models/profile.py:106
msgid "Normal User"
msgstr ""
-#: judge/models/profile.py:104
+#: judge/models/profile.py:107
msgid "Problem Setter"
msgstr ""
-#: judge/models/profile.py:105 templates/base.html:220
+#: judge/models/profile.py:108 templates/base.html:220
#: templates/comments/list.html:99 templates/contest/contest-list-tabs.html:24
#: templates/contest/ranking-table.html:49
#: templates/problem/problem-list-tabs.html:6
@@ -1830,155 +1839,167 @@ msgstr ""
msgid "Admin"
msgstr ""
-#: judge/models/profile.py:106
+#: judge/models/profile.py:109
msgid "comment mute"
msgstr ""
-#: judge/models/profile.py:106
+#: judge/models/profile.py:109
msgid "Some users are at their best when silent."
msgstr ""
-#: judge/models/profile.py:108
+#: judge/models/profile.py:111
msgid "unlisted user"
msgstr ""
-#: judge/models/profile.py:108
+#: judge/models/profile.py:111
msgid "User will not be ranked."
msgstr ""
-#: judge/models/profile.py:111
+#: judge/models/profile.py:114
msgid "user script"
msgstr ""
-#: judge/models/profile.py:112
+#: judge/models/profile.py:115
msgid "User-defined JavaScript for site customization."
msgstr ""
-#: judge/models/profile.py:113
+#: judge/models/profile.py:116
msgid "current contest"
msgstr ""
-#: judge/models/profile.py:115
+#: judge/models/profile.py:118
msgid "math engine"
msgstr ""
-#: judge/models/profile.py:117
+#: judge/models/profile.py:120
msgid "the rendering engine used to render math"
msgstr ""
-#: judge/models/profile.py:118
+#: judge/models/profile.py:121
msgid "TOTP 2FA enabled"
msgstr ""
-#: judge/models/profile.py:119
+#: judge/models/profile.py:122
msgid "check to enable TOTP-based two-factor authentication"
msgstr ""
-#: judge/models/profile.py:120
+#: judge/models/profile.py:123
msgid "WebAuthn 2FA enabled"
msgstr ""
-#: judge/models/profile.py:121
+#: judge/models/profile.py:124
msgid "check to enable WebAuthn-based two-factor authentication"
msgstr ""
-#: judge/models/profile.py:122
+#: judge/models/profile.py:125
msgid "TOTP key"
msgstr ""
-#: judge/models/profile.py:123
+#: judge/models/profile.py:126
msgid "32 character base32-encoded key for TOTP"
msgstr ""
-#: judge/models/profile.py:125
+#: judge/models/profile.py:128
msgid "TOTP key must be empty or base32"
msgstr ""
-#: judge/models/profile.py:126
+#: judge/models/profile.py:129
msgid "scratch codes"
msgstr ""
-#: judge/models/profile.py:127
+#: judge/models/profile.py:130
msgid "JSON array of 16 character base32-encoded codes for scratch codes"
msgstr ""
-#: judge/models/profile.py:131
+#: judge/models/profile.py:134
msgid "Scratch codes must be empty or a JSON array of 16-character base32 codes"
msgstr ""
-#: judge/models/profile.py:133
+#: judge/models/profile.py:136
+msgid "last TOTP timecode"
+msgstr ""
+
+#: judge/models/profile.py:137
msgid "API token"
msgstr ""
-#: judge/models/profile.py:134
+#: judge/models/profile.py:138
msgid "64 character hex-encoded API access token"
msgstr ""
-#: judge/models/profile.py:136
+#: judge/models/profile.py:140
msgid "API token must be None or hexadecimal"
msgstr ""
-#: judge/models/profile.py:137
+#: judge/models/profile.py:141
msgid "internal notes"
msgstr ""
-#: judge/models/profile.py:138
+#: judge/models/profile.py:142
msgid "Notes for administrators regarding this user."
msgstr ""
-#: judge/models/profile.py:139
+#: judge/models/profile.py:143
msgid "last data download time"
msgstr ""
-#: judge/models/profile.py:236
+#: judge/models/profile.py:253
msgid "Shows in-progress development stuff"
msgstr ""
-#: judge/models/profile.py:237
+#: judge/models/profile.py:254
msgid "Edit TOTP settings"
msgstr ""
-#: judge/models/profile.py:239
+#: judge/models/profile.py:256
msgid "user profile"
msgstr ""
-#: judge/models/profile.py:240
+#: judge/models/profile.py:257
msgid "user profiles"
msgstr ""
-#: judge/models/profile.py:246
+#: judge/models/profile.py:263
msgid "device name"
msgstr ""
-#: judge/models/profile.py:247
+#: judge/models/profile.py:264
msgid "credential ID"
msgstr ""
-#: judge/models/profile.py:248
+#: judge/models/profile.py:265
msgid "public key"
msgstr ""
-#: judge/models/profile.py:249
+#: judge/models/profile.py:266
msgid "sign counter"
msgstr ""
-#: judge/models/profile.py:271
+#: judge/models/profile.py:287
+msgid "WebAuthn credential"
+msgstr ""
+
+#: judge/models/profile.py:288
+msgid "WebAuthn credentials"
+msgstr ""
+
+#: judge/models/profile.py:295
msgid "request time"
msgstr ""
-#: judge/models/profile.py:272
+#: judge/models/profile.py:296
msgid "state"
msgstr ""
-#: judge/models/profile.py:277
+#: judge/models/profile.py:301
msgid "reason"
msgstr ""
-#: judge/models/profile.py:280
+#: judge/models/profile.py:304
msgid "organization join request"
msgstr ""
-#: judge/models/profile.py:281
+#: judge/models/profile.py:305
msgid "organization join requests"
msgstr ""
@@ -2134,210 +2155,210 @@ msgstr ""
msgid "judge"
msgstr ""
-#: judge/models/submission.py:20 judge/models/submission.py:47
+#: judge/models/submission.py:21 judge/models/submission.py:48
#: judge/utils/problems.py:74
msgid "Accepted"
msgstr ""
-#: judge/models/submission.py:21 judge/models/submission.py:48
+#: judge/models/submission.py:22 judge/models/submission.py:49
msgid "Wrong Answer"
msgstr ""
-#: judge/models/submission.py:22 judge/models/submission.py:50
+#: judge/models/submission.py:23 judge/models/submission.py:51
msgid "Time Limit Exceeded"
msgstr ""
-#: judge/models/submission.py:23 judge/models/submission.py:51
+#: judge/models/submission.py:24 judge/models/submission.py:52
msgid "Memory Limit Exceeded"
msgstr ""
-#: judge/models/submission.py:24 judge/models/submission.py:52
+#: judge/models/submission.py:25 judge/models/submission.py:53
msgid "Output Limit Exceeded"
msgstr ""
-#: judge/models/submission.py:25 judge/models/submission.py:53
+#: judge/models/submission.py:26 judge/models/submission.py:54
msgid "Invalid Return"
msgstr ""
-#: judge/models/submission.py:26 judge/models/submission.py:54
+#: judge/models/submission.py:27 judge/models/submission.py:55
msgid "Runtime Error"
msgstr ""
-#: judge/models/submission.py:27 judge/models/submission.py:41
-#: judge/models/submission.py:55 judge/utils/problems.py:76
+#: judge/models/submission.py:28 judge/models/submission.py:42
+#: judge/models/submission.py:56 judge/utils/problems.py:76
msgid "Compile Error"
msgstr ""
-#: judge/models/submission.py:28 judge/models/submission.py:40
+#: judge/models/submission.py:29 judge/models/submission.py:41
msgid "Internal Error"
msgstr ""
-#: judge/models/submission.py:29
+#: judge/models/submission.py:30
msgid "Short circuit"
msgstr ""
-#: judge/models/submission.py:30 judge/models/submission.py:42
-#: judge/models/submission.py:61
+#: judge/models/submission.py:31 judge/models/submission.py:43
+#: judge/models/submission.py:62
msgid "Aborted"
msgstr ""
-#: judge/models/submission.py:36 judge/models/submission.py:57
+#: judge/models/submission.py:37 judge/models/submission.py:58
msgid "Queued"
msgstr ""
-#: judge/models/submission.py:37 judge/models/submission.py:58
+#: judge/models/submission.py:38 judge/models/submission.py:59
msgid "Processing"
msgstr ""
-#: judge/models/submission.py:38 judge/models/submission.py:59
+#: judge/models/submission.py:39 judge/models/submission.py:60
msgid "Grading"
msgstr ""
-#: judge/models/submission.py:39 judge/models/submission.py:60
+#: judge/models/submission.py:40 judge/models/submission.py:61
msgid "Completed"
msgstr ""
-#: judge/models/submission.py:56
+#: judge/models/submission.py:57
msgid "Internal Error (judging server error)"
msgstr ""
-#: judge/models/submission.py:66
+#: judge/models/submission.py:67
msgid "submission time"
msgstr ""
-#: judge/models/submission.py:67 judge/models/submission.py:227
+#: judge/models/submission.py:68 judge/models/submission.py:238
msgid "execution time"
msgstr ""
-#: judge/models/submission.py:68 judge/models/submission.py:228
+#: judge/models/submission.py:69 judge/models/submission.py:239
msgid "memory usage"
msgstr ""
-#: judge/models/submission.py:69 judge/models/submission.py:229
+#: judge/models/submission.py:70 judge/models/submission.py:240
msgid "points granted"
msgstr ""
-#: judge/models/submission.py:70
+#: judge/models/submission.py:71
msgid "submission language"
msgstr ""
-#: judge/models/submission.py:71
+#: judge/models/submission.py:72
msgid "status"
msgstr ""
-#: judge/models/submission.py:72
+#: judge/models/submission.py:73
msgid "result"
msgstr ""
-#: judge/models/submission.py:74
+#: judge/models/submission.py:75
msgid "compile errors"
msgstr ""
-#: judge/models/submission.py:76
+#: judge/models/submission.py:77
msgid "batched cases"
msgstr ""
-#: judge/models/submission.py:77
+#: judge/models/submission.py:78
msgid "test case points"
msgstr ""
-#: judge/models/submission.py:78
+#: judge/models/submission.py:79
msgid "test case total points"
msgstr ""
-#: judge/models/submission.py:79
+#: judge/models/submission.py:80
msgid "judged on"
msgstr ""
-#: judge/models/submission.py:81
+#: judge/models/submission.py:82
msgid "submission judge time"
msgstr ""
-#: judge/models/submission.py:82
-msgid "was rejudged by admin"
+#: judge/models/submission.py:83
+msgid "last rejudge date by admin"
msgstr ""
-#: judge/models/submission.py:83
+#: judge/models/submission.py:84
msgid "was ran on pretests only"
msgstr ""
-#: judge/models/submission.py:86
-msgid "lock submission"
+#: judge/models/submission.py:87
+msgid "submission lock"
msgstr ""
-#: judge/models/submission.py:199
+#: judge/models/submission.py:210
msgid "Abort any submission"
msgstr ""
-#: judge/models/submission.py:200
+#: judge/models/submission.py:211
msgid "Rejudge the submission"
msgstr ""
-#: judge/models/submission.py:201
+#: judge/models/submission.py:212
msgid "Rejudge a lot of submissions"
msgstr ""
-#: judge/models/submission.py:202
+#: judge/models/submission.py:213
msgid "Submit without limit"
msgstr ""
-#: judge/models/submission.py:203
+#: judge/models/submission.py:214
msgid "View all submission"
msgstr ""
-#: judge/models/submission.py:204
+#: judge/models/submission.py:215
msgid "Resubmit others' submission"
msgstr ""
-#: judge/models/submission.py:205
+#: judge/models/submission.py:216
msgid "Change lock status of submission"
msgstr ""
-#: judge/models/submission.py:208 templates/contest/moss.html:58
+#: judge/models/submission.py:219 templates/contest/moss.html:58
msgid "submissions"
msgstr ""
-#: judge/models/submission.py:212 judge/models/submission.py:223
+#: judge/models/submission.py:223 judge/models/submission.py:234
msgid "associated submission"
msgstr ""
-#: judge/models/submission.py:214
+#: judge/models/submission.py:225
msgid "source code"
msgstr ""
-#: judge/models/submission.py:225
+#: judge/models/submission.py:236
msgid "test case ID"
msgstr ""
-#: judge/models/submission.py:226
+#: judge/models/submission.py:237
msgid "status flag"
msgstr ""
-#: judge/models/submission.py:230
+#: judge/models/submission.py:241
msgid "points possible"
msgstr ""
-#: judge/models/submission.py:231
+#: judge/models/submission.py:242
msgid "batch number"
msgstr ""
-#: judge/models/submission.py:232
+#: judge/models/submission.py:243
msgid "judging feedback"
msgstr ""
-#: judge/models/submission.py:233
+#: judge/models/submission.py:244
msgid "extended judging feedback"
msgstr ""
-#: judge/models/submission.py:234
+#: judge/models/submission.py:245
msgid "program output"
msgstr ""
-#: judge/models/submission.py:242
+#: judge/models/submission.py:253
msgid "submission test case"
msgstr ""
-#: judge/models/submission.py:243
+#: judge/models/submission.py:254
msgid "submission test cases"
msgstr ""
@@ -2385,6 +2406,10 @@ msgstr ""
msgid "poster"
msgstr ""
+#: judge/models/ticket.py:30
+msgid "message body"
+msgstr "тело сообщения"
+
#: judge/models/ticket.py:31
msgid "message time"
msgstr ""
@@ -2407,19 +2432,23 @@ msgstr ""
msgid "Running MOSS"
msgstr ""
-#: judge/tasks/submission.py:43
+#: judge/tasks/submission.py:45
msgid "Modifying submissions"
msgstr ""
-#: judge/tasks/submission.py:56
+#: judge/tasks/submission.py:58
msgid "Recalculating user points"
msgstr ""
-#: judge/tasks/user.py:50
+#: judge/tasks/user.py:49
+msgid "Applying filters"
+msgstr ""
+
+#: judge/tasks/user.py:64
msgid "Preparing your submission data"
msgstr ""
-#: judge/tasks/user.py:81
+#: judge/tasks/user.py:95
msgid "Preparing your comment data"
msgstr ""
@@ -2538,7 +2567,7 @@ msgstr ""
msgid "You already voted."
msgstr ""
-#: judge/views/comment.py:129 judge/views/organization.py:298
+#: judge/views/comment.py:129 judge/views/organization.py:297
msgid "Edited from site"
msgstr ""
@@ -2546,125 +2575,130 @@ msgstr ""
msgid "Editing comment"
msgstr ""
-#: judge/views/contests.py:56 judge/views/contests.py:201
-#: judge/views/contests.py:204 judge/views/contests.py:382
+#: judge/views/contests.py:57 judge/views/contests.py:210
+#: judge/views/contests.py:213 judge/views/contests.py:395
msgid "No such contest"
msgstr ""
-#: judge/views/contests.py:57 judge/views/contests.py:202
+#: judge/views/contests.py:58 judge/views/contests.py:211
#, python-format
msgid "Could not find a contest with the key \"%s\"."
msgstr ""
-#: judge/views/contests.py:70
+#: judge/views/contests.py:71
msgid "Contests"
msgstr ""
-#: judge/views/contests.py:205
+#: judge/views/contests.py:214
msgid "Could not find such contest."
msgstr ""
-#: judge/views/contests.py:208
+#: judge/views/contests.py:217
#, python-format
msgid "Access to contest \"%s\" denied"
msgstr ""
-#: judge/views/contests.py:235
+#: judge/views/contests.py:244
msgid "Clone Contest"
msgstr ""
-#: judge/views/contests.py:301
+#: judge/views/contests.py:278
+#, python-format
+msgid "Cloned contest from %s"
+msgstr ""
+
+#: judge/views/contests.py:314
msgid "Contest not ongoing"
msgstr ""
-#: judge/views/contests.py:302
+#: judge/views/contests.py:315
#, python-format
msgid "\"%s\" is not currently ongoing."
msgstr ""
-#: judge/views/contests.py:306
+#: judge/views/contests.py:319
msgid "Already in contest"
msgstr ""
-#: judge/views/contests.py:307
+#: judge/views/contests.py:320
#, python-format
msgid "You are already in a contest: \"%s\"."
msgstr ""
-#: judge/views/contests.py:310
+#: judge/views/contests.py:323
msgid "Banned from joining"
msgstr ""
-#: judge/views/contests.py:311
+#: judge/views/contests.py:324
msgid "You have been declared persona non grata for this contest. You are permanently barred from joining this contest."
msgstr ""
-#: judge/views/contests.py:372
+#: judge/views/contests.py:385
#, python-format
msgid "Enter access code for \"%s\""
msgstr ""
-#: judge/views/contests.py:383
+#: judge/views/contests.py:396
#, python-format
msgid "You are not in contest \"%s\"."
msgstr ""
-#: judge/views/contests.py:402
+#: judge/views/contests.py:415
msgid "ContestCalendar requires integer year and month"
msgstr ""
-#: judge/views/contests.py:442
+#: judge/views/contests.py:455
#, python-format
msgid "Contests in %(month)s"
msgstr ""
-#: judge/views/contests.py:442
+#: judge/views/contests.py:455
msgid "F Y"
msgstr ""
-#: judge/views/contests.py:489
+#: judge/views/contests.py:502
#, python-format
msgid "%s Statistics"
msgstr ""
-#: judge/views/contests.py:662
+#: judge/views/contests.py:675
#, python-format
msgid "%s Rankings"
msgstr ""
-#: judge/views/contests.py:670
+#: judge/views/contests.py:683
msgid "???"
msgstr ""
-#: judge/views/contests.py:686
+#: judge/views/contests.py:699
#, python-format
msgid "Your participation in %s"
msgstr ""
-#: judge/views/contests.py:687
+#: judge/views/contests.py:700
#, python-format
msgid "%s's participation in %s"
msgstr ""
-#: judge/views/contests.py:694
+#: judge/views/contests.py:707
msgid "Live"
msgstr "Онлайн"
-#: judge/views/contests.py:706 templates/contest/contest-tabs.html:13
+#: judge/views/contests.py:719 templates/contest/contest-tabs.html:13
msgid "Participation"
msgstr ""
-#: judge/views/contests.py:750
+#: judge/views/contests.py:763
#, python-format
msgid "%s MOSS Results"
msgstr ""
-#: judge/views/contests.py:777
+#: judge/views/contests.py:790
#, python-format
msgid "Running MOSS for %s..."
msgstr ""
-#: judge/views/contests.py:800
+#: judge/views/contests.py:813
#, python-format
msgid "Contest tag: %s"
msgstr ""
@@ -2693,71 +2727,71 @@ msgstr ""
msgid "Runtimes"
msgstr ""
-#: judge/views/organization.py:44 judge/views/organization.py:47
+#: judge/views/organization.py:43 judge/views/organization.py:46
msgid "No such organization"
msgstr ""
-#: judge/views/organization.py:45
+#: judge/views/organization.py:44
#, python-format
msgid "Could not find an organization with the key \"%s\"."
msgstr ""
-#: judge/views/organization.py:48
+#: judge/views/organization.py:47
msgid "Could not find such organization."
msgstr ""
-#: judge/views/organization.py:72 judge/views/register.py:34
+#: judge/views/organization.py:71 judge/views/register.py:33
#: templates/organization/list.html:15 templates/user/user-list-tabs.html:5
msgid "Organizations"
msgstr ""
-#: judge/views/organization.py:93
+#: judge/views/organization.py:92
#, python-format
msgid "%s Members"
msgstr ""
-#: judge/views/organization.py:118 judge/views/organization.py:121
-#: judge/views/organization.py:126
+#: judge/views/organization.py:117 judge/views/organization.py:120
+#: judge/views/organization.py:125
msgid "Joining organization"
msgstr ""
-#: judge/views/organization.py:118
+#: judge/views/organization.py:117
msgid "You are already in the organization."
msgstr ""
-#: judge/views/organization.py:121
+#: judge/views/organization.py:120
msgid "This organization is not open."
msgstr ""
-#: judge/views/organization.py:138
+#: judge/views/organization.py:137
msgid "Leaving organization"
msgstr ""
-#: judge/views/organization.py:138
+#: judge/views/organization.py:137
#, python-format
msgid "You are not in \"%s\"."
msgstr ""
-#: judge/views/organization.py:162
+#: judge/views/organization.py:161
#, python-format
msgid "Request to join %s"
msgstr ""
-#: judge/views/organization.py:180
+#: judge/views/organization.py:179
msgid "Join request detail"
msgstr ""
-#: judge/views/organization.py:208
+#: judge/views/organization.py:207
#, python-format
msgid "Managing join requests for %s"
msgstr ""
-#: judge/views/organization.py:239
+#: judge/views/organization.py:238
#, python-format
msgid "Your organization can only receive %d more members. You cannot approve %d users."
msgstr ""
-#: judge/views/organization.py:251
+#: judge/views/organization.py:250
#, python-format
msgid "Approved %d user."
msgid_plural "Approved %d users."
@@ -2766,7 +2800,7 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-#: judge/views/organization.py:252
+#: judge/views/organization.py:251
#, python-format
msgid "Rejected %d user."
msgid_plural "Rejected %d users."
@@ -2775,85 +2809,99 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-#: judge/views/organization.py:282
+#: judge/views/organization.py:281
#, python-format
msgid "Editing %s"
msgstr ""
-#: judge/views/organization.py:306 judge/views/organization.py:314
+#: judge/views/organization.py:305 judge/views/organization.py:313
msgid "Can't edit organization"
msgstr ""
-#: judge/views/organization.py:307
+#: judge/views/organization.py:306
msgid "You are not allowed to edit this organization."
msgstr ""
-#: judge/views/organization.py:315
+#: judge/views/organization.py:314
msgid "You are not allowed to kick people from this organization."
msgstr ""
-#: judge/views/organization.py:320 judge/views/organization.py:324
+#: judge/views/organization.py:319 judge/views/organization.py:323
msgid "Can't kick user"
msgstr ""
-#: judge/views/organization.py:321
+#: judge/views/organization.py:320
msgid "The user you are trying to kick does not exist!"
msgstr ""
-#: judge/views/organization.py:325
+#: judge/views/organization.py:324
#, python-format
msgid "The user you are trying to kick is not in organization: %s."
msgstr ""
-#: judge/views/problem.py:67
+#: judge/views/problem.py:68
msgid "No such problem"
msgstr ""
-#: judge/views/problem.py:68
+#: judge/views/problem.py:69
#, python-format
msgid "Could not find a problem with the code \"%s\"."
msgstr ""
-#: judge/views/problem.py:110
+#: judge/views/problem.py:111
#, python-brace-format
msgid "Editorial for {0}"
msgstr ""
-#: judge/views/problem.py:113
+#: judge/views/problem.py:114
#, python-brace-format
msgid "Editorial for {0}"
msgstr ""
-#: judge/views/problem.py:283 templates/contest/contest.html:79
+#: judge/views/problem.py:133
+msgid "No such editorial"
+msgstr ""
+
+#: judge/views/problem.py:134
+#, python-format
+msgid "Could not find an editorial with the code \"%s\"."
+msgstr ""
+
+#: judge/views/problem.py:289 templates/contest/contest.html:79
#: templates/user/user-tabs.html:5 templates/user/users-table.html:23
msgid "Problems"
msgstr "Задачи"
-#: judge/views/problem.py:556 judge/views/problem.py:564
+#: judge/views/problem.py:562 judge/views/problem.py:570
#, python-format
msgid "Submit to %s"
msgstr ""
-#: judge/views/problem.py:613
+#: judge/views/problem.py:619
msgid "Banned from submitting"
msgstr ""
-#: judge/views/problem.py:614
+#: judge/views/problem.py:620
msgid "You have been declared persona non grata for this problem. You are permanently barred from submitting this problem."
msgstr ""
-#: judge/views/problem.py:618
+#: judge/views/problem.py:624
msgid "Too many submissions"
msgstr ""
-#: judge/views/problem.py:619
+#: judge/views/problem.py:625
msgid "You have exceeded the submission limit for this problem."
msgstr ""
-#: judge/views/problem.py:681
+#: judge/views/problem.py:693
msgid "Clone Problem"
msgstr ""
+#: judge/views/problem.py:720
+#, python-format
+msgid "Cloned problem from %s"
+msgstr ""
+
#: judge/views/problem_data.py:37
msgid "Checker arguments must be a JSON object"
msgstr ""
@@ -2925,52 +2973,52 @@ msgstr ""
msgid "Best solutions for {0}"
msgstr ""
-#: judge/views/ranked_submission.py:80
+#: judge/views/ranked_submission.py:82
#, python-format
msgid "Best solutions for %(problem)s in %(contest)s"
msgstr ""
-#: judge/views/ranked_submission.py:83
+#: judge/views/ranked_submission.py:85
#, python-format
msgid "Best solutions for problem %(number)s in %(contest)s"
msgstr ""
-#: judge/views/ranked_submission.py:89
+#: judge/views/ranked_submission.py:91
#, python-brace-format
msgid "Best solutions for {0} in {2}"
msgstr ""
-#: judge/views/ranked_submission.py:92
+#: judge/views/ranked_submission.py:94
#, python-brace-format
msgid "Best solutions for problem {0} in {1}"
msgstr ""
-#: judge/views/register.py:27
+#: judge/views/register.py:26
msgid "A username must contain letters, numbers, or underscores"
msgstr ""
-#: judge/views/register.py:31
+#: judge/views/register.py:30
msgid "Preferred language"
msgstr "Предпочитаемый язык"
-#: judge/views/register.py:38
+#: judge/views/register.py:37
msgid "Subscribe to newsletter?"
msgstr ""
-#: judge/views/register.py:45
+#: judge/views/register.py:44
#, python-format
msgid "The email address \"%s\" is already taken. Only one registration is allowed per address."
msgstr ""
-#: judge/views/register.py:51
+#: judge/views/register.py:50
msgid "Your email provider is not allowed due to history of abuse. Please use a reputable email provider."
msgstr ""
-#: judge/views/register.py:57 judge/views/register.py:95
+#: judge/views/register.py:56 judge/views/register.py:94
msgid "Registration"
msgstr "Регистрация"
-#: judge/views/register.py:106
+#: judge/views/register.py:105
msgid "Authentication failure"
msgstr "Ошибка авторизации"
@@ -2978,7 +3026,7 @@ msgstr "Ошибка авторизации"
msgid "Language statistics"
msgstr "Статистика языка"
-#: judge/views/status.py:24 templates/submission/list.html:311
+#: judge/views/status.py:24 templates/submission/list.html:310
msgid "Status"
msgstr "Статус"
@@ -2986,74 +3034,74 @@ msgstr "Статус"
msgid "Version matrix"
msgstr ""
-#: judge/views/submission.py:53 judge/views/submission.py:60
+#: judge/views/submission.py:55 judge/views/submission.py:62
#, python-format
msgid "Submission of %(problem)s by %(user)s"
msgstr ""
-#: judge/views/submission.py:203 judge/views/submission.py:204
+#: judge/views/submission.py:205 judge/views/submission.py:206
#: templates/problem/problem.html:127
msgid "All submissions"
msgstr ""
-#: judge/views/submission.py:349
+#: judge/views/submission.py:355
msgid "All my submissions"
msgstr ""
-#: judge/views/submission.py:350
+#: judge/views/submission.py:356
#, python-format
msgid "All submissions by %s"
msgstr ""
-#: judge/views/submission.py:381
+#: judge/views/submission.py:387
#, python-format
msgid "All submissions for %s"
msgstr ""
-#: judge/views/submission.py:400
+#: judge/views/submission.py:410
msgid "Must pass a problem"
msgstr ""
-#: judge/views/submission.py:439
+#: judge/views/submission.py:449
#, python-format
msgid "My submissions for %(problem)s"
msgstr ""
-#: judge/views/submission.py:440
+#: judge/views/submission.py:450
#, python-format
msgid "%(user)s's submissions for %(problem)s"
msgstr ""
-#: judge/views/submission.py:536
+#: judge/views/submission.py:546
msgid "Must pass a contest"
msgstr ""
-#: judge/views/submission.py:544
+#: judge/views/submission.py:554
#, python-format
msgid "My submissions in %(contest)s"
msgstr ""
-#: judge/views/submission.py:545
+#: judge/views/submission.py:555
#, python-format
msgid "%(user)s's submissions in %(contest)s"
msgstr ""
-#: judge/views/submission.py:559
+#: judge/views/submission.py:569
#, python-brace-format
msgid "My submissions in {0}"
msgstr ""
-#: judge/views/submission.py:561
+#: judge/views/submission.py:571
#, python-brace-format
msgid "{0}'s submissions in {2}"
msgstr ""
-#: judge/views/submission.py:585
+#: judge/views/submission.py:597
#, python-brace-format
msgid "{0}'s submissions for {2} in {4}"
msgstr ""
-#: judge/views/submission.py:590
+#: judge/views/submission.py:602
#, python-brace-format
msgid "{0}'s submissions for problem {2} in {3}"
msgstr ""
@@ -3070,40 +3118,40 @@ msgstr ""
msgid "You must solve at least one problem before you can create a ticket."
msgstr ""
-#: judge/views/ticket.py:87 judge/views/ticket.py:90
+#: judge/views/ticket.py:91 judge/views/ticket.py:94
#, python-format
msgid "New ticket for %s"
msgstr ""
-#: judge/views/ticket.py:144
+#: judge/views/ticket.py:148
#, python-format
msgid "%(title)s - Ticket %(id)d"
msgstr ""
-#: judge/views/ticket.py:249
+#: judge/views/ticket.py:253
#, python-format
msgid "Tickets - Page %(number)d of %(total)d"
msgstr ""
-#: judge/views/ticket.py:298
+#: judge/views/ticket.py:302
#, python-format
msgid "New Ticket: %s"
msgstr ""
-#: judge/views/ticket.py:299
+#: judge/views/ticket.py:303
#, python-format
msgid "#%(id)d, assigned to: %(users)s"
msgstr ""
-#: judge/views/ticket.py:301
+#: judge/views/ticket.py:305
msgid ", "
msgstr ""
-#: judge/views/ticket.py:301
+#: judge/views/ticket.py:305
msgid "no one"
msgstr ""
-#: judge/views/ticket.py:321
+#: judge/views/ticket.py:325
#, python-format
msgid "New Ticket Message For: %s"
msgstr ""
@@ -3112,87 +3160,91 @@ msgstr ""
msgid "Enable Two-factor Authentication"
msgstr ""
-#: judge/views/two_factor.py:99
+#: judge/views/two_factor.py:108
+msgid "Refresh Two-factor Authentication"
+msgstr ""
+
+#: judge/views/two_factor.py:116
msgid "Disable Two-factor Authentication"
msgstr ""
-#: judge/views/two_factor.py:148
+#: judge/views/two_factor.py:165
msgid "Invalid WebAuthn response"
msgstr ""
-#: judge/views/two_factor.py:151
+#: judge/views/two_factor.py:168
msgid "Invalid name"
msgstr ""
-#: judge/views/two_factor.py:204
+#: judge/views/two_factor.py:221
msgid "Staff may not disable 2FA"
msgstr ""
-#: judge/views/two_factor.py:216
+#: judge/views/two_factor.py:229
msgid "Perform Two-factor Authentication"
msgstr ""
-#: judge/views/user.py:79
+#: judge/views/user.py:78
msgid "No such user"
msgstr ""
-#: judge/views/user.py:79
+#: judge/views/user.py:78
#, python-format
msgid "No user handle \"%s\"."
msgstr ""
-#: judge/views/user.py:83
+#: judge/views/user.py:82
msgid "My account"
msgstr ""
-#: judge/views/user.py:84
+#: judge/views/user.py:83
#, python-format
msgid "User %s"
msgstr "Пользователь %s"
-#: judge/views/user.py:132
+#: judge/views/user.py:131
msgid "Login"
msgstr "Войти"
-#: judge/views/user.py:173
+#: judge/views/user.py:172
msgid "M j, Y, G:i"
msgstr ""
-#: judge/views/user.py:307
+#: judge/views/user.py:306
msgid "Preparing your data..."
msgstr ""
-#: judge/views/user.py:311 templates/user/edit-profile.html:348
+#: judge/views/user.py:310 templates/user/edit-profile.html:352
msgid "Download your data"
msgstr ""
-#: judge/views/user.py:367
+#: judge/views/user.py:366
msgid "Updated on site"
msgstr ""
-#: judge/views/user.py:400 templates/admin/auth/user/change_form.html:14
+#: judge/views/user.py:399 templates/admin/auth/user/change_form.html:14
#: templates/admin/auth/user/change_form.html:17 templates/base.html:222
#: templates/user/user-tabs.html:16
msgid "Edit profile"
msgstr ""
-#: judge/views/user.py:415
+#: judge/views/user.py:414
msgid "Generated API token for user"
msgstr ""
-#: judge/views/user.py:427
+#: judge/views/user.py:426
msgid "Removed API token for user"
msgstr ""
-#: judge/views/user.py:437
+#: judge/views/user.py:436
msgid "Generated scratch codes for user"
msgstr ""
-#: judge/views/user.py:443 templates/user/user-list-tabs.html:4
+#: judge/views/user.py:442 templates/user/user-list-tabs.html:4
msgid "Leaderboard"
msgstr ""
-#: judge/views/user.py:504
+#: judge/views/user.py:503
msgid "You have been successfully logged out."
msgstr ""
@@ -3317,11 +3369,11 @@ msgstr "Новости"
msgid "posted on {time}"
msgstr ""
-#: templates/blog/list.html:130 templates/problem/problem.html:309
+#: templates/blog/list.html:130 templates/problem/problem.html:311
msgid "Clarifications"
msgstr ""
-#: templates/blog/list.html:146 templates/problem/problem.html:320
+#: templates/blog/list.html:146 templates/problem/problem.html:322
msgid "No clarifications have been made at this time."
msgstr ""
@@ -3514,7 +3566,7 @@ msgid "Info"
msgstr ""
#: templates/contest/contest-tabs.html:6 templates/stats/base.html:9
-#: templates/submission/list.html:337
+#: templates/submission/list.html:336
msgid "Statistics"
msgstr "Статистика"
@@ -3717,19 +3769,19 @@ msgstr ""
msgid "Disqualify"
msgstr ""
-#: templates/contest/ranking.html:169
+#: templates/contest/ranking.html:173
msgid "Are you sure you want to disqualify this participation?"
msgstr ""
-#: templates/contest/ranking.html:174
+#: templates/contest/ranking.html:178
msgid "Are you sure you want to un-disqualify this participation?"
msgstr ""
-#: templates/contest/ranking.html:246
+#: templates/contest/ranking.html:250
msgid "View user participation"
msgstr ""
-#: templates/contest/ranking.html:250
+#: templates/contest/ranking.html:254
msgid "Show organizations"
msgstr ""
@@ -4004,7 +4056,7 @@ msgstr ""
msgid "Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence."
msgstr ""
-#: templates/problem/editorial.html:27 templates/problem/problem.html:209
+#: templates/problem/editorial.html:27 templates/problem/problem.html:210
msgid "Author:"
msgid_plural "Authors:"
msgstr[0] ""
@@ -4175,7 +4227,7 @@ msgstr ""
msgid "Memory limit:"
msgstr ""
-#: templates/problem/problem.html:224
+#: templates/problem/problem.html:226
msgid "Problem type"
msgid_plural "Problem types"
msgstr[0] ""
@@ -4183,16 +4235,16 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-#: templates/problem/problem.html:237
+#: templates/problem/problem.html:239
msgid "Allowed languages"
msgstr ""
-#: templates/problem/problem.html:245
+#: templates/problem/problem.html:247
#, python-format
msgid "No %(lang)s judge online"
msgstr ""
-#: templates/problem/problem.html:256
+#: templates/problem/problem.html:258
msgid "Judge:"
msgid_plural "Judges:"
msgstr[0] ""
@@ -4200,15 +4252,15 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-#: templates/problem/problem.html:273
+#: templates/problem/problem.html:275
msgid "none available"
msgstr ""
-#: templates/problem/problem.html:298
+#: templates/problem/problem.html:300
msgid "Request clarification"
msgstr ""
-#: templates/problem/problem.html:300
+#: templates/problem/problem.html:302
msgid "Report an issue"
msgstr ""
@@ -4253,7 +4305,7 @@ msgstr ""
msgid "Point range"
msgstr ""
-#: templates/problem/search-form.html:63 templates/submission/list.html:329
+#: templates/problem/search-form.html:63 templates/submission/list.html:328
#: templates/ticket/list.html:248
msgid "Go"
msgstr ""
@@ -4302,7 +4354,7 @@ msgid "Invalid username or password."
msgstr ""
#: templates/registration/login.html:53
-#: templates/registration/two_factor_auth.html:86
+#: templates/registration/two_factor_auth.html:92
msgid "Login!"
msgstr "Войти!"
@@ -4422,12 +4474,12 @@ msgid "Default language"
msgstr ""
#: templates/registration/registration_form.html:184
-#: templates/user/edit-profile.html:310
+#: templates/user/edit-profile.html:314
msgid "Affiliated organizations"
msgstr ""
#: templates/registration/registration_form.html:190
-#: templates/user/edit-profile.html:324
+#: templates/user/edit-profile.html:328
msgid "Notify me about upcoming contests"
msgstr "Уведомлять меня о предстоящих соревнованиях"
@@ -4443,57 +4495,93 @@ msgstr "Условия использования"
msgid "Register!"
msgstr "Зарегистрироваться!"
-#: templates/registration/totp_disable.html:38
+#: templates/registration/totp_disable.html:31
msgid "To protect your account, you must first authenticate before you can disable Two Factor Authentication."
msgstr ""
-#: templates/registration/totp_disable.html:45
+#: templates/registration/totp_disable.html:38
msgid "Enter the 6-digit code generated by your app or one of your 16-digit scratch codes:"
msgstr ""
-#: templates/registration/totp_disable.html:48
+#: templates/registration/totp_disable.html:41
msgid "Disable Two Factor Authentication"
msgstr ""
-#: templates/registration/totp_enable.html:75
+#: templates/registration/totp_enable.html:72
msgid "Scan this code with your authenticator app:"
msgstr ""
-#: templates/registration/totp_enable.html:76
+#: templates/registration/totp_enable.html:73
msgid "QR code"
msgstr ""
-#: templates/registration/totp_enable.html:77
+#: templates/registration/totp_enable.html:74
msgid "Or enter this code manually:"
msgstr ""
-#: templates/registration/totp_enable.html:88
+#: templates/registration/totp_enable.html:85
msgid "Enter the 6-digit code generated by your app:"
msgstr ""
-#: templates/registration/totp_enable.html:91
+#: templates/registration/totp_enable.html:90
+msgid "Refresh Two Factor Authentication"
+msgstr ""
+
+#: templates/registration/totp_enable.html:92
msgid "Enable Two Factor Authentication"
msgstr ""
+#: templates/registration/totp_enable.html:98
+msgid "Below is a list of one-time use scratch codes."
+msgstr ""
+
+#: templates/registration/totp_enable.html:99
+msgid "These codes can only be used once and are for emergency use."
+msgstr ""
+
+#: templates/registration/totp_enable.html:100
+msgid "You can use these codes to login to your account or disable two-factor authentication."
+msgstr ""
+
+#: templates/registration/totp_enable.html:101
+msgid "If you ever need more scratch codes, you can regenerate them on the edit profile tab."
+msgstr ""
+
+#: templates/registration/totp_enable.html:102
+msgid "Please write these down and keep them in a secure location."
+msgstr ""
+
+#: templates/registration/totp_enable.html:103
+msgid "These codes will never be shown again after you enable two-factor authentication."
+msgstr ""
+
#: templates/registration/two_factor_auth.html:33
-#: templates/user/edit-profile.html:161
+#: templates/user/edit-profile.html:165
msgid "WebAuthn is not supported by your browser."
msgstr ""
#: templates/registration/two_factor_auth.html:54
-#: templates/user/edit-profile.html:185
+#: templates/user/edit-profile.html:189
msgid "Failed to contact server."
msgstr ""
-#: templates/registration/two_factor_auth.html:77
+#: templates/registration/two_factor_auth.html:79
msgid "Enter the 6-digit code generated by your app or one of your 16-character scratch codes:"
msgstr ""
-#: templates/registration/two_factor_auth.html:83
-msgid "Use security key"
+#: templates/registration/two_factor_auth.html:81
+msgid "Enter one of your 16-character scratch codes:"
msgstr ""
#: templates/registration/two_factor_auth.html:89
+msgid "Use security key"
+msgstr ""
+
+#: templates/registration/two_factor_auth.html:94
+msgid "Use scratch code"
+msgstr ""
+
+#: templates/registration/two_factor_auth.html:97
#, python-format
msgid "If you lost your authentication device and are unable to use your scratch codes, please contact us at %(email)s."
msgstr ""
@@ -4574,15 +4662,15 @@ msgstr ""
msgid "Filter by language..."
msgstr ""
-#: templates/submission/list.html:307
+#: templates/submission/list.html:306
msgid "Filter submissions"
msgstr ""
-#: templates/submission/list.html:343
+#: templates/submission/list.html:342
msgid "Total:"
msgstr ""
-#: templates/submission/list.html:353
+#: templates/submission/list.html:352
msgid "You were disconnected. Refresh to show latest updates."
msgstr ""
@@ -4800,121 +4888,125 @@ msgstr ""
msgid "Search by handle..."
msgstr ""
-#: templates/user/edit-profile.html:109
+#: templates/user/edit-profile.html:113
msgid "Are you sure you want to generate or regenerate your API token?"
msgstr ""
-#: templates/user/edit-profile.html:110
+#: templates/user/edit-profile.html:114
msgid "This will invalidate any previous API tokens."
msgstr ""
-#: templates/user/edit-profile.html:111
+#: templates/user/edit-profile.html:115
msgid "It also allows access to your account without Two-factor Authentication."
msgstr ""
-#: templates/user/edit-profile.html:112
+#: templates/user/edit-profile.html:116
msgid "You will not be able to view your api token after you leave this page!"
msgstr ""
-#: templates/user/edit-profile.html:113 templates/user/edit-profile.html:207
+#: templates/user/edit-profile.html:117 templates/user/edit-profile.html:211
msgid "Generating..."
msgstr ""
-#: templates/user/edit-profile.html:121 templates/user/edit-profile.html:243
-#: templates/user/edit-profile.html:371 templates/user/edit-profile.html:390
+#: templates/user/edit-profile.html:125 templates/user/edit-profile.html:247
+#: templates/user/edit-profile.html:373 templates/user/edit-profile.html:395
msgid "Regenerate"
msgstr ""
-#: templates/user/edit-profile.html:127 templates/user/edit-profile.html:392
+#: templates/user/edit-profile.html:131 templates/user/edit-profile.html:397
msgid "Remove"
msgstr ""
-#: templates/user/edit-profile.html:137
+#: templates/user/edit-profile.html:141
msgid "Are you sure you want to remove your API token?"
msgstr ""
-#: templates/user/edit-profile.html:144 templates/user/edit-profile.html:375
-#: templates/user/edit-profile.html:396
+#: templates/user/edit-profile.html:148 templates/user/edit-profile.html:377
+#: templates/user/edit-profile.html:401
msgid "Generate"
msgstr ""
-#: templates/user/edit-profile.html:190
+#: templates/user/edit-profile.html:194
msgid "Are you sure you want to delete this security key?"
msgstr ""
-#: templates/user/edit-profile.html:280
+#: templates/user/edit-profile.html:284
msgid "Self-description"
msgstr ""
-#: templates/user/edit-profile.html:287
+#: templates/user/edit-profile.html:291
msgid "Select your closest major city"
msgstr ""
-#: templates/user/edit-profile.html:296
+#: templates/user/edit-profile.html:300
msgid "Editor theme"
msgstr ""
-#: templates/user/edit-profile.html:301
+#: templates/user/edit-profile.html:305
msgid "Math engine"
msgstr ""
-#: templates/user/edit-profile.html:335 templates/user/edit-profile.html:337
+#: templates/user/edit-profile.html:339 templates/user/edit-profile.html:341
msgid "Change your avatar"
msgstr ""
-#: templates/user/edit-profile.html:342
+#: templates/user/edit-profile.html:346
msgid "Change your password"
msgstr ""
-#: templates/user/edit-profile.html:356
+#: templates/user/edit-profile.html:359
msgid "Two-factor Authentication is enabled"
msgstr ""
-#: templates/user/edit-profile.html:358
-msgid "Two-factor Authentication is disabled"
+#: templates/user/edit-profile.html:362 templates/user/edit-profile.html:365
+msgid "Disable"
msgstr ""
-#: templates/user/edit-profile.html:363 templates/user/edit-profile.html:365
-msgid "Disable"
+#: templates/user/edit-profile.html:367
+msgid "Refresh"
msgstr ""
-#: templates/user/edit-profile.html:368
+#: templates/user/edit-profile.html:370
msgid "Scratch Codes:"
msgstr ""
-#: templates/user/edit-profile.html:372 templates/user/edit-profile.html:393
+#: templates/user/edit-profile.html:374 templates/user/edit-profile.html:398
msgid "Hidden"
msgstr ""
-#: templates/user/edit-profile.html:381
+#: templates/user/edit-profile.html:384
+msgid "Two-factor Authentication is disabled"
+msgstr ""
+
+#: templates/user/edit-profile.html:385
msgid "Enable"
msgstr ""
-#: templates/user/edit-profile.html:387
+#: templates/user/edit-profile.html:392
msgid "API Token"
msgstr ""
-#: templates/user/edit-profile.html:404
+#: templates/user/edit-profile.html:409
msgid "Security keys"
msgstr ""
-#: templates/user/edit-profile.html:414
+#: templates/user/edit-profile.html:419
msgid "Delete"
msgstr ""
-#: templates/user/edit-profile.html:421
+#: templates/user/edit-profile.html:426
msgid "Enter a name for this key"
msgstr ""
-#: templates/user/edit-profile.html:422
+#: templates/user/edit-profile.html:427
msgid "Add"
msgstr ""
-#: templates/user/edit-profile.html:430
+#: templates/user/edit-profile.html:435
msgid "User-script"
msgstr ""
-#: templates/user/edit-profile.html:434
+#: templates/user/edit-profile.html:439
msgid "Update profile"
msgstr ""
diff --git a/locale/ru/LC_MESSAGES/djangojs.po b/locale/ru/LC_MESSAGES/djangojs.po
index 5c5d7c5a9e..f0d12590f1 100644
--- a/locale/ru/LC_MESSAGES/djangojs.po
+++ b/locale/ru/LC_MESSAGES/djangojs.po
@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: dmoj\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-10-01 23:12+0000\n"
-"PO-Revision-Date: 2021-04-25 00:08\n"
+"PO-Revision-Date: 2021-07-23 00:29\n"
"Last-Translator: \n"
"Language-Team: Russian\n"
"Language: ru_RU\n"
diff --git a/locale/sr_Latn/LC_MESSAGES/django.po b/locale/sr_Latn/LC_MESSAGES/django.po
index e238d8ba29..cf36d74fad 100644
--- a/locale/sr_Latn/LC_MESSAGES/django.po
+++ b/locale/sr_Latn/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: dmoj\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-24 19:15+0000\n"
-"PO-Revision-Date: 2021-04-25 00:08\n"
+"POT-Creation-Date: 2021-06-17 01:38+0000\n"
+"PO-Revision-Date: 2021-07-23 00:29\n"
"Last-Translator: \n"
"Language-Team: Serbian (Latin)\n"
"Language: sr_CS\n"
@@ -17,77 +17,77 @@ msgstr ""
"X-Crowdin-File: django.po\n"
"X-Crowdin-File-ID: 10\n"
-#: dmoj/settings.py:364
+#: dmoj/settings.py:365
msgid "Catalan"
-msgstr ""
+msgstr "Katalonski"
-#: dmoj/settings.py:365
+#: dmoj/settings.py:366
msgid "German"
-msgstr ""
+msgstr "Nemački"
-#: dmoj/settings.py:366
+#: dmoj/settings.py:367
msgid "English"
-msgstr ""
+msgstr "Engleski"
-#: dmoj/settings.py:367
+#: dmoj/settings.py:368
msgid "Spanish"
-msgstr ""
+msgstr "Španski"
-#: dmoj/settings.py:368
+#: dmoj/settings.py:369
msgid "French"
-msgstr ""
+msgstr "Francuski"
-#: dmoj/settings.py:369
+#: dmoj/settings.py:370
msgid "Croatian"
-msgstr ""
+msgstr "Hrvatski"
-#: dmoj/settings.py:370
+#: dmoj/settings.py:371
msgid "Hungarian"
-msgstr ""
+msgstr "Mađarski"
-#: dmoj/settings.py:371
+#: dmoj/settings.py:372
msgid "Japanese"
-msgstr ""
+msgstr "Japanski"
-#: dmoj/settings.py:372
+#: dmoj/settings.py:373
msgid "Korean"
-msgstr ""
+msgstr "Korejski"
-#: dmoj/settings.py:373
+#: dmoj/settings.py:374
msgid "Brazilian Portuguese"
-msgstr ""
+msgstr "Brazilski Portugalski"
-#: dmoj/settings.py:374
+#: dmoj/settings.py:375
msgid "Romanian"
-msgstr ""
+msgstr "Rumunski"
-#: dmoj/settings.py:375
+#: dmoj/settings.py:376
msgid "Russian"
-msgstr ""
+msgstr "Ruski"
-#: dmoj/settings.py:376
+#: dmoj/settings.py:377
msgid "Serbian (Latin)"
-msgstr ""
+msgstr "Srpski (Latinica)"
-#: dmoj/settings.py:377
+#: dmoj/settings.py:378
msgid "Turkish"
-msgstr ""
+msgstr "Turski"
-#: dmoj/settings.py:378
+#: dmoj/settings.py:379
msgid "Vietnamese"
-msgstr ""
+msgstr "Vijetnamski"
-#: dmoj/settings.py:379
+#: dmoj/settings.py:380
msgid "Simplified Chinese"
-msgstr ""
+msgstr "Pojednostavljeni Kineski"
-#: dmoj/settings.py:380
+#: dmoj/settings.py:381
msgid "Traditional Chinese"
-msgstr ""
+msgstr "Klasični kinezki"
-#: dmoj/urls.py:103 templates/base.html:190
+#: dmoj/urls.py:104 templates/base.html:190
msgid "Home"
-msgstr ""
+msgstr "Naslovna Strana"
#: judge/admin/comments.py:40
#, python-format
@@ -99,64 +99,64 @@ msgstr[2] ""
#: judge/admin/comments.py:43
msgid "Hide comments"
-msgstr ""
+msgstr "Sakrij komentar"
#: judge/admin/comments.py:47
#, python-format
msgid "%d comment successfully unhidden."
msgid_plural "%d comments successfully unhidden."
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "%d Komentar dostupan."
+msgstr[1] "%d Komentara dostupan."
+msgstr[2] "%d Komentari dostupan."
#: judge/admin/comments.py:50
msgid "Unhide comments"
-msgstr ""
+msgstr "prikaži komentare"
#: judge/admin/comments.py:58
msgid "Associated page"
-msgstr ""
+msgstr "Asocirana stranica"
-#: judge/admin/contest.py:31
+#: judge/admin/contest.py:32
msgid "Included contests"
-msgstr ""
+msgstr "Uključena takmičenja"
-#: judge/admin/contest.py:65 templates/contest/contest.html:83
+#: judge/admin/contest.py:66 templates/contest/contest.html:83
#: templates/contest/moss.html:43 templates/problem/list.html:204
#: templates/problem/list.html:219 templates/user/user-problems.html:58
#: templates/user/user-problems.html:100
msgid "Problem"
-msgstr ""
+msgstr "Zadatak"
-#: judge/admin/contest.py:114
+#: judge/admin/contest.py:117
msgid "Settings"
-msgstr ""
+msgstr "Podešavanja"
-#: judge/admin/contest.py:116
+#: judge/admin/contest.py:120
msgid "Scheduling"
-msgstr ""
+msgstr "zakazivanje"
-#: judge/admin/contest.py:117
+#: judge/admin/contest.py:121
msgid "Details"
-msgstr ""
+msgstr "Detalji"
-#: judge/admin/contest.py:118
+#: judge/admin/contest.py:122
msgid "Format"
-msgstr ""
+msgstr "Format"
-#: judge/admin/contest.py:119 templates/contest/ranking-table.html:5
+#: judge/admin/contest.py:123 templates/contest/ranking-table.html:5
msgid "Rating"
-msgstr ""
+msgstr "Rangiranje"
-#: judge/admin/contest.py:120
+#: judge/admin/contest.py:124
msgid "Access"
-msgstr ""
+msgstr "Pristup"
-#: judge/admin/contest.py:122 judge/admin/problem.py:134
+#: judge/admin/contest.py:126 judge/admin/problem.py:135
msgid "Justice"
-msgstr ""
+msgstr "Pravda"
-#: judge/admin/contest.py:211
+#: judge/admin/contest.py:215
#, python-format
msgid "%d contest successfully marked as visible."
msgid_plural "%d contests successfully marked as visible."
@@ -164,47 +164,47 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-#: judge/admin/contest.py:214
+#: judge/admin/contest.py:218
msgid "Mark contests as visible"
-msgstr ""
+msgstr "Označi takmičenje kao vidljivo"
-#: judge/admin/contest.py:220
+#: judge/admin/contest.py:224
#, python-format
msgid "%d contest successfully marked as hidden."
msgid_plural "%d contests successfully marked as hidden."
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "%d Takmičenje je uspešno označeno kao nevidljivo."
+msgstr[1] "%d Takmičenja je uspešno označeno kao nevidljivo."
+msgstr[2] "%d Takmičenja je uspešno označeno kao nevidljivo."
-#: judge/admin/contest.py:223
+#: judge/admin/contest.py:227
msgid "Mark contests as hidden"
-msgstr ""
+msgstr "Označi takmičenje kao nevidljivo"
-#: judge/admin/contest.py:229
+#: judge/admin/contest.py:233
#, python-format
msgid "%d contest successfully locked."
msgid_plural "%d contests successfully locked."
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "%d Takmičenje uspešno zaključeno."
+msgstr[1] "%d Takmičenja uspešno zaključeno."
+msgstr[2] "%d Takmičenja uspešno zaključeno."
-#: judge/admin/contest.py:232
+#: judge/admin/contest.py:236
msgid "Lock contest submissions"
msgstr ""
-#: judge/admin/contest.py:238
+#: judge/admin/contest.py:242
#, python-format
msgid "%d contest successfully unlocked."
msgid_plural "%d contests successfully unlocked."
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "%d Takmičenje uspešno odključeno."
+msgstr[1] "%d Takmičenja uspešno odključeno."
+msgstr[2] "%d Takmičenja uspešno odključeno."
-#: judge/admin/contest.py:241
+#: judge/admin/contest.py:245
msgid "Unlock contest submissions"
msgstr ""
-#: judge/admin/contest.py:262 judge/admin/submission.py:170
+#: judge/admin/contest.py:266 judge/admin/submission.py:170
#, python-format
msgid "%d submission was successfully scheduled for rejudging."
msgid_plural "%d submissions were successfully scheduled for rejudging."
@@ -212,7 +212,7 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-#: judge/admin/contest.py:337
+#: judge/admin/contest.py:341
#, python-format
msgid "%d participation recalculated."
msgid_plural "%d participations recalculated."
@@ -220,17 +220,17 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-#: judge/admin/contest.py:340
+#: judge/admin/contest.py:344
msgid "Recalculate results"
-msgstr ""
+msgstr "Preračunati resultate"
-#: judge/admin/contest.py:344 judge/admin/organization.py:63
+#: judge/admin/contest.py:348 judge/admin/organization.py:63
msgid "username"
-msgstr ""
+msgstr "korisničko ime"
-#: judge/admin/contest.py:349 templates/base.html:258
+#: judge/admin/contest.py:353 templates/base.html:258
msgid "virtual"
-msgstr ""
+msgstr "virtualno"
#: judge/admin/interface.py:29 judge/models/interface.py:46
msgid "link path"
@@ -238,65 +238,65 @@ msgstr ""
#: judge/admin/interface.py:72
msgid "Content"
-msgstr ""
+msgstr "Sadržaj"
#: judge/admin/interface.py:73
msgid "Summary"
msgstr ""
-#: judge/admin/interface.py:113 judge/models/contest.py:383
-#: judge/models/contest.py:509 judge/models/profile.py:244
-#: judge/models/profile.py:268
+#: judge/admin/interface.py:113 judge/models/contest.py:419
+#: judge/models/contest.py:546 judge/models/profile.py:261
+#: judge/models/profile.py:292
msgid "user"
-msgstr ""
+msgstr "korisnik"
#: judge/admin/interface.py:154
msgid "object"
-msgstr ""
+msgstr "objekat"
-#: judge/admin/organization.py:32 judge/admin/problem.py:181
-#: judge/admin/profile.py:82
+#: judge/admin/organization.py:32 judge/admin/problem.py:182
+#: judge/admin/profile.py:92
msgid "View on site"
msgstr ""
#: judge/admin/problem.py:29
msgid "Describe the changes you made (optional)"
-msgstr ""
+msgstr "Opišite promene koje ste napravili (neobavezno)"
-#: judge/admin/problem.py:129
+#: judge/admin/problem.py:130
msgid "Social Media"
-msgstr ""
+msgstr "Social Media"
-#: judge/admin/problem.py:130
+#: judge/admin/problem.py:131
msgid "Taxonomy"
msgstr ""
-#: judge/admin/problem.py:131 templates/contest/contest.html:84
+#: judge/admin/problem.py:132 templates/contest/contest.html:84
#: templates/problem/data.html:385 templates/problem/list.html:209
#: templates/problem/list.html:230 templates/user/base-users-table.html:10
#: templates/user/user-problems.html:60
msgid "Points"
-msgstr ""
+msgstr "Poeni"
-#: judge/admin/problem.py:132
+#: judge/admin/problem.py:133
msgid "Limits"
-msgstr ""
+msgstr "Granice"
-#: judge/admin/problem.py:133 judge/admin/submission.py:238
-#: templates/stats/base.html:14 templates/submission/list.html:320
-#: templates/user/edit-profile.html:292
+#: judge/admin/problem.py:134 judge/admin/submission.py:238
+#: templates/stats/base.html:14 templates/submission/list.html:319
+#: templates/user/edit-profile.html:296
msgid "Language"
-msgstr ""
+msgstr "Jezik"
-#: judge/admin/problem.py:135
+#: judge/admin/problem.py:136
msgid "History"
-msgstr ""
+msgstr "Istorija"
-#: judge/admin/problem.py:178
+#: judge/admin/problem.py:179
msgid "Authors"
-msgstr ""
+msgstr "Autori"
-#: judge/admin/problem.py:191
+#: judge/admin/problem.py:192
#, python-format
msgid "%d problem's publish date successfully updated."
msgid_plural "%d problems' publish date successfully updated."
@@ -304,60 +304,60 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-#: judge/admin/problem.py:195
+#: judge/admin/problem.py:196
msgid "Set publish date to now"
-msgstr ""
+msgstr "Podesi datum objavljivanja na danas"
-#: judge/admin/problem.py:201
+#: judge/admin/problem.py:202
#, python-format
msgid "%d problem successfully marked as public."
msgid_plural "%d problems successfully marked as public."
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "%d zadatak je uspešno označen kao javni."
+msgstr[1] "%d zadatka je uspešno označen kao javni."
+msgstr[2] "%d zadataka je uspešno označen kao javni."
-#: judge/admin/problem.py:205
+#: judge/admin/problem.py:206
msgid "Mark problems as public"
msgstr ""
-#: judge/admin/problem.py:211
+#: judge/admin/problem.py:212
#, python-format
msgid "%d problem successfully marked as private."
msgid_plural "%d problems successfully marked as private."
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "%d zadatak je uspešno označen kao privatni."
+msgstr[1] "%d zadatka je uspešno označen kao privatni."
+msgstr[2] "%d zadataka je uspešno označen kao privatni."
-#: judge/admin/problem.py:215
+#: judge/admin/problem.py:216
msgid "Mark problems as private"
msgstr ""
#: judge/admin/profile.py:35
msgid "timezone"
-msgstr ""
+msgstr "vremenska zona"
-#: judge/admin/profile.py:88 judge/admin/submission.py:217
+#: judge/admin/profile.py:98 judge/admin/submission.py:217
#: templates/organization/requests/log.html:9
#: templates/organization/requests/pending.html:12
#: templates/ticket/list.html:261
msgid "User"
-msgstr ""
+msgstr "Korisnik"
-#: judge/admin/profile.py:93 templates/registration/registration_form.html:143
+#: judge/admin/profile.py:103 templates/registration/registration_form.html:143
msgid "Email"
-msgstr ""
+msgstr "Email"
-#: judge/admin/profile.py:98 judge/views/register.py:29
+#: judge/admin/profile.py:108 judge/views/register.py:28
#: templates/registration/registration_form.html:171
-#: templates/user/edit-profile.html:288
+#: templates/user/edit-profile.html:292
msgid "Timezone"
-msgstr ""
+msgstr "Vremenska zona"
-#: judge/admin/profile.py:103
+#: judge/admin/profile.py:113
msgid "date joined"
-msgstr ""
+msgstr "datum pridruženja"
-#: judge/admin/profile.py:110
+#: judge/admin/profile.py:120
#, python-format
msgid "%d user have scores recalculated."
msgid_plural "%d users have scores recalculated."
@@ -365,13 +365,13 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-#: judge/admin/profile.py:113
+#: judge/admin/profile.py:123
msgid "Recalculate scores"
msgstr ""
#: judge/admin/runtime.py:19
msgid "Disallowed problems"
-msgstr ""
+msgstr "Nedozvoljeni zadatak"
#: judge/admin/runtime.py:22
msgid "These problems are NOT allowed to be submitted in this language"
@@ -379,38 +379,38 @@ msgstr ""
#: judge/admin/runtime.py:80
msgid "Description"
-msgstr ""
+msgstr "Opis"
#: judge/admin/runtime.py:81
msgid "Information"
-msgstr ""
+msgstr "Informacija"
#: judge/admin/runtime.py:82
msgid "Capabilities"
-msgstr ""
+msgstr "Sposobnosti"
#: judge/admin/submission.py:23 judge/admin/submission.py:42
#: judge/admin/submission.py:227
msgid "None"
-msgstr ""
+msgstr "Nijedan"
#: judge/admin/submission.py:23
msgid "Not done"
-msgstr ""
+msgstr "Nije urađeno"
#: judge/admin/submission.py:23
msgid "Exceptional"
-msgstr ""
+msgstr "Izuzetno"
#: judge/admin/submission.py:42
msgid "Unaccepted"
-msgstr ""
+msgstr "Nije prihvaćeno"
#: judge/admin/submission.py:89
#, python-format
msgctxt "contest problem"
msgid "%(problem)s in %(contest)s"
-msgstr ""
+msgstr "%(problem)s u %(contest)s"
#: judge/admin/submission.py:155 judge/admin/submission.py:177
msgid "You do not have the permission to rejudge submissions."
@@ -438,46 +438,46 @@ msgstr ""
#: judge/admin/submission.py:206
msgid "Problem code"
-msgstr ""
+msgstr "Kod zadatka"
#: judge/admin/submission.py:211
msgid "Problem name"
-msgstr ""
+msgstr "Ime zadatka"
#: judge/admin/submission.py:221 templates/organization/requests/log.html:10
#: templates/organization/requests/pending.html:13
msgid "Time"
-msgstr ""
+msgstr "Vreme"
#: judge/admin/submission.py:229
#, python-format
msgid "%d KB"
-msgstr ""
+msgstr "%d KB"
#: judge/admin/submission.py:231
#, python-format
msgid "%.2f MB"
-msgstr ""
+msgstr "%.2f MB"
#: judge/admin/submission.py:233
msgid "Memory"
-msgstr ""
+msgstr "Memorija"
#: judge/admin/taxon.py:11 judge/admin/taxon.py:34
msgid "Included problems"
-msgstr ""
+msgstr "Uključeni zadaci"
#: judge/admin/taxon.py:14
msgid "These problems are included in this group of problems"
-msgstr ""
+msgstr "Ovi zadaci su uključeni u ovu grupu zadataka"
#: judge/admin/taxon.py:37
msgid "These problems are included in this type of problems"
-msgstr ""
+msgstr "Ovi zadaci su uključeni u ovaj tip zadataka"
#: judge/apps.py:8
msgid "Online Judge"
-msgstr ""
+msgstr "Online sudija"
#: judge/comments.py:41
msgid "Comment body"
@@ -493,143 +493,144 @@ msgstr ""
#: judge/comments.py:93
msgid "Posted comment"
-msgstr ""
+msgstr "Komentar ostavljen"
#: judge/contest_format/atcoder.py:19
msgid "AtCoder"
-msgstr ""
+msgstr "AtCoder"
#: judge/contest_format/default.py:18
msgid "Default"
-msgstr ""
+msgstr "Default"
#: judge/contest_format/ecoo.py:18
msgid "ECOO"
-msgstr ""
+msgstr "ECOO"
#: judge/contest_format/icpc.py:19
msgid "ICPC"
-msgstr ""
+msgstr "ICPC"
#: judge/contest_format/ioi.py:11
msgid "IOI"
-msgstr ""
+msgstr "IOI"
#: judge/contest_format/legacy_ioi.py:18
msgid "IOI (pre-2016)"
-msgstr ""
+msgstr "IOI (pre-2016)"
-#: judge/forms.py:26
-msgid "Two-factor authentication tokens must be 6 decimal digits."
+#: judge/forms.py:27
+#, python-brace-format
+msgid "Two-factor authentication tokens must be {TOTP_CODE_LENGTH} decimal digits."
msgstr ""
-#: judge/forms.py:29
+#: judge/forms.py:30
msgid "Invalid two-factor authentication token."
msgstr ""
-#: judge/forms.py:32
+#: judge/forms.py:33
msgid "Scratch codes must be 16 base32 characters."
msgstr ""
-#: judge/forms.py:34
+#: judge/forms.py:35 judge/forms.py:264
msgid "Invalid scratch code."
-msgstr ""
+msgstr "Nevažeći scratch kod."
-#: judge/forms.py:45
+#: judge/forms.py:46
msgid "Subscribe to contest updates"
msgstr ""
-#: judge/forms.py:46
+#: judge/forms.py:47
msgid "Enable experimental features"
-msgstr ""
+msgstr "Dozvolite eksperimentalne karakteristike"
-#: judge/forms.py:71
+#: judge/forms.py:72
msgid "You must solve at least one problem before you can update your profile."
-msgstr ""
+msgstr "Morate rešiti barem jedan zadatak pre nego što možete da ažurirate svoj profil."
-#: judge/forms.py:80 judge/views/organization.py:127
+#: judge/forms.py:81 judge/views/organization.py:126
#, python-brace-format
msgid "You may not be part of more than {count} public organizations."
-msgstr ""
+msgstr "Nemožete biti član više od {count} javne organizacije."
-#: judge/forms.py:96
+#: judge/forms.py:97
msgid "Download comments?"
-msgstr ""
+msgstr "Download komentare?"
-#: judge/forms.py:97
+#: judge/forms.py:98
msgid "Download submissions?"
-msgstr ""
+msgstr "Download rešenja?"
-#: judge/forms.py:98
+#: judge/forms.py:99
msgid "Filter by problem code glob:"
-msgstr ""
+msgstr "Sortiraj po glob kodu zadatka:"
-#: judge/forms.py:102
+#: judge/forms.py:103
msgid "Leave empty to include all submissions"
-msgstr ""
+msgstr "Ostavi prazno da uključiš sva rešenja"
-#: judge/forms.py:105 templates/problem/manage_submission.html:142
+#: judge/forms.py:106 templates/problem/manage_submission.html:142
msgid "Filter by result:"
-msgstr ""
+msgstr "Filtriraj po rezultatima:"
-#: judge/forms.py:111
+#: judge/forms.py:112
msgid "Please select at least one thing to download."
-msgstr ""
+msgstr "Izaberite barem jednu stvar za download."
-#: judge/forms.py:137
+#: judge/forms.py:138
msgid "Any judge"
-msgstr ""
+msgstr "Bilo koji sudija"
-#: judge/forms.py:167 judge/views/register.py:26
+#: judge/forms.py:159 judge/views/register.py:25
#: templates/registration/registration_form.html:137
#: templates/user/base-users-table.html:5
msgid "Username"
-msgstr ""
+msgstr "Korisničko Ime"
-#: judge/forms.py:168 templates/registration/registration_form.html:149
+#: judge/forms.py:160 templates/registration/registration_form.html:149
#: templates/registration/registration_form.html:163
msgid "Password"
-msgstr ""
+msgstr "Lozinka"
-#: judge/forms.py:201
+#: judge/forms.py:192
msgid "Invalid code length."
-msgstr ""
+msgstr "Nevažeća dužina koda. "
-#: judge/forms.py:219
+#: judge/forms.py:223
msgid "Invalid WebAuthn response."
-msgstr ""
+msgstr "Nevažeći WebAuthn odgovor."
-#: judge/forms.py:222
+#: judge/forms.py:226
msgid "No WebAuthn challenge issued."
msgstr ""
-#: judge/forms.py:228
+#: judge/forms.py:232
msgid "Invalid WebAuthn credential ID."
-msgstr ""
+msgstr "Nevažeći WebAuthn credential ID."
-#: judge/forms.py:257
+#: judge/forms.py:262
msgid "Invalid two-factor authentication token or scratch code."
msgstr ""
-#: judge/forms.py:259
+#: judge/forms.py:266
msgid "Must specify either totp_token or webauthn_response."
msgstr ""
-#: judge/forms.py:263 judge/models/problem.py:105
+#: judge/forms.py:270 judge/models/problem.py:119
msgid "Problem code must be ^[a-z0-9]+$"
msgstr ""
-#: judge/forms.py:268
+#: judge/forms.py:275
msgid "Problem with code already exists."
-msgstr ""
+msgstr "Zadatak sa tim kodom več postoji."
-#: judge/forms.py:273 judge/models/contest.py:66
+#: judge/forms.py:280 judge/models/contest.py:66
msgid "Contest id must be ^[a-z0-9]+$"
msgstr ""
-#: judge/forms.py:278
+#: judge/forms.py:285
msgid "Contest with key already exists."
-msgstr ""
+msgstr "Takmičenje sa tim ključem več postoji."
#: judge/jinja2/datetime.py:26 templates/blog/content.html:27
#: templates/blog/dashboard.html:21
@@ -639,16 +640,16 @@ msgstr ""
#: judge/jinja2/datetime.py:26
#, python-brace-format
msgid "{time}"
-msgstr ""
+msgstr "{time}"
#: judge/jinja2/datetime.py:26
#, python-brace-format
msgid "on {time}"
-msgstr ""
+msgstr "na {time}"
#: judge/models/choices.py:59
msgid "Leave as LaTeX"
-msgstr ""
+msgstr "Ostavi kao LaTeX"
#: judge/models/choices.py:60
msgid "SVG with PNG fallback"
@@ -664,53 +665,53 @@ msgstr ""
#: judge/models/choices.py:63
msgid "Detect best quality"
-msgstr ""
+msgstr "Otkriti najbolji kvalitet"
#: judge/models/comment.py:25
msgid "Page code must be ^[pcs]:[a-z0-9]+$|^b:\\d+$"
-msgstr ""
+msgstr "Kod stranice mora biti ^[pcs]:[a-z0-9]+$|^b:\\d+$"
#: judge/models/comment.py:41
msgid "commenter"
-msgstr ""
+msgstr "komentator"
#: judge/models/comment.py:42
msgid "posted time"
-msgstr ""
+msgstr "objavljeno vreme"
#: judge/models/comment.py:43 judge/models/comment.py:196
msgid "associated page"
-msgstr ""
+msgstr "asocirana stranica"
#: judge/models/comment.py:45
msgid "votes"
-msgstr ""
+msgstr "glasovi"
#: judge/models/comment.py:46
msgid "body of comment"
-msgstr ""
+msgstr "body komentara"
#: judge/models/comment.py:47
msgid "hide the comment"
-msgstr ""
+msgstr "sakrij komentar"
#: judge/models/comment.py:48
msgid "parent"
-msgstr ""
+msgstr "roditelj"
#: judge/models/comment.py:53
msgid "comment"
-msgstr ""
+msgstr "komentar"
#: judge/models/comment.py:54
msgid "comments"
-msgstr ""
+msgstr "komentari"
#: judge/models/comment.py:89 judge/models/comment.py:141
-#: judge/models/problem.py:484
+#: judge/models/problem.py:511
#, python-format
msgid "Editorial for %s"
-msgstr ""
+msgstr "Uvodnik za %s"
#: judge/models/comment.py:191
msgid "comment vote"
@@ -726,457 +727,473 @@ msgstr ""
#: judge/models/contest.py:28
msgid "Invalid colour."
-msgstr ""
+msgstr "Nepravilna boja."
#: judge/models/contest.py:30
msgid "tag name"
-msgstr ""
+msgstr "naziv oznake"
#: judge/models/contest.py:31
msgid "Lowercase letters and hyphens only."
-msgstr ""
+msgstr "Samo mala slova i crtica."
#: judge/models/contest.py:32
msgid "tag colour"
-msgstr ""
+msgstr "boja oznake"
#: judge/models/contest.py:33
msgid "tag description"
-msgstr ""
+msgstr "opis oznake"
#: judge/models/contest.py:52
msgid "contest tag"
-msgstr ""
+msgstr "oznaka takmičenja"
-#: judge/models/contest.py:53 judge/models/contest.py:117
+#: judge/models/contest.py:53 judge/models/contest.py:126
msgid "contest tags"
-msgstr ""
+msgstr "oznake takmičenja"
#: judge/models/contest.py:61
msgid "Visible"
-msgstr ""
+msgstr "Vidljivo"
#: judge/models/contest.py:62
msgid "Hidden for duration of contest"
-msgstr ""
+msgstr "Sakriveno za vreme takmičenja"
#: judge/models/contest.py:63
msgid "Hidden for duration of participation"
-msgstr ""
+msgstr "Sakriveno tokom učestvovanja"
#: judge/models/contest.py:65
msgid "contest id"
-msgstr ""
+msgstr "id takmičenja"
#: judge/models/contest.py:67
msgid "contest name"
-msgstr ""
+msgstr "ime takmičenja"
#: judge/models/contest.py:68
-msgid "These people will be able to edit the contest."
-msgstr ""
+msgid "These users will be able to edit the contest."
+msgstr "Ovi korisnici će moći da edituju takmičenje."
-#: judge/models/contest.py:70 judge/models/runtime.py:136
+#: judge/models/contest.py:70
+msgid "These users will be able to edit the contest, but will not be listed as authors."
+msgstr "Ovi korisnici će moći da edituju takmičenje, ali neće biti navedeni kao autori."
+
+#: judge/models/contest.py:73
+msgid "These users will be able to view the contest, but not edit it."
+msgstr "Ovi korisnici će moći da vide takmičenje, ali neće moći da ga edituju."
+
+#: judge/models/contest.py:76 judge/models/runtime.py:136
msgid "description"
-msgstr ""
+msgstr "opis"
-#: judge/models/contest.py:71 judge/models/problem.py:431
+#: judge/models/contest.py:77 judge/models/problem.py:458
#: judge/models/runtime.py:138
msgid "problems"
-msgstr ""
+msgstr "zadaci"
-#: judge/models/contest.py:72 judge/models/contest.py:384
+#: judge/models/contest.py:78 judge/models/contest.py:420
msgid "start time"
-msgstr ""
+msgstr "vreme početka"
-#: judge/models/contest.py:73
+#: judge/models/contest.py:79
msgid "end time"
-msgstr ""
+msgstr "vreme kraja"
-#: judge/models/contest.py:74 judge/models/problem.py:126
-#: judge/models/problem.py:455
+#: judge/models/contest.py:80 judge/models/problem.py:140
+#: judge/models/problem.py:482
msgid "time limit"
-msgstr ""
+msgstr "vremensko ograničenje"
-#: judge/models/contest.py:75 judge/models/problem.py:144
+#: judge/models/contest.py:81 judge/models/problem.py:158
msgid "publicly visible"
-msgstr ""
+msgstr "javno vidljivo"
-#: judge/models/contest.py:76
+#: judge/models/contest.py:82
msgid "Should be set even for organization-private contests, where it determines whether the contest is visible to members of the specified organizations."
msgstr ""
-#: judge/models/contest.py:79
+#: judge/models/contest.py:85
msgid "contest rated"
-msgstr ""
+msgstr "takmičenje je rangirano"
-#: judge/models/contest.py:79
+#: judge/models/contest.py:85
msgid "Whether this contest can be rated."
-msgstr ""
+msgstr "Može li ovo takmičenje biti rangirano."
-#: judge/models/contest.py:81
+#: judge/models/contest.py:87
msgid "view contest scoreboard"
-msgstr ""
+msgstr "pregledaj rezultate takmičenja"
-#: judge/models/contest.py:83
+#: judge/models/contest.py:89
msgid "These users will be able to view the scoreboard."
-msgstr ""
+msgstr "Ovi korisnici će moći da vide rezultate svih učesnika takmičenja."
-#: judge/models/contest.py:84
+#: judge/models/contest.py:90
msgid "scoreboard visibility"
-msgstr ""
+msgstr "vidljivost rezultata svih učesnika"
-#: judge/models/contest.py:85
+#: judge/models/contest.py:91
msgid "Scoreboard visibility through the duration of the contest"
-msgstr ""
+msgstr "Vidljivost rezultata svih učesnika tokom takmičenja"
-#: judge/models/contest.py:87
+#: judge/models/contest.py:93
msgid "no comments"
-msgstr ""
+msgstr "bez komentara"
-#: judge/models/contest.py:88
+#: judge/models/contest.py:94
msgid "Use clarification system instead of comments."
-msgstr ""
+msgstr "Koristi clarification sistem umesto komentara."
-#: judge/models/contest.py:90
+#: judge/models/contest.py:96
msgid "Rating floor for contest"
msgstr ""
-#: judge/models/contest.py:92
+#: judge/models/contest.py:98
msgid "Rating ceiling for contest"
msgstr ""
-#: judge/models/contest.py:94
+#: judge/models/contest.py:100
msgid "rate all"
msgstr ""
-#: judge/models/contest.py:94
+#: judge/models/contest.py:100
msgid "Rate all users who joined."
msgstr ""
-#: judge/models/contest.py:95
+#: judge/models/contest.py:101
msgid "exclude from ratings"
msgstr ""
-#: judge/models/contest.py:97
+#: judge/models/contest.py:103
msgid "private to specific users"
msgstr ""
-#: judge/models/contest.py:98
+#: judge/models/contest.py:104
msgid "private contestants"
-msgstr ""
+msgstr "privatni takmičari"
-#: judge/models/contest.py:99
+#: judge/models/contest.py:105
msgid "If private, only these users may see the contest"
msgstr ""
-#: judge/models/contest.py:101
+#: judge/models/contest.py:107
msgid "hide problem tags"
msgstr ""
-#: judge/models/contest.py:102
+#: judge/models/contest.py:108
msgid "Whether problem tags should be hidden by default."
msgstr ""
-#: judge/models/contest.py:104
+#: judge/models/contest.py:110
+msgid "hide problem authors"
+msgstr ""
+
+#: judge/models/contest.py:111
+msgid "Whether problem authors should be hidden by default."
+msgstr ""
+
+#: judge/models/contest.py:113
msgid "run pretests only"
msgstr ""
-#: judge/models/contest.py:105
+#: judge/models/contest.py:114
msgid "Whether judges should grade pretests only, versus all testcases. Commonly set during a contest, then unset prior to rejudging user submissions when the contest ends."
msgstr ""
-#: judge/models/contest.py:109 judge/models/problem.py:166
+#: judge/models/contest.py:118 judge/models/problem.py:183
msgid "private to organizations"
msgstr ""
-#: judge/models/contest.py:110 judge/models/problem.py:164
-#: judge/models/profile.py:83
+#: judge/models/contest.py:119 judge/models/problem.py:181
+#: judge/models/profile.py:86
msgid "organizations"
-msgstr ""
+msgstr "organizacije"
-#: judge/models/contest.py:111
+#: judge/models/contest.py:120
msgid "If private, only these organizations may see the contest"
msgstr ""
-#: judge/models/contest.py:112 judge/models/problem.py:153
+#: judge/models/contest.py:121 judge/models/problem.py:167
msgid "OpenGraph image"
-msgstr ""
+msgstr "OpenGraph slika"
-#: judge/models/contest.py:113 judge/models/profile.py:54
+#: judge/models/contest.py:122 judge/models/profile.py:57
msgid "Logo override image"
msgstr ""
-#: judge/models/contest.py:115
+#: judge/models/contest.py:124
msgid "This image will replace the default site logo for users inside the contest."
-msgstr ""
+msgstr "Ova slika če zameniti default site logo za učesnike takmičenja."
-#: judge/models/contest.py:118
+#: judge/models/contest.py:127
msgid "the amount of live participants"
-msgstr ""
+msgstr "broj aktivnih učesnika"
-#: judge/models/contest.py:119
+#: judge/models/contest.py:128
msgid "contest summary"
-msgstr ""
+msgstr "opis takmičenja"
-#: judge/models/contest.py:120 judge/models/problem.py:155
+#: judge/models/contest.py:129 judge/models/problem.py:169
msgid "Plain-text, shown in meta description tag, e.g. for social media."
msgstr ""
-#: judge/models/contest.py:121 judge/models/profile.py:53
+#: judge/models/contest.py:130 judge/models/profile.py:56
msgid "access code"
-msgstr ""
+msgstr "access code"
-#: judge/models/contest.py:122
+#: judge/models/contest.py:131
msgid "An optional code to prompt contestants before they are allowed to join the contest. Leave it blank to disable."
msgstr ""
-#: judge/models/contest.py:124 judge/models/problem.py:149
+#: judge/models/contest.py:133 judge/models/problem.py:163
msgid "personae non gratae"
-msgstr ""
+msgstr "personae non gratae"
-#: judge/models/contest.py:125
+#: judge/models/contest.py:134
msgid "Bans the selected users from joining this contest."
-msgstr ""
+msgstr "Sprečava učešće u takmičenju izabranim korisnicima."
-#: judge/models/contest.py:126
+#: judge/models/contest.py:135
msgid "contest format"
-msgstr ""
+msgstr "format takmičenja"
-#: judge/models/contest.py:127
+#: judge/models/contest.py:136
msgid "The contest format module to use."
msgstr ""
-#: judge/models/contest.py:128
+#: judge/models/contest.py:137
msgid "contest format configuration"
-msgstr ""
+msgstr "konfiguracija formata takmičenja"
-#: judge/models/contest.py:129
+#: judge/models/contest.py:138
msgid "A JSON object to serve as the configuration for the chosen contest format module. Leave empty to use None. Exact format depends on the contest format selected."
msgstr ""
-#: judge/models/contest.py:136
+#: judge/models/contest.py:145
msgid "contest lock"
msgstr ""
-#: judge/models/contest.py:137
-msgid "Prevent submissions from this contest from being rejudged."
+#: judge/models/contest.py:146
+msgid "Prevent submissions from this contest from being rejudged after this date."
msgstr ""
-#: judge/models/contest.py:138
+#: judge/models/contest.py:148
msgid "precision points"
msgstr ""
-#: judge/models/contest.py:140
+#: judge/models/contest.py:150
msgid "Number of digits to round points to."
msgstr ""
-#: judge/models/contest.py:362
+#: judge/models/contest.py:398
msgid "See private contests"
-msgstr ""
+msgstr "Pogledajte privatne komentare"
-#: judge/models/contest.py:363
+#: judge/models/contest.py:399
msgid "Edit own contests"
msgstr ""
-#: judge/models/contest.py:364
+#: judge/models/contest.py:400
msgid "Edit all contests"
msgstr ""
-#: judge/models/contest.py:365
+#: judge/models/contest.py:401
msgid "Clone contest"
msgstr ""
-#: judge/models/contest.py:366 templates/contest/moss.html:74
+#: judge/models/contest.py:402 templates/contest/moss.html:74
msgid "MOSS contest"
-msgstr ""
+msgstr "MOSS takmičenje"
-#: judge/models/contest.py:367
+#: judge/models/contest.py:403
msgid "Rate contests"
msgstr ""
-#: judge/models/contest.py:368
+#: judge/models/contest.py:404
msgid "Contest access codes"
msgstr ""
-#: judge/models/contest.py:369
+#: judge/models/contest.py:405
msgid "Create private contests"
-msgstr ""
+msgstr "Napravi privatno takmičenje"
-#: judge/models/contest.py:370
+#: judge/models/contest.py:406
msgid "Change contest visibility"
-msgstr ""
+msgstr "Promeniti vidljivost takmičenja"
-#: judge/models/contest.py:371
+#: judge/models/contest.py:407
msgid "Edit contest problem label script"
msgstr ""
-#: judge/models/contest.py:372
+#: judge/models/contest.py:408
msgid "Change lock status of contest"
msgstr ""
-#: judge/models/contest.py:374 judge/models/contest.py:472
-#: judge/models/contest.py:510 judge/models/contest.py:532
-#: judge/models/submission.py:84
+#: judge/models/contest.py:410 judge/models/contest.py:508
+#: judge/models/contest.py:547 judge/models/contest.py:569
+#: judge/models/submission.py:85
msgid "contest"
-msgstr ""
+msgstr "takmičenje"
-#: judge/models/contest.py:375
+#: judge/models/contest.py:411
msgid "contests"
-msgstr ""
+msgstr "takmičenja"
-#: judge/models/contest.py:382
+#: judge/models/contest.py:418
msgid "associated contest"
-msgstr ""
+msgstr "asociranja takmičenja"
-#: judge/models/contest.py:385
+#: judge/models/contest.py:421
msgid "score"
-msgstr ""
+msgstr "rezultat"
-#: judge/models/contest.py:386
+#: judge/models/contest.py:422
msgid "cumulative time"
-msgstr ""
+msgstr "zbirno vreme"
-#: judge/models/contest.py:387
+#: judge/models/contest.py:423
msgid "is disqualified"
-msgstr ""
+msgstr "diskvalifikovan"
-#: judge/models/contest.py:388
+#: judge/models/contest.py:424
msgid "Whether this participation is disqualified."
msgstr ""
-#: judge/models/contest.py:389
+#: judge/models/contest.py:425
msgid "tie-breaking field"
msgstr ""
-#: judge/models/contest.py:390
+#: judge/models/contest.py:426
msgid "virtual participation id"
msgstr ""
-#: judge/models/contest.py:391
+#: judge/models/contest.py:427
msgid "0 means non-virtual, otherwise the n-th virtual participation."
msgstr ""
-#: judge/models/contest.py:392
+#: judge/models/contest.py:428
msgid "contest format specific data"
msgstr ""
-#: judge/models/contest.py:458
+#: judge/models/contest.py:494
#, python-format
msgid "%s spectating in %s"
msgstr ""
-#: judge/models/contest.py:460
+#: judge/models/contest.py:496
#, python-format
msgid "%s in %s, v%d"
msgstr ""
-#: judge/models/contest.py:461
+#: judge/models/contest.py:497
#, python-format
msgid "%s in %s"
-msgstr ""
+msgstr "%s u %s"
-#: judge/models/contest.py:464
+#: judge/models/contest.py:500
msgid "contest participation"
msgstr ""
-#: judge/models/contest.py:465
+#: judge/models/contest.py:501
msgid "contest participations"
-msgstr ""
+msgstr "učesnici takmičenja"
-#: judge/models/contest.py:471 judge/models/contest.py:494
-#: judge/models/contest.py:533 judge/models/problem.py:430
-#: judge/models/problem.py:435 judge/models/problem.py:453
+#: judge/models/contest.py:507 judge/models/contest.py:531
+#: judge/models/contest.py:570 judge/models/problem.py:457
+#: judge/models/problem.py:462 judge/models/problem.py:480
#: judge/models/problem_data.py:35
msgid "problem"
-msgstr ""
+msgstr "zadatak"
-#: judge/models/contest.py:473 judge/models/contest.py:498
-#: judge/models/problem.py:137
+#: judge/models/contest.py:509 judge/models/contest.py:535
+#: judge/models/problem.py:151
msgid "points"
-msgstr ""
+msgstr "poeni"
-#: judge/models/contest.py:474
+#: judge/models/contest.py:510
msgid "partial"
-msgstr ""
+msgstr "delimičan"
-#: judge/models/contest.py:475 judge/models/contest.py:499
+#: judge/models/contest.py:511 judge/models/contest.py:536
msgid "is pretested"
-msgstr ""
+msgstr "več testiran"
-#: judge/models/contest.py:476 judge/models/interface.py:43
+#: judge/models/contest.py:512 judge/models/interface.py:43
msgid "order"
-msgstr ""
+msgstr "redosled"
-#: judge/models/contest.py:477
+#: judge/models/contest.py:513
msgid "output prefix length override"
msgstr ""
-#: judge/models/contest.py:479
+#: judge/models/contest.py:515
msgid "Maximum number of submissions for this problem, or leave blank for no limit."
-msgstr ""
+msgstr "Maksimalan broj odgovora za ovaj zadatak, ili ostaviti prazno da nema ograničenja."
-#: judge/models/contest.py:482
+#: judge/models/contest.py:518
msgid "Why include a problem you can't submit to?"
-msgstr ""
+msgstr "Zašto uključiti zadatak koji ne možete predati?"
-#: judge/models/contest.py:487
+#: judge/models/contest.py:523
msgid "contest problem"
-msgstr ""
+msgstr "zadatak na takmičenju"
-#: judge/models/contest.py:488
+#: judge/models/contest.py:524
msgid "contest problems"
-msgstr ""
+msgstr "zadaci na takmičenju"
-#: judge/models/contest.py:492 judge/models/submission.py:207
+#: judge/models/contest.py:529 judge/models/submission.py:218
msgid "submission"
-msgstr ""
+msgstr "predaja"
-#: judge/models/contest.py:496 judge/models/contest.py:511
+#: judge/models/contest.py:533 judge/models/contest.py:548
msgid "participation"
-msgstr ""
+msgstr "učestvovanje"
-#: judge/models/contest.py:500
+#: judge/models/contest.py:537
msgid "Whether this submission was ran only on pretests."
msgstr ""
-#: judge/models/contest.py:504
+#: judge/models/contest.py:541
msgid "contest submission"
-msgstr ""
+msgstr "predaja takmičenja"
-#: judge/models/contest.py:505
+#: judge/models/contest.py:542
msgid "contest submissions"
-msgstr ""
+msgstr "predaje takmičenja"
-#: judge/models/contest.py:513
+#: judge/models/contest.py:550
msgid "rank"
-msgstr ""
+msgstr "nivo"
-#: judge/models/contest.py:514
+#: judge/models/contest.py:551
msgid "rating"
-msgstr ""
+msgstr "rangiranje"
-#: judge/models/contest.py:515
+#: judge/models/contest.py:552
msgid "volatility"
msgstr ""
-#: judge/models/contest.py:516
+#: judge/models/contest.py:553
msgid "last rated"
msgstr ""
-#: judge/models/contest.py:520
+#: judge/models/contest.py:557
msgid "contest rating"
msgstr ""
-#: judge/models/contest.py:521
+#: judge/models/contest.py:558
msgid "contest ratings"
msgstr ""
-#: judge/models/contest.py:540
+#: judge/models/contest.py:577
msgid "contest moss result"
msgstr ""
-#: judge/models/contest.py:541
+#: judge/models/contest.py:578
msgid "contest moss results"
msgstr ""
@@ -1216,384 +1233,376 @@ msgstr ""
msgid "post title"
msgstr ""
-#: judge/models/interface.py:67 judge/models/problem.py:473
+#: judge/models/interface.py:67 judge/models/problem.py:500
msgid "authors"
-msgstr ""
+msgstr "autori"
#: judge/models/interface.py:68
msgid "slug"
-msgstr ""
+msgstr "puž"
-#: judge/models/interface.py:69 judge/models/problem.py:471
+#: judge/models/interface.py:69 judge/models/problem.py:498
msgid "public visibility"
msgstr ""
#: judge/models/interface.py:70
msgid "sticky"
-msgstr ""
+msgstr "Post-it"
#: judge/models/interface.py:71
msgid "publish after"
-msgstr ""
+msgstr "objaviti posle"
#: judge/models/interface.py:72
msgid "post content"
-msgstr ""
+msgstr "objavi sadržaj"
#: judge/models/interface.py:73
msgid "post summary"
-msgstr ""
+msgstr "objavi opis"
#: judge/models/interface.py:74
msgid "openGraph image"
-msgstr ""
+msgstr "openGraph slika"
#: judge/models/interface.py:96
msgid "Edit all posts"
-msgstr ""
+msgstr "Edituj sve objave"
#: judge/models/interface.py:98
msgid "blog post"
-msgstr ""
+msgstr "blog objava"
#: judge/models/interface.py:99
msgid "blog posts"
-msgstr ""
-
-#: judge/models/message.py:11
-msgid "message title"
-msgstr ""
-
-#: judge/models/message.py:12 judge/models/ticket.py:30
-msgid "message body"
-msgstr ""
-
-#: judge/models/message.py:13
-msgid "sender"
-msgstr ""
-
-#: judge/models/message.py:14
-msgid "target"
-msgstr ""
-
-#: judge/models/message.py:15
-msgid "message timestamp"
-msgstr ""
-
-#: judge/models/message.py:16
-msgid "read"
-msgstr ""
-
-#: judge/models/message.py:20
-msgid "messages in the thread"
-msgstr ""
+msgstr "blog objave"
#: judge/models/problem.py:30
#, python-format
msgid "Disallowed characters: %(value)s"
-msgstr ""
+msgstr "Nedozvoljeni karakteri: %(value)s"
#: judge/models/problem.py:35
msgid "problem category ID"
-msgstr ""
+msgstr "ID kategorije zadatka"
#: judge/models/problem.py:36
msgid "problem category name"
-msgstr ""
+msgstr "ime kategorije zadatka"
#: judge/models/problem.py:43
msgid "problem type"
-msgstr ""
+msgstr "tip zadatka"
-#: judge/models/problem.py:44 judge/models/problem.py:121
+#: judge/models/problem.py:44 judge/models/problem.py:135
msgid "problem types"
-msgstr ""
+msgstr "tipovi zadatka"
#: judge/models/problem.py:48
msgid "problem group ID"
-msgstr ""
+msgstr "ID grupe zadataka"
#: judge/models/problem.py:49
msgid "problem group name"
-msgstr ""
+msgstr "ime grupe zadataka"
-#: judge/models/problem.py:56 judge/models/problem.py:124
+#: judge/models/problem.py:56 judge/models/problem.py:138
msgid "problem group"
-msgstr ""
+msgstr "grupa zadataka"
#: judge/models/problem.py:57
msgid "problem groups"
-msgstr ""
+msgstr "grupe zadataka"
#: judge/models/problem.py:61
msgid "key"
-msgstr ""
+msgstr "ključ"
#: judge/models/problem.py:63
msgid "link"
-msgstr ""
+msgstr "link"
#: judge/models/problem.py:64
msgid "full name"
-msgstr ""
+msgstr "puno ime"
-#: judge/models/problem.py:65 judge/models/profile.py:41
+#: judge/models/problem.py:65 judge/models/profile.py:44
#: judge/models/runtime.py:24
msgid "short name"
-msgstr ""
+msgstr "kratko ime"
#: judge/models/problem.py:66
msgid "Displayed on pages under this license"
-msgstr ""
+msgstr "Prikazano na stranicama pod ovom licencom"
#: judge/models/problem.py:67
msgid "icon"
-msgstr ""
+msgstr "ikona"
#: judge/models/problem.py:67
msgid "URL to the icon"
-msgstr ""
+msgstr "URL za ikonu"
#: judge/models/problem.py:68
msgid "license text"
-msgstr ""
+msgstr "tekst licence"
#: judge/models/problem.py:77
msgid "license"
-msgstr ""
+msgstr "licenca"
#: judge/models/problem.py:78
msgid "licenses"
-msgstr ""
+msgstr "licence"
+
+#: judge/models/problem.py:112
+msgid "Follow global setting"
+msgstr "Prati globalno podešavanje"
+
+#: judge/models/problem.py:113
+msgid "Always visible"
+msgstr "Uvek dostupno"
+
+#: judge/models/problem.py:114
+msgid "Visible if problem solved"
+msgstr "Dostupno ako je zadatak rešen"
-#: judge/models/problem.py:104
+#: judge/models/problem.py:115
+msgid "Only own submissions"
+msgstr "Samo svoja rešenja"
+
+#: judge/models/problem.py:118
msgid "problem code"
-msgstr ""
+msgstr "kod zadatka"
-#: judge/models/problem.py:106
+#: judge/models/problem.py:120
msgid "A short, unique code for the problem, used in the url after /problem/"
-msgstr ""
+msgstr "Kratak, jedinstveni kod za zadatak, koji se koristi u url-u posle /problem/"
-#: judge/models/problem.py:108
+#: judge/models/problem.py:122
msgid "problem name"
-msgstr ""
+msgstr "ime zadatka"
-#: judge/models/problem.py:109
+#: judge/models/problem.py:123
msgid "The full name of the problem, as shown in the problem list."
-msgstr ""
+msgstr "Puno ime zadatka, kao što je prikazano u listi zadataka."
-#: judge/models/problem.py:111
+#: judge/models/problem.py:125
msgid "problem body"
-msgstr ""
+msgstr "sadržaj zadatka"
-#: judge/models/problem.py:112
+#: judge/models/problem.py:126
msgid "creators"
-msgstr ""
+msgstr "kreatori"
-#: judge/models/problem.py:113
+#: judge/models/problem.py:127
msgid "These users will be able to edit the problem, and be listed as authors."
-msgstr ""
+msgstr "Ovi korisnici će moći da edituju zadatak, i biće navedeni kao autori."
-#: judge/models/problem.py:115
+#: judge/models/problem.py:129
msgid "curators"
-msgstr ""
+msgstr "kustos"
-#: judge/models/problem.py:116
+#: judge/models/problem.py:130
msgid "These users will be able to edit the problem, but not be listed as authors."
-msgstr ""
+msgstr "Ovi korisnici će moći da edituju zadatak, i neće biti navedeni kao autori."
-#: judge/models/problem.py:118
+#: judge/models/problem.py:132
msgid "testers"
-msgstr ""
+msgstr "testeri"
-#: judge/models/problem.py:120
+#: judge/models/problem.py:134
msgid "These users will be able to view the private problem, but not edit it."
-msgstr ""
+msgstr "Ovi korisnici će moći da vide privatni zadatak, ali neće moći da ga edituju."
-#: judge/models/problem.py:122
+#: judge/models/problem.py:136
msgid "The type of problem, as shown on the problem's page."
-msgstr ""
+msgstr "Tip zadatka, kao što je prikazano na stranici zadatka."
-#: judge/models/problem.py:125
+#: judge/models/problem.py:139
msgid "The group of problem, shown under Category in the problem list."
-msgstr ""
+msgstr "Grupa zadataka, prikazana u okviru Kategorije u listi zadataka."
-#: judge/models/problem.py:127
+#: judge/models/problem.py:141
msgid "The time limit for this problem, in seconds. Fractional seconds (e.g. 1.5) are supported."
-msgstr ""
+msgstr "Vremensko ograničenje za ovaj zadatak, u sekundama. Delovi sekunda (npr. 1.5) su podržani."
-#: judge/models/problem.py:131 judge/models/problem.py:458
+#: judge/models/problem.py:145 judge/models/problem.py:485
msgid "memory limit"
-msgstr ""
+msgstr "ograničenje memorije"
-#: judge/models/problem.py:132
+#: judge/models/problem.py:146
msgid "The memory limit for this problem, in kilobytes (e.g. 64mb = 65536 kilobytes)."
-msgstr ""
+msgstr "Memorijsko ograničenje za ovaj zadatak, u kilobytes (npr. 64mb = 65536 kilobytes)."
-#: judge/models/problem.py:138
+#: judge/models/problem.py:152
msgid "Points awarded for problem completion. Points are displayed with a 'p' suffix if partial."
-msgstr ""
+msgstr "Pojeni dodeljeni za rešen zadatak. Pojeni su prikazani sa 'p' sufiksom ako je rešenje delimično priznato."
-#: judge/models/problem.py:141
+#: judge/models/problem.py:155
msgid "allows partial points"
-msgstr ""
+msgstr "dozvoljava dodeljivanje delimičnih poena"
-#: judge/models/problem.py:142
+#: judge/models/problem.py:156
msgid "allowed languages"
-msgstr ""
+msgstr "dozvoljeni jezici"
-#: judge/models/problem.py:143
+#: judge/models/problem.py:157
msgid "List of allowed submission languages."
-msgstr ""
+msgstr "Lista dozvoljenih jezika za rešenja."
-#: judge/models/problem.py:145
+#: judge/models/problem.py:159
msgid "manually managed"
msgstr ""
-#: judge/models/problem.py:146
+#: judge/models/problem.py:160
msgid "Whether judges should be allowed to manage data or not."
msgstr ""
-#: judge/models/problem.py:147
+#: judge/models/problem.py:161
msgid "date of publishing"
msgstr ""
-#: judge/models/problem.py:148
+#: judge/models/problem.py:162
msgid "Doesn't have magic ability to auto-publish due to backward compatibility"
msgstr ""
-#: judge/models/problem.py:150
+#: judge/models/problem.py:164
msgid "Bans the selected users from submitting to this problem."
msgstr ""
-#: judge/models/problem.py:152
+#: judge/models/problem.py:166
msgid "The license under which this problem is published."
msgstr ""
-#: judge/models/problem.py:154
+#: judge/models/problem.py:168
msgid "problem summary"
msgstr ""
-#: judge/models/problem.py:156
+#: judge/models/problem.py:170
msgid "number of users"
-msgstr ""
+msgstr "broj korisnika"
-#: judge/models/problem.py:157
+#: judge/models/problem.py:171
msgid "The number of users who solved the problem."
msgstr ""
-#: judge/models/problem.py:158
+#: judge/models/problem.py:172
msgid "solve rate"
msgstr ""
-#: judge/models/problem.py:159
+#: judge/models/problem.py:173
msgid "allow full markdown access"
msgstr ""
-#: judge/models/problem.py:165
+#: judge/models/problem.py:174
+msgid "submission source visibility"
+msgstr ""
+
+#: judge/models/problem.py:182
msgid "If private, only these organizations may see the problem."
msgstr ""
-#: judge/models/problem.py:420
+#: judge/models/problem.py:447
msgid "See hidden problems"
-msgstr ""
+msgstr "Vidi sakrivene zadatke"
-#: judge/models/problem.py:421
+#: judge/models/problem.py:448
msgid "Edit own problems"
msgstr ""
-#: judge/models/problem.py:422
+#: judge/models/problem.py:449
msgid "Edit all problems"
msgstr ""
-#: judge/models/problem.py:423
+#: judge/models/problem.py:450
msgid "Edit all public problems"
msgstr ""
-#: judge/models/problem.py:424
+#: judge/models/problem.py:451
msgid "Edit problems with full markup"
msgstr ""
-#: judge/models/problem.py:425 templates/problem/problem.html:161
+#: judge/models/problem.py:452 templates/problem/problem.html:161
msgid "Clone problem"
msgstr ""
-#: judge/models/problem.py:426
+#: judge/models/problem.py:453
msgid "Change is_public field"
msgstr ""
-#: judge/models/problem.py:427
+#: judge/models/problem.py:454
msgid "Change is_manually_managed field"
msgstr ""
-#: judge/models/problem.py:428
+#: judge/models/problem.py:455
msgid "See organization-private problems"
msgstr ""
-#: judge/models/problem.py:436 judge/models/problem.py:454
+#: judge/models/problem.py:463 judge/models/problem.py:481
#: judge/models/runtime.py:111
msgid "language"
-msgstr ""
+msgstr "jezik"
-#: judge/models/problem.py:437
+#: judge/models/problem.py:464
msgid "translated name"
-msgstr ""
+msgstr "prevedeno ime"
-#: judge/models/problem.py:438
+#: judge/models/problem.py:465
msgid "translated description"
-msgstr ""
+msgstr "preveden opis"
-#: judge/models/problem.py:442
+#: judge/models/problem.py:469
msgid "problem translation"
-msgstr ""
+msgstr "prevod zadatka"
-#: judge/models/problem.py:443
+#: judge/models/problem.py:470
msgid "problem translations"
-msgstr ""
+msgstr "prevodi zadatka"
-#: judge/models/problem.py:447
+#: judge/models/problem.py:474
msgid "clarified problem"
msgstr ""
-#: judge/models/problem.py:448
+#: judge/models/problem.py:475
msgid "clarification body"
msgstr ""
-#: judge/models/problem.py:449
+#: judge/models/problem.py:476
msgid "clarification timestamp"
msgstr ""
-#: judge/models/problem.py:464
+#: judge/models/problem.py:491
msgid "language-specific resource limit"
msgstr ""
-#: judge/models/problem.py:465
+#: judge/models/problem.py:492
msgid "language-specific resource limits"
msgstr ""
-#: judge/models/problem.py:469
+#: judge/models/problem.py:496
msgid "associated problem"
msgstr ""
-#: judge/models/problem.py:472
+#: judge/models/problem.py:499
msgid "publish date"
-msgstr ""
+msgstr "datum objave"
-#: judge/models/problem.py:474
+#: judge/models/problem.py:501
msgid "editorial content"
msgstr ""
-#: judge/models/problem.py:497
+#: judge/models/problem.py:524
msgid "See hidden solutions"
msgstr ""
-#: judge/models/problem.py:499
+#: judge/models/problem.py:526
msgid "solution"
-msgstr ""
+msgstr "rešenje"
-#: judge/models/problem.py:500
+#: judge/models/problem.py:527
msgid "solutions"
-msgstr ""
+msgstr "rešenja"
#: judge/models/problem_data.py:23
msgid "Standard"
@@ -1677,19 +1686,19 @@ msgstr ""
#: judge/models/problem_data.py:82
msgid "Batch start"
-msgstr ""
+msgstr "početak Batch-a"
#: judge/models/problem_data.py:83
msgid "Batch end"
-msgstr ""
+msgstr "kraj Batch-a"
#: judge/models/problem_data.py:85
msgid "input file name"
-msgstr ""
+msgstr "ime ulaznog fajla"
#: judge/models/problem_data.py:86
msgid "output file name"
-msgstr ""
+msgstr "ime izlaznog fajla"
#: judge/models/problem_data.py:87
msgid "generator arguments"
@@ -1697,275 +1706,287 @@ msgstr ""
#: judge/models/problem_data.py:88
msgid "point value"
-msgstr ""
+msgstr "vrednost poena"
#: judge/models/problem_data.py:89
msgid "case is pretest?"
msgstr ""
-#: judge/models/profile.py:38
+#: judge/models/profile.py:41
msgid "organization title"
-msgstr ""
+msgstr "naziv organizacije"
-#: judge/models/profile.py:39
+#: judge/models/profile.py:42
msgid "organization slug"
-msgstr ""
+msgstr "puž organizacije"
-#: judge/models/profile.py:40
+#: judge/models/profile.py:43
msgid "Organization name shown in URL"
-msgstr ""
+msgstr "ime Organizacije prikazano u URL-u"
-#: judge/models/profile.py:42
+#: judge/models/profile.py:45
msgid "Displayed beside user name during contests"
-msgstr ""
+msgstr "Prikazano pored imena korisnika tokom takmičenja"
-#: judge/models/profile.py:43
+#: judge/models/profile.py:46
msgid "organization description"
-msgstr ""
+msgstr "opis organizacije"
-#: judge/models/profile.py:44
+#: judge/models/profile.py:47
msgid "administrators"
-msgstr ""
+msgstr "administratori"
-#: judge/models/profile.py:45
+#: judge/models/profile.py:48
msgid "Those who can edit this organization"
-msgstr ""
+msgstr "Oni koji mogu da edit-uju ovu organizaciju"
-#: judge/models/profile.py:46
+#: judge/models/profile.py:49
msgid "creation date"
-msgstr ""
+msgstr "datum kreiranja"
-#: judge/models/profile.py:47
+#: judge/models/profile.py:50
msgid "is open organization?"
-msgstr ""
+msgstr "je otvorena organizacija?"
-#: judge/models/profile.py:48
+#: judge/models/profile.py:51
msgid "Allow joining organization"
-msgstr ""
+msgstr "Dozvoli pridruživanje organizaciji"
-#: judge/models/profile.py:49
+#: judge/models/profile.py:52
msgid "maximum size"
-msgstr ""
+msgstr "maksimalna veličina"
-#: judge/models/profile.py:50
+#: judge/models/profile.py:53
msgid "Maximum amount of users in this organization, only applicable to private organizations"
-msgstr ""
+msgstr "Maksimalan broj korisnika u ovoj organizaciji, primenljiv samo na privatne organizacije"
-#: judge/models/profile.py:52
+#: judge/models/profile.py:55
msgid "Student access code"
-msgstr ""
+msgstr "pristupni kod studenta"
-#: judge/models/profile.py:56
+#: judge/models/profile.py:59
msgid "This image will replace the default site logo for users viewing the organization."
-msgstr ""
+msgstr "Ova slika če zameniti default site logo za korisnike koji gledaju organizaciju."
-#: judge/models/profile.py:79
+#: judge/models/profile.py:82
msgid "Administer organizations"
-msgstr ""
+msgstr "Administriraj organizacije"
-#: judge/models/profile.py:80
+#: judge/models/profile.py:83
msgid "Edit all organizations"
-msgstr ""
+msgstr "Edit-uj sve organizacije"
-#: judge/models/profile.py:82 judge/models/profile.py:99
-#: judge/models/profile.py:269
+#: judge/models/profile.py:85 judge/models/profile.py:102
+#: judge/models/profile.py:293
msgid "organization"
-msgstr ""
+msgstr "organizacija"
-#: judge/models/profile.py:87
+#: judge/models/profile.py:90
msgid "user associated"
-msgstr ""
+msgstr "asocirani korisnik"
-#: judge/models/profile.py:88
+#: judge/models/profile.py:91
msgid "self-description"
-msgstr ""
+msgstr "samo-opis"
-#: judge/models/profile.py:89
+#: judge/models/profile.py:92
msgid "location"
-msgstr ""
+msgstr "lokacija"
-#: judge/models/profile.py:91
+#: judge/models/profile.py:94
msgid "preferred language"
-msgstr ""
+msgstr "željeni jezik"
-#: judge/models/profile.py:97
+#: judge/models/profile.py:100
msgid "last access time"
-msgstr ""
+msgstr "vreme poslednjeg pristupa"
-#: judge/models/profile.py:98
+#: judge/models/profile.py:101
msgid "last IP"
-msgstr ""
+msgstr "poslednji IP"
-#: judge/models/profile.py:101
+#: judge/models/profile.py:104
msgid "display rank"
-msgstr ""
+msgstr "prikaži nivo"
-#: judge/models/profile.py:103
+#: judge/models/profile.py:106
msgid "Normal User"
-msgstr ""
+msgstr "Običan korisnik"
-#: judge/models/profile.py:104
+#: judge/models/profile.py:107
msgid "Problem Setter"
-msgstr ""
+msgstr "Pisac zadatka"
-#: judge/models/profile.py:105 templates/base.html:220
+#: judge/models/profile.py:108 templates/base.html:220
#: templates/comments/list.html:99 templates/contest/contest-list-tabs.html:24
#: templates/contest/ranking-table.html:49
#: templates/problem/problem-list-tabs.html:6
#: templates/submission/info-base.html:13
#: templates/submission/submission-list-tabs.html:15
msgid "Admin"
-msgstr ""
+msgstr "Administrator"
-#: judge/models/profile.py:106
+#: judge/models/profile.py:109
msgid "comment mute"
-msgstr ""
+msgstr "nemi koment"
-#: judge/models/profile.py:106
+#: judge/models/profile.py:109
msgid "Some users are at their best when silent."
-msgstr ""
+msgstr "U ćutanju je zlato."
-#: judge/models/profile.py:108
+#: judge/models/profile.py:111
msgid "unlisted user"
msgstr ""
-#: judge/models/profile.py:108
+#: judge/models/profile.py:111
msgid "User will not be ranked."
-msgstr ""
+msgstr "Korisnik neće biti rangiran"
-#: judge/models/profile.py:111
+#: judge/models/profile.py:114
msgid "user script"
msgstr ""
-#: judge/models/profile.py:112
+#: judge/models/profile.py:115
msgid "User-defined JavaScript for site customization."
msgstr ""
-#: judge/models/profile.py:113
+#: judge/models/profile.py:116
msgid "current contest"
-msgstr ""
+msgstr "takmičenje u toku"
-#: judge/models/profile.py:115
+#: judge/models/profile.py:118
msgid "math engine"
-msgstr ""
+msgstr "math engine"
-#: judge/models/profile.py:117
+#: judge/models/profile.py:120
msgid "the rendering engine used to render math"
msgstr ""
-#: judge/models/profile.py:118
+#: judge/models/profile.py:121
msgid "TOTP 2FA enabled"
msgstr ""
-#: judge/models/profile.py:119
+#: judge/models/profile.py:122
msgid "check to enable TOTP-based two-factor authentication"
msgstr ""
-#: judge/models/profile.py:120
+#: judge/models/profile.py:123
msgid "WebAuthn 2FA enabled"
msgstr ""
-#: judge/models/profile.py:121
+#: judge/models/profile.py:124
msgid "check to enable WebAuthn-based two-factor authentication"
msgstr ""
-#: judge/models/profile.py:122
+#: judge/models/profile.py:125
msgid "TOTP key"
msgstr ""
-#: judge/models/profile.py:123
+#: judge/models/profile.py:126
msgid "32 character base32-encoded key for TOTP"
msgstr ""
-#: judge/models/profile.py:125
+#: judge/models/profile.py:128
msgid "TOTP key must be empty or base32"
msgstr ""
-#: judge/models/profile.py:126
+#: judge/models/profile.py:129
msgid "scratch codes"
msgstr ""
-#: judge/models/profile.py:127
+#: judge/models/profile.py:130
msgid "JSON array of 16 character base32-encoded codes for scratch codes"
msgstr ""
-#: judge/models/profile.py:131
+#: judge/models/profile.py:134
msgid "Scratch codes must be empty or a JSON array of 16-character base32 codes"
msgstr ""
-#: judge/models/profile.py:133
-msgid "API token"
+#: judge/models/profile.py:136
+msgid "last TOTP timecode"
msgstr ""
-#: judge/models/profile.py:134
+#: judge/models/profile.py:137
+msgid "API token"
+msgstr "API žeton"
+
+#: judge/models/profile.py:138
msgid "64 character hex-encoded API access token"
msgstr ""
-#: judge/models/profile.py:136
+#: judge/models/profile.py:140
msgid "API token must be None or hexadecimal"
msgstr ""
-#: judge/models/profile.py:137
+#: judge/models/profile.py:141
msgid "internal notes"
-msgstr ""
+msgstr "interne beleške"
-#: judge/models/profile.py:138
+#: judge/models/profile.py:142
msgid "Notes for administrators regarding this user."
msgstr ""
-#: judge/models/profile.py:139
+#: judge/models/profile.py:143
msgid "last data download time"
msgstr ""
-#: judge/models/profile.py:236
+#: judge/models/profile.py:253
msgid "Shows in-progress development stuff"
msgstr ""
-#: judge/models/profile.py:237
+#: judge/models/profile.py:254
msgid "Edit TOTP settings"
msgstr ""
-#: judge/models/profile.py:239
+#: judge/models/profile.py:256
msgid "user profile"
-msgstr ""
+msgstr "profil korisnika"
-#: judge/models/profile.py:240
+#: judge/models/profile.py:257
msgid "user profiles"
msgstr ""
-#: judge/models/profile.py:246
+#: judge/models/profile.py:263
msgid "device name"
-msgstr ""
+msgstr "ime uređaja"
-#: judge/models/profile.py:247
+#: judge/models/profile.py:264
msgid "credential ID"
msgstr ""
-#: judge/models/profile.py:248
+#: judge/models/profile.py:265
msgid "public key"
msgstr ""
-#: judge/models/profile.py:249
+#: judge/models/profile.py:266
msgid "sign counter"
msgstr ""
-#: judge/models/profile.py:271
+#: judge/models/profile.py:287
+msgid "WebAuthn credential"
+msgstr ""
+
+#: judge/models/profile.py:288
+msgid "WebAuthn credentials"
+msgstr ""
+
+#: judge/models/profile.py:295
msgid "request time"
msgstr ""
-#: judge/models/profile.py:272
+#: judge/models/profile.py:296
msgid "state"
-msgstr ""
+msgstr "status"
-#: judge/models/profile.py:277
+#: judge/models/profile.py:301
msgid "reason"
-msgstr ""
+msgstr "razlog"
-#: judge/models/profile.py:280
+#: judge/models/profile.py:304
msgid "organization join request"
msgstr ""
-#: judge/models/profile.py:281
+#: judge/models/profile.py:305
msgid "organization join requests"
msgstr ""
@@ -2031,7 +2052,7 @@ msgstr ""
#: judge/models/runtime.py:42
msgid "language description"
-msgstr ""
+msgstr "opis jezika"
#: judge/models/runtime.py:43
msgid "Use this field to inform users of quirks with your environment, additional restrictions, etc."
@@ -2047,7 +2068,7 @@ msgstr ""
#: judge/models/runtime.py:112
msgid "languages"
-msgstr ""
+msgstr "jezici"
#: judge/models/runtime.py:116
msgid "language to which this runtime belongs"
@@ -2095,7 +2116,7 @@ msgstr ""
#: judge/models/runtime.py:131
msgid "judge online status"
-msgstr ""
+msgstr "online status sudije"
#: judge/models/runtime.py:132
msgid "judge start time"
@@ -2115,226 +2136,226 @@ msgstr ""
#: judge/models/runtime.py:139 judge/models/runtime.py:181
msgid "judges"
-msgstr ""
+msgstr "sudije"
#: judge/models/runtime.py:180
msgid "judge"
-msgstr ""
+msgstr "sudija"
-#: judge/models/submission.py:20 judge/models/submission.py:47
+#: judge/models/submission.py:21 judge/models/submission.py:48
#: judge/utils/problems.py:74
msgid "Accepted"
-msgstr ""
+msgstr "Prihvaćeno"
-#: judge/models/submission.py:21 judge/models/submission.py:48
+#: judge/models/submission.py:22 judge/models/submission.py:49
msgid "Wrong Answer"
-msgstr ""
+msgstr "Pogrešni Odgovori"
-#: judge/models/submission.py:22 judge/models/submission.py:50
+#: judge/models/submission.py:23 judge/models/submission.py:51
msgid "Time Limit Exceeded"
msgstr ""
-#: judge/models/submission.py:23 judge/models/submission.py:51
+#: judge/models/submission.py:24 judge/models/submission.py:52
msgid "Memory Limit Exceeded"
msgstr ""
-#: judge/models/submission.py:24 judge/models/submission.py:52
+#: judge/models/submission.py:25 judge/models/submission.py:53
msgid "Output Limit Exceeded"
msgstr ""
-#: judge/models/submission.py:25 judge/models/submission.py:53
+#: judge/models/submission.py:26 judge/models/submission.py:54
msgid "Invalid Return"
msgstr ""
-#: judge/models/submission.py:26 judge/models/submission.py:54
+#: judge/models/submission.py:27 judge/models/submission.py:55
msgid "Runtime Error"
msgstr ""
-#: judge/models/submission.py:27 judge/models/submission.py:41
-#: judge/models/submission.py:55 judge/utils/problems.py:76
+#: judge/models/submission.py:28 judge/models/submission.py:42
+#: judge/models/submission.py:56 judge/utils/problems.py:76
msgid "Compile Error"
-msgstr ""
+msgstr "Greška u Sastavljanju"
-#: judge/models/submission.py:28 judge/models/submission.py:40
+#: judge/models/submission.py:29 judge/models/submission.py:41
msgid "Internal Error"
-msgstr ""
+msgstr "Unutrašnja Grеška"
-#: judge/models/submission.py:29
+#: judge/models/submission.py:30
msgid "Short circuit"
msgstr ""
-#: judge/models/submission.py:30 judge/models/submission.py:42
-#: judge/models/submission.py:61
+#: judge/models/submission.py:31 judge/models/submission.py:43
+#: judge/models/submission.py:62
msgid "Aborted"
-msgstr ""
+msgstr "Prekinut"
-#: judge/models/submission.py:36 judge/models/submission.py:57
+#: judge/models/submission.py:37 judge/models/submission.py:58
msgid "Queued"
msgstr ""
-#: judge/models/submission.py:37 judge/models/submission.py:58
+#: judge/models/submission.py:38 judge/models/submission.py:59
msgid "Processing"
msgstr ""
-#: judge/models/submission.py:38 judge/models/submission.py:59
+#: judge/models/submission.py:39 judge/models/submission.py:60
msgid "Grading"
msgstr ""
-#: judge/models/submission.py:39 judge/models/submission.py:60
+#: judge/models/submission.py:40 judge/models/submission.py:61
msgid "Completed"
-msgstr ""
+msgstr "Završeno"
-#: judge/models/submission.py:56
+#: judge/models/submission.py:57
msgid "Internal Error (judging server error)"
msgstr ""
-#: judge/models/submission.py:66
+#: judge/models/submission.py:67
msgid "submission time"
msgstr ""
-#: judge/models/submission.py:67 judge/models/submission.py:227
+#: judge/models/submission.py:68 judge/models/submission.py:238
msgid "execution time"
msgstr ""
-#: judge/models/submission.py:68 judge/models/submission.py:228
+#: judge/models/submission.py:69 judge/models/submission.py:239
msgid "memory usage"
msgstr ""
-#: judge/models/submission.py:69 judge/models/submission.py:229
+#: judge/models/submission.py:70 judge/models/submission.py:240
msgid "points granted"
msgstr ""
-#: judge/models/submission.py:70
+#: judge/models/submission.py:71
msgid "submission language"
msgstr ""
-#: judge/models/submission.py:71
+#: judge/models/submission.py:72
msgid "status"
-msgstr ""
+msgstr "status"
-#: judge/models/submission.py:72
+#: judge/models/submission.py:73
msgid "result"
-msgstr ""
+msgstr "rezultat"
-#: judge/models/submission.py:74
+#: judge/models/submission.py:75
msgid "compile errors"
-msgstr ""
+msgstr "Greške u Sastavljanju"
-#: judge/models/submission.py:76
+#: judge/models/submission.py:77
msgid "batched cases"
msgstr ""
-#: judge/models/submission.py:77
+#: judge/models/submission.py:78
msgid "test case points"
msgstr ""
-#: judge/models/submission.py:78
+#: judge/models/submission.py:79
msgid "test case total points"
msgstr ""
-#: judge/models/submission.py:79
+#: judge/models/submission.py:80
msgid "judged on"
msgstr ""
-#: judge/models/submission.py:81
+#: judge/models/submission.py:82
msgid "submission judge time"
msgstr ""
-#: judge/models/submission.py:82
-msgid "was rejudged by admin"
+#: judge/models/submission.py:83
+msgid "last rejudge date by admin"
msgstr ""
-#: judge/models/submission.py:83
+#: judge/models/submission.py:84
msgid "was ran on pretests only"
msgstr ""
-#: judge/models/submission.py:86
-msgid "lock submission"
+#: judge/models/submission.py:87
+msgid "submission lock"
msgstr ""
-#: judge/models/submission.py:199
+#: judge/models/submission.py:210
msgid "Abort any submission"
msgstr ""
-#: judge/models/submission.py:200
+#: judge/models/submission.py:211
msgid "Rejudge the submission"
msgstr ""
-#: judge/models/submission.py:201
+#: judge/models/submission.py:212
msgid "Rejudge a lot of submissions"
msgstr ""
-#: judge/models/submission.py:202
+#: judge/models/submission.py:213
msgid "Submit without limit"
msgstr ""
-#: judge/models/submission.py:203
+#: judge/models/submission.py:214
msgid "View all submission"
msgstr ""
-#: judge/models/submission.py:204
+#: judge/models/submission.py:215
msgid "Resubmit others' submission"
msgstr ""
-#: judge/models/submission.py:205
+#: judge/models/submission.py:216
msgid "Change lock status of submission"
msgstr ""
-#: judge/models/submission.py:208 templates/contest/moss.html:58
+#: judge/models/submission.py:219 templates/contest/moss.html:58
msgid "submissions"
msgstr ""
-#: judge/models/submission.py:212 judge/models/submission.py:223
+#: judge/models/submission.py:223 judge/models/submission.py:234
msgid "associated submission"
msgstr ""
-#: judge/models/submission.py:214
+#: judge/models/submission.py:225
msgid "source code"
msgstr ""
-#: judge/models/submission.py:225
+#: judge/models/submission.py:236
msgid "test case ID"
msgstr ""
-#: judge/models/submission.py:226
+#: judge/models/submission.py:237
msgid "status flag"
-msgstr ""
+msgstr "statusna zastava"
-#: judge/models/submission.py:230
+#: judge/models/submission.py:241
msgid "points possible"
msgstr ""
-#: judge/models/submission.py:231
+#: judge/models/submission.py:242
msgid "batch number"
msgstr ""
-#: judge/models/submission.py:232
+#: judge/models/submission.py:243
msgid "judging feedback"
msgstr ""
-#: judge/models/submission.py:233
+#: judge/models/submission.py:244
msgid "extended judging feedback"
msgstr ""
-#: judge/models/submission.py:234
+#: judge/models/submission.py:245
msgid "program output"
msgstr ""
-#: judge/models/submission.py:242
+#: judge/models/submission.py:253
msgid "submission test case"
msgstr ""
-#: judge/models/submission.py:243
+#: judge/models/submission.py:254
msgid "submission test cases"
msgstr ""
#: judge/models/ticket.py:10
msgid "ticket title"
-msgstr ""
+msgstr "naslov tiketa"
#: judge/models/ticket.py:11
msgid "ticket creator"
-msgstr ""
+msgstr "autor tiketa"
#: judge/models/ticket.py:13
msgid "creation time"
@@ -2372,6 +2393,10 @@ msgstr ""
msgid "poster"
msgstr ""
+#: judge/models/ticket.py:30
+msgid "message body"
+msgstr ""
+
#: judge/models/ticket.py:31
msgid "message time"
msgstr ""
@@ -2394,19 +2419,23 @@ msgstr ""
msgid "Running MOSS"
msgstr ""
-#: judge/tasks/submission.py:43
+#: judge/tasks/submission.py:45
msgid "Modifying submissions"
msgstr ""
-#: judge/tasks/submission.py:56
+#: judge/tasks/submission.py:58
msgid "Recalculating user points"
msgstr ""
-#: judge/tasks/user.py:50
+#: judge/tasks/user.py:49
+msgid "Applying filters"
+msgstr ""
+
+#: judge/tasks/user.py:64
msgid "Preparing your submission data"
msgstr ""
-#: judge/tasks/user.py:81
+#: judge/tasks/user.py:95
msgid "Preparing your comment data"
msgstr ""
@@ -2449,15 +2478,15 @@ msgstr ""
#: judge/utils/problems.py:75
msgid "Wrong"
-msgstr ""
+msgstr "Pogrešno"
#: judge/utils/problems.py:77
msgid "Timeout"
-msgstr ""
+msgstr "Istek vremena"
#: judge/utils/problems.py:78
msgid "Error"
-msgstr ""
+msgstr "Greška"
#: judge/utils/problems.py:89
msgid "Can't pass both queryset and keyword filters"
@@ -2503,7 +2532,7 @@ msgstr[2] ""
#: judge/utils/timedelta.py:63
msgctxt "hours and minutes"
msgid "%h:%m"
-msgstr ""
+msgstr "%h:%m"
#: judge/views/blog.py:37
#, python-format
@@ -2520,9 +2549,9 @@ msgstr ""
#: judge/views/comment.py:66
msgid "You already voted."
-msgstr ""
+msgstr "Već ste glasali"
-#: judge/views/comment.py:129 judge/views/organization.py:298
+#: judge/views/comment.py:129 judge/views/organization.py:297
msgid "Edited from site"
msgstr ""
@@ -2530,132 +2559,137 @@ msgstr ""
msgid "Editing comment"
msgstr ""
-#: judge/views/contests.py:56 judge/views/contests.py:201
-#: judge/views/contests.py:204 judge/views/contests.py:382
+#: judge/views/contests.py:57 judge/views/contests.py:210
+#: judge/views/contests.py:213 judge/views/contests.py:395
msgid "No such contest"
-msgstr ""
+msgstr "Ne postoji takvo takmičenje "
-#: judge/views/contests.py:57 judge/views/contests.py:202
+#: judge/views/contests.py:58 judge/views/contests.py:211
#, python-format
msgid "Could not find a contest with the key \"%s\"."
-msgstr ""
+msgstr "Takmičenje sa \"%s\" ključem nije pronađeno."
-#: judge/views/contests.py:70
+#: judge/views/contests.py:71
msgid "Contests"
-msgstr ""
+msgstr "Takmičenja"
-#: judge/views/contests.py:205
+#: judge/views/contests.py:214
msgid "Could not find such contest."
msgstr ""
-#: judge/views/contests.py:208
+#: judge/views/contests.py:217
#, python-format
msgid "Access to contest \"%s\" denied"
msgstr ""
-#: judge/views/contests.py:235
+#: judge/views/contests.py:244
msgid "Clone Contest"
msgstr ""
-#: judge/views/contests.py:301
+#: judge/views/contests.py:278
+#, python-format
+msgid "Cloned contest from %s"
+msgstr ""
+
+#: judge/views/contests.py:314
msgid "Contest not ongoing"
msgstr ""
-#: judge/views/contests.py:302
+#: judge/views/contests.py:315
#, python-format
msgid "\"%s\" is not currently ongoing."
msgstr ""
-#: judge/views/contests.py:306
+#: judge/views/contests.py:319
msgid "Already in contest"
-msgstr ""
+msgstr "Več na takmičenju "
-#: judge/views/contests.py:307
+#: judge/views/contests.py:320
#, python-format
msgid "You are already in a contest: \"%s\"."
-msgstr ""
+msgstr "Već učestvujete na takmičenju: \"%s\"."
-#: judge/views/contests.py:310
+#: judge/views/contests.py:323
msgid "Banned from joining"
msgstr ""
-#: judge/views/contests.py:311
+#: judge/views/contests.py:324
msgid "You have been declared persona non grata for this contest. You are permanently barred from joining this contest."
msgstr ""
-#: judge/views/contests.py:372
+#: judge/views/contests.py:385
#, python-format
msgid "Enter access code for \"%s\""
msgstr ""
-#: judge/views/contests.py:383
+#: judge/views/contests.py:396
#, python-format
msgid "You are not in contest \"%s\"."
msgstr ""
-#: judge/views/contests.py:402
+#: judge/views/contests.py:415
msgid "ContestCalendar requires integer year and month"
msgstr ""
-#: judge/views/contests.py:442
+#: judge/views/contests.py:455
#, python-format
msgid "Contests in %(month)s"
msgstr ""
-#: judge/views/contests.py:442
+#: judge/views/contests.py:455
msgid "F Y"
msgstr ""
-#: judge/views/contests.py:489
+#: judge/views/contests.py:502
#, python-format
msgid "%s Statistics"
msgstr ""
-#: judge/views/contests.py:662
+#: judge/views/contests.py:675
#, python-format
msgid "%s Rankings"
msgstr ""
-#: judge/views/contests.py:670
+#: judge/views/contests.py:683
msgid "???"
msgstr ""
-#: judge/views/contests.py:686
+#: judge/views/contests.py:699
#, python-format
msgid "Your participation in %s"
msgstr ""
-#: judge/views/contests.py:687
+#: judge/views/contests.py:700
#, python-format
msgid "%s's participation in %s"
msgstr ""
-#: judge/views/contests.py:694
+#: judge/views/contests.py:707
msgid "Live"
msgstr ""
-#: judge/views/contests.py:706 templates/contest/contest-tabs.html:13
+#: judge/views/contests.py:719 templates/contest/contest-tabs.html:13
msgid "Participation"
msgstr ""
-#: judge/views/contests.py:750
+#: judge/views/contests.py:763
#, python-format
msgid "%s MOSS Results"
msgstr ""
-#: judge/views/contests.py:777
+#: judge/views/contests.py:790
#, python-format
msgid "Running MOSS for %s..."
msgstr ""
-#: judge/views/contests.py:800
+#: judge/views/contests.py:813
#, python-format
msgid "Contest tag: %s"
msgstr ""
#: judge/views/error.py:14
msgid "404 error"
-msgstr ""
+msgstr "greška 404"
#: judge/views/error.py:15
#, python-format
@@ -2677,71 +2711,71 @@ msgstr ""
msgid "Runtimes"
msgstr ""
-#: judge/views/organization.py:44 judge/views/organization.py:47
+#: judge/views/organization.py:43 judge/views/organization.py:46
msgid "No such organization"
msgstr ""
-#: judge/views/organization.py:45
+#: judge/views/organization.py:44
#, python-format
msgid "Could not find an organization with the key \"%s\"."
msgstr ""
-#: judge/views/organization.py:48
+#: judge/views/organization.py:47
msgid "Could not find such organization."
msgstr ""
-#: judge/views/organization.py:72 judge/views/register.py:34
+#: judge/views/organization.py:71 judge/views/register.py:33
#: templates/organization/list.html:15 templates/user/user-list-tabs.html:5
msgid "Organizations"
-msgstr ""
+msgstr "Organizacije"
-#: judge/views/organization.py:93
+#: judge/views/organization.py:92
#, python-format
msgid "%s Members"
msgstr ""
-#: judge/views/organization.py:118 judge/views/organization.py:121
-#: judge/views/organization.py:126
+#: judge/views/organization.py:117 judge/views/organization.py:120
+#: judge/views/organization.py:125
msgid "Joining organization"
msgstr ""
-#: judge/views/organization.py:118
+#: judge/views/organization.py:117
msgid "You are already in the organization."
msgstr ""
-#: judge/views/organization.py:121
+#: judge/views/organization.py:120
msgid "This organization is not open."
msgstr ""
-#: judge/views/organization.py:138
+#: judge/views/organization.py:137
msgid "Leaving organization"
msgstr ""
-#: judge/views/organization.py:138
+#: judge/views/organization.py:137
#, python-format
msgid "You are not in \"%s\"."
msgstr ""
-#: judge/views/organization.py:162
+#: judge/views/organization.py:161
#, python-format
msgid "Request to join %s"
msgstr ""
-#: judge/views/organization.py:180
+#: judge/views/organization.py:179
msgid "Join request detail"
msgstr ""
-#: judge/views/organization.py:208
+#: judge/views/organization.py:207
#, python-format
msgid "Managing join requests for %s"
msgstr ""
-#: judge/views/organization.py:239
+#: judge/views/organization.py:238
#, python-format
msgid "Your organization can only receive %d more members. You cannot approve %d users."
msgstr ""
-#: judge/views/organization.py:251
+#: judge/views/organization.py:250
#, python-format
msgid "Approved %d user."
msgid_plural "Approved %d users."
@@ -2749,7 +2783,7 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-#: judge/views/organization.py:252
+#: judge/views/organization.py:251
#, python-format
msgid "Rejected %d user."
msgid_plural "Rejected %d users."
@@ -2757,85 +2791,99 @@ msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-#: judge/views/organization.py:282
+#: judge/views/organization.py:281
#, python-format
msgid "Editing %s"
msgstr ""
-#: judge/views/organization.py:306 judge/views/organization.py:314
+#: judge/views/organization.py:305 judge/views/organization.py:313
msgid "Can't edit organization"
msgstr ""
-#: judge/views/organization.py:307
+#: judge/views/organization.py:306
msgid "You are not allowed to edit this organization."
msgstr ""
-#: judge/views/organization.py:315
+#: judge/views/organization.py:314
msgid "You are not allowed to kick people from this organization."
msgstr ""
-#: judge/views/organization.py:320 judge/views/organization.py:324
+#: judge/views/organization.py:319 judge/views/organization.py:323
msgid "Can't kick user"
msgstr ""
-#: judge/views/organization.py:321
+#: judge/views/organization.py:320
msgid "The user you are trying to kick does not exist!"
msgstr ""
-#: judge/views/organization.py:325
+#: judge/views/organization.py:324
#, python-format
msgid "The user you are trying to kick is not in organization: %s."
msgstr ""
-#: judge/views/problem.py:67
+#: judge/views/problem.py:68
msgid "No such problem"
msgstr ""
-#: judge/views/problem.py:68
+#: judge/views/problem.py:69
#, python-format
msgid "Could not find a problem with the code \"%s\"."
msgstr ""
-#: judge/views/problem.py:110
+#: judge/views/problem.py:111
#, python-brace-format
msgid "Editorial for {0}"
msgstr ""
-#: judge/views/problem.py:113
+#: judge/views/problem.py:114
#, python-brace-format
msgid "Editorial for {0}"
msgstr ""
-#: judge/views/problem.py:283 templates/contest/contest.html:79
+#: judge/views/problem.py:133
+msgid "No such editorial"
+msgstr ""
+
+#: judge/views/problem.py:134
+#, python-format
+msgid "Could not find an editorial with the code \"%s\"."
+msgstr ""
+
+#: judge/views/problem.py:289 templates/contest/contest.html:79
#: templates/user/user-tabs.html:5 templates/user/users-table.html:23
msgid "Problems"
-msgstr ""
+msgstr "Zadatci"
-#: judge/views/problem.py:556 judge/views/problem.py:564
+#: judge/views/problem.py:562 judge/views/problem.py:570
#, python-format
msgid "Submit to %s"
msgstr ""
-#: judge/views/problem.py:613
+#: judge/views/problem.py:619
msgid "Banned from submitting"
msgstr ""
-#: judge/views/problem.py:614
+#: judge/views/problem.py:620
msgid "You have been declared persona non grata for this problem. You are permanently barred from submitting this problem."
msgstr ""
-#: judge/views/problem.py:618
+#: judge/views/problem.py:624
msgid "Too many submissions"
msgstr ""
-#: judge/views/problem.py:619
+#: judge/views/problem.py:625
msgid "You have exceeded the submission limit for this problem."
msgstr ""
-#: judge/views/problem.py:681
+#: judge/views/problem.py:693
msgid "Clone Problem"
msgstr ""
+#: judge/views/problem.py:720
+#, python-format
+msgid "Cloned problem from %s"
+msgstr ""
+
#: judge/views/problem_data.py:37
msgid "Checker arguments must be a JSON object"
msgstr ""
@@ -2906,52 +2954,52 @@ msgstr ""
msgid "Best solutions for {0}"
msgstr ""
-#: judge/views/ranked_submission.py:80
+#: judge/views/ranked_submission.py:82
#, python-format
msgid "Best solutions for %(problem)s in %(contest)s"
msgstr ""
-#: judge/views/ranked_submission.py:83
+#: judge/views/ranked_submission.py:85
#, python-format
msgid "Best solutions for problem %(number)s in %(contest)s"
msgstr ""
-#: judge/views/ranked_submission.py:89
+#: judge/views/ranked_submission.py:91
#, python-brace-format
msgid "Best solutions for {0} in {2}"
msgstr ""
-#: judge/views/ranked_submission.py:92
+#: judge/views/ranked_submission.py:94
#, python-brace-format
msgid "Best solutions for problem {0} in {1}"
msgstr ""
-#: judge/views/register.py:27
+#: judge/views/register.py:26
msgid "A username must contain letters, numbers, or underscores"
msgstr ""
-#: judge/views/register.py:31
+#: judge/views/register.py:30
msgid "Preferred language"
-msgstr ""
+msgstr "Željeni jezik"
-#: judge/views/register.py:38
+#: judge/views/register.py:37
msgid "Subscribe to newsletter?"
msgstr ""
-#: judge/views/register.py:45
+#: judge/views/register.py:44
#, python-format
msgid "The email address \"%s\" is already taken. Only one registration is allowed per address."
msgstr ""
-#: judge/views/register.py:51
+#: judge/views/register.py:50
msgid "Your email provider is not allowed due to history of abuse. Please use a reputable email provider."
msgstr ""
-#: judge/views/register.py:57 judge/views/register.py:95
+#: judge/views/register.py:56 judge/views/register.py:94
msgid "Registration"
-msgstr ""
+msgstr "Registracija"
-#: judge/views/register.py:106
+#: judge/views/register.py:105
msgid "Authentication failure"
msgstr ""
@@ -2959,7 +3007,7 @@ msgstr ""
msgid "Language statistics"
msgstr ""
-#: judge/views/status.py:24 templates/submission/list.html:311
+#: judge/views/status.py:24 templates/submission/list.html:310
msgid "Status"
msgstr ""
@@ -2967,74 +3015,74 @@ msgstr ""
msgid "Version matrix"
msgstr ""
-#: judge/views/submission.py:53 judge/views/submission.py:60
+#: judge/views/submission.py:55 judge/views/submission.py:62
#, python-format
msgid "Submission of %(problem)s by %(user)s"
msgstr ""
-#: judge/views/submission.py:203 judge/views/submission.py:204
+#: judge/views/submission.py:205 judge/views/submission.py:206
#: templates/problem/problem.html:127
msgid "All submissions"
-msgstr ""
+msgstr "Sva rešenja"
-#: judge/views/submission.py:349
+#: judge/views/submission.py:355
msgid "All my submissions"
-msgstr ""
+msgstr "Sva moja rešenja"
-#: judge/views/submission.py:350
+#: judge/views/submission.py:356
#, python-format
msgid "All submissions by %s"
-msgstr ""
+msgstr "Sva rešenja od %s"
-#: judge/views/submission.py:381
+#: judge/views/submission.py:387
#, python-format
msgid "All submissions for %s"
-msgstr ""
+msgstr "Sva rešenja za %s"
-#: judge/views/submission.py:400
+#: judge/views/submission.py:410
msgid "Must pass a problem"
msgstr ""
-#: judge/views/submission.py:439
+#: judge/views/submission.py:449
#, python-format
msgid "My submissions for %(problem)s"
-msgstr ""
+msgstr "Moja rešenja za %(problem)s"
-#: judge/views/submission.py:440
+#: judge/views/submission.py:450
#, python-format
msgid "%(user)s's submissions for %(problem)s"
-msgstr ""
+msgstr "%(user)sa rešenja za %(problem)s"
-#: judge/views/submission.py:536
+#: judge/views/submission.py:546
msgid "Must pass a contest"
msgstr ""
-#: judge/views/submission.py:544
+#: judge/views/submission.py:554
#, python-format
msgid "My submissions in %(contest)s"
-msgstr ""
+msgstr "Moja rešenja u %(contest)s"
-#: judge/views/submission.py:545
+#: judge/views/submission.py:555
#, python-format
msgid "%(user)s's submissions in %(contest)s"
msgstr ""
-#: judge/views/submission.py:559
+#: judge/views/submission.py:569
#, python-brace-format
msgid "My submissions in {0}"
msgstr ""
-#: judge/views/submission.py:561
+#: judge/views/submission.py:571
#, python-brace-format
msgid "{0}'s submissions in {2}"
msgstr ""
-#: judge/views/submission.py:585
+#: judge/views/submission.py:597
#, python-brace-format
msgid "{0}'s submissions for {2} in {4}"
msgstr ""
-#: judge/views/submission.py:590
+#: judge/views/submission.py:602
#, python-brace-format
msgid "{0}'s submissions for problem {2} in {3}"
msgstr ""
@@ -3051,40 +3099,40 @@ msgstr ""
msgid "You must solve at least one problem before you can create a ticket."
msgstr ""
-#: judge/views/ticket.py:87 judge/views/ticket.py:90
+#: judge/views/ticket.py:91 judge/views/ticket.py:94
#, python-format
msgid "New ticket for %s"
msgstr ""
-#: judge/views/ticket.py:144
+#: judge/views/ticket.py:148
#, python-format
msgid "%(title)s - Ticket %(id)d"
msgstr ""
-#: judge/views/ticket.py:249
+#: judge/views/ticket.py:253
#, python-format
msgid "Tickets - Page %(number)d of %(total)d"
msgstr ""
-#: judge/views/ticket.py:298
+#: judge/views/ticket.py:302
#, python-format
msgid "New Ticket: %s"
msgstr ""
-#: judge/views/ticket.py:299
+#: judge/views/ticket.py:303
#, python-format
msgid "#%(id)d, assigned to: %(users)s"
msgstr ""
-#: judge/views/ticket.py:301
+#: judge/views/ticket.py:305
msgid ", "
msgstr ""
-#: judge/views/ticket.py:301
+#: judge/views/ticket.py:305
msgid "no one"
msgstr ""
-#: judge/views/ticket.py:321
+#: judge/views/ticket.py:325
#, python-format
msgid "New Ticket Message For: %s"
msgstr ""
@@ -3093,87 +3141,91 @@ msgstr ""
msgid "Enable Two-factor Authentication"
msgstr ""
-#: judge/views/two_factor.py:99
+#: judge/views/two_factor.py:108
+msgid "Refresh Two-factor Authentication"
+msgstr ""
+
+#: judge/views/two_factor.py:116
msgid "Disable Two-factor Authentication"
msgstr ""
-#: judge/views/two_factor.py:148
+#: judge/views/two_factor.py:165
msgid "Invalid WebAuthn response"
msgstr ""
-#: judge/views/two_factor.py:151
+#: judge/views/two_factor.py:168
msgid "Invalid name"
-msgstr ""
+msgstr "Nevažeći ime"
-#: judge/views/two_factor.py:204
+#: judge/views/two_factor.py:221
msgid "Staff may not disable 2FA"
msgstr ""
-#: judge/views/two_factor.py:216
+#: judge/views/two_factor.py:229
msgid "Perform Two-factor Authentication"
msgstr ""
-#: judge/views/user.py:79
+#: judge/views/user.py:78
msgid "No such user"
-msgstr ""
+msgstr "Ne postoj takav korisnik"
-#: judge/views/user.py:79
+#: judge/views/user.py:78
#, python-format
msgid "No user handle \"%s\"."
msgstr ""
-#: judge/views/user.py:83
+#: judge/views/user.py:82
msgid "My account"
msgstr ""
-#: judge/views/user.py:84
+#: judge/views/user.py:83
#, python-format
msgid "User %s"
msgstr ""
-#: judge/views/user.py:132
+#: judge/views/user.py:131
msgid "Login"
msgstr ""
-#: judge/views/user.py:173
+#: judge/views/user.py:172
msgid "M j, Y, G:i"
msgstr ""
-#: judge/views/user.py:307
+#: judge/views/user.py:306
msgid "Preparing your data..."
msgstr ""
-#: judge/views/user.py:311 templates/user/edit-profile.html:348
+#: judge/views/user.py:310 templates/user/edit-profile.html:352
msgid "Download your data"
-msgstr ""
+msgstr "Skini vaše podatke"
-#: judge/views/user.py:367
+#: judge/views/user.py:366
msgid "Updated on site"
msgstr ""
-#: judge/views/user.py:400 templates/admin/auth/user/change_form.html:14
+#: judge/views/user.py:399 templates/admin/auth/user/change_form.html:14
#: templates/admin/auth/user/change_form.html:17 templates/base.html:222
#: templates/user/user-tabs.html:16
msgid "Edit profile"
msgstr ""
-#: judge/views/user.py:415
+#: judge/views/user.py:414
msgid "Generated API token for user"
msgstr ""
-#: judge/views/user.py:427
+#: judge/views/user.py:426
msgid "Removed API token for user"
msgstr ""
-#: judge/views/user.py:437
+#: judge/views/user.py:436
msgid "Generated scratch codes for user"
msgstr ""
-#: judge/views/user.py:443 templates/user/user-list-tabs.html:4
+#: judge/views/user.py:442 templates/user/user-list-tabs.html:4
msgid "Leaderboard"
msgstr ""
-#: judge/views/user.py:504
+#: judge/views/user.py:503
msgid "You have been successfully logged out."
msgstr ""
@@ -3211,12 +3263,12 @@ msgstr ""
#: templates/admin/judge/problem/change_form.html:14
msgid "View Submissions"
-msgstr ""
+msgstr "Vidi Rešenja"
#: templates/admin/judge/problem/change_form.html:17
#: templates/user/user-base.html:61
msgid "View submissions"
-msgstr ""
+msgstr "Vidi rešenja"
#: templates/admin/judge/profile/change_form.html:14
#: templates/admin/judge/profile/change_form.html:17
@@ -3232,7 +3284,7 @@ msgstr ""
#: templates/base.html:214
#, python-format
msgid "Hello, %(username)s."
-msgstr ""
+msgstr "Zdravo, %(username)s."
#: templates/base.html:229
msgid "Log out"
@@ -3245,7 +3297,7 @@ msgstr ""
#: templates/base.html:239 templates/registration/registration_form.html:175
msgid "or"
-msgstr ""
+msgstr "ili"
#: templates/base.html:240
msgid "Sign up"
@@ -3265,7 +3317,7 @@ msgstr ""
#: templates/license.html:10 templates/problem/data.html:428
#: templates/problem/editorial.html:14
msgid "Edit"
-msgstr ""
+msgstr "Edit-uj"
#: templates/blog/content.html:27
#, python-format
@@ -3291,18 +3343,18 @@ msgstr ""
#: templates/blog/list.html:92
msgid "News"
-msgstr ""
+msgstr "Vesti"
#: templates/blog/list.html:106
#, python-brace-format
msgid "posted on {time}"
msgstr ""
-#: templates/blog/list.html:130 templates/problem/problem.html:309
+#: templates/blog/list.html:130 templates/problem/problem.html:311
msgid "Clarifications"
msgstr ""
-#: templates/blog/list.html:146 templates/problem/problem.html:320
+#: templates/blog/list.html:146 templates/problem/problem.html:322
msgid "No clarifications have been made at this time."
msgstr ""
@@ -3320,7 +3372,7 @@ msgstr ""
#: templates/blog/list.html:209
msgid "New problems"
-msgstr ""
+msgstr "Novi zadaci"
#: templates/blog/list.html:226
msgid "My open tickets"
@@ -3495,7 +3547,7 @@ msgid "Info"
msgstr ""
#: templates/contest/contest-tabs.html:6 templates/stats/base.html:9
-#: templates/submission/list.html:337
+#: templates/submission/list.html:336
msgid "Statistics"
msgstr ""
@@ -3590,15 +3642,15 @@ msgstr ""
#: templates/contest/list.html:65
msgid "hidden"
-msgstr ""
+msgstr "sakriveno"
#: templates/contest/list.html:78
msgid "private"
-msgstr ""
+msgstr "privatno"
#: templates/contest/list.html:83
msgid "rated"
-msgstr ""
+msgstr "rangirano"
#: templates/contest/list.html:131
msgid "Spectate"
@@ -3606,16 +3658,16 @@ msgstr ""
#: templates/contest/list.html:137
msgid "Join"
-msgstr ""
+msgstr "Pridruži se"
#: templates/contest/list.html:147
msgid "Active Contests"
-msgstr ""
+msgstr "Aktivna takmičenja"
#: templates/contest/list.html:151 templates/contest/list.html:193
#: templates/contest/list.html:231 templates/contest/list.html:268
msgid "Contest"
-msgstr ""
+msgstr "Takmičenje"
#: templates/contest/list.html:189
msgid "Ongoing Contests"
@@ -3627,7 +3679,7 @@ msgstr ""
#: templates/contest/list.html:254
msgid "There are no scheduled contests at this time."
-msgstr ""
+msgstr "Nema zakazana takmičenja u momentu"
#: templates/contest/list.html:260
msgid "Past Contests"
@@ -3667,7 +3719,7 @@ msgstr ""
#: templates/contest/private.html:5
msgid "This contest is private to specific users."
-msgstr ""
+msgstr "Ovo takmičenje je privatno za određena korisnika."
#: templates/contest/private.html:10
msgid "Additionally, only the following organizations may access this contest:"
@@ -3679,7 +3731,7 @@ msgstr ""
#: templates/contest/ranking-table.html:7
msgid "Organization"
-msgstr ""
+msgstr "Organizacija"
#: templates/contest/ranking-table.html:27
#, python-brace-format
@@ -3698,21 +3750,21 @@ msgstr ""
msgid "Disqualify"
msgstr ""
-#: templates/contest/ranking.html:169
+#: templates/contest/ranking.html:173
msgid "Are you sure you want to disqualify this participation?"
msgstr ""
-#: templates/contest/ranking.html:174
+#: templates/contest/ranking.html:178
msgid "Are you sure you want to un-disqualify this participation?"
msgstr ""
-#: templates/contest/ranking.html:246
+#: templates/contest/ranking.html:250
msgid "View user participation"
msgstr ""
-#: templates/contest/ranking.html:250
+#: templates/contest/ranking.html:254
msgid "Show organizations"
-msgstr ""
+msgstr "Pokaži organizacije"
#: templates/contest/stats.html:38
msgid "Problem Status Distribution"
@@ -3747,11 +3799,11 @@ msgstr ""
#: templates/newsletter/subscription_update_activated.html:3
#: templates/newsletter/subscription_update_activated.html:6
msgid "activate"
-msgstr ""
+msgstr "aktiviraj"
#: templates/newsletter/subscription_unsubscribe_activated.html:8
msgid "You have successfully been unsubscribed."
-msgstr ""
+msgstr "Uspešno ste se odjavili."
#: templates/newsletter/subscription_unsubscribe_email_sent.html:3
#: templates/newsletter/subscription_unsubscribe_email_sent.html:6
@@ -3770,7 +3822,7 @@ msgstr ""
#: templates/newsletter/subscription_unsubscribe_user.html:21
msgid "Unsubscribe"
-msgstr ""
+msgstr "Odjavite se"
#: templates/newsletter/subscription_update.html:3
#: templates/newsletter/subscription_update.html:6
@@ -3855,29 +3907,29 @@ msgstr ""
#: templates/organization/requests/detail.html:13
msgid "User:"
-msgstr ""
+msgstr "Korisnik:"
#: templates/organization/requests/detail.html:17
msgid "Organization:"
-msgstr ""
+msgstr "Organizacija:"
#: templates/organization/requests/detail.html:25
msgid "Time:"
-msgstr ""
+msgstr "Vreme:"
#: templates/organization/requests/detail.html:29
msgid "Reason:"
-msgstr ""
+msgstr "Razlog:"
#: templates/organization/requests/log.html:11
#: templates/organization/requests/pending.html:14
msgid "State"
-msgstr ""
+msgstr "Stanje"
#: templates/organization/requests/log.html:12
#: templates/organization/requests/pending.html:15
msgid "Reason"
-msgstr ""
+msgstr "Razlog"
#: templates/organization/requests/log.html:28
#: templates/organization/requests/pending.html:37
@@ -3911,7 +3963,7 @@ msgstr ""
#: templates/organization/requests/tabs.html:13
msgid "Rejected"
-msgstr ""
+msgstr "Odbijeno"
#: templates/organization/users-table.html:15
msgid "Kick"
@@ -3931,7 +3983,7 @@ msgstr ""
#: templates/problem/data.html:344
msgid "View YAML"
-msgstr ""
+msgstr "Pogledaj YAML"
#: templates/problem/data.html:360
msgid "Show columns:"
@@ -3955,7 +4007,7 @@ msgstr ""
#: templates/problem/data.html:382
msgid "Type"
-msgstr ""
+msgstr "Tip"
#: templates/problem/data.html:383
msgid "Input file"
@@ -3971,7 +4023,7 @@ msgstr ""
#: templates/problem/data.html:438 templates/problem/submit.html:258
msgid "Submit!"
-msgstr ""
+msgstr "Odgovori!"
#: templates/problem/data.html:439
msgid "Add new case"
@@ -3985,10 +4037,10 @@ msgstr ""
msgid "Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence."
msgstr ""
-#: templates/problem/editorial.html:27 templates/problem/problem.html:209
+#: templates/problem/editorial.html:27 templates/problem/problem.html:210
msgid "Author:"
msgid_plural "Authors:"
-msgstr[0] ""
+msgstr[0] "Autor:"
msgstr[1] ""
msgstr[2] ""
@@ -3998,12 +4050,12 @@ msgstr ""
#: templates/problem/list.html:183
msgid "Hot problems"
-msgstr ""
+msgstr "Popularni zadaci"
#: templates/problem/list.html:205 templates/problem/list.html:222
#: templates/problem/search-form.html:30 templates/user/user-problems.html:59
msgid "Category"
-msgstr ""
+msgstr "Kategorija"
#: templates/problem/list.html:207 templates/problem/list.html:226
msgid "Types"
@@ -4140,7 +4192,7 @@ msgstr ""
#: templates/problem/problem.html:168
msgid "Points:"
-msgstr ""
+msgstr "Poeni:"
#: templates/problem/problem.html:171 templates/problem/problem.html:173
msgid "(partial)"
@@ -4154,48 +4206,48 @@ msgstr ""
msgid "Memory limit:"
msgstr ""
-#: templates/problem/problem.html:224
+#: templates/problem/problem.html:226
msgid "Problem type"
msgid_plural "Problem types"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
-#: templates/problem/problem.html:237
+#: templates/problem/problem.html:239
msgid "Allowed languages"
-msgstr ""
+msgstr "Dozvoljeni jezici"
-#: templates/problem/problem.html:245
+#: templates/problem/problem.html:247
#, python-format
msgid "No %(lang)s judge online"
msgstr ""
-#: templates/problem/problem.html:256
+#: templates/problem/problem.html:258
msgid "Judge:"
msgid_plural "Judges:"
-msgstr[0] ""
+msgstr[0] "Sudija:"
msgstr[1] ""
-msgstr[2] ""
+msgstr[2] "Sudije:"
-#: templates/problem/problem.html:273
+#: templates/problem/problem.html:275
msgid "none available"
msgstr ""
-#: templates/problem/problem.html:298
+#: templates/problem/problem.html:300
msgid "Request clarification"
msgstr ""
-#: templates/problem/problem.html:300
+#: templates/problem/problem.html:302
msgid "Report an issue"
msgstr ""
#: templates/problem/raw.html:62
msgid "Time Limit:"
-msgstr ""
+msgstr "Vremensko Ograničenje:"
#: templates/problem/raw.html:71
msgid "Memory Limit:"
-msgstr ""
+msgstr "Ograničenje Memorije:"
#: templates/problem/search-form.html:2
msgid "Problem search"
@@ -4203,7 +4255,7 @@ msgstr ""
#: templates/problem/search-form.html:8
msgid "Search problems..."
-msgstr ""
+msgstr "Traži zadatke..."
#: templates/problem/search-form.html:14
msgid "Full text search"
@@ -4220,20 +4272,20 @@ msgstr ""
#: templates/problem/search-form.html:33 templates/problem/search-form.html:35
#: templates/submission/submission-list-tabs.html:4
msgid "All"
-msgstr ""
+msgstr "Svi"
#: templates/problem/search-form.html:46
msgid "Problem types"
-msgstr ""
+msgstr "Tipovi zadatka"
#: templates/problem/search-form.html:57
msgid "Point range"
msgstr ""
-#: templates/problem/search-form.html:63 templates/submission/list.html:329
+#: templates/problem/search-form.html:63 templates/submission/list.html:328
#: templates/ticket/list.html:248
msgid "Go"
-msgstr ""
+msgstr "Idi"
#: templates/problem/search-form.html:64
msgid "Random"
@@ -4278,7 +4330,7 @@ msgid "Invalid username or password."
msgstr ""
#: templates/registration/login.html:53
-#: templates/registration/two_factor_auth.html:86
+#: templates/registration/two_factor_auth.html:92
msgid "Login!"
msgstr ""
@@ -4398,12 +4450,12 @@ msgid "Default language"
msgstr ""
#: templates/registration/registration_form.html:184
-#: templates/user/edit-profile.html:310
+#: templates/user/edit-profile.html:314
msgid "Affiliated organizations"
msgstr ""
#: templates/registration/registration_form.html:190
-#: templates/user/edit-profile.html:324
+#: templates/user/edit-profile.html:328
msgid "Notify me about upcoming contests"
msgstr ""
@@ -4419,57 +4471,93 @@ msgstr ""
msgid "Register!"
msgstr ""
-#: templates/registration/totp_disable.html:38
+#: templates/registration/totp_disable.html:31
msgid "To protect your account, you must first authenticate before you can disable Two Factor Authentication."
msgstr ""
-#: templates/registration/totp_disable.html:45
+#: templates/registration/totp_disable.html:38
msgid "Enter the 6-digit code generated by your app or one of your 16-digit scratch codes:"
msgstr ""
-#: templates/registration/totp_disable.html:48
+#: templates/registration/totp_disable.html:41
msgid "Disable Two Factor Authentication"
-msgstr ""
+msgstr "Isključi multi-faktor autentifikaciju"
-#: templates/registration/totp_enable.html:75
+#: templates/registration/totp_enable.html:72
msgid "Scan this code with your authenticator app:"
msgstr ""
-#: templates/registration/totp_enable.html:76
+#: templates/registration/totp_enable.html:73
msgid "QR code"
-msgstr ""
+msgstr "QR kod"
-#: templates/registration/totp_enable.html:77
+#: templates/registration/totp_enable.html:74
msgid "Or enter this code manually:"
msgstr ""
-#: templates/registration/totp_enable.html:88
+#: templates/registration/totp_enable.html:85
msgid "Enter the 6-digit code generated by your app:"
msgstr ""
-#: templates/registration/totp_enable.html:91
+#: templates/registration/totp_enable.html:90
+msgid "Refresh Two Factor Authentication"
+msgstr ""
+
+#: templates/registration/totp_enable.html:92
msgid "Enable Two Factor Authentication"
+msgstr "Omogući multi-faktor autentifikaciju"
+
+#: templates/registration/totp_enable.html:98
+msgid "Below is a list of one-time use scratch codes."
+msgstr ""
+
+#: templates/registration/totp_enable.html:99
+msgid "These codes can only be used once and are for emergency use."
+msgstr ""
+
+#: templates/registration/totp_enable.html:100
+msgid "You can use these codes to login to your account or disable two-factor authentication."
+msgstr ""
+
+#: templates/registration/totp_enable.html:101
+msgid "If you ever need more scratch codes, you can regenerate them on the edit profile tab."
+msgstr ""
+
+#: templates/registration/totp_enable.html:102
+msgid "Please write these down and keep them in a secure location."
+msgstr ""
+
+#: templates/registration/totp_enable.html:103
+msgid "These codes will never be shown again after you enable two-factor authentication."
msgstr ""
#: templates/registration/two_factor_auth.html:33
-#: templates/user/edit-profile.html:161
+#: templates/user/edit-profile.html:165
msgid "WebAuthn is not supported by your browser."
msgstr ""
#: templates/registration/two_factor_auth.html:54
-#: templates/user/edit-profile.html:185
+#: templates/user/edit-profile.html:189
msgid "Failed to contact server."
msgstr ""
-#: templates/registration/two_factor_auth.html:77
+#: templates/registration/two_factor_auth.html:79
msgid "Enter the 6-digit code generated by your app or one of your 16-character scratch codes:"
msgstr ""
-#: templates/registration/two_factor_auth.html:83
-msgid "Use security key"
+#: templates/registration/two_factor_auth.html:81
+msgid "Enter one of your 16-character scratch codes:"
msgstr ""
#: templates/registration/two_factor_auth.html:89
+msgid "Use security key"
+msgstr ""
+
+#: templates/registration/two_factor_auth.html:94
+msgid "Use scratch code"
+msgstr ""
+
+#: templates/registration/two_factor_auth.html:97
#, python-format
msgid "If you lost your authentication device and are unable to use your scratch codes, please contact us at %(email)s."
msgstr ""
@@ -4484,7 +4572,7 @@ msgstr ""
#: templates/status/judge-status-table.html:2
msgid "Judge"
-msgstr ""
+msgstr "Sudija"
#: templates/status/judge-status-table.html:4
msgid "Online"
@@ -4515,7 +4603,7 @@ msgstr ""
#: templates/status/language-list.html:34 templates/ticket/list.html:259
msgid "ID"
-msgstr ""
+msgstr "ID"
#: templates/status/language-list.html:36
msgid "Runtime Info"
@@ -4523,7 +4611,7 @@ msgstr ""
#: templates/status/status-tabs.html:4
msgid "Judges"
-msgstr ""
+msgstr "Sudije"
#: templates/status/status-tabs.html:6
msgid "Version Matrix"
@@ -4550,15 +4638,15 @@ msgstr ""
msgid "Filter by language..."
msgstr ""
-#: templates/submission/list.html:307
+#: templates/submission/list.html:306
msgid "Filter submissions"
msgstr ""
-#: templates/submission/list.html:343
+#: templates/submission/list.html:342
msgid "Total:"
msgstr ""
-#: templates/submission/list.html:353
+#: templates/submission/list.html:352
msgid "You were disconnected. Refresh to show latest updates."
msgstr ""
@@ -4585,11 +4673,11 @@ msgstr ""
#: templates/submission/row.html:71
msgid "admin"
-msgstr ""
+msgstr "administrator"
#: templates/submission/source.html:25
msgid "View status"
-msgstr ""
+msgstr "Pogledaj status"
#: templates/submission/source.html:26
msgid "View raw source"
@@ -4775,121 +4863,125 @@ msgstr ""
msgid "Search by handle..."
msgstr ""
-#: templates/user/edit-profile.html:109
+#: templates/user/edit-profile.html:113
msgid "Are you sure you want to generate or regenerate your API token?"
msgstr ""
-#: templates/user/edit-profile.html:110
+#: templates/user/edit-profile.html:114
msgid "This will invalidate any previous API tokens."
msgstr ""
-#: templates/user/edit-profile.html:111
+#: templates/user/edit-profile.html:115
msgid "It also allows access to your account without Two-factor Authentication."
msgstr ""
-#: templates/user/edit-profile.html:112
+#: templates/user/edit-profile.html:116
msgid "You will not be able to view your api token after you leave this page!"
msgstr ""
-#: templates/user/edit-profile.html:113 templates/user/edit-profile.html:207
+#: templates/user/edit-profile.html:117 templates/user/edit-profile.html:211
msgid "Generating..."
msgstr ""
-#: templates/user/edit-profile.html:121 templates/user/edit-profile.html:243
-#: templates/user/edit-profile.html:371 templates/user/edit-profile.html:390
+#: templates/user/edit-profile.html:125 templates/user/edit-profile.html:247
+#: templates/user/edit-profile.html:373 templates/user/edit-profile.html:395
msgid "Regenerate"
msgstr ""
-#: templates/user/edit-profile.html:127 templates/user/edit-profile.html:392
+#: templates/user/edit-profile.html:131 templates/user/edit-profile.html:397
msgid "Remove"
msgstr ""
-#: templates/user/edit-profile.html:137
+#: templates/user/edit-profile.html:141
msgid "Are you sure you want to remove your API token?"
msgstr ""
-#: templates/user/edit-profile.html:144 templates/user/edit-profile.html:375
-#: templates/user/edit-profile.html:396
+#: templates/user/edit-profile.html:148 templates/user/edit-profile.html:377
+#: templates/user/edit-profile.html:401
msgid "Generate"
msgstr ""
-#: templates/user/edit-profile.html:190
+#: templates/user/edit-profile.html:194
msgid "Are you sure you want to delete this security key?"
msgstr ""
-#: templates/user/edit-profile.html:280
+#: templates/user/edit-profile.html:284
msgid "Self-description"
msgstr ""
-#: templates/user/edit-profile.html:287
+#: templates/user/edit-profile.html:291
msgid "Select your closest major city"
msgstr ""
-#: templates/user/edit-profile.html:296
+#: templates/user/edit-profile.html:300
msgid "Editor theme"
msgstr ""
-#: templates/user/edit-profile.html:301
+#: templates/user/edit-profile.html:305
msgid "Math engine"
-msgstr ""
+msgstr "Math engine"
-#: templates/user/edit-profile.html:335 templates/user/edit-profile.html:337
+#: templates/user/edit-profile.html:339 templates/user/edit-profile.html:341
msgid "Change your avatar"
msgstr ""
-#: templates/user/edit-profile.html:342
+#: templates/user/edit-profile.html:346
msgid "Change your password"
msgstr ""
-#: templates/user/edit-profile.html:356
+#: templates/user/edit-profile.html:359
msgid "Two-factor Authentication is enabled"
-msgstr ""
+msgstr "Multi-faktor autentifikacija je upaljena"
-#: templates/user/edit-profile.html:358
-msgid "Two-factor Authentication is disabled"
+#: templates/user/edit-profile.html:362 templates/user/edit-profile.html:365
+msgid "Disable"
msgstr ""
-#: templates/user/edit-profile.html:363 templates/user/edit-profile.html:365
-msgid "Disable"
+#: templates/user/edit-profile.html:367
+msgid "Refresh"
msgstr ""
-#: templates/user/edit-profile.html:368
+#: templates/user/edit-profile.html:370
msgid "Scratch Codes:"
msgstr ""
-#: templates/user/edit-profile.html:372 templates/user/edit-profile.html:393
+#: templates/user/edit-profile.html:374 templates/user/edit-profile.html:398
msgid "Hidden"
msgstr ""
-#: templates/user/edit-profile.html:381
+#: templates/user/edit-profile.html:384
+msgid "Two-factor Authentication is disabled"
+msgstr "Multi-faktor autentifikacija je ugašena"
+
+#: templates/user/edit-profile.html:385
msgid "Enable"
-msgstr ""
+msgstr "Uključi"
-#: templates/user/edit-profile.html:387
+#: templates/user/edit-profile.html:392
msgid "API Token"
-msgstr ""
+msgstr "API Žeton"
-#: templates/user/edit-profile.html:404
+#: templates/user/edit-profile.html:409
msgid "Security keys"
msgstr ""
-#: templates/user/edit-profile.html:414
+#: templates/user/edit-profile.html:419
msgid "Delete"
-msgstr ""
+msgstr "Izbriši"
-#: templates/user/edit-profile.html:421
+#: templates/user/edit-profile.html:426
msgid "Enter a name for this key"
msgstr ""
-#: templates/user/edit-profile.html:422
+#: templates/user/edit-profile.html:427
msgid "Add"
-msgstr ""
+msgstr "Dodaj"
-#: templates/user/edit-profile.html:430
+#: templates/user/edit-profile.html:435
msgid "User-script"
msgstr ""
-#: templates/user/edit-profile.html:434
+#: templates/user/edit-profile.html:439
msgid "Update profile"
msgstr ""
@@ -4952,7 +5044,7 @@ msgstr ""
#: templates/user/user-about.html:14
msgid "From"
-msgstr ""
+msgstr "Od"
#: templates/user/user-about.html:25
msgid "Admin Notes"
@@ -5044,7 +5136,7 @@ msgstr ""
#: templates/user/user-base.html:76
msgid "Rating:"
-msgstr ""
+msgstr "Rangiranje:"
#: templates/user/user-base.html:77
msgid "Volatility:"
@@ -5052,11 +5144,11 @@ msgstr ""
#: templates/user/user-base.html:78
msgid "Min. rating:"
-msgstr ""
+msgstr "Min. Rangiranje:"
#: templates/user/user-base.html:79
msgid "Max rating:"
-msgstr ""
+msgstr "Max Rangiranje:"
#: templates/user/user-problems.html:37
msgid "Points breakdown"
diff --git a/locale/sr_Latn/LC_MESSAGES/djangojs.po b/locale/sr_Latn/LC_MESSAGES/djangojs.po
index a06729d694..b40782332b 100644
--- a/locale/sr_Latn/LC_MESSAGES/djangojs.po
+++ b/locale/sr_Latn/LC_MESSAGES/djangojs.po
@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: dmoj\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-10-01 23:12+0000\n"
-"PO-Revision-Date: 2021-04-25 00:08\n"
+"PO-Revision-Date: 2021-07-23 00:29\n"
"Last-Translator: \n"
"Language-Team: Serbian (Latin)\n"
"Language: sr_CS\n"
diff --git a/locale/tr/LC_MESSAGES/django.po b/locale/tr/LC_MESSAGES/django.po
index acae66944a..1ebfdd42a2 100644
--- a/locale/tr/LC_MESSAGES/django.po
+++ b/locale/tr/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: dmoj\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-24 19:15+0000\n"
-"PO-Revision-Date: 2021-04-25 00:08\n"
+"POT-Creation-Date: 2021-06-17 01:38+0000\n"
+"PO-Revision-Date: 2021-07-07 00:28\n"
"Last-Translator: \n"
"Language-Team: Turkish\n"
"Language: tr_TR\n"
@@ -17,75 +17,75 @@ msgstr ""
"X-Crowdin-File: django.po\n"
"X-Crowdin-File-ID: 10\n"
-#: dmoj/settings.py:364
+#: dmoj/settings.py:365
msgid "Catalan"
msgstr ""
-#: dmoj/settings.py:365
+#: dmoj/settings.py:366
msgid "German"
msgstr ""
-#: dmoj/settings.py:366
+#: dmoj/settings.py:367
msgid "English"
msgstr ""
-#: dmoj/settings.py:367
+#: dmoj/settings.py:368
msgid "Spanish"
msgstr ""
-#: dmoj/settings.py:368
+#: dmoj/settings.py:369
msgid "French"
msgstr ""
-#: dmoj/settings.py:369
+#: dmoj/settings.py:370
msgid "Croatian"
msgstr ""
-#: dmoj/settings.py:370
+#: dmoj/settings.py:371
msgid "Hungarian"
msgstr ""
-#: dmoj/settings.py:371
+#: dmoj/settings.py:372
msgid "Japanese"
msgstr ""
-#: dmoj/settings.py:372
+#: dmoj/settings.py:373
msgid "Korean"
msgstr ""
-#: dmoj/settings.py:373
+#: dmoj/settings.py:374
msgid "Brazilian Portuguese"
msgstr ""
-#: dmoj/settings.py:374
+#: dmoj/settings.py:375
msgid "Romanian"
msgstr ""
-#: dmoj/settings.py:375
+#: dmoj/settings.py:376
msgid "Russian"
msgstr ""
-#: dmoj/settings.py:376
+#: dmoj/settings.py:377
msgid "Serbian (Latin)"
msgstr ""
-#: dmoj/settings.py:377
+#: dmoj/settings.py:378
msgid "Turkish"
msgstr ""
-#: dmoj/settings.py:378
+#: dmoj/settings.py:379
msgid "Vietnamese"
msgstr ""
-#: dmoj/settings.py:379
+#: dmoj/settings.py:380
msgid "Simplified Chinese"
msgstr ""
-#: dmoj/settings.py:380
+#: dmoj/settings.py:381
msgid "Traditional Chinese"
msgstr ""
-#: dmoj/urls.py:103 templates/base.html:190
+#: dmoj/urls.py:104 templates/base.html:190
msgid "Home"
msgstr "Ana sayfa"
@@ -115,112 +115,112 @@ msgstr "Yorumları göster"
msgid "Associated page"
msgstr "İlişkili sayfa"
-#: judge/admin/contest.py:31
+#: judge/admin/contest.py:32
msgid "Included contests"
msgstr "Yarışmalar"
-#: judge/admin/contest.py:65 templates/contest/contest.html:83
+#: judge/admin/contest.py:66 templates/contest/contest.html:83
#: templates/contest/moss.html:43 templates/problem/list.html:204
#: templates/problem/list.html:219 templates/user/user-problems.html:58
#: templates/user/user-problems.html:100
msgid "Problem"
msgstr ""
-#: judge/admin/contest.py:114
+#: judge/admin/contest.py:117
msgid "Settings"
msgstr ""
-#: judge/admin/contest.py:116
+#: judge/admin/contest.py:120
msgid "Scheduling"
msgstr "Planlama"
-#: judge/admin/contest.py:117
+#: judge/admin/contest.py:121
msgid "Details"
msgstr "Ayrıntılar"
-#: judge/admin/contest.py:118
+#: judge/admin/contest.py:122
msgid "Format"
msgstr ""
-#: judge/admin/contest.py:119 templates/contest/ranking-table.html:5
+#: judge/admin/contest.py:123 templates/contest/ranking-table.html:5
msgid "Rating"
msgstr "Derecelendirme"
-#: judge/admin/contest.py:120
+#: judge/admin/contest.py:124
msgid "Access"
msgstr ""
-#: judge/admin/contest.py:122 judge/admin/problem.py:134
+#: judge/admin/contest.py:126 judge/admin/problem.py:135
msgid "Justice"
msgstr "Demir yumruk"
-#: judge/admin/contest.py:211
+#: judge/admin/contest.py:215
#, python-format
msgid "%d contest successfully marked as visible."
msgid_plural "%d contests successfully marked as visible."
msgstr[0] ""
msgstr[1] ""
-#: judge/admin/contest.py:214
+#: judge/admin/contest.py:218
msgid "Mark contests as visible"
msgstr ""
-#: judge/admin/contest.py:220
+#: judge/admin/contest.py:224
#, python-format
msgid "%d contest successfully marked as hidden."
msgid_plural "%d contests successfully marked as hidden."
msgstr[0] ""
msgstr[1] ""
-#: judge/admin/contest.py:223
+#: judge/admin/contest.py:227
msgid "Mark contests as hidden"
msgstr ""
-#: judge/admin/contest.py:229
+#: judge/admin/contest.py:233
#, python-format
msgid "%d contest successfully locked."
msgid_plural "%d contests successfully locked."
msgstr[0] ""
msgstr[1] ""
-#: judge/admin/contest.py:232
+#: judge/admin/contest.py:236
msgid "Lock contest submissions"
msgstr ""
-#: judge/admin/contest.py:238
+#: judge/admin/contest.py:242
#, python-format
msgid "%d contest successfully unlocked."
msgid_plural "%d contests successfully unlocked."
msgstr[0] ""
msgstr[1] ""
-#: judge/admin/contest.py:241
+#: judge/admin/contest.py:245
msgid "Unlock contest submissions"
msgstr ""
-#: judge/admin/contest.py:262 judge/admin/submission.py:170
+#: judge/admin/contest.py:266 judge/admin/submission.py:170
#, python-format
msgid "%d submission was successfully scheduled for rejudging."
msgid_plural "%d submissions were successfully scheduled for rejudging."
msgstr[0] ""
msgstr[1] ""
-#: judge/admin/contest.py:337
+#: judge/admin/contest.py:341
#, python-format
msgid "%d participation recalculated."
msgid_plural "%d participations recalculated."
msgstr[0] ""
msgstr[1] ""
-#: judge/admin/contest.py:340
+#: judge/admin/contest.py:344
msgid "Recalculate results"
msgstr ""
-#: judge/admin/contest.py:344 judge/admin/organization.py:63
+#: judge/admin/contest.py:348 judge/admin/organization.py:63
msgid "username"
msgstr "kullanıcı adı"
-#: judge/admin/contest.py:349 templates/base.html:258
+#: judge/admin/contest.py:353 templates/base.html:258
msgid "virtual"
msgstr "sanal"
@@ -236,9 +236,9 @@ msgstr "İçerik"
msgid "Summary"
msgstr "Özet"
-#: judge/admin/interface.py:113 judge/models/contest.py:383
-#: judge/models/contest.py:509 judge/models/profile.py:244
-#: judge/models/profile.py:268
+#: judge/admin/interface.py:113 judge/models/contest.py:419
+#: judge/models/contest.py:546 judge/models/profile.py:261
+#: judge/models/profile.py:292
msgid "user"
msgstr "kullanıcı"
@@ -246,8 +246,8 @@ msgstr "kullanıcı"
msgid "object"
msgstr ""
-#: judge/admin/organization.py:32 judge/admin/problem.py:181
-#: judge/admin/profile.py:82
+#: judge/admin/organization.py:32 judge/admin/problem.py:182
+#: judge/admin/profile.py:92
msgid "View on site"
msgstr "Sitede görüntüle"
@@ -255,69 +255,69 @@ msgstr "Sitede görüntüle"
msgid "Describe the changes you made (optional)"
msgstr "Yaptığın değişiklikleri özetle (isteğe bağlı)"
-#: judge/admin/problem.py:129
+#: judge/admin/problem.py:130
msgid "Social Media"
msgstr "Sosyal Medya"
-#: judge/admin/problem.py:130
+#: judge/admin/problem.py:131
msgid "Taxonomy"
msgstr "Tasnif"
-#: judge/admin/problem.py:131 templates/contest/contest.html:84
+#: judge/admin/problem.py:132 templates/contest/contest.html:84
#: templates/problem/data.html:385 templates/problem/list.html:209
#: templates/problem/list.html:230 templates/user/base-users-table.html:10
#: templates/user/user-problems.html:60
msgid "Points"
msgstr "Puanlar"
-#: judge/admin/problem.py:132
+#: judge/admin/problem.py:133
msgid "Limits"
msgstr "Sınırlar"
-#: judge/admin/problem.py:133 judge/admin/submission.py:238
-#: templates/stats/base.html:14 templates/submission/list.html:320
-#: templates/user/edit-profile.html:292
+#: judge/admin/problem.py:134 judge/admin/submission.py:238
+#: templates/stats/base.html:14 templates/submission/list.html:319
+#: templates/user/edit-profile.html:296
msgid "Language"
msgstr "Dil"
-#: judge/admin/problem.py:135
+#: judge/admin/problem.py:136
msgid "History"
msgstr "Geçmiş"
-#: judge/admin/problem.py:178
+#: judge/admin/problem.py:179
msgid "Authors"
msgstr "Yazarlar"
-#: judge/admin/problem.py:191
+#: judge/admin/problem.py:192
#, python-format
msgid "%d problem's publish date successfully updated."
msgid_plural "%d problems' publish date successfully updated."
msgstr[0] ""
msgstr[1] ""
-#: judge/admin/problem.py:195
+#: judge/admin/problem.py:196
msgid "Set publish date to now"
msgstr ""
-#: judge/admin/problem.py:201
+#: judge/admin/problem.py:202
#, python-format
msgid "%d problem successfully marked as public."
msgid_plural "%d problems successfully marked as public."
msgstr[0] "%d problem herkese açık olarak işaretlendi."
msgstr[1] "%d problem herkese açık olarak işaretlendi."
-#: judge/admin/problem.py:205
+#: judge/admin/problem.py:206
msgid "Mark problems as public"
msgstr "Problemleri herkese aç"
-#: judge/admin/problem.py:211
+#: judge/admin/problem.py:212
#, python-format
msgid "%d problem successfully marked as private."
msgid_plural "%d problems successfully marked as private."
msgstr[0] "%d problem gizli olarak işaretlendi."
msgstr[1] "%d problem gizli olarak işaretlendi."
-#: judge/admin/problem.py:215
+#: judge/admin/problem.py:216
msgid "Mark problems as private"
msgstr "Problemleri gizle"
@@ -325,35 +325,35 @@ msgstr "Problemleri gizle"
msgid "timezone"
msgstr "saat dilimi"
-#: judge/admin/profile.py:88 judge/admin/submission.py:217
+#: judge/admin/profile.py:98 judge/admin/submission.py:217
#: templates/organization/requests/log.html:9
#: templates/organization/requests/pending.html:12
#: templates/ticket/list.html:261
msgid "User"
msgstr "Kullanıcı"
-#: judge/admin/profile.py:93 templates/registration/registration_form.html:143
+#: judge/admin/profile.py:103 templates/registration/registration_form.html:143
msgid "Email"
msgstr "E-posta"
-#: judge/admin/profile.py:98 judge/views/register.py:29
+#: judge/admin/profile.py:108 judge/views/register.py:28
#: templates/registration/registration_form.html:171
-#: templates/user/edit-profile.html:288
+#: templates/user/edit-profile.html:292
msgid "Timezone"
msgstr "Saat dilimi"
-#: judge/admin/profile.py:103
+#: judge/admin/profile.py:113
msgid "date joined"
msgstr "kayıt tarihi"
-#: judge/admin/profile.py:110
+#: judge/admin/profile.py:120
#, python-format
msgid "%d user have scores recalculated."
msgid_plural "%d users have scores recalculated."
msgstr[0] "%d kullanıcının puanları yeniden hesaplandı."
msgstr[1] "%d kullanıcının puanları yeniden hesaplandı."
-#: judge/admin/profile.py:113
+#: judge/admin/profile.py:123
msgid "Recalculate scores"
msgstr "Puanları yeniden hesapla"
@@ -506,115 +506,116 @@ msgstr ""
msgid "IOI (pre-2016)"
msgstr ""
-#: judge/forms.py:26
-msgid "Two-factor authentication tokens must be 6 decimal digits."
+#: judge/forms.py:27
+#, python-brace-format
+msgid "Two-factor authentication tokens must be {TOTP_CODE_LENGTH} decimal digits."
msgstr ""
-#: judge/forms.py:29
+#: judge/forms.py:30
msgid "Invalid two-factor authentication token."
msgstr ""
-#: judge/forms.py:32
+#: judge/forms.py:33
msgid "Scratch codes must be 16 base32 characters."
msgstr ""
-#: judge/forms.py:34
+#: judge/forms.py:35 judge/forms.py:264
msgid "Invalid scratch code."
msgstr ""
-#: judge/forms.py:45
+#: judge/forms.py:46
msgid "Subscribe to contest updates"
msgstr "Yarışma güncellemelerine abone ol"
-#: judge/forms.py:46
+#: judge/forms.py:47
msgid "Enable experimental features"
msgstr "Deneysel özellikleri aç"
-#: judge/forms.py:71
+#: judge/forms.py:72
msgid "You must solve at least one problem before you can update your profile."
msgstr ""
-#: judge/forms.py:80 judge/views/organization.py:127
+#: judge/forms.py:81 judge/views/organization.py:126
#, python-brace-format
msgid "You may not be part of more than {count} public organizations."
msgstr "{count} açık organizasyondan daha fazlasına üye olamazsın."
-#: judge/forms.py:96
+#: judge/forms.py:97
msgid "Download comments?"
msgstr ""
-#: judge/forms.py:97
+#: judge/forms.py:98
msgid "Download submissions?"
msgstr ""
-#: judge/forms.py:98
+#: judge/forms.py:99
msgid "Filter by problem code glob:"
msgstr ""
-#: judge/forms.py:102
+#: judge/forms.py:103
msgid "Leave empty to include all submissions"
msgstr ""
-#: judge/forms.py:105 templates/problem/manage_submission.html:142
+#: judge/forms.py:106 templates/problem/manage_submission.html:142
msgid "Filter by result:"
msgstr ""
-#: judge/forms.py:111
+#: judge/forms.py:112
msgid "Please select at least one thing to download."
msgstr ""
-#: judge/forms.py:137
+#: judge/forms.py:138
msgid "Any judge"
msgstr ""
-#: judge/forms.py:167 judge/views/register.py:26
+#: judge/forms.py:159 judge/views/register.py:25
#: templates/registration/registration_form.html:137
#: templates/user/base-users-table.html:5
msgid "Username"
msgstr "Kullanıcı Adı"
-#: judge/forms.py:168 templates/registration/registration_form.html:149
+#: judge/forms.py:160 templates/registration/registration_form.html:149
#: templates/registration/registration_form.html:163
msgid "Password"
msgstr "Şifre"
-#: judge/forms.py:201
+#: judge/forms.py:192
msgid "Invalid code length."
msgstr ""
-#: judge/forms.py:219
+#: judge/forms.py:223
msgid "Invalid WebAuthn response."
msgstr ""
-#: judge/forms.py:222
+#: judge/forms.py:226
msgid "No WebAuthn challenge issued."
msgstr ""
-#: judge/forms.py:228
+#: judge/forms.py:232
msgid "Invalid WebAuthn credential ID."
msgstr ""
-#: judge/forms.py:257
+#: judge/forms.py:262
msgid "Invalid two-factor authentication token or scratch code."
msgstr ""
-#: judge/forms.py:259
+#: judge/forms.py:266
msgid "Must specify either totp_token or webauthn_response."
msgstr ""
-#: judge/forms.py:263 judge/models/problem.py:105
+#: judge/forms.py:270 judge/models/problem.py:119
msgid "Problem code must be ^[a-z0-9]+$"
msgstr "Problem kodu ^[a-z0-9]+$ olmalıdır"
-#: judge/forms.py:268
+#: judge/forms.py:275
msgid "Problem with code already exists."
msgstr ""
-#: judge/forms.py:273 judge/models/contest.py:66
+#: judge/forms.py:280 judge/models/contest.py:66
msgid "Contest id must be ^[a-z0-9]+$"
msgstr "Yarışma ID'si ^[a-z0-9]+$ olmalıdır"
-#: judge/forms.py:278
+#: judge/forms.py:285
msgid "Contest with key already exists."
msgstr ""
@@ -694,7 +695,7 @@ msgid "comments"
msgstr "yorumlar"
#: judge/models/comment.py:89 judge/models/comment.py:141
-#: judge/models/problem.py:484
+#: judge/models/problem.py:511
#, python-format
msgid "Editorial for %s"
msgstr "%s problemi için editorial"
@@ -735,7 +736,7 @@ msgstr "etiket tanımı"
msgid "contest tag"
msgstr "yarışma etiketi"
-#: judge/models/contest.py:53 judge/models/contest.py:117
+#: judge/models/contest.py:53 judge/models/contest.py:126
msgid "contest tags"
msgstr "yarışma etiketleri"
@@ -760,410 +761,426 @@ msgid "contest name"
msgstr "yarışma adı"
#: judge/models/contest.py:68
-msgid "These people will be able to edit the contest."
-msgstr "Bu kişiler yarışmayı düzenleyebilecekler."
+msgid "These users will be able to edit the contest."
+msgstr ""
+
+#: judge/models/contest.py:70
+msgid "These users will be able to edit the contest, but will not be listed as authors."
+msgstr ""
-#: judge/models/contest.py:70 judge/models/runtime.py:136
+#: judge/models/contest.py:73
+msgid "These users will be able to view the contest, but not edit it."
+msgstr ""
+
+#: judge/models/contest.py:76 judge/models/runtime.py:136
msgid "description"
msgstr "Tanım"
-#: judge/models/contest.py:71 judge/models/problem.py:431
+#: judge/models/contest.py:77 judge/models/problem.py:458
#: judge/models/runtime.py:138
msgid "problems"
msgstr "problemler"
-#: judge/models/contest.py:72 judge/models/contest.py:384
+#: judge/models/contest.py:78 judge/models/contest.py:420
msgid "start time"
msgstr "başlangıç"
-#: judge/models/contest.py:73
+#: judge/models/contest.py:79
msgid "end time"
msgstr "bitiş"
-#: judge/models/contest.py:74 judge/models/problem.py:126
-#: judge/models/problem.py:455
+#: judge/models/contest.py:80 judge/models/problem.py:140
+#: judge/models/problem.py:482
msgid "time limit"
msgstr "zaman sınırı"
-#: judge/models/contest.py:75 judge/models/problem.py:144
+#: judge/models/contest.py:81 judge/models/problem.py:158
msgid "publicly visible"
msgstr "herkese açık"
-#: judge/models/contest.py:76
+#: judge/models/contest.py:82
msgid "Should be set even for organization-private contests, where it determines whether the contest is visible to members of the specified organizations."
msgstr "Organizasyona özel yarışmalar için de açılmalıdır. Eğer bir yarışma organizasyona özel ise bu seçenek yarışmanın üyelere açılıp açılmayacağını belirler."
-#: judge/models/contest.py:79
+#: judge/models/contest.py:85
msgid "contest rated"
msgstr "dereceli yarışma"
-#: judge/models/contest.py:79
+#: judge/models/contest.py:85
msgid "Whether this contest can be rated."
msgstr "Bu yarışma derecelendirilebilir mi?"
-#: judge/models/contest.py:81
+#: judge/models/contest.py:87
msgid "view contest scoreboard"
msgstr ""
-#: judge/models/contest.py:83
+#: judge/models/contest.py:89
msgid "These users will be able to view the scoreboard."
msgstr ""
-#: judge/models/contest.py:84
+#: judge/models/contest.py:90
msgid "scoreboard visibility"
msgstr ""
-#: judge/models/contest.py:85
+#: judge/models/contest.py:91
msgid "Scoreboard visibility through the duration of the contest"
msgstr ""
-#: judge/models/contest.py:87
+#: judge/models/contest.py:93
msgid "no comments"
msgstr "yorum yok"
-#: judge/models/contest.py:88
+#: judge/models/contest.py:94
msgid "Use clarification system instead of comments."
msgstr "Yorumlar yerine açıklama sistemini kullanın."
-#: judge/models/contest.py:90
+#: judge/models/contest.py:96
msgid "Rating floor for contest"
msgstr ""
-#: judge/models/contest.py:92
+#: judge/models/contest.py:98
msgid "Rating ceiling for contest"
msgstr ""
-#: judge/models/contest.py:94
+#: judge/models/contest.py:100
msgid "rate all"
msgstr "herkesi derecelendir"
-#: judge/models/contest.py:94
+#: judge/models/contest.py:100
msgid "Rate all users who joined."
msgstr "Katılan tüm kullanıcıları derecelendir"
-#: judge/models/contest.py:95
+#: judge/models/contest.py:101
msgid "exclude from ratings"
msgstr "derecelendirme dışı kullanıcılar"
-#: judge/models/contest.py:97
+#: judge/models/contest.py:103
msgid "private to specific users"
msgstr ""
-#: judge/models/contest.py:98
+#: judge/models/contest.py:104
msgid "private contestants"
msgstr ""
-#: judge/models/contest.py:99
+#: judge/models/contest.py:105
msgid "If private, only these users may see the contest"
msgstr ""
-#: judge/models/contest.py:101
+#: judge/models/contest.py:107
msgid "hide problem tags"
msgstr "problem etiketlerini gizle"
-#: judge/models/contest.py:102
+#: judge/models/contest.py:108
msgid "Whether problem tags should be hidden by default."
msgstr "Problem etiketleri varsayılan olarak gizli olmalı mı?"
-#: judge/models/contest.py:104
+#: judge/models/contest.py:110
+msgid "hide problem authors"
+msgstr ""
+
+#: judge/models/contest.py:111
+msgid "Whether problem authors should be hidden by default."
+msgstr ""
+
+#: judge/models/contest.py:113
msgid "run pretests only"
msgstr "yalnızca ön testleri çalıştır"
-#: judge/models/contest.py:105
+#: judge/models/contest.py:114
msgid "Whether judges should grade pretests only, versus all testcases. Commonly set during a contest, then unset prior to rejudging user submissions when the contest ends."
msgstr "Judge'lar yalnızca ön testleri mi çalıştırmalı? Bu seçenek genellikle yarışma sırasında açılır, yarışma bittiğinde kapatılır ve çözümler yeniden puanlanır."
-#: judge/models/contest.py:109 judge/models/problem.py:166
+#: judge/models/contest.py:118 judge/models/problem.py:183
msgid "private to organizations"
msgstr "organizasyonlara özel"
-#: judge/models/contest.py:110 judge/models/problem.py:164
-#: judge/models/profile.py:83
+#: judge/models/contest.py:119 judge/models/problem.py:181
+#: judge/models/profile.py:86
msgid "organizations"
msgstr "organizasyonlar"
-#: judge/models/contest.py:111
+#: judge/models/contest.py:120
msgid "If private, only these organizations may see the contest"
msgstr "Özel ise, sadece bu organizasyonlar yarışmayı görebilirler"
-#: judge/models/contest.py:112 judge/models/problem.py:153
+#: judge/models/contest.py:121 judge/models/problem.py:167
msgid "OpenGraph image"
msgstr "OpenGraph resmi"
-#: judge/models/contest.py:113 judge/models/profile.py:54
+#: judge/models/contest.py:122 judge/models/profile.py:57
msgid "Logo override image"
msgstr ""
-#: judge/models/contest.py:115
+#: judge/models/contest.py:124
msgid "This image will replace the default site logo for users inside the contest."
msgstr ""
-#: judge/models/contest.py:118
+#: judge/models/contest.py:127
msgid "the amount of live participants"
msgstr "anlık katılımcı sayısı"
-#: judge/models/contest.py:119
+#: judge/models/contest.py:128
msgid "contest summary"
msgstr "yarışma özeti"
-#: judge/models/contest.py:120 judge/models/problem.py:155
+#: judge/models/contest.py:129 judge/models/problem.py:169
msgid "Plain-text, shown in meta description tag, e.g. for social media."
msgstr "Düz yazı, sosyal medya vb. için \"meta description\" tag'inde görünecektir."
-#: judge/models/contest.py:121 judge/models/profile.py:53
+#: judge/models/contest.py:130 judge/models/profile.py:56
msgid "access code"
msgstr "erişim kodu"
-#: judge/models/contest.py:122
+#: judge/models/contest.py:131
msgid "An optional code to prompt contestants before they are allowed to join the contest. Leave it blank to disable."
msgstr "Yarışmaya katılabilmek için girilmesi gereken, isteğe bağlı bir kod. Boş bırakılırsa devre dışı kalır."
-#: judge/models/contest.py:124 judge/models/problem.py:149
+#: judge/models/contest.py:133 judge/models/problem.py:163
msgid "personae non gratae"
msgstr "istenmeyen kişiler"
-#: judge/models/contest.py:125
+#: judge/models/contest.py:134
msgid "Bans the selected users from joining this contest."
msgstr ""
-#: judge/models/contest.py:126
+#: judge/models/contest.py:135
msgid "contest format"
msgstr ""
-#: judge/models/contest.py:127
+#: judge/models/contest.py:136
msgid "The contest format module to use."
msgstr ""
-#: judge/models/contest.py:128
+#: judge/models/contest.py:137
msgid "contest format configuration"
msgstr ""
-#: judge/models/contest.py:129
+#: judge/models/contest.py:138
msgid "A JSON object to serve as the configuration for the chosen contest format module. Leave empty to use None. Exact format depends on the contest format selected."
msgstr ""
-#: judge/models/contest.py:136
+#: judge/models/contest.py:145
msgid "contest lock"
msgstr ""
-#: judge/models/contest.py:137
-msgid "Prevent submissions from this contest from being rejudged."
+#: judge/models/contest.py:146
+msgid "Prevent submissions from this contest from being rejudged after this date."
msgstr ""
-#: judge/models/contest.py:138
+#: judge/models/contest.py:148
msgid "precision points"
msgstr ""
-#: judge/models/contest.py:140
+#: judge/models/contest.py:150
msgid "Number of digits to round points to."
msgstr ""
-#: judge/models/contest.py:362
+#: judge/models/contest.py:398
msgid "See private contests"
msgstr "Özel yarışmaları gör"
-#: judge/models/contest.py:363
+#: judge/models/contest.py:399
msgid "Edit own contests"
msgstr "Kendi yarışmalarını düzenle"
-#: judge/models/contest.py:364
+#: judge/models/contest.py:400
msgid "Edit all contests"
msgstr "Tüm yarışmaları düzenle"
-#: judge/models/contest.py:365
+#: judge/models/contest.py:401
msgid "Clone contest"
msgstr ""
-#: judge/models/contest.py:366 templates/contest/moss.html:74
+#: judge/models/contest.py:402 templates/contest/moss.html:74
msgid "MOSS contest"
msgstr ""
-#: judge/models/contest.py:367
+#: judge/models/contest.py:403
msgid "Rate contests"
msgstr "Yarışmaları derecelendir"
-#: judge/models/contest.py:368
+#: judge/models/contest.py:404
msgid "Contest access codes"
msgstr "Yarışma erişim kodları"
-#: judge/models/contest.py:369
+#: judge/models/contest.py:405
msgid "Create private contests"
msgstr ""
-#: judge/models/contest.py:370
+#: judge/models/contest.py:406
msgid "Change contest visibility"
msgstr ""
-#: judge/models/contest.py:371
+#: judge/models/contest.py:407
msgid "Edit contest problem label script"
msgstr ""
-#: judge/models/contest.py:372
+#: judge/models/contest.py:408
msgid "Change lock status of contest"
msgstr ""
-#: judge/models/contest.py:374 judge/models/contest.py:472
-#: judge/models/contest.py:510 judge/models/contest.py:532
-#: judge/models/submission.py:84
+#: judge/models/contest.py:410 judge/models/contest.py:508
+#: judge/models/contest.py:547 judge/models/contest.py:569
+#: judge/models/submission.py:85
msgid "contest"
msgstr "yarışma"
-#: judge/models/contest.py:375
+#: judge/models/contest.py:411
msgid "contests"
msgstr "yarışmalar"
-#: judge/models/contest.py:382
+#: judge/models/contest.py:418
msgid "associated contest"
msgstr "ilişkili yarışma"
-#: judge/models/contest.py:385
+#: judge/models/contest.py:421
msgid "score"
msgstr "puan"
-#: judge/models/contest.py:386
+#: judge/models/contest.py:422
msgid "cumulative time"
msgstr "kümülatif süre"
-#: judge/models/contest.py:387
+#: judge/models/contest.py:423
msgid "is disqualified"
msgstr ""
-#: judge/models/contest.py:388
+#: judge/models/contest.py:424
msgid "Whether this participation is disqualified."
msgstr ""
-#: judge/models/contest.py:389
+#: judge/models/contest.py:425
msgid "tie-breaking field"
msgstr ""
-#: judge/models/contest.py:390
+#: judge/models/contest.py:426
msgid "virtual participation id"
msgstr "sanal katılım ID'si"
-#: judge/models/contest.py:391
+#: judge/models/contest.py:427
msgid "0 means non-virtual, otherwise the n-th virtual participation."
msgstr ""
-#: judge/models/contest.py:392
+#: judge/models/contest.py:428
msgid "contest format specific data"
msgstr ""
-#: judge/models/contest.py:458
+#: judge/models/contest.py:494
#, python-format
msgid "%s spectating in %s"
msgstr "%s, \"%s\" yarışmasında gözlemci"
-#: judge/models/contest.py:460
+#: judge/models/contest.py:496
#, python-format
msgid "%s in %s, v%d"
msgstr "%s, \"%s\" yarışmasında, sanal: %d"
-#: judge/models/contest.py:461
+#: judge/models/contest.py:497
#, python-format
msgid "%s in %s"
msgstr "%s, \"%s\" yarışmasında"
-#: judge/models/contest.py:464
+#: judge/models/contest.py:500
msgid "contest participation"
msgstr "yarışma katılımı"
-#: judge/models/contest.py:465
+#: judge/models/contest.py:501
msgid "contest participations"
msgstr "yarışma katılımı"
-#: judge/models/contest.py:471 judge/models/contest.py:494
-#: judge/models/contest.py:533 judge/models/problem.py:430
-#: judge/models/problem.py:435 judge/models/problem.py:453
+#: judge/models/contest.py:507 judge/models/contest.py:531
+#: judge/models/contest.py:570 judge/models/problem.py:457
+#: judge/models/problem.py:462 judge/models/problem.py:480
#: judge/models/problem_data.py:35
msgid "problem"
msgstr ""
-#: judge/models/contest.py:473 judge/models/contest.py:498
-#: judge/models/problem.py:137
+#: judge/models/contest.py:509 judge/models/contest.py:535
+#: judge/models/problem.py:151
msgid "points"
msgstr "puan"
-#: judge/models/contest.py:474
+#: judge/models/contest.py:510
msgid "partial"
msgstr "kısmi"
-#: judge/models/contest.py:475 judge/models/contest.py:499
+#: judge/models/contest.py:511 judge/models/contest.py:536
msgid "is pretested"
msgstr "ön testli"
-#: judge/models/contest.py:476 judge/models/interface.py:43
+#: judge/models/contest.py:512 judge/models/interface.py:43
msgid "order"
msgstr "sıra"
-#: judge/models/contest.py:477
+#: judge/models/contest.py:513
msgid "output prefix length override"
msgstr ""
-#: judge/models/contest.py:479
+#: judge/models/contest.py:515
msgid "Maximum number of submissions for this problem, or leave blank for no limit."
msgstr ""
-#: judge/models/contest.py:482
+#: judge/models/contest.py:518
msgid "Why include a problem you can't submit to?"
msgstr "Neden çözüm gönderemediğin bir problemi ekleyesin ki?"
-#: judge/models/contest.py:487
+#: judge/models/contest.py:523
msgid "contest problem"
msgstr "yarışma problemi"
-#: judge/models/contest.py:488
+#: judge/models/contest.py:524
msgid "contest problems"
msgstr "yarışma problemleri"
-#: judge/models/contest.py:492 judge/models/submission.py:207
+#: judge/models/contest.py:529 judge/models/submission.py:218
msgid "submission"
msgstr "çözüm"
-#: judge/models/contest.py:496 judge/models/contest.py:511
+#: judge/models/contest.py:533 judge/models/contest.py:548
msgid "participation"
msgstr "katılım"
-#: judge/models/contest.py:500
+#: judge/models/contest.py:537
msgid "Whether this submission was ran only on pretests."
msgstr "Bu çözüm yalnızca pretest'lerde mi çalıştı?"
-#: judge/models/contest.py:504
+#: judge/models/contest.py:541
msgid "contest submission"
msgstr "yarışma çözümü"
-#: judge/models/contest.py:505
+#: judge/models/contest.py:542
msgid "contest submissions"
msgstr "yarışma çözümleri"
-#: judge/models/contest.py:513
+#: judge/models/contest.py:550
msgid "rank"
msgstr "sıralama"
-#: judge/models/contest.py:514
+#: judge/models/contest.py:551
msgid "rating"
msgstr "derece"
-#: judge/models/contest.py:515
+#: judge/models/contest.py:552
msgid "volatility"
msgstr "değişkenlik"
-#: judge/models/contest.py:516
+#: judge/models/contest.py:553
msgid "last rated"
msgstr "son derecelendirme"
-#: judge/models/contest.py:520
+#: judge/models/contest.py:557
msgid "contest rating"
msgstr "yarışma derecesi"
-#: judge/models/contest.py:521
+#: judge/models/contest.py:558
msgid "contest ratings"
msgstr "yarışma derecesi"
-#: judge/models/contest.py:540
+#: judge/models/contest.py:577
msgid "contest moss result"
msgstr ""
-#: judge/models/contest.py:541
+#: judge/models/contest.py:578
msgid "contest moss results"
msgstr ""
@@ -1203,7 +1220,7 @@ msgstr "üst nesne"
msgid "post title"
msgstr "gönderi başlığı"
-#: judge/models/interface.py:67 judge/models/problem.py:473
+#: judge/models/interface.py:67 judge/models/problem.py:500
msgid "authors"
msgstr "yazarlar"
@@ -1211,7 +1228,7 @@ msgstr "yazarlar"
msgid "slug"
msgstr ""
-#: judge/models/interface.py:69 judge/models/problem.py:471
+#: judge/models/interface.py:69 judge/models/problem.py:498
msgid "public visibility"
msgstr "halka açık mı?"
@@ -1247,34 +1264,6 @@ msgstr "blog gönderisi"
msgid "blog posts"
msgstr "blog gönderisi"
-#: judge/models/message.py:11
-msgid "message title"
-msgstr "mesaj başlığı"
-
-#: judge/models/message.py:12 judge/models/ticket.py:30
-msgid "message body"
-msgstr "mesaj içeriği"
-
-#: judge/models/message.py:13
-msgid "sender"
-msgstr "gönderici"
-
-#: judge/models/message.py:14
-msgid "target"
-msgstr "alıcı"
-
-#: judge/models/message.py:15
-msgid "message timestamp"
-msgstr "mesaj zaman damgası(timestamp)"
-
-#: judge/models/message.py:16
-msgid "read"
-msgstr "okundu"
-
-#: judge/models/message.py:20
-msgid "messages in the thread"
-msgstr "konudaki mesajlar"
-
#: judge/models/problem.py:30
#, python-format
msgid "Disallowed characters: %(value)s"
@@ -1292,7 +1281,7 @@ msgstr "problem kategorisi adı"
msgid "problem type"
msgstr "problem tipi"
-#: judge/models/problem.py:44 judge/models/problem.py:121
+#: judge/models/problem.py:44 judge/models/problem.py:135
msgid "problem types"
msgstr "problem tipleri"
@@ -1304,7 +1293,7 @@ msgstr "problem grup ID'si"
msgid "problem group name"
msgstr "problem grubu adı"
-#: judge/models/problem.py:56 judge/models/problem.py:124
+#: judge/models/problem.py:56 judge/models/problem.py:138
msgid "problem group"
msgstr "problem grubu"
@@ -1324,7 +1313,7 @@ msgstr ""
msgid "full name"
msgstr "Tam ad"
-#: judge/models/problem.py:65 judge/models/profile.py:41
+#: judge/models/problem.py:65 judge/models/profile.py:44
#: judge/models/runtime.py:24
msgid "short name"
msgstr "Kısa ad"
@@ -1353,232 +1342,252 @@ msgstr "lisans"
msgid "licenses"
msgstr "lisans"
-#: judge/models/problem.py:104
+#: judge/models/problem.py:112
+msgid "Follow global setting"
+msgstr ""
+
+#: judge/models/problem.py:113
+msgid "Always visible"
+msgstr ""
+
+#: judge/models/problem.py:114
+msgid "Visible if problem solved"
+msgstr ""
+
+#: judge/models/problem.py:115
+msgid "Only own submissions"
+msgstr ""
+
+#: judge/models/problem.py:118
msgid "problem code"
msgstr "problem kodu"
-#: judge/models/problem.py:106
+#: judge/models/problem.py:120
msgid "A short, unique code for the problem, used in the url after /problem/"
msgstr ""
-#: judge/models/problem.py:108
+#: judge/models/problem.py:122
msgid "problem name"
msgstr "problem adı"
-#: judge/models/problem.py:109
+#: judge/models/problem.py:123
msgid "The full name of the problem, as shown in the problem list."
msgstr ""
-#: judge/models/problem.py:111
+#: judge/models/problem.py:125
msgid "problem body"
msgstr "problem içeriği"
-#: judge/models/problem.py:112
+#: judge/models/problem.py:126
msgid "creators"
msgstr "yaratıcılar"
-#: judge/models/problem.py:113
+#: judge/models/problem.py:127
msgid "These users will be able to edit the problem, and be listed as authors."
msgstr ""
-#: judge/models/problem.py:115
+#: judge/models/problem.py:129
msgid "curators"
msgstr "küratörler"
-#: judge/models/problem.py:116
+#: judge/models/problem.py:130
msgid "These users will be able to edit the problem, but not be listed as authors."
msgstr ""
-#: judge/models/problem.py:118
+#: judge/models/problem.py:132
msgid "testers"
msgstr "testçiler"
-#: judge/models/problem.py:120
+#: judge/models/problem.py:134
msgid "These users will be able to view the private problem, but not edit it."
msgstr ""
-#: judge/models/problem.py:122
+#: judge/models/problem.py:136
msgid "The type of problem, as shown on the problem's page."
msgstr ""
-#: judge/models/problem.py:125
+#: judge/models/problem.py:139
msgid "The group of problem, shown under Category in the problem list."
msgstr ""
-#: judge/models/problem.py:127
+#: judge/models/problem.py:141
msgid "The time limit for this problem, in seconds. Fractional seconds (e.g. 1.5) are supported."
msgstr "Bu problem için saniye cinsinden zaman sınırı. Küsuratlı saniyeler(örn. 1.5) desteklenmektedir."
-#: judge/models/problem.py:131 judge/models/problem.py:458
+#: judge/models/problem.py:145 judge/models/problem.py:485
msgid "memory limit"
msgstr "bellek sınırı"
-#: judge/models/problem.py:132
+#: judge/models/problem.py:146
msgid "The memory limit for this problem, in kilobytes (e.g. 64mb = 65536 kilobytes)."
msgstr "Bu problem için kilobayt cinsinden hafıza sınırı. (örn. 64MB = 65536 KB)"
-#: judge/models/problem.py:138
+#: judge/models/problem.py:152
msgid "Points awarded for problem completion. Points are displayed with a 'p' suffix if partial."
msgstr ""
-#: judge/models/problem.py:141
+#: judge/models/problem.py:155
msgid "allows partial points"
msgstr "kısmi puanlama yapılabilir"
-#: judge/models/problem.py:142
+#: judge/models/problem.py:156
msgid "allowed languages"
msgstr "izin verilen diller"
-#: judge/models/problem.py:143
+#: judge/models/problem.py:157
msgid "List of allowed submission languages."
msgstr ""
-#: judge/models/problem.py:145
+#: judge/models/problem.py:159
msgid "manually managed"
msgstr "elle yönetilir"
-#: judge/models/problem.py:146
+#: judge/models/problem.py:160
msgid "Whether judges should be allowed to manage data or not."
msgstr ""
-#: judge/models/problem.py:147
+#: judge/models/problem.py:161
msgid "date of publishing"
msgstr "yayınlama tarihi"
-#: judge/models/problem.py:148
+#: judge/models/problem.py:162
msgid "Doesn't have magic ability to auto-publish due to backward compatibility"
msgstr "Geri uyumluluk sorunundan dolayı oto-yayınlama büyüsü yapılamamaktadır"
-#: judge/models/problem.py:150
+#: judge/models/problem.py:164
msgid "Bans the selected users from submitting to this problem."
msgstr ""
-#: judge/models/problem.py:152
+#: judge/models/problem.py:166
msgid "The license under which this problem is published."
msgstr ""
-#: judge/models/problem.py:154
+#: judge/models/problem.py:168
msgid "problem summary"
msgstr "problem özeti"
-#: judge/models/problem.py:156
+#: judge/models/problem.py:170
msgid "number of users"
msgstr ""
-#: judge/models/problem.py:157
+#: judge/models/problem.py:171
msgid "The number of users who solved the problem."
msgstr ""
-#: judge/models/problem.py:158
+#: judge/models/problem.py:172
msgid "solve rate"
msgstr ""
-#: judge/models/problem.py:159
+#: judge/models/problem.py:173
msgid "allow full markdown access"
msgstr ""
-#: judge/models/problem.py:165
+#: judge/models/problem.py:174
+msgid "submission source visibility"
+msgstr ""
+
+#: judge/models/problem.py:182
msgid "If private, only these organizations may see the problem."
msgstr ""
-#: judge/models/problem.py:420
+#: judge/models/problem.py:447
msgid "See hidden problems"
msgstr ""
-#: judge/models/problem.py:421
+#: judge/models/problem.py:448
msgid "Edit own problems"
msgstr ""
-#: judge/models/problem.py:422
+#: judge/models/problem.py:449
msgid "Edit all problems"
msgstr ""
-#: judge/models/problem.py:423
+#: judge/models/problem.py:450
msgid "Edit all public problems"
msgstr ""
-#: judge/models/problem.py:424
+#: judge/models/problem.py:451
msgid "Edit problems with full markup"
msgstr ""
-#: judge/models/problem.py:425 templates/problem/problem.html:161
+#: judge/models/problem.py:452 templates/problem/problem.html:161
msgid "Clone problem"
msgstr "Soruyu çoğalt"
-#: judge/models/problem.py:426
+#: judge/models/problem.py:453
msgid "Change is_public field"
msgstr ""
-#: judge/models/problem.py:427
+#: judge/models/problem.py:454
msgid "Change is_manually_managed field"
msgstr ""
-#: judge/models/problem.py:428
+#: judge/models/problem.py:455
msgid "See organization-private problems"
msgstr ""
-#: judge/models/problem.py:436 judge/models/problem.py:454
+#: judge/models/problem.py:463 judge/models/problem.py:481
#: judge/models/runtime.py:111
msgid "language"
msgstr "dil"
-#: judge/models/problem.py:437
+#: judge/models/problem.py:464
msgid "translated name"
msgstr "çevrilmiş ad"
-#: judge/models/problem.py:438
+#: judge/models/problem.py:465
msgid "translated description"
msgstr "çevrilmiş tanım"
-#: judge/models/problem.py:442
+#: judge/models/problem.py:469
msgid "problem translation"
msgstr "problem çevirisi"
-#: judge/models/problem.py:443
+#: judge/models/problem.py:470
msgid "problem translations"
msgstr "problem çevirisi"
-#: judge/models/problem.py:447
+#: judge/models/problem.py:474
msgid "clarified problem"
msgstr "açıklık getirilmiş problem"
-#: judge/models/problem.py:448
+#: judge/models/problem.py:475
msgid "clarification body"
msgstr "açıklama içeriği"
-#: judge/models/problem.py:449
+#: judge/models/problem.py:476
msgid "clarification timestamp"
msgstr "açıklama zaman damgası(timestamp)"
-#: judge/models/problem.py:464
+#: judge/models/problem.py:491
msgid "language-specific resource limit"
msgstr "Dile özel kaynak sınırı"
-#: judge/models/problem.py:465
+#: judge/models/problem.py:492
msgid "language-specific resource limits"
msgstr "Dile özel kaynak sınırları"
-#: judge/models/problem.py:469
+#: judge/models/problem.py:496
msgid "associated problem"
msgstr "ilgili problem"
-#: judge/models/problem.py:472
+#: judge/models/problem.py:499
msgid "publish date"
msgstr "yayın tarihi"
-#: judge/models/problem.py:474
+#: judge/models/problem.py:501
msgid "editorial content"
msgstr "problem analizi içeriği"
-#: judge/models/problem.py:497
+#: judge/models/problem.py:524
msgid "See hidden solutions"
msgstr ""
-#: judge/models/problem.py:499
+#: judge/models/problem.py:526
msgid "solution"
msgstr "çözüm"
-#: judge/models/problem.py:500
+#: judge/models/problem.py:527
msgid "solutions"
msgstr "çözümler"
@@ -1690,112 +1699,112 @@ msgstr "puan değeri"
msgid "case is pretest?"
msgstr "ön test mi?"
-#: judge/models/profile.py:38
+#: judge/models/profile.py:41
msgid "organization title"
msgstr "organizasyon başlığı"
-#: judge/models/profile.py:39
+#: judge/models/profile.py:42
msgid "organization slug"
msgstr ""
-#: judge/models/profile.py:40
+#: judge/models/profile.py:43
msgid "Organization name shown in URL"
msgstr ""
-#: judge/models/profile.py:42
+#: judge/models/profile.py:45
msgid "Displayed beside user name during contests"
msgstr "Yarışmalar sırasında kullanıcı adının yanında gösterilir"
-#: judge/models/profile.py:43
+#: judge/models/profile.py:46
msgid "organization description"
msgstr "organizasyon tanımı"
-#: judge/models/profile.py:44
+#: judge/models/profile.py:47
msgid "administrators"
msgstr "Adminler"
-#: judge/models/profile.py:45
+#: judge/models/profile.py:48
msgid "Those who can edit this organization"
msgstr "Bu organizasyonu düzenleme yetkisi olanlar "
-#: judge/models/profile.py:46
+#: judge/models/profile.py:49
msgid "creation date"
msgstr "Oluşturulma tarihi"
-#: judge/models/profile.py:47
+#: judge/models/profile.py:50
msgid "is open organization?"
msgstr "Açık organizasyon mu?"
-#: judge/models/profile.py:48
+#: judge/models/profile.py:51
msgid "Allow joining organization"
msgstr "Organizasyona katılmaya izin ver"
-#: judge/models/profile.py:49
+#: judge/models/profile.py:52
msgid "maximum size"
msgstr "maksimum boyut"
-#: judge/models/profile.py:50
+#: judge/models/profile.py:53
msgid "Maximum amount of users in this organization, only applicable to private organizations"
msgstr "Bu organizasyondaki maksimum üye sayısı. Sadece özel organizasyonlar için geçerlidir"
-#: judge/models/profile.py:52
+#: judge/models/profile.py:55
msgid "Student access code"
msgstr "Öğrenci erişim kodu"
-#: judge/models/profile.py:56
+#: judge/models/profile.py:59
msgid "This image will replace the default site logo for users viewing the organization."
msgstr ""
-#: judge/models/profile.py:79
+#: judge/models/profile.py:82
msgid "Administer organizations"
msgstr ""
-#: judge/models/profile.py:80
+#: judge/models/profile.py:83
msgid "Edit all organizations"
msgstr ""
-#: judge/models/profile.py:82 judge/models/profile.py:99
-#: judge/models/profile.py:269
+#: judge/models/profile.py:85 judge/models/profile.py:102
+#: judge/models/profile.py:293
msgid "organization"
msgstr "Organizasyon"
-#: judge/models/profile.py:87
+#: judge/models/profile.py:90
msgid "user associated"
msgstr "ilişkili kullanıcı"
-#: judge/models/profile.py:88
+#: judge/models/profile.py:91
msgid "self-description"
msgstr "hakkında"
-#: judge/models/profile.py:89
+#: judge/models/profile.py:92
msgid "location"
msgstr "konum"
-#: judge/models/profile.py:91
+#: judge/models/profile.py:94
msgid "preferred language"
msgstr "tercih edilen dil"
-#: judge/models/profile.py:97
+#: judge/models/profile.py:100
msgid "last access time"
msgstr "son erişim"
-#: judge/models/profile.py:98
+#: judge/models/profile.py:101
msgid "last IP"
msgstr "son IP"
-#: judge/models/profile.py:101
+#: judge/models/profile.py:104
msgid "display rank"
msgstr "görünen derece"
-#: judge/models/profile.py:103
+#: judge/models/profile.py:106
msgid "Normal User"
msgstr ""
-#: judge/models/profile.py:104
+#: judge/models/profile.py:107
msgid "Problem Setter"
msgstr ""
-#: judge/models/profile.py:105 templates/base.html:220
+#: judge/models/profile.py:108 templates/base.html:220
#: templates/comments/list.html:99 templates/contest/contest-list-tabs.html:24
#: templates/contest/ranking-table.html:49
#: templates/problem/problem-list-tabs.html:6
@@ -1804,155 +1813,167 @@ msgstr ""
msgid "Admin"
msgstr "Yönetici"
-#: judge/models/profile.py:106
+#: judge/models/profile.py:109
msgid "comment mute"
msgstr "yorum engeli"
-#: judge/models/profile.py:106
+#: judge/models/profile.py:109
msgid "Some users are at their best when silent."
msgstr "Bazı kullanıcıların sessiz kalması daha iyidir."
-#: judge/models/profile.py:108
+#: judge/models/profile.py:111
msgid "unlisted user"
msgstr ""
-#: judge/models/profile.py:108
+#: judge/models/profile.py:111
msgid "User will not be ranked."
msgstr ""
-#: judge/models/profile.py:111
+#: judge/models/profile.py:114
msgid "user script"
msgstr "userscript"
-#: judge/models/profile.py:112
+#: judge/models/profile.py:115
msgid "User-defined JavaScript for site customization."
msgstr "Site düzenlemesi için kullanıcı tanımlı JavaScript"
-#: judge/models/profile.py:113
+#: judge/models/profile.py:116
msgid "current contest"
msgstr "şu anki yarışma"
-#: judge/models/profile.py:115
+#: judge/models/profile.py:118
msgid "math engine"
msgstr "matematik motoru"
-#: judge/models/profile.py:117
+#: judge/models/profile.py:120
msgid "the rendering engine used to render math"
msgstr "matematiksel ifadeleri gösteren program"
-#: judge/models/profile.py:118
+#: judge/models/profile.py:121
msgid "TOTP 2FA enabled"
msgstr ""
-#: judge/models/profile.py:119
+#: judge/models/profile.py:122
msgid "check to enable TOTP-based two-factor authentication"
msgstr ""
-#: judge/models/profile.py:120
+#: judge/models/profile.py:123
msgid "WebAuthn 2FA enabled"
msgstr ""
-#: judge/models/profile.py:121
+#: judge/models/profile.py:124
msgid "check to enable WebAuthn-based two-factor authentication"
msgstr ""
-#: judge/models/profile.py:122
+#: judge/models/profile.py:125
msgid "TOTP key"
msgstr ""
-#: judge/models/profile.py:123
+#: judge/models/profile.py:126
msgid "32 character base32-encoded key for TOTP"
msgstr ""
-#: judge/models/profile.py:125
+#: judge/models/profile.py:128
msgid "TOTP key must be empty or base32"
msgstr ""
-#: judge/models/profile.py:126
+#: judge/models/profile.py:129
msgid "scratch codes"
msgstr ""
-#: judge/models/profile.py:127
+#: judge/models/profile.py:130
msgid "JSON array of 16 character base32-encoded codes for scratch codes"
msgstr ""
-#: judge/models/profile.py:131
+#: judge/models/profile.py:134
msgid "Scratch codes must be empty or a JSON array of 16-character base32 codes"
msgstr ""
-#: judge/models/profile.py:133
+#: judge/models/profile.py:136
+msgid "last TOTP timecode"
+msgstr ""
+
+#: judge/models/profile.py:137
msgid "API token"
msgstr ""
-#: judge/models/profile.py:134
+#: judge/models/profile.py:138
msgid "64 character hex-encoded API access token"
msgstr ""
-#: judge/models/profile.py:136
+#: judge/models/profile.py:140
msgid "API token must be None or hexadecimal"
msgstr ""
-#: judge/models/profile.py:137
+#: judge/models/profile.py:141
msgid "internal notes"
msgstr ""
-#: judge/models/profile.py:138
+#: judge/models/profile.py:142
msgid "Notes for administrators regarding this user."
msgstr ""
-#: judge/models/profile.py:139
+#: judge/models/profile.py:143
msgid "last data download time"
msgstr ""
-#: judge/models/profile.py:236
+#: judge/models/profile.py:253
msgid "Shows in-progress development stuff"
msgstr ""
-#: judge/models/profile.py:237
+#: judge/models/profile.py:254
msgid "Edit TOTP settings"
msgstr ""
-#: judge/models/profile.py:239
+#: judge/models/profile.py:256
msgid "user profile"
msgstr "Kullanıcı Profili"
-#: judge/models/profile.py:240
+#: judge/models/profile.py:257
msgid "user profiles"
msgstr "Kullanıcı Profilleri"
-#: judge/models/profile.py:246
+#: judge/models/profile.py:263
msgid "device name"
msgstr ""
-#: judge/models/profile.py:247
+#: judge/models/profile.py:264
msgid "credential ID"
msgstr ""
-#: judge/models/profile.py:248
+#: judge/models/profile.py:265
msgid "public key"
msgstr ""
-#: judge/models/profile.py:249
+#: judge/models/profile.py:266
msgid "sign counter"
msgstr ""
-#: judge/models/profile.py:271
+#: judge/models/profile.py:287
+msgid "WebAuthn credential"
+msgstr ""
+
+#: judge/models/profile.py:288
+msgid "WebAuthn credentials"
+msgstr ""
+
+#: judge/models/profile.py:295
msgid "request time"
msgstr "istek zamanı"
-#: judge/models/profile.py:272
+#: judge/models/profile.py:296
msgid "state"
msgstr "durum"
-#: judge/models/profile.py:277
+#: judge/models/profile.py:301
msgid "reason"
msgstr "sebep"
-#: judge/models/profile.py:280
+#: judge/models/profile.py:304
msgid "organization join request"
msgstr "organizasyona katılma isteği"
-#: judge/models/profile.py:281
+#: judge/models/profile.py:305
msgid "organization join requests"
msgstr "organizasyona katılma istekleri"
@@ -2108,210 +2129,210 @@ msgstr "judge'lar"
msgid "judge"
msgstr ""
-#: judge/models/submission.py:20 judge/models/submission.py:47
+#: judge/models/submission.py:21 judge/models/submission.py:48
#: judge/utils/problems.py:74
msgid "Accepted"
msgstr "Kabul edildi"
-#: judge/models/submission.py:21 judge/models/submission.py:48
+#: judge/models/submission.py:22 judge/models/submission.py:49
msgid "Wrong Answer"
msgstr "Yanlış cevap"
-#: judge/models/submission.py:22 judge/models/submission.py:50
+#: judge/models/submission.py:23 judge/models/submission.py:51
msgid "Time Limit Exceeded"
msgstr "Zaman Sınırı Aşıldı"
-#: judge/models/submission.py:23 judge/models/submission.py:51
+#: judge/models/submission.py:24 judge/models/submission.py:52
msgid "Memory Limit Exceeded"
msgstr "Bellek Sınırı Aşıldı"
-#: judge/models/submission.py:24 judge/models/submission.py:52
+#: judge/models/submission.py:25 judge/models/submission.py:53
msgid "Output Limit Exceeded"
msgstr "Çıktı Limiti Aşıldı"
-#: judge/models/submission.py:25 judge/models/submission.py:53
+#: judge/models/submission.py:26 judge/models/submission.py:54
msgid "Invalid Return"
msgstr "Geçersiz Dönüş Kodu"
-#: judge/models/submission.py:26 judge/models/submission.py:54
+#: judge/models/submission.py:27 judge/models/submission.py:55
msgid "Runtime Error"
msgstr "Çalışma Hatası"
-#: judge/models/submission.py:27 judge/models/submission.py:41
-#: judge/models/submission.py:55 judge/utils/problems.py:76
+#: judge/models/submission.py:28 judge/models/submission.py:42
+#: judge/models/submission.py:56 judge/utils/problems.py:76
msgid "Compile Error"
msgstr "Derleme Hatası"
-#: judge/models/submission.py:28 judge/models/submission.py:40
+#: judge/models/submission.py:29 judge/models/submission.py:41
msgid "Internal Error"
msgstr "İç Hata"
-#: judge/models/submission.py:29
+#: judge/models/submission.py:30
msgid "Short circuit"
msgstr "Kısa devre"
-#: judge/models/submission.py:30 judge/models/submission.py:42
-#: judge/models/submission.py:61
+#: judge/models/submission.py:31 judge/models/submission.py:43
+#: judge/models/submission.py:62
msgid "Aborted"
msgstr "İptal edildi"
-#: judge/models/submission.py:36 judge/models/submission.py:57
+#: judge/models/submission.py:37 judge/models/submission.py:58
msgid "Queued"
msgstr "Sıraya Alındı"
-#: judge/models/submission.py:37 judge/models/submission.py:58
+#: judge/models/submission.py:38 judge/models/submission.py:59
msgid "Processing"
msgstr "İşleniyor"
-#: judge/models/submission.py:38 judge/models/submission.py:59
+#: judge/models/submission.py:39 judge/models/submission.py:60
msgid "Grading"
msgstr "Puanlanıyor"
-#: judge/models/submission.py:39 judge/models/submission.py:60
+#: judge/models/submission.py:40 judge/models/submission.py:61
msgid "Completed"
msgstr "Tamamlandı"
-#: judge/models/submission.py:56
+#: judge/models/submission.py:57
msgid "Internal Error (judging server error)"
msgstr "İç Hata (judge sunucusu hatası)"
-#: judge/models/submission.py:66
+#: judge/models/submission.py:67
msgid "submission time"
msgstr "çözüm süresi"
-#: judge/models/submission.py:67 judge/models/submission.py:227
+#: judge/models/submission.py:68 judge/models/submission.py:238
msgid "execution time"
msgstr "çalışma süresi"
-#: judge/models/submission.py:68 judge/models/submission.py:228
+#: judge/models/submission.py:69 judge/models/submission.py:239
msgid "memory usage"
msgstr "bellek kullanımı"
-#: judge/models/submission.py:69 judge/models/submission.py:229
+#: judge/models/submission.py:70 judge/models/submission.py:240
msgid "points granted"
msgstr "verilen puan"
-#: judge/models/submission.py:70
+#: judge/models/submission.py:71
msgid "submission language"
msgstr "çözüm dili"
-#: judge/models/submission.py:71
+#: judge/models/submission.py:72
msgid "status"
msgstr "statü"
-#: judge/models/submission.py:72
+#: judge/models/submission.py:73
msgid "result"
msgstr "sonuç"
-#: judge/models/submission.py:74
+#: judge/models/submission.py:75
msgid "compile errors"
msgstr "derleme hataları"
-#: judge/models/submission.py:76
+#: judge/models/submission.py:77
msgid "batched cases"
msgstr "kümelenmiş testler"
-#: judge/models/submission.py:77
+#: judge/models/submission.py:78
msgid "test case points"
msgstr "test puanı"
-#: judge/models/submission.py:78
+#: judge/models/submission.py:79
msgid "test case total points"
msgstr "toplam test puanı"
-#: judge/models/submission.py:79
+#: judge/models/submission.py:80
msgid "judged on"
msgstr "değerlendirildiği sunucu"
-#: judge/models/submission.py:81
+#: judge/models/submission.py:82
msgid "submission judge time"
msgstr ""
-#: judge/models/submission.py:82
-msgid "was rejudged by admin"
-msgstr "admin tarafından yeniden değerlendirildi"
-
#: judge/models/submission.py:83
+msgid "last rejudge date by admin"
+msgstr ""
+
+#: judge/models/submission.py:84
msgid "was ran on pretests only"
msgstr "sadece ön testlerde çalıştı"
-#: judge/models/submission.py:86
-msgid "lock submission"
+#: judge/models/submission.py:87
+msgid "submission lock"
msgstr ""
-#: judge/models/submission.py:199
+#: judge/models/submission.py:210
msgid "Abort any submission"
msgstr ""
-#: judge/models/submission.py:200
+#: judge/models/submission.py:211
msgid "Rejudge the submission"
msgstr ""
-#: judge/models/submission.py:201
+#: judge/models/submission.py:212
msgid "Rejudge a lot of submissions"
msgstr ""
-#: judge/models/submission.py:202
+#: judge/models/submission.py:213
msgid "Submit without limit"
msgstr ""
-#: judge/models/submission.py:203
+#: judge/models/submission.py:214
msgid "View all submission"
msgstr ""
-#: judge/models/submission.py:204
+#: judge/models/submission.py:215
msgid "Resubmit others' submission"
msgstr ""
-#: judge/models/submission.py:205
+#: judge/models/submission.py:216
msgid "Change lock status of submission"
msgstr ""
-#: judge/models/submission.py:208 templates/contest/moss.html:58
+#: judge/models/submission.py:219 templates/contest/moss.html:58
msgid "submissions"
msgstr "çözümler"
-#: judge/models/submission.py:212 judge/models/submission.py:223
+#: judge/models/submission.py:223 judge/models/submission.py:234
msgid "associated submission"
msgstr "ilişkili çözüm gönderisi"
-#: judge/models/submission.py:214
+#: judge/models/submission.py:225
msgid "source code"
msgstr "kaynak kodu"
-#: judge/models/submission.py:225
+#: judge/models/submission.py:236
msgid "test case ID"
msgstr "test ID"
-#: judge/models/submission.py:226
+#: judge/models/submission.py:237
msgid "status flag"
msgstr "durum kodu"
-#: judge/models/submission.py:230
+#: judge/models/submission.py:241
msgid "points possible"
msgstr "alınabilecek puan"
-#: judge/models/submission.py:231
+#: judge/models/submission.py:242
msgid "batch number"
msgstr "küme #"
-#: judge/models/submission.py:232
+#: judge/models/submission.py:243
msgid "judging feedback"
msgstr ""
-#: judge/models/submission.py:233
+#: judge/models/submission.py:244
msgid "extended judging feedback"
msgstr ""
-#: judge/models/submission.py:234
+#: judge/models/submission.py:245
msgid "program output"
msgstr "program çıktısı"
-#: judge/models/submission.py:242
+#: judge/models/submission.py:253
msgid "submission test case"
msgstr "çözüm testi"
-#: judge/models/submission.py:243
+#: judge/models/submission.py:254
msgid "submission test cases"
msgstr "çözüm testleri"
@@ -2359,6 +2380,10 @@ msgstr "bilet"
msgid "poster"
msgstr "gönderen"
+#: judge/models/ticket.py:30
+msgid "message body"
+msgstr "mesaj içeriği"
+
#: judge/models/ticket.py:31
msgid "message time"
msgstr "mesaj zamanı"
@@ -2381,19 +2406,23 @@ msgstr ""
msgid "Running MOSS"
msgstr ""
-#: judge/tasks/submission.py:43
+#: judge/tasks/submission.py:45
msgid "Modifying submissions"
msgstr ""
-#: judge/tasks/submission.py:56
+#: judge/tasks/submission.py:58
msgid "Recalculating user points"
msgstr ""
-#: judge/tasks/user.py:50
+#: judge/tasks/user.py:49
+msgid "Applying filters"
+msgstr ""
+
+#: judge/tasks/user.py:64
msgid "Preparing your submission data"
msgstr ""
-#: judge/tasks/user.py:81
+#: judge/tasks/user.py:95
msgid "Preparing your comment data"
msgstr ""
@@ -2506,7 +2535,7 @@ msgstr ""
msgid "You already voted."
msgstr "Zaten oy verdin."
-#: judge/views/comment.py:129 judge/views/organization.py:298
+#: judge/views/comment.py:129 judge/views/organization.py:297
msgid "Edited from site"
msgstr "Site aracılığıyla düzenlendi"
@@ -2514,125 +2543,130 @@ msgstr "Site aracılığıyla düzenlendi"
msgid "Editing comment"
msgstr "Yorum düzenleniyor"
-#: judge/views/contests.py:56 judge/views/contests.py:201
-#: judge/views/contests.py:204 judge/views/contests.py:382
+#: judge/views/contests.py:57 judge/views/contests.py:210
+#: judge/views/contests.py:213 judge/views/contests.py:395
msgid "No such contest"
msgstr "Böyle bir yarışma yok :("
-#: judge/views/contests.py:57 judge/views/contests.py:202
+#: judge/views/contests.py:58 judge/views/contests.py:211
#, python-format
msgid "Could not find a contest with the key \"%s\"."
msgstr "\"%s\" anahtarıyla bir yarışma bulunamadı."
-#: judge/views/contests.py:70
+#: judge/views/contests.py:71
msgid "Contests"
msgstr "Yarışmalar"
-#: judge/views/contests.py:205
+#: judge/views/contests.py:214
msgid "Could not find such contest."
msgstr "Yarışma bulunamadı."
-#: judge/views/contests.py:208
+#: judge/views/contests.py:217
#, python-format
msgid "Access to contest \"%s\" denied"
msgstr "\"%s\" yarışmasına erişimin yok "
-#: judge/views/contests.py:235
+#: judge/views/contests.py:244
msgid "Clone Contest"
msgstr ""
-#: judge/views/contests.py:301
+#: judge/views/contests.py:278
+#, python-format
+msgid "Cloned contest from %s"
+msgstr ""
+
+#: judge/views/contests.py:314
msgid "Contest not ongoing"
msgstr "Yarışma devam etmiyor"
-#: judge/views/contests.py:302
+#: judge/views/contests.py:315
#, python-format
msgid "\"%s\" is not currently ongoing."
msgstr "\"%s\" şu anda devam etmiyor."
-#: judge/views/contests.py:306
+#: judge/views/contests.py:319
msgid "Already in contest"
msgstr "Zaten yarışmadasın"
-#: judge/views/contests.py:307
+#: judge/views/contests.py:320
#, python-format
msgid "You are already in a contest: \"%s\"."
msgstr "Zaten bir yarışmadasın: \"%s\"."
-#: judge/views/contests.py:310
+#: judge/views/contests.py:323
msgid "Banned from joining"
msgstr ""
-#: judge/views/contests.py:311
+#: judge/views/contests.py:324
msgid "You have been declared persona non grata for this contest. You are permanently barred from joining this contest."
msgstr ""
-#: judge/views/contests.py:372
+#: judge/views/contests.py:385
#, python-format
msgid "Enter access code for \"%s\""
msgstr "“%s” için erişim kodunu gir"
-#: judge/views/contests.py:383
+#: judge/views/contests.py:396
#, python-format
msgid "You are not in contest \"%s\"."
msgstr "\"%s\" yarışmasında değilsin."
-#: judge/views/contests.py:402
+#: judge/views/contests.py:415
msgid "ContestCalendar requires integer year and month"
msgstr ""
-#: judge/views/contests.py:442
+#: judge/views/contests.py:455
#, python-format
msgid "Contests in %(month)s"
msgstr "%(month)s ayındaki yarışmalar"
-#: judge/views/contests.py:442
+#: judge/views/contests.py:455
msgid "F Y"
msgstr ""
-#: judge/views/contests.py:489
+#: judge/views/contests.py:502
#, python-format
msgid "%s Statistics"
msgstr ""
-#: judge/views/contests.py:662
+#: judge/views/contests.py:675
#, python-format
msgid "%s Rankings"
msgstr "%s - Sıralama"
-#: judge/views/contests.py:670
+#: judge/views/contests.py:683
msgid "???"
msgstr "???"
-#: judge/views/contests.py:686
+#: judge/views/contests.py:699
#, python-format
msgid "Your participation in %s"
msgstr "\"%s\" yarışmasına katılımın"
-#: judge/views/contests.py:687
+#: judge/views/contests.py:700
#, python-format
msgid "%s's participation in %s"
msgstr "%s adlı kullanıcının \"%s\" yarışmasına katılımı"
-#: judge/views/contests.py:694
+#: judge/views/contests.py:707
msgid "Live"
msgstr "Canlı"
-#: judge/views/contests.py:706 templates/contest/contest-tabs.html:13
+#: judge/views/contests.py:719 templates/contest/contest-tabs.html:13
msgid "Participation"
msgstr "Katılım"
-#: judge/views/contests.py:750
+#: judge/views/contests.py:763
#, python-format
msgid "%s MOSS Results"
msgstr ""
-#: judge/views/contests.py:777
+#: judge/views/contests.py:790
#, python-format
msgid "Running MOSS for %s..."
msgstr ""
-#: judge/views/contests.py:800
+#: judge/views/contests.py:813
#, python-format
msgid "Contest tag: %s"
msgstr "Yarışma etiketi: %s"
@@ -2661,163 +2695,177 @@ msgstr "bozuk sayfa \"%s\""
msgid "Runtimes"
msgstr "Dil sürümleri"
-#: judge/views/organization.py:44 judge/views/organization.py:47
+#: judge/views/organization.py:43 judge/views/organization.py:46
msgid "No such organization"
msgstr "Böyle bir organizasyon yok :("
-#: judge/views/organization.py:45
+#: judge/views/organization.py:44
#, python-format
msgid "Could not find an organization with the key \"%s\"."
msgstr "\"%s\" anahtarına sahip bir organizasyon bulunamadı."
-#: judge/views/organization.py:48
+#: judge/views/organization.py:47
msgid "Could not find such organization."
msgstr "Böyle bir organizasyon bulunamadı."
-#: judge/views/organization.py:72 judge/views/register.py:34
+#: judge/views/organization.py:71 judge/views/register.py:33
#: templates/organization/list.html:15 templates/user/user-list-tabs.html:5
msgid "Organizations"
msgstr "Organizasyonlar"
-#: judge/views/organization.py:93
+#: judge/views/organization.py:92
#, python-format
msgid "%s Members"
msgstr "%s üye"
-#: judge/views/organization.py:118 judge/views/organization.py:121
-#: judge/views/organization.py:126
+#: judge/views/organization.py:117 judge/views/organization.py:120
+#: judge/views/organization.py:125
msgid "Joining organization"
msgstr "Organizasyona katılım"
-#: judge/views/organization.py:118
+#: judge/views/organization.py:117
msgid "You are already in the organization."
msgstr "Bu organizasyonda zaten varsın."
-#: judge/views/organization.py:121
+#: judge/views/organization.py:120
msgid "This organization is not open."
msgstr "Bu organizasyon açık değil."
-#: judge/views/organization.py:138
+#: judge/views/organization.py:137
msgid "Leaving organization"
msgstr "Organizasyondan çık"
-#: judge/views/organization.py:138
+#: judge/views/organization.py:137
#, python-format
msgid "You are not in \"%s\"."
msgstr "\"%s\" içinde değilsin."
-#: judge/views/organization.py:162
+#: judge/views/organization.py:161
#, python-format
msgid "Request to join %s"
msgstr "%s'ye katılma isteği"
-#: judge/views/organization.py:180
+#: judge/views/organization.py:179
msgid "Join request detail"
msgstr "Katılma isteği detayı"
-#: judge/views/organization.py:208
+#: judge/views/organization.py:207
#, python-format
msgid "Managing join requests for %s"
msgstr "%s - Katılım isteklerini yönet"
-#: judge/views/organization.py:239
+#: judge/views/organization.py:238
#, python-format
msgid "Your organization can only receive %d more members. You cannot approve %d users."
msgstr "Organizasyon yalnızca %d üye daha alabilir. %d üyenin katılımını onaylayamazsın."
-#: judge/views/organization.py:251
+#: judge/views/organization.py:250
#, python-format
msgid "Approved %d user."
msgid_plural "Approved %d users."
msgstr[0] "%d kullanıcı onaylandı"
msgstr[1] "%d kullanıcı onaylandı"
-#: judge/views/organization.py:252
+#: judge/views/organization.py:251
#, python-format
msgid "Rejected %d user."
msgid_plural "Rejected %d users."
msgstr[0] "%d kullanıcı onaylandı"
msgstr[1] "%d kullanıcı onaylandı"
-#: judge/views/organization.py:282
+#: judge/views/organization.py:281
#, python-format
msgid "Editing %s"
msgstr "%s düzenleniyor"
-#: judge/views/organization.py:306 judge/views/organization.py:314
+#: judge/views/organization.py:305 judge/views/organization.py:313
msgid "Can't edit organization"
msgstr "Bu organizasyon düzenlenemiyor"
-#: judge/views/organization.py:307
+#: judge/views/organization.py:306
msgid "You are not allowed to edit this organization."
msgstr "Bu organizasyonu düzenleme yetkisine sahip değilsin."
-#: judge/views/organization.py:315
+#: judge/views/organization.py:314
msgid "You are not allowed to kick people from this organization."
msgstr "Üyeleri bu organizasyondan atma yetkisine sahip değilsin."
-#: judge/views/organization.py:320 judge/views/organization.py:324
+#: judge/views/organization.py:319 judge/views/organization.py:323
msgid "Can't kick user"
msgstr "Bu üyeyi atamazsın."
-#: judge/views/organization.py:321
+#: judge/views/organization.py:320
msgid "The user you are trying to kick does not exist!"
msgstr "Atmaya çalıştığın üye bulunamıyor!"
-#: judge/views/organization.py:325
+#: judge/views/organization.py:324
#, python-format
msgid "The user you are trying to kick is not in organization: %s."
msgstr "Atmaya çalıştığın üye \"%s\" organizasyonunda değil."
-#: judge/views/problem.py:67
+#: judge/views/problem.py:68
msgid "No such problem"
msgstr "Böyle bir problem yok :("
-#: judge/views/problem.py:68
+#: judge/views/problem.py:69
#, python-format
msgid "Could not find a problem with the code \"%s\"."
msgstr "\"%s\" anahtarına sahip problem bulunamadı."
-#: judge/views/problem.py:110
+#: judge/views/problem.py:111
#, python-brace-format
msgid "Editorial for {0}"
msgstr " {0} - Problem analizi"
-#: judge/views/problem.py:113
+#: judge/views/problem.py:114
#, python-brace-format
msgid "Editorial for {0}"
msgstr "{0} için problem analizi"
-#: judge/views/problem.py:283 templates/contest/contest.html:79
+#: judge/views/problem.py:133
+msgid "No such editorial"
+msgstr ""
+
+#: judge/views/problem.py:134
+#, python-format
+msgid "Could not find an editorial with the code \"%s\"."
+msgstr ""
+
+#: judge/views/problem.py:289 templates/contest/contest.html:79
#: templates/user/user-tabs.html:5 templates/user/users-table.html:23
msgid "Problems"
msgstr "Problemler"
-#: judge/views/problem.py:556 judge/views/problem.py:564
+#: judge/views/problem.py:562 judge/views/problem.py:570
#, python-format
msgid "Submit to %s"
msgstr ""
-#: judge/views/problem.py:613
+#: judge/views/problem.py:619
msgid "Banned from submitting"
msgstr "Çözüm gönderme engellendi"
-#: judge/views/problem.py:614
+#: judge/views/problem.py:620
msgid "You have been declared persona non grata for this problem. You are permanently barred from submitting this problem."
msgstr "Bu problem için istenmeyen adam olarak işaretlendin. Çözüm gönderemezsin."
-#: judge/views/problem.py:618
+#: judge/views/problem.py:624
msgid "Too many submissions"
msgstr "Çok fazla çözüm gönderisi"
-#: judge/views/problem.py:619
+#: judge/views/problem.py:625
msgid "You have exceeded the submission limit for this problem."
msgstr "Bu soru için çözüm gönderi sınırını geçtin."
-#: judge/views/problem.py:681
+#: judge/views/problem.py:693
msgid "Clone Problem"
msgstr ""
+#: judge/views/problem.py:720
+#, python-format
+msgid "Cloned problem from %s"
+msgstr ""
+
#: judge/views/problem_data.py:37
msgid "Checker arguments must be a JSON object"
msgstr "Checker değişkenleri JSON nesnesi olarak verilmelidir."
@@ -2887,52 +2935,52 @@ msgstr "%s için en iyi çözümler"
msgid "Best solutions for {0}"
msgstr "{0} için en iyi çözümler"
-#: judge/views/ranked_submission.py:80
+#: judge/views/ranked_submission.py:82
#, python-format
msgid "Best solutions for %(problem)s in %(contest)s"
msgstr "\"%(problem)s\" için en iyi çözümler - %(contest)s"
-#: judge/views/ranked_submission.py:83
+#: judge/views/ranked_submission.py:85
#, python-format
msgid "Best solutions for problem %(number)s in %(contest)s"
msgstr "Problem %(number)s için en iyi çözümler - %(contest)s"
-#: judge/views/ranked_submission.py:89
+#: judge/views/ranked_submission.py:91
#, python-brace-format
msgid "Best solutions for {0} in {2}"
msgstr "{0} için en iyi çözümler - {2}"
-#: judge/views/ranked_submission.py:92
+#: judge/views/ranked_submission.py:94
#, python-brace-format
msgid "Best solutions for problem {0} in {1}"
msgstr "Problem {0} için en iyi çözümler - {1}"
-#: judge/views/register.py:27
+#: judge/views/register.py:26
msgid "A username must contain letters, numbers, or underscores"
msgstr "Kullanıcı adı harfler, rakamlar veya alt çizgilerden oluşmalıdır"
-#: judge/views/register.py:31
+#: judge/views/register.py:30
msgid "Preferred language"
msgstr "Tercih edilen dil"
-#: judge/views/register.py:38
+#: judge/views/register.py:37
msgid "Subscribe to newsletter?"
msgstr "Haber bültenine abone ol"
-#: judge/views/register.py:45
+#: judge/views/register.py:44
#, python-format
msgid "The email address \"%s\" is already taken. Only one registration is allowed per address."
msgstr "\"%s\" zaten kullanımda. E-posta adresleri yalnızca bir kez kullanılabilir."
-#: judge/views/register.py:51
+#: judge/views/register.py:50
msgid "Your email provider is not allowed due to history of abuse. Please use a reputable email provider."
msgstr "E-posta sağlayıcın geçmişte yaşanan suistimallerden dolayı geçersizdir. Lütfen bilinen bir e-posta sağlayıcısı kullan."
-#: judge/views/register.py:57 judge/views/register.py:95
+#: judge/views/register.py:56 judge/views/register.py:94
msgid "Registration"
msgstr "Kayıt"
-#: judge/views/register.py:106
+#: judge/views/register.py:105
msgid "Authentication failure"
msgstr "Kimlik doğrulama hatası"
@@ -2940,7 +2988,7 @@ msgstr "Kimlik doğrulama hatası"
msgid "Language statistics"
msgstr "Dil istatistikleri"
-#: judge/views/status.py:24 templates/submission/list.html:311
+#: judge/views/status.py:24 templates/submission/list.html:310
msgid "Status"
msgstr "Durum"
@@ -2948,74 +2996,74 @@ msgstr "Durum"
msgid "Version matrix"
msgstr "Sürüm matrisi"
-#: judge/views/submission.py:53 judge/views/submission.py:60
+#: judge/views/submission.py:55 judge/views/submission.py:62
#, python-format
msgid "Submission of %(problem)s by %(user)s"
msgstr "%(user)s tarafından %(problem)s için gönderilen çözüm"
-#: judge/views/submission.py:203 judge/views/submission.py:204
+#: judge/views/submission.py:205 judge/views/submission.py:206
#: templates/problem/problem.html:127
msgid "All submissions"
msgstr "Tüm çözümler"
-#: judge/views/submission.py:349
+#: judge/views/submission.py:355
msgid "All my submissions"
msgstr "Tüm çözümlerim"
-#: judge/views/submission.py:350
+#: judge/views/submission.py:356
#, python-format
msgid "All submissions by %s"
msgstr "%s'nin tüm çözümleri"
-#: judge/views/submission.py:381
+#: judge/views/submission.py:387
#, python-format
msgid "All submissions for %s"
msgstr "%s için tüm çözümler"
-#: judge/views/submission.py:400
+#: judge/views/submission.py:410
msgid "Must pass a problem"
msgstr "Bir problem tanımlanmalı"
-#: judge/views/submission.py:439
+#: judge/views/submission.py:449
#, python-format
msgid "My submissions for %(problem)s"
msgstr "%(problem)s için çözümlerim"
-#: judge/views/submission.py:440
+#: judge/views/submission.py:450
#, python-format
msgid "%(user)s's submissions for %(problem)s"
msgstr "%(user)s tarafından %(problem)s için gönderilen çözümler"
-#: judge/views/submission.py:536
+#: judge/views/submission.py:546
msgid "Must pass a contest"
msgstr "Bir yarışma tanımlanmalı"
-#: judge/views/submission.py:544
+#: judge/views/submission.py:554
#, python-format
msgid "My submissions in %(contest)s"
msgstr ""
-#: judge/views/submission.py:545
+#: judge/views/submission.py:555
#, python-format
msgid "%(user)s's submissions in %(contest)s"
msgstr ""
-#: judge/views/submission.py:559
+#: judge/views/submission.py:569
#, python-brace-format
msgid "My submissions in {0}"
msgstr ""
-#: judge/views/submission.py:561
+#: judge/views/submission.py:571
#, python-brace-format
msgid "{0}'s submissions in {2}"
msgstr ""
-#: judge/views/submission.py:585
+#: judge/views/submission.py:597
#, python-brace-format
msgid "{0}'s submissions for {2} in {4}"
msgstr "{0} tarafından {2} için gönderilen çözüm - {4}"
-#: judge/views/submission.py:590
+#: judge/views/submission.py:602
#, python-brace-format
msgid "{0}'s submissions for problem {2} in {3}"
msgstr "{0} tarafından problem {2} için gönderilen çözüm - {3}"
@@ -3032,40 +3080,40 @@ msgstr "Sorun açıklaması"
msgid "You must solve at least one problem before you can create a ticket."
msgstr ""
-#: judge/views/ticket.py:87 judge/views/ticket.py:90
+#: judge/views/ticket.py:91 judge/views/ticket.py:94
#, python-format
msgid "New ticket for %s"
msgstr "%s için yeni bilet"
-#: judge/views/ticket.py:144
+#: judge/views/ticket.py:148
#, python-format
msgid "%(title)s - Ticket %(id)d"
msgstr "%(title)s - Bilet %(id)d"
-#: judge/views/ticket.py:249
+#: judge/views/ticket.py:253
#, python-format
msgid "Tickets - Page %(number)d of %(total)d"
msgstr "Biletler - Sayfa %(number)d/%(total)d"
-#: judge/views/ticket.py:298
+#: judge/views/ticket.py:302
#, python-format
msgid "New Ticket: %s"
msgstr "Yeni Bilet: %s"
-#: judge/views/ticket.py:299
+#: judge/views/ticket.py:303
#, python-format
msgid "#%(id)d, assigned to: %(users)s"
msgstr "#%(id)d, sorumlular: %(users)s"
-#: judge/views/ticket.py:301
+#: judge/views/ticket.py:305
msgid ", "
msgstr ","
-#: judge/views/ticket.py:301
+#: judge/views/ticket.py:305
msgid "no one"
msgstr "kimse"
-#: judge/views/ticket.py:321
+#: judge/views/ticket.py:325
#, python-format
msgid "New Ticket Message For: %s"
msgstr ""
@@ -3074,87 +3122,91 @@ msgstr ""
msgid "Enable Two-factor Authentication"
msgstr ""
-#: judge/views/two_factor.py:99
+#: judge/views/two_factor.py:108
+msgid "Refresh Two-factor Authentication"
+msgstr ""
+
+#: judge/views/two_factor.py:116
msgid "Disable Two-factor Authentication"
msgstr ""
-#: judge/views/two_factor.py:148
+#: judge/views/two_factor.py:165
msgid "Invalid WebAuthn response"
msgstr ""
-#: judge/views/two_factor.py:151
+#: judge/views/two_factor.py:168
msgid "Invalid name"
msgstr ""
-#: judge/views/two_factor.py:204
+#: judge/views/two_factor.py:221
msgid "Staff may not disable 2FA"
msgstr ""
-#: judge/views/two_factor.py:216
+#: judge/views/two_factor.py:229
msgid "Perform Two-factor Authentication"
msgstr ""
-#: judge/views/user.py:79
+#: judge/views/user.py:78
msgid "No such user"
msgstr "Böyle bir kullanıcı yok"
-#: judge/views/user.py:79
+#: judge/views/user.py:78
#, python-format
msgid "No user handle \"%s\"."
msgstr "\"%s\" adında bir kullanıcı yok."
-#: judge/views/user.py:83
+#: judge/views/user.py:82
msgid "My account"
msgstr "Hesabım"
-#: judge/views/user.py:84
+#: judge/views/user.py:83
#, python-format
msgid "User %s"
msgstr "Kullanıcı %s"
-#: judge/views/user.py:132
+#: judge/views/user.py:131
msgid "Login"
msgstr "Giriş"
-#: judge/views/user.py:173
+#: judge/views/user.py:172
msgid "M j, Y, G:i"
msgstr "j M Y, G:i"
-#: judge/views/user.py:307
+#: judge/views/user.py:306
msgid "Preparing your data..."
msgstr ""
-#: judge/views/user.py:311 templates/user/edit-profile.html:348
+#: judge/views/user.py:310 templates/user/edit-profile.html:352
msgid "Download your data"
msgstr ""
-#: judge/views/user.py:367
+#: judge/views/user.py:366
msgid "Updated on site"
msgstr "Sitede güncellendi"
-#: judge/views/user.py:400 templates/admin/auth/user/change_form.html:14
+#: judge/views/user.py:399 templates/admin/auth/user/change_form.html:14
#: templates/admin/auth/user/change_form.html:17 templates/base.html:222
#: templates/user/user-tabs.html:16
msgid "Edit profile"
msgstr "Profili düzenle"
-#: judge/views/user.py:415
+#: judge/views/user.py:414
msgid "Generated API token for user"
msgstr ""
-#: judge/views/user.py:427
+#: judge/views/user.py:426
msgid "Removed API token for user"
msgstr ""
-#: judge/views/user.py:437
+#: judge/views/user.py:436
msgid "Generated scratch codes for user"
msgstr ""
-#: judge/views/user.py:443 templates/user/user-list-tabs.html:4
+#: judge/views/user.py:442 templates/user/user-list-tabs.html:4
msgid "Leaderboard"
msgstr "Sıralama"
-#: judge/views/user.py:504
+#: judge/views/user.py:503
msgid "You have been successfully logged out."
msgstr ""
@@ -3281,11 +3333,11 @@ msgstr "Haberler"
msgid "posted on {time}"
msgstr "{time}"
-#: templates/blog/list.html:130 templates/problem/problem.html:309
+#: templates/blog/list.html:130 templates/problem/problem.html:311
msgid "Clarifications"
msgstr "Açıklamalar"
-#: templates/blog/list.html:146 templates/problem/problem.html:320
+#: templates/blog/list.html:146 templates/problem/problem.html:322
msgid "No clarifications have been made at this time."
msgstr "Henüz bir açıklama yapılmadı."
@@ -3478,7 +3530,7 @@ msgid "Info"
msgstr "Hakkında"
#: templates/contest/contest-tabs.html:6 templates/stats/base.html:9
-#: templates/submission/list.html:337
+#: templates/submission/list.html:336
msgid "Statistics"
msgstr "İstatistikler"
@@ -3681,19 +3733,19 @@ msgstr ""
msgid "Disqualify"
msgstr ""
-#: templates/contest/ranking.html:169
+#: templates/contest/ranking.html:173
msgid "Are you sure you want to disqualify this participation?"
msgstr ""
-#: templates/contest/ranking.html:174
+#: templates/contest/ranking.html:178
msgid "Are you sure you want to un-disqualify this participation?"
msgstr ""
-#: templates/contest/ranking.html:246
+#: templates/contest/ranking.html:250
msgid "View user participation"
msgstr "Kullanıcı katılımını göster"
-#: templates/contest/ranking.html:250
+#: templates/contest/ranking.html:254
msgid "Show organizations"
msgstr "Organizasyonları göster"
@@ -3968,7 +4020,7 @@ msgstr ""
msgid "Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence."
msgstr "Bu problem analizini yalnızca takıldığın yerlerde kullanmalısın. Lütfen analizden kod kopyalayıp yapıştırma.
Problemi çözmeden resmi çözümü kopyalayıp yapıştırmak engellenmene neden olabilir."
-#: templates/problem/editorial.html:27 templates/problem/problem.html:209
+#: templates/problem/editorial.html:27 templates/problem/problem.html:210
msgid "Author:"
msgid_plural "Authors:"
msgstr[0] "Yazar"
@@ -4135,36 +4187,36 @@ msgstr "Zaman sınırı:"
msgid "Memory limit:"
msgstr "Bellek sınırı:"
-#: templates/problem/problem.html:224
+#: templates/problem/problem.html:226
msgid "Problem type"
msgid_plural "Problem types"
msgstr[0] "Soru tipi"
msgstr[1] "Soru tipleri"
-#: templates/problem/problem.html:237
+#: templates/problem/problem.html:239
msgid "Allowed languages"
msgstr "İzin verilen diller"
-#: templates/problem/problem.html:245
+#: templates/problem/problem.html:247
#, python-format
msgid "No %(lang)s judge online"
msgstr "%(lang)s için çevrimiçi judge yok"
-#: templates/problem/problem.html:256
+#: templates/problem/problem.html:258
msgid "Judge:"
msgid_plural "Judges:"
msgstr[0] ""
msgstr[1] ""
-#: templates/problem/problem.html:273
+#: templates/problem/problem.html:275
msgid "none available"
msgstr ""
-#: templates/problem/problem.html:298
+#: templates/problem/problem.html:300
msgid "Request clarification"
msgstr "Açıklama talebi"
-#: templates/problem/problem.html:300
+#: templates/problem/problem.html:302
msgid "Report an issue"
msgstr "Bir sorun bildir"
@@ -4209,7 +4261,7 @@ msgstr "Problem tipleri"
msgid "Point range"
msgstr "Puan aralığı"
-#: templates/problem/search-form.html:63 templates/submission/list.html:329
+#: templates/problem/search-form.html:63 templates/submission/list.html:328
#: templates/ticket/list.html:248
msgid "Go"
msgstr "Git"
@@ -4256,7 +4308,7 @@ msgid "Invalid username or password."
msgstr "Kullanıcı adı veya şifre yanlış"
#: templates/registration/login.html:53
-#: templates/registration/two_factor_auth.html:86
+#: templates/registration/two_factor_auth.html:92
msgid "Login!"
msgstr "Giriş Yap!"
@@ -4376,12 +4428,12 @@ msgid "Default language"
msgstr "Varsayılan dil"
#: templates/registration/registration_form.html:184
-#: templates/user/edit-profile.html:310
+#: templates/user/edit-profile.html:314
msgid "Affiliated organizations"
msgstr "Organizasyon üyelikleri"
#: templates/registration/registration_form.html:190
-#: templates/user/edit-profile.html:324
+#: templates/user/edit-profile.html:328
msgid "Notify me about upcoming contests"
msgstr "Gelecek yarışmalar hakkında beni bilgilendir"
@@ -4397,57 +4449,93 @@ msgstr "Şartlar & Koşullar"
msgid "Register!"
msgstr "Kaydol!"
-#: templates/registration/totp_disable.html:38
+#: templates/registration/totp_disable.html:31
msgid "To protect your account, you must first authenticate before you can disable Two Factor Authentication."
msgstr ""
-#: templates/registration/totp_disable.html:45
+#: templates/registration/totp_disable.html:38
msgid "Enter the 6-digit code generated by your app or one of your 16-digit scratch codes:"
msgstr ""
-#: templates/registration/totp_disable.html:48
+#: templates/registration/totp_disable.html:41
msgid "Disable Two Factor Authentication"
msgstr ""
-#: templates/registration/totp_enable.html:75
+#: templates/registration/totp_enable.html:72
msgid "Scan this code with your authenticator app:"
msgstr ""
-#: templates/registration/totp_enable.html:76
+#: templates/registration/totp_enable.html:73
msgid "QR code"
msgstr ""
-#: templates/registration/totp_enable.html:77
+#: templates/registration/totp_enable.html:74
msgid "Or enter this code manually:"
msgstr ""
-#: templates/registration/totp_enable.html:88
+#: templates/registration/totp_enable.html:85
msgid "Enter the 6-digit code generated by your app:"
msgstr ""
-#: templates/registration/totp_enable.html:91
+#: templates/registration/totp_enable.html:90
+msgid "Refresh Two Factor Authentication"
+msgstr ""
+
+#: templates/registration/totp_enable.html:92
msgid "Enable Two Factor Authentication"
msgstr ""
+#: templates/registration/totp_enable.html:98
+msgid "Below is a list of one-time use scratch codes."
+msgstr ""
+
+#: templates/registration/totp_enable.html:99
+msgid "These codes can only be used once and are for emergency use."
+msgstr ""
+
+#: templates/registration/totp_enable.html:100
+msgid "You can use these codes to login to your account or disable two-factor authentication."
+msgstr ""
+
+#: templates/registration/totp_enable.html:101
+msgid "If you ever need more scratch codes, you can regenerate them on the edit profile tab."
+msgstr ""
+
+#: templates/registration/totp_enable.html:102
+msgid "Please write these down and keep them in a secure location."
+msgstr ""
+
+#: templates/registration/totp_enable.html:103
+msgid "These codes will never be shown again after you enable two-factor authentication."
+msgstr ""
+
#: templates/registration/two_factor_auth.html:33
-#: templates/user/edit-profile.html:161
+#: templates/user/edit-profile.html:165
msgid "WebAuthn is not supported by your browser."
msgstr ""
#: templates/registration/two_factor_auth.html:54
-#: templates/user/edit-profile.html:185
+#: templates/user/edit-profile.html:189
msgid "Failed to contact server."
msgstr ""
-#: templates/registration/two_factor_auth.html:77
+#: templates/registration/two_factor_auth.html:79
msgid "Enter the 6-digit code generated by your app or one of your 16-character scratch codes:"
msgstr ""
-#: templates/registration/two_factor_auth.html:83
-msgid "Use security key"
+#: templates/registration/two_factor_auth.html:81
+msgid "Enter one of your 16-character scratch codes:"
msgstr ""
#: templates/registration/two_factor_auth.html:89
+msgid "Use security key"
+msgstr ""
+
+#: templates/registration/two_factor_auth.html:94
+msgid "Use scratch code"
+msgstr ""
+
+#: templates/registration/two_factor_auth.html:97
#, python-format
msgid "If you lost your authentication device and are unable to use your scratch codes, please contact us at %(email)s."
msgstr ""
@@ -4528,15 +4616,15 @@ msgstr "Duruma göre filtrele..."
msgid "Filter by language..."
msgstr "Dile göre filtrele..."
-#: templates/submission/list.html:307
+#: templates/submission/list.html:306
msgid "Filter submissions"
msgstr "Çözümleri filtrele"
-#: templates/submission/list.html:343
+#: templates/submission/list.html:342
msgid "Total:"
msgstr ""
-#: templates/submission/list.html:353
+#: templates/submission/list.html:352
msgid "You were disconnected. Refresh to show latest updates."
msgstr "Bağlantın koptu. Son güncellemeleri görmek için sayfayı yenile."
@@ -4752,121 +4840,125 @@ msgstr "Sıralama"
msgid "Search by handle..."
msgstr "Kullanıcı adı ile ara..."
-#: templates/user/edit-profile.html:109
+#: templates/user/edit-profile.html:113
msgid "Are you sure you want to generate or regenerate your API token?"
msgstr ""
-#: templates/user/edit-profile.html:110
+#: templates/user/edit-profile.html:114
msgid "This will invalidate any previous API tokens."
msgstr ""
-#: templates/user/edit-profile.html:111
+#: templates/user/edit-profile.html:115
msgid "It also allows access to your account without Two-factor Authentication."
msgstr ""
-#: templates/user/edit-profile.html:112
+#: templates/user/edit-profile.html:116
msgid "You will not be able to view your api token after you leave this page!"
msgstr ""
-#: templates/user/edit-profile.html:113 templates/user/edit-profile.html:207
+#: templates/user/edit-profile.html:117 templates/user/edit-profile.html:211
msgid "Generating..."
msgstr ""
-#: templates/user/edit-profile.html:121 templates/user/edit-profile.html:243
-#: templates/user/edit-profile.html:371 templates/user/edit-profile.html:390
+#: templates/user/edit-profile.html:125 templates/user/edit-profile.html:247
+#: templates/user/edit-profile.html:373 templates/user/edit-profile.html:395
msgid "Regenerate"
msgstr ""
-#: templates/user/edit-profile.html:127 templates/user/edit-profile.html:392
+#: templates/user/edit-profile.html:131 templates/user/edit-profile.html:397
msgid "Remove"
msgstr ""
-#: templates/user/edit-profile.html:137
+#: templates/user/edit-profile.html:141
msgid "Are you sure you want to remove your API token?"
msgstr ""
-#: templates/user/edit-profile.html:144 templates/user/edit-profile.html:375
-#: templates/user/edit-profile.html:396
+#: templates/user/edit-profile.html:148 templates/user/edit-profile.html:377
+#: templates/user/edit-profile.html:401
msgid "Generate"
msgstr ""
-#: templates/user/edit-profile.html:190
+#: templates/user/edit-profile.html:194
msgid "Are you sure you want to delete this security key?"
msgstr ""
-#: templates/user/edit-profile.html:280
+#: templates/user/edit-profile.html:284
msgid "Self-description"
msgstr "Künye"
-#: templates/user/edit-profile.html:287
+#: templates/user/edit-profile.html:291
msgid "Select your closest major city"
msgstr "En yakın büyük şehri seç"
-#: templates/user/edit-profile.html:296
+#: templates/user/edit-profile.html:300
msgid "Editor theme"
msgstr "Editör teması"
-#: templates/user/edit-profile.html:301
+#: templates/user/edit-profile.html:305
msgid "Math engine"
msgstr "Matematik motoru"
-#: templates/user/edit-profile.html:335 templates/user/edit-profile.html:337
+#: templates/user/edit-profile.html:339 templates/user/edit-profile.html:341
msgid "Change your avatar"
msgstr "Profil fotoğrafı değiştir"
-#: templates/user/edit-profile.html:342
+#: templates/user/edit-profile.html:346
msgid "Change your password"
msgstr "Şifre değiştir"
-#: templates/user/edit-profile.html:356
+#: templates/user/edit-profile.html:359
msgid "Two-factor Authentication is enabled"
msgstr ""
-#: templates/user/edit-profile.html:358
-msgid "Two-factor Authentication is disabled"
+#: templates/user/edit-profile.html:362 templates/user/edit-profile.html:365
+msgid "Disable"
msgstr ""
-#: templates/user/edit-profile.html:363 templates/user/edit-profile.html:365
-msgid "Disable"
+#: templates/user/edit-profile.html:367
+msgid "Refresh"
msgstr ""
-#: templates/user/edit-profile.html:368
+#: templates/user/edit-profile.html:370
msgid "Scratch Codes:"
msgstr ""
-#: templates/user/edit-profile.html:372 templates/user/edit-profile.html:393
+#: templates/user/edit-profile.html:374 templates/user/edit-profile.html:398
msgid "Hidden"
msgstr ""
-#: templates/user/edit-profile.html:381
+#: templates/user/edit-profile.html:384
+msgid "Two-factor Authentication is disabled"
+msgstr ""
+
+#: templates/user/edit-profile.html:385
msgid "Enable"
msgstr ""
-#: templates/user/edit-profile.html:387
+#: templates/user/edit-profile.html:392
msgid "API Token"
msgstr ""
-#: templates/user/edit-profile.html:404
+#: templates/user/edit-profile.html:409
msgid "Security keys"
msgstr ""
-#: templates/user/edit-profile.html:414
+#: templates/user/edit-profile.html:419
msgid "Delete"
msgstr ""
-#: templates/user/edit-profile.html:421
+#: templates/user/edit-profile.html:426
msgid "Enter a name for this key"
msgstr ""
-#: templates/user/edit-profile.html:422
+#: templates/user/edit-profile.html:427
msgid "Add"
msgstr ""
-#: templates/user/edit-profile.html:430
+#: templates/user/edit-profile.html:435
msgid "User-script"
msgstr "Userscript"
-#: templates/user/edit-profile.html:434
+#: templates/user/edit-profile.html:439
msgid "Update profile"
msgstr "Profilini güncelle"
diff --git a/locale/tr/LC_MESSAGES/djangojs.po b/locale/tr/LC_MESSAGES/djangojs.po
index 901bcbf465..efd4bf5bcd 100644
--- a/locale/tr/LC_MESSAGES/djangojs.po
+++ b/locale/tr/LC_MESSAGES/djangojs.po
@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: dmoj\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-10-01 23:12+0000\n"
-"PO-Revision-Date: 2021-04-25 00:08\n"
+"PO-Revision-Date: 2021-07-07 00:28\n"
"Last-Translator: \n"
"Language-Team: Turkish\n"
"Language: tr_TR\n"
diff --git a/locale/vi/LC_MESSAGES/django.po b/locale/vi/LC_MESSAGES/django.po
index f9e4be6edb..a39f0dca46 100644
--- a/locale/vi/LC_MESSAGES/django.po
+++ b/locale/vi/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: dmoj\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-24 19:15+0000\n"
-"PO-Revision-Date: 2021-04-25 00:08\n"
+"POT-Creation-Date: 2021-06-17 01:38+0000\n"
+"PO-Revision-Date: 2021-07-07 00:28\n"
"Last-Translator: \n"
"Language-Team: Vietnamese\n"
"Language: vi_VN\n"
@@ -17,75 +17,75 @@ msgstr ""
"X-Crowdin-File: django.po\n"
"X-Crowdin-File-ID: 10\n"
-#: dmoj/settings.py:364
+#: dmoj/settings.py:365
msgid "Catalan"
msgstr "Catalan"
-#: dmoj/settings.py:365
+#: dmoj/settings.py:366
msgid "German"
msgstr "Tiếng Đức"
-#: dmoj/settings.py:366
+#: dmoj/settings.py:367
msgid "English"
msgstr "Tiếng Anh"
-#: dmoj/settings.py:367
+#: dmoj/settings.py:368
msgid "Spanish"
msgstr "Tiếng Tây Ban Nha"
-#: dmoj/settings.py:368
+#: dmoj/settings.py:369
msgid "French"
msgstr "Tiếng Pháp"
-#: dmoj/settings.py:369
+#: dmoj/settings.py:370
msgid "Croatian"
msgstr "Tiếng Croatia"
-#: dmoj/settings.py:370
+#: dmoj/settings.py:371
msgid "Hungarian"
msgstr "Tiếng Hung-ga-ri"
-#: dmoj/settings.py:371
+#: dmoj/settings.py:372
msgid "Japanese"
msgstr "Tiếng Nhật Bản"
-#: dmoj/settings.py:372
+#: dmoj/settings.py:373
msgid "Korean"
msgstr "Tiếng Hàn Quốc"
-#: dmoj/settings.py:373
+#: dmoj/settings.py:374
msgid "Brazilian Portuguese"
msgstr "Tiếng Braxin-Bồ Đào Nha"
-#: dmoj/settings.py:374
+#: dmoj/settings.py:375
msgid "Romanian"
msgstr "Tiếng Romania"
-#: dmoj/settings.py:375
+#: dmoj/settings.py:376
msgid "Russian"
msgstr "Tiếng Nga"
-#: dmoj/settings.py:376
+#: dmoj/settings.py:377
msgid "Serbian (Latin)"
msgstr "Tiếng Séc-bi (Latin)"
-#: dmoj/settings.py:377
+#: dmoj/settings.py:378
msgid "Turkish"
msgstr "Tiếng Thổ Nhĩ Kỳ"
-#: dmoj/settings.py:378
+#: dmoj/settings.py:379
msgid "Vietnamese"
msgstr "Tiếng Việt"
-#: dmoj/settings.py:379
+#: dmoj/settings.py:380
msgid "Simplified Chinese"
msgstr "Tiếng Trung (Giản thể)"
-#: dmoj/settings.py:380
+#: dmoj/settings.py:381
msgid "Traditional Chinese"
msgstr "Tiếng Trung phồn thể"
-#: dmoj/urls.py:103 templates/base.html:190
+#: dmoj/urls.py:104 templates/base.html:190
msgid "Home"
msgstr "Trang chủ"
@@ -113,106 +113,106 @@ msgstr "Bỏ ẩn bình luận"
msgid "Associated page"
msgstr "Trang liên kết"
-#: judge/admin/contest.py:31
+#: judge/admin/contest.py:32
msgid "Included contests"
msgstr "Các cuộc thi"
-#: judge/admin/contest.py:65 templates/contest/contest.html:83
+#: judge/admin/contest.py:66 templates/contest/contest.html:83
#: templates/contest/moss.html:43 templates/problem/list.html:204
#: templates/problem/list.html:219 templates/user/user-problems.html:58
#: templates/user/user-problems.html:100
msgid "Problem"
msgstr "Đề bài"
-#: judge/admin/contest.py:114
+#: judge/admin/contest.py:117
msgid "Settings"
msgstr "Cài đặt"
-#: judge/admin/contest.py:116
+#: judge/admin/contest.py:120
msgid "Scheduling"
msgstr "Kế hoạch"
-#: judge/admin/contest.py:117
+#: judge/admin/contest.py:121
msgid "Details"
msgstr "Chi tiêt"
-#: judge/admin/contest.py:118
+#: judge/admin/contest.py:122
msgid "Format"
msgstr "Định dạng"
-#: judge/admin/contest.py:119 templates/contest/ranking-table.html:5
+#: judge/admin/contest.py:123 templates/contest/ranking-table.html:5
msgid "Rating"
msgstr "Xếp loại"
-#: judge/admin/contest.py:120
+#: judge/admin/contest.py:124
msgid "Access"
msgstr "Truy cập"
-#: judge/admin/contest.py:122 judge/admin/problem.py:134
+#: judge/admin/contest.py:126 judge/admin/problem.py:135
msgid "Justice"
msgstr "Luật"
-#: judge/admin/contest.py:211
+#: judge/admin/contest.py:215
#, python-format
msgid "%d contest successfully marked as visible."
msgid_plural "%d contests successfully marked as visible."
msgstr[0] "%d kỳ thi đã được đánh dấu là có thể thấy."
-#: judge/admin/contest.py:214
+#: judge/admin/contest.py:218
msgid "Mark contests as visible"
msgstr "Đánh dấu các kỳ thi là có thể thấy"
-#: judge/admin/contest.py:220
+#: judge/admin/contest.py:224
#, python-format
msgid "%d contest successfully marked as hidden."
msgid_plural "%d contests successfully marked as hidden."
msgstr[0] "%d kỳ thi đã được đánh dấu là ẩn."
-#: judge/admin/contest.py:223
+#: judge/admin/contest.py:227
msgid "Mark contests as hidden"
msgstr "Đánh dấu các kỳ thi là ẩn"
-#: judge/admin/contest.py:229
+#: judge/admin/contest.py:233
#, python-format
msgid "%d contest successfully locked."
msgid_plural "%d contests successfully locked."
msgstr[0] "Đã khóa %d cuộc thi thành công."
-#: judge/admin/contest.py:232
+#: judge/admin/contest.py:236
msgid "Lock contest submissions"
msgstr "khóa bài thi"
-#: judge/admin/contest.py:238
+#: judge/admin/contest.py:242
#, python-format
msgid "%d contest successfully unlocked."
msgid_plural "%d contests successfully unlocked."
msgstr[0] "Mở khóa %d cuộc thi thành công."
-#: judge/admin/contest.py:241
+#: judge/admin/contest.py:245
msgid "Unlock contest submissions"
msgstr "gỡ khóa bài thi"
-#: judge/admin/contest.py:262 judge/admin/submission.py:170
+#: judge/admin/contest.py:266 judge/admin/submission.py:170
#, python-format
msgid "%d submission was successfully scheduled for rejudging."
msgid_plural "%d submissions were successfully scheduled for rejudging."
msgstr[0] "%d bài nộp đã được lên lịch để chấm lại."
-#: judge/admin/contest.py:337
+#: judge/admin/contest.py:341
#, python-format
msgid "%d participation recalculated."
msgid_plural "%d participations recalculated."
msgstr[0] "%d tham gia tính lại."
-#: judge/admin/contest.py:340
+#: judge/admin/contest.py:344
msgid "Recalculate results"
msgstr "Kết quả tính lại"
-#: judge/admin/contest.py:344 judge/admin/organization.py:63
+#: judge/admin/contest.py:348 judge/admin/organization.py:63
msgid "username"
msgstr "tên người dùng"
-#: judge/admin/contest.py:349 templates/base.html:258
+#: judge/admin/contest.py:353 templates/base.html:258
msgid "virtual"
msgstr "ảo"
@@ -228,9 +228,9 @@ msgstr "Nội dung"
msgid "Summary"
msgstr "Tổng hợp"
-#: judge/admin/interface.py:113 judge/models/contest.py:383
-#: judge/models/contest.py:509 judge/models/profile.py:244
-#: judge/models/profile.py:268
+#: judge/admin/interface.py:113 judge/models/contest.py:419
+#: judge/models/contest.py:546 judge/models/profile.py:261
+#: judge/models/profile.py:292
msgid "user"
msgstr "thành viên"
@@ -238,8 +238,8 @@ msgstr "thành viên"
msgid "object"
msgstr "đối tượng"
-#: judge/admin/organization.py:32 judge/admin/problem.py:181
-#: judge/admin/profile.py:82
+#: judge/admin/organization.py:32 judge/admin/problem.py:182
+#: judge/admin/profile.py:92
msgid "View on site"
msgstr "Xem trên trang web"
@@ -247,66 +247,66 @@ msgstr "Xem trên trang web"
msgid "Describe the changes you made (optional)"
msgstr "Mô tả những thay đổi bạn đã thực hiện (tùy chọn)"
-#: judge/admin/problem.py:129
+#: judge/admin/problem.py:130
msgid "Social Media"
msgstr "Mạng Xã hội"
-#: judge/admin/problem.py:130
+#: judge/admin/problem.py:131
msgid "Taxonomy"
msgstr "Phân loại"
-#: judge/admin/problem.py:131 templates/contest/contest.html:84
+#: judge/admin/problem.py:132 templates/contest/contest.html:84
#: templates/problem/data.html:385 templates/problem/list.html:209
#: templates/problem/list.html:230 templates/user/base-users-table.html:10
#: templates/user/user-problems.html:60
msgid "Points"
msgstr "Điểm"
-#: judge/admin/problem.py:132
+#: judge/admin/problem.py:133
msgid "Limits"
msgstr "Giới hạn"
-#: judge/admin/problem.py:133 judge/admin/submission.py:238
-#: templates/stats/base.html:14 templates/submission/list.html:320
-#: templates/user/edit-profile.html:292
+#: judge/admin/problem.py:134 judge/admin/submission.py:238
+#: templates/stats/base.html:14 templates/submission/list.html:319
+#: templates/user/edit-profile.html:296
msgid "Language"
msgstr "Ngôn ngữ"
-#: judge/admin/problem.py:135
+#: judge/admin/problem.py:136
msgid "History"
msgstr "Lịch sử"
-#: judge/admin/problem.py:178
+#: judge/admin/problem.py:179
msgid "Authors"
msgstr "Tác giả"
-#: judge/admin/problem.py:191
+#: judge/admin/problem.py:192
#, python-format
msgid "%d problem's publish date successfully updated."
msgid_plural "%d problems' publish date successfully updated."
msgstr[0] "%d ngày xuất bản của bài tập đã được cập nhật."
-#: judge/admin/problem.py:195
+#: judge/admin/problem.py:196
msgid "Set publish date to now"
msgstr "Chỉnh thời gian xuất bản đến hiện tại"
-#: judge/admin/problem.py:201
+#: judge/admin/problem.py:202
#, python-format
msgid "%d problem successfully marked as public."
msgid_plural "%d problems successfully marked as public."
msgstr[0] "%d bài toán đã được công bố."
-#: judge/admin/problem.py:205
+#: judge/admin/problem.py:206
msgid "Mark problems as public"
msgstr "Công bố đề bài"
-#: judge/admin/problem.py:211
+#: judge/admin/problem.py:212
#, python-format
msgid "%d problem successfully marked as private."
msgid_plural "%d problems successfully marked as private."
msgstr[0] "%d bài toán đã được đánh dấu là cá nhân."
-#: judge/admin/problem.py:215
+#: judge/admin/problem.py:216
msgid "Mark problems as private"
msgstr "Đánh dấu bài toán là cá nhân"
@@ -314,34 +314,34 @@ msgstr "Đánh dấu bài toán là cá nhân"
msgid "timezone"
msgstr "múi giờ"
-#: judge/admin/profile.py:88 judge/admin/submission.py:217
+#: judge/admin/profile.py:98 judge/admin/submission.py:217
#: templates/organization/requests/log.html:9
#: templates/organization/requests/pending.html:12
#: templates/ticket/list.html:261
msgid "User"
msgstr "Thành viên"
-#: judge/admin/profile.py:93 templates/registration/registration_form.html:143
+#: judge/admin/profile.py:103 templates/registration/registration_form.html:143
msgid "Email"
msgstr "Hộp thư"
-#: judge/admin/profile.py:98 judge/views/register.py:29
+#: judge/admin/profile.py:108 judge/views/register.py:28
#: templates/registration/registration_form.html:171
-#: templates/user/edit-profile.html:288
+#: templates/user/edit-profile.html:292
msgid "Timezone"
msgstr "Múi giờ"
-#: judge/admin/profile.py:103
+#: judge/admin/profile.py:113
msgid "date joined"
msgstr "ngày tham gia"
-#: judge/admin/profile.py:110
+#: judge/admin/profile.py:120
#, python-format
msgid "%d user have scores recalculated."
msgid_plural "%d users have scores recalculated."
msgstr[0] "%d người dùng có tính lại điểm."
-#: judge/admin/profile.py:113
+#: judge/admin/profile.py:123
msgid "Recalculate scores"
msgstr "Tính lại điểm"
@@ -493,115 +493,116 @@ msgstr "IOI"
msgid "IOI (pre-2016)"
msgstr "IOI (trước năm 2016)"
-#: judge/forms.py:26
-msgid "Two-factor authentication tokens must be 6 decimal digits."
-msgstr "Mã xác thực 2 lớp phải có 6 chữ số"
+#: judge/forms.py:27
+#, python-brace-format
+msgid "Two-factor authentication tokens must be {TOTP_CODE_LENGTH} decimal digits."
+msgstr ""
-#: judge/forms.py:29
+#: judge/forms.py:30
msgid "Invalid two-factor authentication token."
msgstr "Mã xác thực không đúng"
-#: judge/forms.py:32
+#: judge/forms.py:33
msgid "Scratch codes must be 16 base32 characters."
msgstr "Mã truy cập phải là 16 kí tự hệ 32"
-#: judge/forms.py:34
+#: judge/forms.py:35 judge/forms.py:264
msgid "Invalid scratch code."
msgstr ""
-#: judge/forms.py:45
+#: judge/forms.py:46
msgid "Subscribe to contest updates"
msgstr "Đăng ký để nhận các cập nhật về cuộc thi"
-#: judge/forms.py:46
+#: judge/forms.py:47
msgid "Enable experimental features"
msgstr "Bật các tính năng đang thử nghiệm"
-#: judge/forms.py:71
+#: judge/forms.py:72
msgid "You must solve at least one problem before you can update your profile."
-msgstr ""
+msgstr "Bạn cần phải giải ít nhất một bài trước khi được quyền cập nhật hồ sơ."
-#: judge/forms.py:80 judge/views/organization.py:127
+#: judge/forms.py:81 judge/views/organization.py:126
#, python-brace-format
msgid "You may not be part of more than {count} public organizations."
msgstr "Bạn không thể là thành viên của nhiều hơn {count} tổ chức công khai."
-#: judge/forms.py:96
+#: judge/forms.py:97
msgid "Download comments?"
msgstr "Tải các bình luận về?"
-#: judge/forms.py:97
+#: judge/forms.py:98
msgid "Download submissions?"
msgstr "Tải xuống các bài nộp?"
-#: judge/forms.py:98
+#: judge/forms.py:99
msgid "Filter by problem code glob:"
-msgstr ""
+msgstr "Sắp xếp theo mã bài tập:"
-#: judge/forms.py:102
+#: judge/forms.py:103
msgid "Leave empty to include all submissions"
msgstr "Hãy để trống để bao gồm mọi bài nộp"
-#: judge/forms.py:105 templates/problem/manage_submission.html:142
+#: judge/forms.py:106 templates/problem/manage_submission.html:142
msgid "Filter by result:"
msgstr "Lọc theo kết quả:"
-#: judge/forms.py:111
+#: judge/forms.py:112
msgid "Please select at least one thing to download."
msgstr "Vui lòng chọn ít nhất một thứ để tải về."
-#: judge/forms.py:137
+#: judge/forms.py:138
msgid "Any judge"
msgstr "Bất kì máy chấm nào"
-#: judge/forms.py:167 judge/views/register.py:26
+#: judge/forms.py:159 judge/views/register.py:25
#: templates/registration/registration_form.html:137
#: templates/user/base-users-table.html:5
msgid "Username"
msgstr "Tên truy cập"
-#: judge/forms.py:168 templates/registration/registration_form.html:149
+#: judge/forms.py:160 templates/registration/registration_form.html:149
#: templates/registration/registration_form.html:163
msgid "Password"
msgstr "Mật khẩu"
-#: judge/forms.py:201
+#: judge/forms.py:192
msgid "Invalid code length."
msgstr "Độ dài của bài nộp không hợp lệ."
-#: judge/forms.py:219
+#: judge/forms.py:223
msgid "Invalid WebAuthn response."
msgstr "Phản hồi WebAuthn không hợp lệ."
-#: judge/forms.py:222
+#: judge/forms.py:226
msgid "No WebAuthn challenge issued."
msgstr ""
-#: judge/forms.py:228
+#: judge/forms.py:232
msgid "Invalid WebAuthn credential ID."
msgstr ""
-#: judge/forms.py:257
+#: judge/forms.py:262
msgid "Invalid two-factor authentication token or scratch code."
msgstr "Mã xác thực hoặc mã truy cập không hợp lệ."
-#: judge/forms.py:259
+#: judge/forms.py:266
msgid "Must specify either totp_token or webauthn_response."
msgstr ""
-#: judge/forms.py:263 judge/models/problem.py:105
+#: judge/forms.py:270 judge/models/problem.py:119
msgid "Problem code must be ^[a-z0-9]+$"
msgstr "Mã đầu bài chỉ bao gồm ^[a-z0-9] + $"
-#: judge/forms.py:268
+#: judge/forms.py:275
msgid "Problem with code already exists."
msgstr "Mã bài tập đã tồn tại."
-#: judge/forms.py:273 judge/models/contest.py:66
+#: judge/forms.py:280 judge/models/contest.py:66
msgid "Contest id must be ^[a-z0-9]+$"
msgstr "id cuộc thi phải bao gồm ^[a-z0-9] + $"
-#: judge/forms.py:278
+#: judge/forms.py:285
msgid "Contest with key already exists."
msgstr "Mã kỳ thi đã tồn tại."
@@ -681,7 +682,7 @@ msgid "comments"
msgstr "nhận xét"
#: judge/models/comment.py:89 judge/models/comment.py:141
-#: judge/models/problem.py:484
+#: judge/models/problem.py:511
#, python-format
msgid "Editorial for %s"
msgstr "Hướng giải cho %s"
@@ -722,21 +723,21 @@ msgstr "mô tả thẻ"
msgid "contest tag"
msgstr "thẻ cuộc thi"
-#: judge/models/contest.py:53 judge/models/contest.py:117
+#: judge/models/contest.py:53 judge/models/contest.py:126
msgid "contest tags"
msgstr "thẻ cuộc thi"
#: judge/models/contest.py:61
msgid "Visible"
-msgstr ""
+msgstr "Hiển thị"
#: judge/models/contest.py:62
msgid "Hidden for duration of contest"
-msgstr ""
+msgstr "Ẩn trong lúc thi"
#: judge/models/contest.py:63
msgid "Hidden for duration of participation"
-msgstr ""
+msgstr "Ẩn trong lúc tham gia"
#: judge/models/contest.py:65
msgid "contest id"
@@ -747,410 +748,426 @@ msgid "contest name"
msgstr "tên cuộc thi"
#: judge/models/contest.py:68
-msgid "These people will be able to edit the contest."
-msgstr "Những người này sẽ có thể chỉnh sửa các cuộc thi."
+msgid "These users will be able to edit the contest."
+msgstr "Những người dùng này có thể chỉnh sửa cuộc thi."
+
+#: judge/models/contest.py:70
+msgid "These users will be able to edit the contest, but will not be listed as authors."
+msgstr "Những người dùng này có thể chỉnh sửa cuộc thi, nhưng sẽ không được liệt kê trong danh sách tác giả."
-#: judge/models/contest.py:70 judge/models/runtime.py:136
+#: judge/models/contest.py:73
+msgid "These users will be able to view the contest, but not edit it."
+msgstr "Những người dùng này có thể xem cuộc thi, nhưng không thể chỉnh sửa nó."
+
+#: judge/models/contest.py:76 judge/models/runtime.py:136
msgid "description"
msgstr "mô tả"
-#: judge/models/contest.py:71 judge/models/problem.py:431
+#: judge/models/contest.py:77 judge/models/problem.py:458
#: judge/models/runtime.py:138
msgid "problems"
msgstr "đề bài"
-#: judge/models/contest.py:72 judge/models/contest.py:384
+#: judge/models/contest.py:78 judge/models/contest.py:420
msgid "start time"
msgstr "t. gian b. đầu"
-#: judge/models/contest.py:73
+#: judge/models/contest.py:79
msgid "end time"
msgstr "thời gian kết thúc"
-#: judge/models/contest.py:74 judge/models/problem.py:126
-#: judge/models/problem.py:455
+#: judge/models/contest.py:80 judge/models/problem.py:140
+#: judge/models/problem.py:482
msgid "time limit"
msgstr "giới hạn thời gian"
-#: judge/models/contest.py:75 judge/models/problem.py:144
+#: judge/models/contest.py:81 judge/models/problem.py:158
msgid "publicly visible"
msgstr "công khai"
-#: judge/models/contest.py:76
+#: judge/models/contest.py:82
msgid "Should be set even for organization-private contests, where it determines whether the contest is visible to members of the specified organizations."
msgstr "Nên được đặt ngay cả đối với các cuộc thi riêng, nơi nó sẽ xác định xem các cuộc thi chỉ được nhìn thấy bởi các thành viên của tổ chức này."
-#: judge/models/contest.py:79
+#: judge/models/contest.py:85
msgid "contest rated"
msgstr "cuộc thi đã được xếp hạng"
-#: judge/models/contest.py:79
+#: judge/models/contest.py:85
msgid "Whether this contest can be rated."
msgstr "Cho dù cuộc thi này có thể được đánh giá cao."
-#: judge/models/contest.py:81
+#: judge/models/contest.py:87
msgid "view contest scoreboard"
msgstr "Xem bảng điểm cuộc thi"
-#: judge/models/contest.py:83
+#: judge/models/contest.py:89
msgid "These users will be able to view the scoreboard."
msgstr "Những người này sẽ có thể xem bảng điểm"
-#: judge/models/contest.py:84
+#: judge/models/contest.py:90
msgid "scoreboard visibility"
-msgstr ""
+msgstr "Sự hiện thị của bảng điểm"
-#: judge/models/contest.py:85
+#: judge/models/contest.py:91
msgid "Scoreboard visibility through the duration of the contest"
-msgstr ""
+msgstr "Sự hiện thị của bảng điểm trong cuộc thi"
-#: judge/models/contest.py:87
+#: judge/models/contest.py:93
msgid "no comments"
msgstr "không có bình luận gì"
-#: judge/models/contest.py:88
+#: judge/models/contest.py:94
msgid "Use clarification system instead of comments."
msgstr "Đừng comment mà hãy sử dụng hệ thống giải đáp thắc mắc."
-#: judge/models/contest.py:90
+#: judge/models/contest.py:96
msgid "Rating floor for contest"
msgstr "Xếp loại thấp nhất cho cuộc thi"
-#: judge/models/contest.py:92
+#: judge/models/contest.py:98
msgid "Rating ceiling for contest"
msgstr "Xếp loại cao nhất cho cuộc thi"
-#: judge/models/contest.py:94
+#: judge/models/contest.py:100
msgid "rate all"
msgstr "đánh giá tất cả"
-#: judge/models/contest.py:94
+#: judge/models/contest.py:100
msgid "Rate all users who joined."
msgstr "Đánh giá những người đã tham gia."
-#: judge/models/contest.py:95
+#: judge/models/contest.py:101
msgid "exclude from ratings"
msgstr "không xếp hạng"
-#: judge/models/contest.py:97
+#: judge/models/contest.py:103
msgid "private to specific users"
msgstr "riêng tu cho thành viên cụ thể"
-#: judge/models/contest.py:98
+#: judge/models/contest.py:104
msgid "private contestants"
msgstr "thí sinh riêng tư"
-#: judge/models/contest.py:99
+#: judge/models/contest.py:105
msgid "If private, only these users may see the contest"
msgstr "Nếu là riêng tư, chỉ những người dùng này có thể xem kỳ thi"
-#: judge/models/contest.py:101
+#: judge/models/contest.py:107
msgid "hide problem tags"
msgstr "ẩn các thẻ đầu bài"
-#: judge/models/contest.py:102
+#: judge/models/contest.py:108
msgid "Whether problem tags should be hidden by default."
msgstr "Cho dù vấn đề tags nên được ẩn theo mặc định."
-#: judge/models/contest.py:104
+#: judge/models/contest.py:110
+msgid "hide problem authors"
+msgstr ""
+
+#: judge/models/contest.py:111
+msgid "Whether problem authors should be hidden by default."
+msgstr ""
+
+#: judge/models/contest.py:113
msgid "run pretests only"
msgstr "chỉ chạy các phép thử trước"
-#: judge/models/contest.py:105
+#: judge/models/contest.py:114
msgid "Whether judges should grade pretests only, versus all testcases. Commonly set during a contest, then unset prior to rejudging user submissions when the contest ends."
msgstr "Chỉ chấm bài thử. Thường sử dụng trong các cuộc thi, sau đó bỏ để chấm lại các bài chấm ở cuối cuộc thi."
-#: judge/models/contest.py:109 judge/models/problem.py:166
+#: judge/models/contest.py:118 judge/models/problem.py:183
msgid "private to organizations"
msgstr "dành riêng cho tổ chức"
-#: judge/models/contest.py:110 judge/models/problem.py:164
-#: judge/models/profile.py:83
+#: judge/models/contest.py:119 judge/models/problem.py:181
+#: judge/models/profile.py:86
msgid "organizations"
msgstr "tổ chức"
-#: judge/models/contest.py:111
+#: judge/models/contest.py:120
msgid "If private, only these organizations may see the contest"
msgstr "Nếu là dành riêng, thì chỉ các tổ chức này mới có thể xem cuộc thi"
-#: judge/models/contest.py:112 judge/models/problem.py:153
+#: judge/models/contest.py:121 judge/models/problem.py:167
msgid "OpenGraph image"
msgstr "Ảnh OpenGraph"
-#: judge/models/contest.py:113 judge/models/profile.py:54
+#: judge/models/contest.py:122 judge/models/profile.py:57
msgid "Logo override image"
msgstr "Ghi đè ảnh Logo"
-#: judge/models/contest.py:115
+#: judge/models/contest.py:124
msgid "This image will replace the default site logo for users inside the contest."
msgstr "Ảnh này sẽ thay thế logo mặc định cho người dùng trong kỳ thi."
-#: judge/models/contest.py:118
+#: judge/models/contest.py:127
msgid "the amount of live participants"
msgstr "số lượng người tham gia trực tiếp"
-#: judge/models/contest.py:119
+#: judge/models/contest.py:128
msgid "contest summary"
msgstr "tổng kết cuộc thi"
-#: judge/models/contest.py:120 judge/models/problem.py:155
+#: judge/models/contest.py:129 judge/models/problem.py:169
msgid "Plain-text, shown in meta description tag, e.g. for social media."
msgstr "Văn bản thuần tuý, Hiển thị trong thẻ meta, ví dụ như cho các phương tiện truyền thông xã hội."
-#: judge/models/contest.py:121 judge/models/profile.py:53
+#: judge/models/contest.py:130 judge/models/profile.py:56
msgid "access code"
msgstr "mã truy cập"
-#: judge/models/contest.py:122
+#: judge/models/contest.py:131
msgid "An optional code to prompt contestants before they are allowed to join the contest. Leave it blank to disable."
msgstr "Một mã tùy chọn để nhắc nhở các thí sinh trước khi họ được phép tham gia kỳ thi. Để trống để vô hiệu hóa."
-#: judge/models/contest.py:124 judge/models/problem.py:149
+#: judge/models/contest.py:133 judge/models/problem.py:163
msgid "personae non gratae"
msgstr "cá nhân - không tính điểm"
-#: judge/models/contest.py:125
+#: judge/models/contest.py:134
msgid "Bans the selected users from joining this contest."
msgstr "Cấm những người dùng đã chọn tham gia kỳ thi này."
-#: judge/models/contest.py:126
+#: judge/models/contest.py:135
msgid "contest format"
msgstr "định dạng kỳ thi"
-#: judge/models/contest.py:127
+#: judge/models/contest.py:136
msgid "The contest format module to use."
msgstr "Dạng mô đun sử dụng cho kỳ thi."
-#: judge/models/contest.py:128
+#: judge/models/contest.py:137
msgid "contest format configuration"
msgstr "cấu hình dạng kỳ thi"
-#: judge/models/contest.py:129
+#: judge/models/contest.py:138
msgid "A JSON object to serve as the configuration for the chosen contest format module. Leave empty to use None. Exact format depends on the contest format selected."
msgstr "Một đối tượng JSON dùng để chọn cấu hình định dạng cho mô đun kỳ thi. Để trống nếu không dùng. Định dạng chính xác phụ thuộc vào định dạng kỳ thi được chọn."
-#: judge/models/contest.py:136
+#: judge/models/contest.py:145
msgid "contest lock"
msgstr "Khóa cuộc thi."
-#: judge/models/contest.py:137
-msgid "Prevent submissions from this contest from being rejudged."
-msgstr "Không cho các bài nộp của cuộc thi này chấm lại"
+#: judge/models/contest.py:146
+msgid "Prevent submissions from this contest from being rejudged after this date."
+msgstr "Không cho các bài nộp của cuộc thi này chấm lại sau thời gian này."
-#: judge/models/contest.py:138
+#: judge/models/contest.py:148
msgid "precision points"
msgstr "độ chính xác"
-#: judge/models/contest.py:140
+#: judge/models/contest.py:150
msgid "Number of digits to round points to."
msgstr "số chữ số sau dấu chấm phẩy để làm tròn."
-#: judge/models/contest.py:362
+#: judge/models/contest.py:398
msgid "See private contests"
msgstr "Xem các kỳ thi riêng tư"
-#: judge/models/contest.py:363
+#: judge/models/contest.py:399
msgid "Edit own contests"
msgstr "Sửa các kỳ thi sở hữu"
-#: judge/models/contest.py:364
+#: judge/models/contest.py:400
msgid "Edit all contests"
msgstr "Sửa tất cả các kỳ thi"
-#: judge/models/contest.py:365
+#: judge/models/contest.py:401
msgid "Clone contest"
msgstr "Nhân bản kỳ thi"
-#: judge/models/contest.py:366 templates/contest/moss.html:74
+#: judge/models/contest.py:402 templates/contest/moss.html:74
msgid "MOSS contest"
msgstr "Kỳ thi MOSS"
-#: judge/models/contest.py:367
+#: judge/models/contest.py:403
msgid "Rate contests"
msgstr "Đánh gia các kỳ thi"
-#: judge/models/contest.py:368
+#: judge/models/contest.py:404
msgid "Contest access codes"
msgstr "Mã truy cập kỳ thi"
-#: judge/models/contest.py:369
+#: judge/models/contest.py:405
msgid "Create private contests"
msgstr "Tạo kỳ thi riêng tư"
-#: judge/models/contest.py:370
+#: judge/models/contest.py:406
msgid "Change contest visibility"
msgstr "Chỉnh tính công khai của cuộc thi"
-#: judge/models/contest.py:371
+#: judge/models/contest.py:407
msgid "Edit contest problem label script"
msgstr ""
-#: judge/models/contest.py:372
+#: judge/models/contest.py:408
msgid "Change lock status of contest"
-msgstr ""
+msgstr "Chỉnh trạng thái khóa của cuộc thi"
-#: judge/models/contest.py:374 judge/models/contest.py:472
-#: judge/models/contest.py:510 judge/models/contest.py:532
-#: judge/models/submission.py:84
+#: judge/models/contest.py:410 judge/models/contest.py:508
+#: judge/models/contest.py:547 judge/models/contest.py:569
+#: judge/models/submission.py:85
msgid "contest"
msgstr "cuộc thi"
-#: judge/models/contest.py:375
+#: judge/models/contest.py:411
msgid "contests"
msgstr "cuộc thi"
-#: judge/models/contest.py:382
+#: judge/models/contest.py:418
msgid "associated contest"
msgstr "cuộc thi liên quan"
-#: judge/models/contest.py:385
+#: judge/models/contest.py:421
msgid "score"
msgstr "điểm"
-#: judge/models/contest.py:386
+#: judge/models/contest.py:422
msgid "cumulative time"
msgstr "thời gian tích lũy"
-#: judge/models/contest.py:387
+#: judge/models/contest.py:423
msgid "is disqualified"
msgstr "bị loại"
-#: judge/models/contest.py:388
+#: judge/models/contest.py:424
msgid "Whether this participation is disqualified."
msgstr "có bị hủy tư cách tham gia"
-#: judge/models/contest.py:389
+#: judge/models/contest.py:425
msgid "tie-breaking field"
-msgstr ""
+msgstr "Trường dùng để tie-break"
-#: judge/models/contest.py:390
+#: judge/models/contest.py:426
msgid "virtual participation id"
msgstr "mã số tham gia ảo"
-#: judge/models/contest.py:391
+#: judge/models/contest.py:427
msgid "0 means non-virtual, otherwise the n-th virtual participation."
msgstr "0 nghĩa là không phải đăng ký ảo, ngược lại là lần đăng ký ảo thứ n"
-#: judge/models/contest.py:392
+#: judge/models/contest.py:428
msgid "contest format specific data"
msgstr "định dạng dữ liệu cụ thể của kỳ thi"
-#: judge/models/contest.py:458
+#: judge/models/contest.py:494
#, python-format
msgid "%s spectating in %s"
msgstr "%s spectating trong %s"
-#: judge/models/contest.py:460
+#: judge/models/contest.py:496
#, python-format
msgid "%s in %s, v%d"
msgstr "%s trong %s, v%d"
-#: judge/models/contest.py:461
+#: judge/models/contest.py:497
#, python-format
msgid "%s in %s"
msgstr "%s trong %s"
-#: judge/models/contest.py:464
+#: judge/models/contest.py:500
msgid "contest participation"
msgstr "tham gia cuộc thi"
-#: judge/models/contest.py:465
+#: judge/models/contest.py:501
msgid "contest participations"
msgstr "tham gia cuộc thi"
-#: judge/models/contest.py:471 judge/models/contest.py:494
-#: judge/models/contest.py:533 judge/models/problem.py:430
-#: judge/models/problem.py:435 judge/models/problem.py:453
+#: judge/models/contest.py:507 judge/models/contest.py:531
+#: judge/models/contest.py:570 judge/models/problem.py:457
+#: judge/models/problem.py:462 judge/models/problem.py:480
#: judge/models/problem_data.py:35
msgid "problem"
msgstr "vấn đề"
-#: judge/models/contest.py:473 judge/models/contest.py:498
-#: judge/models/problem.py:137
+#: judge/models/contest.py:509 judge/models/contest.py:535
+#: judge/models/problem.py:151
msgid "points"
msgstr "điểm"
-#: judge/models/contest.py:474
+#: judge/models/contest.py:510
msgid "partial"
msgstr "một phần"
-#: judge/models/contest.py:475 judge/models/contest.py:499
+#: judge/models/contest.py:511 judge/models/contest.py:536
msgid "is pretested"
msgstr "được test trước"
-#: judge/models/contest.py:476 judge/models/interface.py:43
+#: judge/models/contest.py:512 judge/models/interface.py:43
msgid "order"
msgstr "thứ tự"
-#: judge/models/contest.py:477
+#: judge/models/contest.py:513
msgid "output prefix length override"
msgstr "ghi đè độ dài output prefix"
-#: judge/models/contest.py:479
+#: judge/models/contest.py:515
msgid "Maximum number of submissions for this problem, or leave blank for no limit."
msgstr "Số lượng tối đa lần nộp cho bài này, hoặc để trống nếu không giới hạn."
-#: judge/models/contest.py:482
+#: judge/models/contest.py:518
msgid "Why include a problem you can't submit to?"
msgstr "Tại sao bạn không thể nộp bài cho một bài tập?"
-#: judge/models/contest.py:487
+#: judge/models/contest.py:523
msgid "contest problem"
msgstr "đề bài của cuộc thi"
-#: judge/models/contest.py:488
+#: judge/models/contest.py:524
msgid "contest problems"
msgstr "đề bài của cuộc thi"
-#: judge/models/contest.py:492 judge/models/submission.py:207
+#: judge/models/contest.py:529 judge/models/submission.py:218
msgid "submission"
msgstr "nộp bài"
-#: judge/models/contest.py:496 judge/models/contest.py:511
+#: judge/models/contest.py:533 judge/models/contest.py:548
msgid "participation"
msgstr "tham dự"
-#: judge/models/contest.py:500
+#: judge/models/contest.py:537
msgid "Whether this submission was ran only on pretests."
msgstr "Bài nộp này chỉ chỉ chạy trên bài thử."
-#: judge/models/contest.py:504
+#: judge/models/contest.py:541
msgid "contest submission"
msgstr "nộp bài thi"
-#: judge/models/contest.py:505
+#: judge/models/contest.py:542
msgid "contest submissions"
msgstr "nộp bài thi"
-#: judge/models/contest.py:513
+#: judge/models/contest.py:550
msgid "rank"
msgstr "hạng"
-#: judge/models/contest.py:514
+#: judge/models/contest.py:551
msgid "rating"
msgstr "đánh giá"
-#: judge/models/contest.py:515
+#: judge/models/contest.py:552
msgid "volatility"
msgstr "volative"
-#: judge/models/contest.py:516
+#: judge/models/contest.py:553
msgid "last rated"
msgstr "lần xếp hạng cuối"
-#: judge/models/contest.py:520
+#: judge/models/contest.py:557
msgid "contest rating"
msgstr "xếp hạng cuộc thi"
-#: judge/models/contest.py:521
+#: judge/models/contest.py:558
msgid "contest ratings"
msgstr "xếp hạng cuộc thi"
-#: judge/models/contest.py:540
+#: judge/models/contest.py:577
msgid "contest moss result"
msgstr "kết quả kỳ thi moss"
-#: judge/models/contest.py:541
+#: judge/models/contest.py:578
msgid "contest moss results"
msgstr "kết quả kỳ thi moss"
@@ -1190,7 +1207,7 @@ msgstr "mục cha"
msgid "post title"
msgstr "tiêu đề bài viết"
-#: judge/models/interface.py:67 judge/models/problem.py:473
+#: judge/models/interface.py:67 judge/models/problem.py:500
msgid "authors"
msgstr "tác giả"
@@ -1198,7 +1215,7 @@ msgstr "tác giả"
msgid "slug"
msgstr "slug"
-#: judge/models/interface.py:69 judge/models/problem.py:471
+#: judge/models/interface.py:69 judge/models/problem.py:498
msgid "public visibility"
msgstr "hiển thị công khai"
@@ -1234,38 +1251,10 @@ msgstr "bài đăng blog"
msgid "blog posts"
msgstr "bài đăng blog"
-#: judge/models/message.py:11
-msgid "message title"
-msgstr "tiêu đề thông báo"
-
-#: judge/models/message.py:12 judge/models/ticket.py:30
-msgid "message body"
-msgstr "nội dung thư"
-
-#: judge/models/message.py:13
-msgid "sender"
-msgstr "người gửi"
-
-#: judge/models/message.py:14
-msgid "target"
-msgstr "mục tiêu"
-
-#: judge/models/message.py:15
-msgid "message timestamp"
-msgstr "nhãn thời gian của tin nhắn"
-
-#: judge/models/message.py:16
-msgid "read"
-msgstr "đọc"
-
-#: judge/models/message.py:20
-msgid "messages in the thread"
-msgstr "các tin nhắn trong luồng"
-
#: judge/models/problem.py:30
#, python-format
msgid "Disallowed characters: %(value)s"
-msgstr ""
+msgstr "Những kí tự bị cấm sử dụng: %(value)s"
#: judge/models/problem.py:35
msgid "problem category ID"
@@ -1279,7 +1268,7 @@ msgstr "phân loại đề bài"
msgid "problem type"
msgstr "kiểu vấn đề"
-#: judge/models/problem.py:44 judge/models/problem.py:121
+#: judge/models/problem.py:44 judge/models/problem.py:135
msgid "problem types"
msgstr "kiểu vấn đề"
@@ -1291,7 +1280,7 @@ msgstr "iD của nhóm đề bài"
msgid "problem group name"
msgstr "tên nhóm đề bài"
-#: judge/models/problem.py:56 judge/models/problem.py:124
+#: judge/models/problem.py:56 judge/models/problem.py:138
msgid "problem group"
msgstr "nhóm đề bài"
@@ -1311,7 +1300,7 @@ msgstr "liên kết"
msgid "full name"
msgstr "tên đầy đủ"
-#: judge/models/problem.py:65 judge/models/profile.py:41
+#: judge/models/problem.py:65 judge/models/profile.py:44
#: judge/models/runtime.py:24
msgid "short name"
msgstr "tên viết tắt"
@@ -1340,232 +1329,252 @@ msgstr "giấy phép"
msgid "licenses"
msgstr "giấy phép"
-#: judge/models/problem.py:104
+#: judge/models/problem.py:112
+msgid "Follow global setting"
+msgstr ""
+
+#: judge/models/problem.py:113
+msgid "Always visible"
+msgstr ""
+
+#: judge/models/problem.py:114
+msgid "Visible if problem solved"
+msgstr ""
+
+#: judge/models/problem.py:115
+msgid "Only own submissions"
+msgstr ""
+
+#: judge/models/problem.py:118
msgid "problem code"
msgstr "mã đầu bài"
-#: judge/models/problem.py:106
+#: judge/models/problem.py:120
msgid "A short, unique code for the problem, used in the url after /problem/"
msgstr "Một mã ngắn duy nhất cho đề bài, sử dụng sau /problem/ trong url"
-#: judge/models/problem.py:108
+#: judge/models/problem.py:122
msgid "problem name"
msgstr "tên bài toán"
-#: judge/models/problem.py:109
+#: judge/models/problem.py:123
msgid "The full name of the problem, as shown in the problem list."
msgstr "Tên đầy đủ của đề bài, được hiển thị trong dánh sách đề bài."
-#: judge/models/problem.py:111
+#: judge/models/problem.py:125
msgid "problem body"
msgstr "bài toán"
-#: judge/models/problem.py:112
+#: judge/models/problem.py:126
msgid "creators"
msgstr "người tạo"
-#: judge/models/problem.py:113
+#: judge/models/problem.py:127
msgid "These users will be able to edit the problem, and be listed as authors."
msgstr "Những người này có thể chỉnh sửa bài tập và được liệt kê trong danh sách tác giả."
-#: judge/models/problem.py:115
+#: judge/models/problem.py:129
msgid "curators"
msgstr "giám khảo"
-#: judge/models/problem.py:116
+#: judge/models/problem.py:130
msgid "These users will be able to edit the problem, but not be listed as authors."
msgstr "Những người này có thể chỉnh sửa bài tập nhưng không được liệt kê trong danh sách tác giả."
-#: judge/models/problem.py:118
+#: judge/models/problem.py:132
msgid "testers"
msgstr "người kiểm tra"
-#: judge/models/problem.py:120
+#: judge/models/problem.py:134
msgid "These users will be able to view the private problem, but not edit it."
msgstr "Những người này có thể xem bài tập riêng tư nhưng không thể chỉnh sửa chúng."
-#: judge/models/problem.py:122
+#: judge/models/problem.py:136
msgid "The type of problem, as shown on the problem's page."
msgstr "Kiểu của bài tập, được hiển thị trong trang đề bài."
-#: judge/models/problem.py:125
+#: judge/models/problem.py:139
msgid "The group of problem, shown under Category in the problem list."
msgstr "Nhóm của bài tập, hiển thị dưới Thể loại trong danh sách bài tập."
-#: judge/models/problem.py:127
+#: judge/models/problem.py:141
msgid "The time limit for this problem, in seconds. Fractional seconds (e.g. 1.5) are supported."
msgstr "Giới hạn thời gian (tính bằng giây) cho bài tập này. Phần lẻ giây (chẳng hạn 1.5) cũng được hỗ trợ."
-#: judge/models/problem.py:131 judge/models/problem.py:458
+#: judge/models/problem.py:145 judge/models/problem.py:485
msgid "memory limit"
msgstr "giới hạn bộ nhớ"
-#: judge/models/problem.py:132
+#: judge/models/problem.py:146
msgid "The memory limit for this problem, in kilobytes (e.g. 64mb = 65536 kilobytes)."
msgstr "Giới hạn bộ nhớ (kilobytes) cho bài tập này (chẳng hạn 64mb = 65536 kilobytes)."
-#: judge/models/problem.py:138
+#: judge/models/problem.py:152
msgid "Points awarded for problem completion. Points are displayed with a 'p' suffix if partial."
msgstr "Điểm thưởng khi hoàn thành bài tập. Điểm được hiển thị với hậu tố 'p' nếu là bài từng phần."
-#: judge/models/problem.py:141
+#: judge/models/problem.py:155
msgid "allows partial points"
msgstr "cho phép cho điểm từng phần"
-#: judge/models/problem.py:142
+#: judge/models/problem.py:156
msgid "allowed languages"
msgstr "ngôn ngữ cho phép"
-#: judge/models/problem.py:143
+#: judge/models/problem.py:157
msgid "List of allowed submission languages."
msgstr "Danh sách các ngôn ngữ cho phép nộp bài."
-#: judge/models/problem.py:145
+#: judge/models/problem.py:159
msgid "manually managed"
msgstr "quản lý thủ công"
-#: judge/models/problem.py:146
+#: judge/models/problem.py:160
msgid "Whether judges should be allowed to manage data or not."
msgstr "Liệu trình chấm có được phép quản lý dữ liệu hay không."
-#: judge/models/problem.py:147
+#: judge/models/problem.py:161
msgid "date of publishing"
msgstr "ngày xuất bản"
-#: judge/models/problem.py:148
+#: judge/models/problem.py:162
msgid "Doesn't have magic ability to auto-publish due to backward compatibility"
msgstr "Không có khả năng tự động công khai vì vấn đề tương thích ngược"
-#: judge/models/problem.py:150
+#: judge/models/problem.py:164
msgid "Bans the selected users from submitting to this problem."
msgstr "Cấm những người dùng được chọn nộp bài cho bài tập này."
-#: judge/models/problem.py:152
+#: judge/models/problem.py:166
msgid "The license under which this problem is published."
msgstr "Giấy phép mà theo đó bài tập này được công bố."
-#: judge/models/problem.py:154
+#: judge/models/problem.py:168
msgid "problem summary"
msgstr "tổng quan bài tập"
-#: judge/models/problem.py:156
+#: judge/models/problem.py:170
msgid "number of users"
msgstr "số thành viên"
-#: judge/models/problem.py:157
+#: judge/models/problem.py:171
msgid "The number of users who solved the problem."
msgstr "Số thành viên đã giải được bài tập."
-#: judge/models/problem.py:158
+#: judge/models/problem.py:172
msgid "solve rate"
msgstr "tỉ lệ giải được"
-#: judge/models/problem.py:159
+#: judge/models/problem.py:173
msgid "allow full markdown access"
+msgstr "Cho phép truy cập hoàn toàn markdown"
+
+#: judge/models/problem.py:174
+msgid "submission source visibility"
msgstr ""
-#: judge/models/problem.py:165
+#: judge/models/problem.py:182
msgid "If private, only these organizations may see the problem."
msgstr "Nếu riêng tư, chỉ những tổ chức này có thể xem bài tập."
-#: judge/models/problem.py:420
+#: judge/models/problem.py:447
msgid "See hidden problems"
msgstr "Xem các bài bị ẩn"
-#: judge/models/problem.py:421
+#: judge/models/problem.py:448
msgid "Edit own problems"
msgstr "Sửa đề bài của mình. "
-#: judge/models/problem.py:422
+#: judge/models/problem.py:449
msgid "Edit all problems"
msgstr "Sửa mọi đề bài."
-#: judge/models/problem.py:423
+#: judge/models/problem.py:450
msgid "Edit all public problems"
msgstr "Sửa mọi đề bài công khai."
-#: judge/models/problem.py:424
+#: judge/models/problem.py:451
msgid "Edit problems with full markup"
msgstr ""
-#: judge/models/problem.py:425 templates/problem/problem.html:161
+#: judge/models/problem.py:452 templates/problem/problem.html:161
msgid "Clone problem"
msgstr "Copy sang bài mới"
-#: judge/models/problem.py:426
+#: judge/models/problem.py:453
msgid "Change is_public field"
msgstr "Thay đổi trường is_public"
-#: judge/models/problem.py:427
+#: judge/models/problem.py:454
msgid "Change is_manually_managed field"
msgstr "Thay đổi trường is_manually_managed"
-#: judge/models/problem.py:428
+#: judge/models/problem.py:455
msgid "See organization-private problems"
msgstr "Xem đề bài riêng của tổ chức"
-#: judge/models/problem.py:436 judge/models/problem.py:454
+#: judge/models/problem.py:463 judge/models/problem.py:481
#: judge/models/runtime.py:111
msgid "language"
msgstr "ngôn ngữ"
-#: judge/models/problem.py:437
+#: judge/models/problem.py:464
msgid "translated name"
msgstr "tên bộ dịch"
-#: judge/models/problem.py:438
+#: judge/models/problem.py:465
msgid "translated description"
msgstr "mô tả bộ dịch"
-#: judge/models/problem.py:442
+#: judge/models/problem.py:469
msgid "problem translation"
msgstr "dịch đầu bài"
-#: judge/models/problem.py:443
+#: judge/models/problem.py:470
msgid "problem translations"
msgstr "dịch đầu bài"
-#: judge/models/problem.py:447
+#: judge/models/problem.py:474
msgid "clarified problem"
msgstr "bài tập được làm rõ"
-#: judge/models/problem.py:448
+#: judge/models/problem.py:475
msgid "clarification body"
msgstr "nội dung làm rõ"
-#: judge/models/problem.py:449
+#: judge/models/problem.py:476
msgid "clarification timestamp"
msgstr "thời gian làm rõ"
-#: judge/models/problem.py:464
+#: judge/models/problem.py:491
msgid "language-specific resource limit"
msgstr "giới hạn tài nguyên theo ngôn ngữ"
-#: judge/models/problem.py:465
+#: judge/models/problem.py:492
msgid "language-specific resource limits"
msgstr "giới hạn tài nguyên theo ngôn ngữ"
-#: judge/models/problem.py:469
+#: judge/models/problem.py:496
msgid "associated problem"
msgstr "đầu bài liên quan"
-#: judge/models/problem.py:472
+#: judge/models/problem.py:499
msgid "publish date"
msgstr "ngày công bố"
-#: judge/models/problem.py:474
+#: judge/models/problem.py:501
msgid "editorial content"
msgstr "biên tập kỳ thi"
-#: judge/models/problem.py:497
+#: judge/models/problem.py:524
msgid "See hidden solutions"
msgstr "Xem các lời giải ẩn"
-#: judge/models/problem.py:499
+#: judge/models/problem.py:526
msgid "solution"
msgstr "lời giải"
-#: judge/models/problem.py:500
+#: judge/models/problem.py:527
msgid "solutions"
msgstr "lời giải"
@@ -1677,112 +1686,112 @@ msgstr "giá trị điểm"
msgid "case is pretest?"
msgstr "test mẫu?"
-#: judge/models/profile.py:38
+#: judge/models/profile.py:41
msgid "organization title"
msgstr "tiêu đề của tổ chức"
-#: judge/models/profile.py:39
+#: judge/models/profile.py:42
msgid "organization slug"
msgstr "organization slug"
-#: judge/models/profile.py:40
+#: judge/models/profile.py:43
msgid "Organization name shown in URL"
msgstr "Tên tổ chức thể hiện trong URL"
-#: judge/models/profile.py:42
+#: judge/models/profile.py:45
msgid "Displayed beside user name during contests"
msgstr "Hiển thị bên cạnh tên trong cuộc thi"
-#: judge/models/profile.py:43
+#: judge/models/profile.py:46
msgid "organization description"
msgstr "mô tả tổ chức"
-#: judge/models/profile.py:44
+#: judge/models/profile.py:47
msgid "administrators"
msgstr "quản trị viên"
-#: judge/models/profile.py:45
+#: judge/models/profile.py:48
msgid "Those who can edit this organization"
msgstr "Những người có thể chỉnh sửa tổ chức"
-#: judge/models/profile.py:46
+#: judge/models/profile.py:49
msgid "creation date"
msgstr "ngày tạo"
-#: judge/models/profile.py:47
+#: judge/models/profile.py:50
msgid "is open organization?"
msgstr "là tổ chức mở?"
-#: judge/models/profile.py:48
+#: judge/models/profile.py:51
msgid "Allow joining organization"
msgstr "Cho phép tham gia tổ chức"
-#: judge/models/profile.py:49
+#: judge/models/profile.py:52
msgid "maximum size"
msgstr "dung lượng tối đa"
-#: judge/models/profile.py:50
+#: judge/models/profile.py:53
msgid "Maximum amount of users in this organization, only applicable to private organizations"
msgstr "Số người dùng tối đa trong tổ chức này, chỉ áp dụng đối với tổ chức tư nhân"
-#: judge/models/profile.py:52
+#: judge/models/profile.py:55
msgid "Student access code"
msgstr "Mã truy cập sinh viên"
-#: judge/models/profile.py:56
+#: judge/models/profile.py:59
msgid "This image will replace the default site logo for users viewing the organization."
msgstr "Ảnh này sẽ thay thế logo mặc định của trang khi thành viên xem tổ chức."
-#: judge/models/profile.py:79
+#: judge/models/profile.py:82
msgid "Administer organizations"
msgstr "Quản trị các tổ chức"
-#: judge/models/profile.py:80
+#: judge/models/profile.py:83
msgid "Edit all organizations"
msgstr "Sửa mọi tổ chức"
-#: judge/models/profile.py:82 judge/models/profile.py:99
-#: judge/models/profile.py:269
+#: judge/models/profile.py:85 judge/models/profile.py:102
+#: judge/models/profile.py:293
msgid "organization"
msgstr "tổ chức"
-#: judge/models/profile.py:87
+#: judge/models/profile.py:90
msgid "user associated"
msgstr "liên kết với người sử dụng"
-#: judge/models/profile.py:88
+#: judge/models/profile.py:91
msgid "self-description"
msgstr "tự mô tả"
-#: judge/models/profile.py:89
+#: judge/models/profile.py:92
msgid "location"
msgstr "vị trí"
-#: judge/models/profile.py:91
+#: judge/models/profile.py:94
msgid "preferred language"
msgstr "ngôn ngữ"
-#: judge/models/profile.py:97
+#: judge/models/profile.py:100
msgid "last access time"
msgstr "lần truy cập cuối cùng"
-#: judge/models/profile.py:98
+#: judge/models/profile.py:101
msgid "last IP"
msgstr "IP"
-#: judge/models/profile.py:101
+#: judge/models/profile.py:104
msgid "display rank"
msgstr "hiển thị xếp hạng"
-#: judge/models/profile.py:103
+#: judge/models/profile.py:106
msgid "Normal User"
msgstr "Người dùng bình thường"
-#: judge/models/profile.py:104
+#: judge/models/profile.py:107
msgid "Problem Setter"
msgstr "Người ra đề"
-#: judge/models/profile.py:105 templates/base.html:220
+#: judge/models/profile.py:108 templates/base.html:220
#: templates/comments/list.html:99 templates/contest/contest-list-tabs.html:24
#: templates/contest/ranking-table.html:49
#: templates/problem/problem-list-tabs.html:6
@@ -1791,155 +1800,167 @@ msgstr "Người ra đề"
msgid "Admin"
msgstr "Quản trị"
-#: judge/models/profile.py:106
+#: judge/models/profile.py:109
msgid "comment mute"
msgstr "bình luận tắt"
-#: judge/models/profile.py:106
+#: judge/models/profile.py:109
msgid "Some users are at their best when silent."
msgstr "Một vài người tốt nhất là khi im lặng."
-#: judge/models/profile.py:108
+#: judge/models/profile.py:111
msgid "unlisted user"
msgstr "thành viên không được liệt kê"
-#: judge/models/profile.py:108
+#: judge/models/profile.py:111
msgid "User will not be ranked."
msgstr "Thành viên không được xếp hạng."
-#: judge/models/profile.py:111
+#: judge/models/profile.py:114
msgid "user script"
msgstr "script tự định nghĩa"
-#: judge/models/profile.py:112
+#: judge/models/profile.py:115
msgid "User-defined JavaScript for site customization."
msgstr "JavaScript tự định nghĩa để tùy chỉnh trang web"
-#: judge/models/profile.py:113
+#: judge/models/profile.py:116
msgid "current contest"
msgstr "cuộc thi hiện tại"
-#: judge/models/profile.py:115
+#: judge/models/profile.py:118
msgid "math engine"
msgstr "bộ xử lý toán học"
-#: judge/models/profile.py:117
+#: judge/models/profile.py:120
msgid "the rendering engine used to render math"
msgstr "công cụ được sử dụng để render toán học"
-#: judge/models/profile.py:118
+#: judge/models/profile.py:121
msgid "TOTP 2FA enabled"
msgstr "Xác thực 2 yếu tố TOTP được kích hoạt"
-#: judge/models/profile.py:119
+#: judge/models/profile.py:122
msgid "check to enable TOTP-based two-factor authentication"
-msgstr ""
+msgstr "đánh dấu để kích hoạt xác minh hai yếu tố TOTP-based"
-#: judge/models/profile.py:120
+#: judge/models/profile.py:123
msgid "WebAuthn 2FA enabled"
-msgstr ""
+msgstr "WebAuthn xác thực 2 yếu tố được kích hoạt"
-#: judge/models/profile.py:121
+#: judge/models/profile.py:124
msgid "check to enable WebAuthn-based two-factor authentication"
-msgstr ""
+msgstr "đánh dấu để kích hoạt xác minh hai yếu tố dựa trên WebAuthn"
-#: judge/models/profile.py:122
+#: judge/models/profile.py:125
msgid "TOTP key"
msgstr "Mã TOTP"
-#: judge/models/profile.py:123
+#: judge/models/profile.py:126
msgid "32 character base32-encoded key for TOTP"
msgstr "mã 32 ký tự base32-encoded cho TOTP"
-#: judge/models/profile.py:125
+#: judge/models/profile.py:128
msgid "TOTP key must be empty or base32"
msgstr "Mã TOTP cần rỗng hoặc base32"
-#: judge/models/profile.py:126
+#: judge/models/profile.py:129
msgid "scratch codes"
msgstr ""
-#: judge/models/profile.py:127
+#: judge/models/profile.py:130
msgid "JSON array of 16 character base32-encoded codes for scratch codes"
msgstr ""
-#: judge/models/profile.py:131
+#: judge/models/profile.py:134
msgid "Scratch codes must be empty or a JSON array of 16-character base32 codes"
msgstr ""
-#: judge/models/profile.py:133
+#: judge/models/profile.py:136
+msgid "last TOTP timecode"
+msgstr ""
+
+#: judge/models/profile.py:137
msgid "API token"
msgstr ""
-#: judge/models/profile.py:134
+#: judge/models/profile.py:138
msgid "64 character hex-encoded API access token"
msgstr ""
-#: judge/models/profile.py:136
+#: judge/models/profile.py:140
msgid "API token must be None or hexadecimal"
msgstr ""
-#: judge/models/profile.py:137
+#: judge/models/profile.py:141
msgid "internal notes"
msgstr "ghi chú nội bộ"
-#: judge/models/profile.py:138
+#: judge/models/profile.py:142
msgid "Notes for administrators regarding this user."
msgstr "Ghi chú cho quản trị viên chấm lại cho thành viên này."
-#: judge/models/profile.py:139
+#: judge/models/profile.py:143
msgid "last data download time"
-msgstr ""
+msgstr "thời gian tải dữ liệu cuối cùng"
-#: judge/models/profile.py:236
+#: judge/models/profile.py:253
msgid "Shows in-progress development stuff"
msgstr "Hiển thị những thứ đang được phát triển"
-#: judge/models/profile.py:237
+#: judge/models/profile.py:254
msgid "Edit TOTP settings"
-msgstr ""
+msgstr "Chỉnh sửa cài đặt TOTP "
-#: judge/models/profile.py:239
+#: judge/models/profile.py:256
msgid "user profile"
msgstr "hồ sơ người dùng"
-#: judge/models/profile.py:240
+#: judge/models/profile.py:257
msgid "user profiles"
msgstr "hồ sơ người dùng"
-#: judge/models/profile.py:246
+#: judge/models/profile.py:263
msgid "device name"
msgstr "Tên thiết bị"
-#: judge/models/profile.py:247
+#: judge/models/profile.py:264
msgid "credential ID"
-msgstr ""
+msgstr "thông tin đăng nhập"
-#: judge/models/profile.py:248
+#: judge/models/profile.py:265
msgid "public key"
msgstr ""
-#: judge/models/profile.py:249
+#: judge/models/profile.py:266
msgid "sign counter"
msgstr ""
-#: judge/models/profile.py:271
+#: judge/models/profile.py:287
+msgid "WebAuthn credential"
+msgstr ""
+
+#: judge/models/profile.py:288
+msgid "WebAuthn credentials"
+msgstr ""
+
+#: judge/models/profile.py:295
msgid "request time"
msgstr "thời gian yêu cầu"
-#: judge/models/profile.py:272
+#: judge/models/profile.py:296
msgid "state"
msgstr "trạng thái"
-#: judge/models/profile.py:277
+#: judge/models/profile.py:301
msgid "reason"
msgstr "lý do"
-#: judge/models/profile.py:280
+#: judge/models/profile.py:304
msgid "organization join request"
msgstr "yêu cầu tham gia tổ chức"
-#: judge/models/profile.py:281
+#: judge/models/profile.py:305
msgid "organization join requests"
msgstr "yêu cầu tham gia tổ chức"
@@ -2009,7 +2030,7 @@ msgstr "mô tả ngôn ngữ"
#: judge/models/runtime.py:43
msgid "Use this field to inform users of quirks with your environment, additional restrictions, etc."
-msgstr ""
+msgstr "Sử dụng trường này để thông báo cho người dùng những đặc điểm của môi trường, hạn chế bổ sung, vv."
#: judge/models/runtime.py:45
msgid "extension"
@@ -2095,210 +2116,210 @@ msgstr "chấm điểm"
msgid "judge"
msgstr "máy chấm"
-#: judge/models/submission.py:20 judge/models/submission.py:47
+#: judge/models/submission.py:21 judge/models/submission.py:48
#: judge/utils/problems.py:74
msgid "Accepted"
msgstr "Chấp nhận (AC)"
-#: judge/models/submission.py:21 judge/models/submission.py:48
+#: judge/models/submission.py:22 judge/models/submission.py:49
msgid "Wrong Answer"
msgstr "Kết quả sai (WA)"
-#: judge/models/submission.py:22 judge/models/submission.py:50
+#: judge/models/submission.py:23 judge/models/submission.py:51
msgid "Time Limit Exceeded"
msgstr "Quá thời gian (TLE)"
-#: judge/models/submission.py:23 judge/models/submission.py:51
+#: judge/models/submission.py:24 judge/models/submission.py:52
msgid "Memory Limit Exceeded"
msgstr "Tràn bộ nhớ (MLE)"
-#: judge/models/submission.py:24 judge/models/submission.py:52
+#: judge/models/submission.py:25 judge/models/submission.py:53
msgid "Output Limit Exceeded"
msgstr "Kết xuất dữ liệu ra quá nhiều"
-#: judge/models/submission.py:25 judge/models/submission.py:53
+#: judge/models/submission.py:26 judge/models/submission.py:54
msgid "Invalid Return"
msgstr "Lỗi khi chạy chương trình (IR)"
-#: judge/models/submission.py:26 judge/models/submission.py:54
+#: judge/models/submission.py:27 judge/models/submission.py:55
msgid "Runtime Error"
msgstr "Lỗi Runtime"
-#: judge/models/submission.py:27 judge/models/submission.py:41
-#: judge/models/submission.py:55 judge/utils/problems.py:76
+#: judge/models/submission.py:28 judge/models/submission.py:42
+#: judge/models/submission.py:56 judge/utils/problems.py:76
msgid "Compile Error"
msgstr "Lỗi dịch (CE)"
-#: judge/models/submission.py:28 judge/models/submission.py:40
+#: judge/models/submission.py:29 judge/models/submission.py:41
msgid "Internal Error"
msgstr "Lỗi Nội Bộ"
-#: judge/models/submission.py:29
+#: judge/models/submission.py:30
msgid "Short circuit"
msgstr "Ngắn mạch"
-#: judge/models/submission.py:30 judge/models/submission.py:42
-#: judge/models/submission.py:61
+#: judge/models/submission.py:31 judge/models/submission.py:43
+#: judge/models/submission.py:62
msgid "Aborted"
msgstr "Bị hủy bỏ"
-#: judge/models/submission.py:36 judge/models/submission.py:57
+#: judge/models/submission.py:37 judge/models/submission.py:58
msgid "Queued"
msgstr "Đang chờ"
-#: judge/models/submission.py:37 judge/models/submission.py:58
+#: judge/models/submission.py:38 judge/models/submission.py:59
msgid "Processing"
msgstr "Đang xử lý"
-#: judge/models/submission.py:38 judge/models/submission.py:59
+#: judge/models/submission.py:39 judge/models/submission.py:60
msgid "Grading"
msgstr "Chấm điểm"
-#: judge/models/submission.py:39 judge/models/submission.py:60
+#: judge/models/submission.py:40 judge/models/submission.py:61
msgid "Completed"
msgstr "Đã Hoàn Thành"
-#: judge/models/submission.py:56
+#: judge/models/submission.py:57
msgid "Internal Error (judging server error)"
msgstr "Lỗi nội bộ (máy chủ chấm bài lỗi)"
-#: judge/models/submission.py:66
+#: judge/models/submission.py:67
msgid "submission time"
msgstr "ngày nộp bài"
-#: judge/models/submission.py:67 judge/models/submission.py:227
+#: judge/models/submission.py:68 judge/models/submission.py:238
msgid "execution time"
msgstr "thời gian thực hiện tối đa"
-#: judge/models/submission.py:68 judge/models/submission.py:228
+#: judge/models/submission.py:69 judge/models/submission.py:239
msgid "memory usage"
msgstr "bộ nhớ sử dụng"
-#: judge/models/submission.py:69 judge/models/submission.py:229
+#: judge/models/submission.py:70 judge/models/submission.py:240
msgid "points granted"
msgstr "điểm được cho"
-#: judge/models/submission.py:70
+#: judge/models/submission.py:71
msgid "submission language"
msgstr "ngôn ngữ lập trình"
-#: judge/models/submission.py:71
+#: judge/models/submission.py:72
msgid "status"
msgstr "trạng thái"
-#: judge/models/submission.py:72
+#: judge/models/submission.py:73
msgid "result"
msgstr "kết quả"
-#: judge/models/submission.py:74
+#: judge/models/submission.py:75
msgid "compile errors"
msgstr "lỗi dịch"
-#: judge/models/submission.py:76
+#: judge/models/submission.py:77
msgid "batched cases"
msgstr "nhóm test"
-#: judge/models/submission.py:77
+#: judge/models/submission.py:78
msgid "test case points"
msgstr "điểm cho testcase"
-#: judge/models/submission.py:78
+#: judge/models/submission.py:79
msgid "test case total points"
msgstr "tổng điểm test case"
-#: judge/models/submission.py:79
+#: judge/models/submission.py:80
msgid "judged on"
msgstr "đánh giá trên"
-#: judge/models/submission.py:81
+#: judge/models/submission.py:82
msgid "submission judge time"
msgstr "thời gian chấm của bài nộp"
-#: judge/models/submission.py:82
-msgid "was rejudged by admin"
-msgstr "được chấm lại bởi admin"
-
#: judge/models/submission.py:83
+msgid "last rejudge date by admin"
+msgstr "ngày cuối cùng được chấm lại bởi admin"
+
+#: judge/models/submission.py:84
msgid "was ran on pretests only"
msgstr "chỉ được chạy bởi test sơ bộ"
-#: judge/models/submission.py:86
-msgid "lock submission"
-msgstr "khóa bài nộp"
+#: judge/models/submission.py:87
+msgid "submission lock"
+msgstr ""
-#: judge/models/submission.py:199
+#: judge/models/submission.py:210
msgid "Abort any submission"
msgstr "Ngừng bất kì bài nộp"
-#: judge/models/submission.py:200
+#: judge/models/submission.py:211
msgid "Rejudge the submission"
msgstr "Chấm lại bài nộp"
-#: judge/models/submission.py:201
+#: judge/models/submission.py:212
msgid "Rejudge a lot of submissions"
msgstr "Chấm lại nhiều bài nộp"
-#: judge/models/submission.py:202
+#: judge/models/submission.py:213
msgid "Submit without limit"
msgstr "Nộp không giới hạn"
-#: judge/models/submission.py:203
+#: judge/models/submission.py:214
msgid "View all submission"
msgstr "Xem tất cả bài nộp"
-#: judge/models/submission.py:204
+#: judge/models/submission.py:215
msgid "Resubmit others' submission"
msgstr "Gửi lại bài nộp của người khác"
-#: judge/models/submission.py:205
+#: judge/models/submission.py:216
msgid "Change lock status of submission"
msgstr ""
-#: judge/models/submission.py:208 templates/contest/moss.html:58
+#: judge/models/submission.py:219 templates/contest/moss.html:58
msgid "submissions"
msgstr "nộp bài"
-#: judge/models/submission.py:212 judge/models/submission.py:223
+#: judge/models/submission.py:223 judge/models/submission.py:234
msgid "associated submission"
msgstr "bài nộp liên quan"
-#: judge/models/submission.py:214
+#: judge/models/submission.py:225
msgid "source code"
msgstr "mã nguồn"
-#: judge/models/submission.py:225
+#: judge/models/submission.py:236
msgid "test case ID"
msgstr "mã testcase"
-#: judge/models/submission.py:226
+#: judge/models/submission.py:237
msgid "status flag"
msgstr "cờ trạng thái"
-#: judge/models/submission.py:230
+#: judge/models/submission.py:241
msgid "points possible"
msgstr "khả năng điểm"
-#: judge/models/submission.py:231
+#: judge/models/submission.py:242
msgid "batch number"
msgstr "lô số"
-#: judge/models/submission.py:232
+#: judge/models/submission.py:243
msgid "judging feedback"
msgstr "phản hồi chấm thi"
-#: judge/models/submission.py:233
+#: judge/models/submission.py:244
msgid "extended judging feedback"
msgstr ""
-#: judge/models/submission.py:234
+#: judge/models/submission.py:245
msgid "program output"
msgstr "lập trình đầu ra"
-#: judge/models/submission.py:242
+#: judge/models/submission.py:253
msgid "submission test case"
msgstr "test case của bài"
-#: judge/models/submission.py:243
+#: judge/models/submission.py:254
msgid "submission test cases"
msgstr "các test case của bài"
@@ -2316,7 +2337,7 @@ msgstr "thời gian tạo"
#: judge/models/ticket.py:14
msgid "assignees"
-msgstr ""
+msgstr "Những người được phân công"
#: judge/models/ticket.py:16
msgid "quick notes"
@@ -2346,6 +2367,10 @@ msgstr "thẻ"
msgid "poster"
msgstr "Người đăng"
+#: judge/models/ticket.py:30
+msgid "message body"
+msgstr "nội dung thư"
+
#: judge/models/ticket.py:31
msgid "message time"
msgstr ""
@@ -2358,7 +2383,7 @@ msgstr "Trang [page] /[topage]"
#: judge/pdf_problems.py:282
#, python-format
msgid "Page %s of %s"
-msgstr ""
+msgstr "Trang số %s trên %s"
#: judge/tasks/contest.py:19
msgid "Recalculating contest scores"
@@ -2368,19 +2393,23 @@ msgstr "Đang tính lại điểm của cuộc thi"
msgid "Running MOSS"
msgstr "Đang chạy MOSS"
-#: judge/tasks/submission.py:43
+#: judge/tasks/submission.py:45
msgid "Modifying submissions"
msgstr "Đang chỉnh sửa các bài nộp"
-#: judge/tasks/submission.py:56
+#: judge/tasks/submission.py:58
msgid "Recalculating user points"
msgstr "Tính lại điểm của người dùng"
-#: judge/tasks/user.py:50
+#: judge/tasks/user.py:49
+msgid "Applying filters"
+msgstr "Áp dụng bộ lọc"
+
+#: judge/tasks/user.py:64
msgid "Preparing your submission data"
-msgstr ""
+msgstr "Đang chuẩn bị dữ liệu bài nộp của bạn"
-#: judge/tasks/user.py:81
+#: judge/tasks/user.py:95
msgid "Preparing your comment data"
msgstr "Đang chuẩn bị dữ liệu bình luận của bạn"
@@ -2490,7 +2519,7 @@ msgstr "Bạn cần phải giải ít nhất một bài trước khi được qu
msgid "You already voted."
msgstr "Bạn đã bỏ phiếu rồi."
-#: judge/views/comment.py:129 judge/views/organization.py:298
+#: judge/views/comment.py:129 judge/views/organization.py:297
msgid "Edited from site"
msgstr "Biên tập từ trang web"
@@ -2498,125 +2527,130 @@ msgstr "Biên tập từ trang web"
msgid "Editing comment"
msgstr "Đang chỉnh sửa bình luận"
-#: judge/views/contests.py:56 judge/views/contests.py:201
-#: judge/views/contests.py:204 judge/views/contests.py:382
+#: judge/views/contests.py:57 judge/views/contests.py:210
+#: judge/views/contests.py:213 judge/views/contests.py:395
msgid "No such contest"
msgstr "Không có cuộc thi như vậy"
-#: judge/views/contests.py:57 judge/views/contests.py:202
+#: judge/views/contests.py:58 judge/views/contests.py:211
#, python-format
msgid "Could not find a contest with the key \"%s\"."
msgstr "Không thể tìm thấy một cuộc thi với khóa \"%s\"."
-#: judge/views/contests.py:70
+#: judge/views/contests.py:71
msgid "Contests"
msgstr "Cuộc thi"
-#: judge/views/contests.py:205
+#: judge/views/contests.py:214
msgid "Could not find such contest."
msgstr "Không thể tìm thấy các cuộc thi như vậy."
-#: judge/views/contests.py:208
+#: judge/views/contests.py:217
#, python-format
msgid "Access to contest \"%s\" denied"
msgstr "Truy cập vào cuộc thi \"%s\" từ chối"
-#: judge/views/contests.py:235
+#: judge/views/contests.py:244
msgid "Clone Contest"
-msgstr ""
+msgstr "Nhân bản kỳ thi"
-#: judge/views/contests.py:301
+#: judge/views/contests.py:278
+#, python-format
+msgid "Cloned contest from %s"
+msgstr "Cuộc thi được nhân bàn từ %s"
+
+#: judge/views/contests.py:314
msgid "Contest not ongoing"
msgstr "Cuộc thi không đang diễn ra"
-#: judge/views/contests.py:302
+#: judge/views/contests.py:315
#, python-format
msgid "\"%s\" is not currently ongoing."
msgstr "\"%s\" không đang diễn ra."
-#: judge/views/contests.py:306
+#: judge/views/contests.py:319
msgid "Already in contest"
msgstr "Đang trong cuộc thi"
-#: judge/views/contests.py:307
+#: judge/views/contests.py:320
#, python-format
msgid "You are already in a contest: \"%s\"."
msgstr "Bạn đang ở một cuộc thi: \"%s\"."
-#: judge/views/contests.py:310
+#: judge/views/contests.py:323
msgid "Banned from joining"
msgstr "Cấm tham gia"
-#: judge/views/contests.py:311
+#: judge/views/contests.py:324
msgid "You have been declared persona non grata for this contest. You are permanently barred from joining this contest."
msgstr ""
-#: judge/views/contests.py:372
+#: judge/views/contests.py:385
#, python-format
msgid "Enter access code for \"%s\""
msgstr "Nhập mã đăng nhập cho %s"
-#: judge/views/contests.py:383
+#: judge/views/contests.py:396
#, python-format
msgid "You are not in contest \"%s\"."
msgstr "Bạn đang không tham gia cuộc thi \"%s\"."
-#: judge/views/contests.py:402
+#: judge/views/contests.py:415
msgid "ContestCalendar requires integer year and month"
msgstr "Lịch của Contest yêu cầu là năm và tháng là số nguyên"
-#: judge/views/contests.py:442
+#: judge/views/contests.py:455
#, python-format
msgid "Contests in %(month)s"
msgstr "Cuộc thi tại %(month)s"
-#: judge/views/contests.py:442
+#: judge/views/contests.py:455
msgid "F Y"
msgstr ""
-#: judge/views/contests.py:489
+#: judge/views/contests.py:502
#, python-format
msgid "%s Statistics"
msgstr "Thống kê của %s "
-#: judge/views/contests.py:662
+#: judge/views/contests.py:675
#, python-format
msgid "%s Rankings"
msgstr "%s xếp hạng"
-#: judge/views/contests.py:670
+#: judge/views/contests.py:683
msgid "???"
msgstr "???"
-#: judge/views/contests.py:686
+#: judge/views/contests.py:699
#, python-format
msgid "Your participation in %s"
msgstr "Tham gia của bạn vào %s"
-#: judge/views/contests.py:687
+#: judge/views/contests.py:700
#, python-format
msgid "%s's participation in %s"
msgstr "%s tham gia vào %s"
-#: judge/views/contests.py:694
+#: judge/views/contests.py:707
msgid "Live"
msgstr "Trực tuyến"
-#: judge/views/contests.py:706 templates/contest/contest-tabs.html:13
+#: judge/views/contests.py:719 templates/contest/contest-tabs.html:13
msgid "Participation"
msgstr "Tham gia"
-#: judge/views/contests.py:750
+#: judge/views/contests.py:763
#, python-format
msgid "%s MOSS Results"
msgstr "Kết quả MOSS của %s "
-#: judge/views/contests.py:777
+#: judge/views/contests.py:790
#, python-format
msgid "Running MOSS for %s..."
msgstr "Đang chạy MOSS cho %s..."
-#: judge/views/contests.py:800
+#: judge/views/contests.py:813
#, python-format
msgid "Contest tag: %s"
msgstr "Thẻ cuộc thi %s"
@@ -2645,161 +2679,175 @@ msgstr "trang lỗi %s"
msgid "Runtimes"
msgstr "Đang chạy"
-#: judge/views/organization.py:44 judge/views/organization.py:47
+#: judge/views/organization.py:43 judge/views/organization.py:46
msgid "No such organization"
msgstr "Không có tổ chức như vậy"
-#: judge/views/organization.py:45
+#: judge/views/organization.py:44
#, python-format
msgid "Could not find an organization with the key \"%s\"."
msgstr "Không thể tìm thấy một tổ chức với khóa \"%s\"."
-#: judge/views/organization.py:48
+#: judge/views/organization.py:47
msgid "Could not find such organization."
msgstr "Không thể tìm thấy các tổ chức như vậy."
-#: judge/views/organization.py:72 judge/views/register.py:34
+#: judge/views/organization.py:71 judge/views/register.py:33
#: templates/organization/list.html:15 templates/user/user-list-tabs.html:5
msgid "Organizations"
msgstr "Tổ chức"
-#: judge/views/organization.py:93
+#: judge/views/organization.py:92
#, python-format
msgid "%s Members"
msgstr "%s thành viên"
-#: judge/views/organization.py:118 judge/views/organization.py:121
-#: judge/views/organization.py:126
+#: judge/views/organization.py:117 judge/views/organization.py:120
+#: judge/views/organization.py:125
msgid "Joining organization"
msgstr "Đang tham gia tổ chức"
-#: judge/views/organization.py:118
+#: judge/views/organization.py:117
msgid "You are already in the organization."
msgstr "Bạn đã trong tổ chức."
-#: judge/views/organization.py:121
+#: judge/views/organization.py:120
msgid "This organization is not open."
msgstr "Tổ chức này không phải là mở."
-#: judge/views/organization.py:138
+#: judge/views/organization.py:137
msgid "Leaving organization"
msgstr "Rời khỏi tổ chức"
-#: judge/views/organization.py:138
+#: judge/views/organization.py:137
#, python-format
msgid "You are not in \"%s\"."
msgstr "Bạn đang không ở trong \"%s\"."
-#: judge/views/organization.py:162
+#: judge/views/organization.py:161
#, python-format
msgid "Request to join %s"
msgstr "Yêu cầu tham gia %s"
-#: judge/views/organization.py:180
+#: judge/views/organization.py:179
msgid "Join request detail"
msgstr "Chi tiết yêu cầu tham gia"
-#: judge/views/organization.py:208
+#: judge/views/organization.py:207
#, python-format
msgid "Managing join requests for %s"
msgstr "Quản lý các yêu cầu tham gia %s"
-#: judge/views/organization.py:239
+#: judge/views/organization.py:238
#, python-format
msgid "Your organization can only receive %d more members. You cannot approve %d users."
msgstr "Tổ chức của bạn có thể chỉ nhận được %d thêm các thành viên. Bạn không thể chấp nhận người dùng %d."
-#: judge/views/organization.py:251
+#: judge/views/organization.py:250
#, python-format
msgid "Approved %d user."
msgid_plural "Approved %d users."
msgstr[0] "Chấp nhận %d thành viên."
-#: judge/views/organization.py:252
+#: judge/views/organization.py:251
#, python-format
msgid "Rejected %d user."
msgid_plural "Rejected %d users."
msgstr[0] "Từ chối %d thành viên."
-#: judge/views/organization.py:282
+#: judge/views/organization.py:281
#, python-format
msgid "Editing %s"
msgstr "Đang chỉnh sửa %s"
-#: judge/views/organization.py:306 judge/views/organization.py:314
+#: judge/views/organization.py:305 judge/views/organization.py:313
msgid "Can't edit organization"
msgstr "Không thể chỉnh sửa tổ chức"
-#: judge/views/organization.py:307
+#: judge/views/organization.py:306
msgid "You are not allowed to edit this organization."
msgstr "Bạn không có quyền chỉnh sửa tổ chức này."
-#: judge/views/organization.py:315
+#: judge/views/organization.py:314
msgid "You are not allowed to kick people from this organization."
msgstr "Bạn không có quyền loại người từ tổ chức này."
-#: judge/views/organization.py:320 judge/views/organization.py:324
+#: judge/views/organization.py:319 judge/views/organization.py:323
msgid "Can't kick user"
msgstr "Không thể loại thành viên"
-#: judge/views/organization.py:321
+#: judge/views/organization.py:320
msgid "The user you are trying to kick does not exist!"
msgstr "Thành viên bạn muốn loại không tồn tại!"
-#: judge/views/organization.py:325
+#: judge/views/organization.py:324
#, python-format
msgid "The user you are trying to kick is not in organization: %s."
msgstr "Thành viên mà bạn muốn loại không thuộc tổ chức: %s."
-#: judge/views/problem.py:67
+#: judge/views/problem.py:68
msgid "No such problem"
msgstr "Không có vấn đề như vậy"
-#: judge/views/problem.py:68
+#: judge/views/problem.py:69
#, python-format
msgid "Could not find a problem with the code \"%s\"."
msgstr "Không thể tìm thấy một đề bài với mã \"%s\"."
-#: judge/views/problem.py:110
+#: judge/views/problem.py:111
#, python-brace-format
msgid "Editorial for {0}"
msgstr "Hướng giải của {0}"
-#: judge/views/problem.py:113
+#: judge/views/problem.py:114
#, python-brace-format
msgid "Editorial for {0}"
msgstr "Hướng giải của {0}"
-#: judge/views/problem.py:283 templates/contest/contest.html:79
+#: judge/views/problem.py:133
+msgid "No such editorial"
+msgstr ""
+
+#: judge/views/problem.py:134
+#, python-format
+msgid "Could not find an editorial with the code \"%s\"."
+msgstr ""
+
+#: judge/views/problem.py:289 templates/contest/contest.html:79
#: templates/user/user-tabs.html:5 templates/user/users-table.html:23
msgid "Problems"
msgstr "Đề bài"
-#: judge/views/problem.py:556 judge/views/problem.py:564
+#: judge/views/problem.py:562 judge/views/problem.py:570
#, python-format
msgid "Submit to %s"
msgstr "Nộp cho %s"
-#: judge/views/problem.py:613
+#: judge/views/problem.py:619
msgid "Banned from submitting"
msgstr "Cấm nộp bài"
-#: judge/views/problem.py:614
+#: judge/views/problem.py:620
msgid "You have been declared persona non grata for this problem. You are permanently barred from submitting this problem."
msgstr "Bạn đã được coi là cá nhận không tính điểm cho đề này. Bạn không thể nộp bài."
-#: judge/views/problem.py:618
+#: judge/views/problem.py:624
msgid "Too many submissions"
msgstr "Quá nhiều bài nộp"
-#: judge/views/problem.py:619
+#: judge/views/problem.py:625
msgid "You have exceeded the submission limit for this problem."
msgstr "Bạn đã vượt quá giới hạn lần nộp của bài này."
-#: judge/views/problem.py:681
+#: judge/views/problem.py:693
msgid "Clone Problem"
msgstr "Nhân bản bài tập"
+#: judge/views/problem.py:720
+#, python-format
+msgid "Cloned problem from %s"
+msgstr ""
+
#: judge/views/problem_data.py:37
msgid "Checker arguments must be a JSON object"
msgstr "Đối số kiểm tra phải là đối tượng JSON"
@@ -2868,52 +2916,52 @@ msgstr "Các giải pháp tốt nhất cho %s"
msgid "Best solutions for {0}"
msgstr "Các giải pháp tốt nhất cho {0}"
-#: judge/views/ranked_submission.py:80
+#: judge/views/ranked_submission.py:82
#, python-format
msgid "Best solutions for %(problem)s in %(contest)s"
msgstr "Các giải pháp tốt nhất cho %(problem)s trong %(contest)s"
-#: judge/views/ranked_submission.py:83
+#: judge/views/ranked_submission.py:85
#, python-format
msgid "Best solutions for problem %(number)s in %(contest)s"
msgstr "Những lời giải tốt nhất cho bài %(number)s trong cuộc thi %(contest)s"
-#: judge/views/ranked_submission.py:89
+#: judge/views/ranked_submission.py:91
#, python-brace-format
msgid "Best solutions for {0} in {2}"
msgstr "Các giải pháp tốt nhất cho {0} trong {2}"
-#: judge/views/ranked_submission.py:92
+#: judge/views/ranked_submission.py:94
#, python-brace-format
msgid "Best solutions for problem {0} in {1}"
msgstr "Những lời giải tốt nhất cho bài {0} trong {1}"
-#: judge/views/register.py:27
+#: judge/views/register.py:26
msgid "A username must contain letters, numbers, or underscores"
msgstr "Tên người dùng phải chứa chữ cái, số hoặc dấu gạch chân"
-#: judge/views/register.py:31
+#: judge/views/register.py:30
msgid "Preferred language"
msgstr "Ngôn ngữ ưa thích"
-#: judge/views/register.py:38
+#: judge/views/register.py:37
msgid "Subscribe to newsletter?"
msgstr "Đăng ký nhận bản tin?"
-#: judge/views/register.py:45
+#: judge/views/register.py:44
#, python-format
msgid "The email address \"%s\" is already taken. Only one registration is allowed per address."
msgstr "Địa chỉ email \"%s\" đã được sử dụng. Chỉ có một đăng ký được cho phép cho mỗi địa chỉ mail."
-#: judge/views/register.py:51
+#: judge/views/register.py:50
msgid "Your email provider is not allowed due to history of abuse. Please use a reputable email provider."
msgstr "Nhà cung cấp email của bạn không được phép do phát tán thư rác. Xin vui lòng sử dụng một nhà cung cấp email có uy tín."
-#: judge/views/register.py:57 judge/views/register.py:95
+#: judge/views/register.py:56 judge/views/register.py:94
msgid "Registration"
msgstr "Đăng ký"
-#: judge/views/register.py:106
+#: judge/views/register.py:105
msgid "Authentication failure"
msgstr "Xác thực không thành công"
@@ -2921,7 +2969,7 @@ msgstr "Xác thực không thành công"
msgid "Language statistics"
msgstr "Thống kê theo ngôn ngữ"
-#: judge/views/status.py:24 templates/submission/list.html:311
+#: judge/views/status.py:24 templates/submission/list.html:310
msgid "Status"
msgstr "Trạng thái"
@@ -2929,81 +2977,81 @@ msgstr "Trạng thái"
msgid "Version matrix"
msgstr "Ma trận phiên bản"
-#: judge/views/submission.py:53 judge/views/submission.py:60
+#: judge/views/submission.py:55 judge/views/submission.py:62
#, python-format
msgid "Submission of %(problem)s by %(user)s"
msgstr "Nộp %(problem)s bởi %(user)s"
-#: judge/views/submission.py:203 judge/views/submission.py:204
+#: judge/views/submission.py:205 judge/views/submission.py:206
#: templates/problem/problem.html:127
msgid "All submissions"
msgstr "Tất cả các bài nộp"
-#: judge/views/submission.py:349
+#: judge/views/submission.py:355
msgid "All my submissions"
msgstr "Tất cả những lần nộp bài của tôi"
-#: judge/views/submission.py:350
+#: judge/views/submission.py:356
#, python-format
msgid "All submissions by %s"
msgstr "Tất cả các bài nộp bởi %s"
-#: judge/views/submission.py:381
+#: judge/views/submission.py:387
#, python-format
msgid "All submissions for %s"
msgstr "Tất cả các bài nộp bởi %s"
-#: judge/views/submission.py:400
+#: judge/views/submission.py:410
msgid "Must pass a problem"
msgstr "Phải giải được 1 bài"
-#: judge/views/submission.py:439
+#: judge/views/submission.py:449
#, python-format
msgid "My submissions for %(problem)s"
msgstr "Các bài nộp của tôi cho %(problem)s"
-#: judge/views/submission.py:440
+#: judge/views/submission.py:450
#, python-format
msgid "%(user)s's submissions for %(problem)s"
msgstr "bài nộp của %(user)s cho %(problem)s"
-#: judge/views/submission.py:536
+#: judge/views/submission.py:546
msgid "Must pass a contest"
msgstr "Phải vượt qua một cuộc thi"
-#: judge/views/submission.py:544
+#: judge/views/submission.py:554
#, python-format
msgid "My submissions in %(contest)s"
msgstr "Các bài nộp của tôi trong %(contest)s"
-#: judge/views/submission.py:545
+#: judge/views/submission.py:555
#, python-format
msgid "%(user)s's submissions in %(contest)s"
msgstr "Các bài nộp của %(user)s trong %(contest)s"
-#: judge/views/submission.py:559
+#: judge/views/submission.py:569
#, python-brace-format
msgid "My submissions in {0}"
msgstr "Các bài nộp của tôi trong {0}"
-#: judge/views/submission.py:561
+#: judge/views/submission.py:571
#, python-brace-format
msgid "{0}'s submissions in {2}"
-msgstr ""
+msgstr "Bài nộp của {0} trong {2}"
-#: judge/views/submission.py:585
+#: judge/views/submission.py:597
#, python-brace-format
msgid "{0}'s submissions for {2} in {4}"
msgstr "{0} gửi cho {2} trong {4}"
-#: judge/views/submission.py:590
+#: judge/views/submission.py:602
#, python-brace-format
msgid "{0}'s submissions for problem {2} in {3}"
msgstr ""
#: judge/views/ticket.py:33 judge/views/ticket.py:39
msgid "Ticket title"
-msgstr ""
+msgstr "Tên thẻ"
#: judge/views/ticket.py:40
msgid "Issue description"
@@ -3011,133 +3059,137 @@ msgstr "Mô tả vấn đề"
#: judge/views/ticket.py:48
msgid "You must solve at least one problem before you can create a ticket."
-msgstr ""
+msgstr "Bạn cần phải giải ít nhất một bài trước khi được quyền tạo một thẻ mới."
-#: judge/views/ticket.py:87 judge/views/ticket.py:90
+#: judge/views/ticket.py:91 judge/views/ticket.py:94
#, python-format
msgid "New ticket for %s"
-msgstr ""
+msgstr "Thẻ mới cho %s"
-#: judge/views/ticket.py:144
+#: judge/views/ticket.py:148
#, python-format
msgid "%(title)s - Ticket %(id)d"
-msgstr ""
+msgstr "%(title)s - Thẻ %(id)d"
-#: judge/views/ticket.py:249
+#: judge/views/ticket.py:253
#, python-format
msgid "Tickets - Page %(number)d of %(total)d"
-msgstr ""
+msgstr "Thẻ - Trang số %(number)d trên %(total)d"
-#: judge/views/ticket.py:298
+#: judge/views/ticket.py:302
#, python-format
msgid "New Ticket: %s"
-msgstr ""
+msgstr "Thẻ mới: %s"
-#: judge/views/ticket.py:299
+#: judge/views/ticket.py:303
#, python-format
msgid "#%(id)d, assigned to: %(users)s"
-msgstr ""
+msgstr "#%(id)d, được gán cho: %(users)s"
-#: judge/views/ticket.py:301
+#: judge/views/ticket.py:305
msgid ", "
msgstr ", "
-#: judge/views/ticket.py:301
+#: judge/views/ticket.py:305
msgid "no one"
msgstr "không có ai"
-#: judge/views/ticket.py:321
+#: judge/views/ticket.py:325
#, python-format
msgid "New Ticket Message For: %s"
-msgstr ""
+msgstr "Tin nhắn về thẻ mới cho: %s"
#: judge/views/two_factor.py:49
msgid "Enable Two-factor Authentication"
+msgstr "Kích hoạt xác thực 2 bước"
+
+#: judge/views/two_factor.py:108
+msgid "Refresh Two-factor Authentication"
msgstr ""
-#: judge/views/two_factor.py:99
+#: judge/views/two_factor.py:116
msgid "Disable Two-factor Authentication"
-msgstr ""
+msgstr "Vô hiệu hóa Xác thực 2 bước"
-#: judge/views/two_factor.py:148
+#: judge/views/two_factor.py:165
msgid "Invalid WebAuthn response"
msgstr ""
-#: judge/views/two_factor.py:151
+#: judge/views/two_factor.py:168
msgid "Invalid name"
msgstr "Tên không hợp lệ"
-#: judge/views/two_factor.py:204
+#: judge/views/two_factor.py:221
msgid "Staff may not disable 2FA"
msgstr ""
-#: judge/views/two_factor.py:216
+#: judge/views/two_factor.py:229
msgid "Perform Two-factor Authentication"
-msgstr ""
+msgstr "Thực hiện xác thực 2 bước"
-#: judge/views/user.py:79
+#: judge/views/user.py:78
msgid "No such user"
msgstr "Không có thư mục này"
-#: judge/views/user.py:79
+#: judge/views/user.py:78
#, python-format
msgid "No user handle \"%s\"."
msgstr "Không xử lý người dùng \"%s\"."
-#: judge/views/user.py:83
+#: judge/views/user.py:82
msgid "My account"
msgstr "Tài khoản của tôi"
-#: judge/views/user.py:84
+#: judge/views/user.py:83
#, python-format
msgid "User %s"
msgstr "Người dùng %s"
-#: judge/views/user.py:132
+#: judge/views/user.py:131
msgid "Login"
msgstr "Đăng nhập"
-#: judge/views/user.py:173
+#: judge/views/user.py:172
msgid "M j, Y, G:i"
msgstr "M j, Y, G:i"
-#: judge/views/user.py:307
+#: judge/views/user.py:306
msgid "Preparing your data..."
msgstr "Đang chuẩn bị dữ liệu..."
-#: judge/views/user.py:311 templates/user/edit-profile.html:348
+#: judge/views/user.py:310 templates/user/edit-profile.html:352
msgid "Download your data"
msgstr "Đang tải xuống dữ liệu"
-#: judge/views/user.py:367
+#: judge/views/user.py:366
msgid "Updated on site"
msgstr "Cập Nhật trên trang web"
-#: judge/views/user.py:400 templates/admin/auth/user/change_form.html:14
+#: judge/views/user.py:399 templates/admin/auth/user/change_form.html:14
#: templates/admin/auth/user/change_form.html:17 templates/base.html:222
#: templates/user/user-tabs.html:16
msgid "Edit profile"
msgstr "Chỉnh sửa tiểu sử"
-#: judge/views/user.py:415
+#: judge/views/user.py:414
msgid "Generated API token for user"
msgstr ""
-#: judge/views/user.py:427
+#: judge/views/user.py:426
msgid "Removed API token for user"
msgstr ""
-#: judge/views/user.py:437
+#: judge/views/user.py:436
msgid "Generated scratch codes for user"
msgstr ""
-#: judge/views/user.py:443 templates/user/user-list-tabs.html:4
+#: judge/views/user.py:442 templates/user/user-list-tabs.html:4
msgid "Leaderboard"
msgstr "Leaderboard"
-#: judge/views/user.py:504
+#: judge/views/user.py:503
msgid "You have been successfully logged out."
-msgstr ""
+msgstr "Bạn vừa đăng xuất thành công"
#: judge/views/widgets.py:52 judge/views/widgets.py:62
#, python-format
@@ -3264,11 +3316,11 @@ msgstr "Tin tức"
msgid "posted on {time}"
msgstr "đã đăng lúc {time}"
-#: templates/blog/list.html:130 templates/problem/problem.html:309
+#: templates/blog/list.html:130 templates/problem/problem.html:311
msgid "Clarifications"
msgstr "Làm rõ"
-#: templates/blog/list.html:146 templates/problem/problem.html:320
+#: templates/blog/list.html:146 templates/problem/problem.html:322
msgid "No clarifications have been made at this time."
msgstr "Chưa có lời làm rõ nào được đưa ra ở thời điểm này."
@@ -3461,7 +3513,7 @@ msgid "Info"
msgstr "Thông tin"
#: templates/contest/contest-tabs.html:6 templates/stats/base.html:9
-#: templates/submission/list.html:337
+#: templates/submission/list.html:336
msgid "Statistics"
msgstr "Thống kê"
@@ -3637,7 +3689,7 @@ msgstr "Cuộc thi này chỉ dành riêng cho một số người dùng."
#: templates/contest/private.html:10
msgid "Additionally, only the following organizations may access this contest:"
-msgstr ""
+msgstr "Thêm vào đó, chỉ có các tổ chức sau có thể truy cập vào cuộc thi này:"
#: templates/contest/private.html:12
msgid "Only the following organizations may access this contest:"
@@ -3654,7 +3706,7 @@ msgstr "Bắt đầu vào lúc {time}"
#: templates/contest/ranking-table.html:30
msgid "Participation ended."
-msgstr ""
+msgstr "Kết thúc thời gian tham gia."
#: templates/contest/ranking-table.html:40
msgid "Un-Disqualify"
@@ -3664,19 +3716,19 @@ msgstr "Bỏ loại"
msgid "Disqualify"
msgstr "Loại"
-#: templates/contest/ranking.html:169
+#: templates/contest/ranking.html:173
msgid "Are you sure you want to disqualify this participation?"
msgstr "Liệu bạn có muốn loại bài tham gia này?"
-#: templates/contest/ranking.html:174
+#: templates/contest/ranking.html:178
msgid "Are you sure you want to un-disqualify this participation?"
msgstr "Liệu bạn có muốn bỏ loại bài tham gia này?"
-#: templates/contest/ranking.html:246
+#: templates/contest/ranking.html:250
msgid "View user participation"
msgstr "Xem thành viên tham gia"
-#: templates/contest/ranking.html:250
+#: templates/contest/ranking.html:254
msgid "Show organizations"
msgstr "Hiển thị các tổ chức"
@@ -3777,7 +3829,7 @@ msgstr "Bạn phải tham gia lại để được hiện thị trên bảng x
#: templates/organization/home.html:11
msgid "You will have to request membership in order to join again."
-msgstr ""
+msgstr "Bạn cần phải gửi yêu cầu tham gia để vào lại tổ chức."
#: templates/organization/home.html:24
msgid "Leave organization"
@@ -3885,15 +3937,15 @@ msgstr "Loại"
#: templates/organization/users.html:34
msgid "Are you sure you want to kick this user?"
-msgstr ""
+msgstr "Bạn có chắc muốn xóa người người dùng này?"
#: templates/pagedown.html:10
msgid "Update preview"
-msgstr ""
+msgstr "Xem trước cập nhật"
#: templates/problem/clone.html:37
msgid "Enter a new code for the cloned problem:"
-msgstr ""
+msgstr "Nhập mã mới cho bài tập đã nhân bản:"
#: templates/problem/data.html:344
msgid "View YAML"
@@ -3949,9 +4001,9 @@ msgstr "Lưu"
#: templates/problem/editorial.html:22
msgid "Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence."
-msgstr ""
+msgstr "Nhớ rằng hướng dẫn giải này chỉ nên sử dụng khi bế tắc, và tuyệt đối không nên sao chép mã nguồn kèm theo. Hãy tôn trọng tác giả bài tập và người viết hướng dẫn giải.
Nộp mã nguồn lời giải chính thức trước khi giải bài tập đó có thể khiến bạn bị ban."
-#: templates/problem/editorial.html:27 templates/problem/problem.html:209
+#: templates/problem/editorial.html:27 templates/problem/problem.html:210
msgid "Author:"
msgid_plural "Authors:"
msgstr[0] "Tác giả:"
@@ -3980,28 +4032,28 @@ msgstr "AC %%"
#: templates/problem/manage_submission.html:55
msgid "Leave empty to not filter by language"
-msgstr ""
+msgstr "Để trống để không lọc theo ngôn ngữ"
#: templates/problem/manage_submission.html:60
msgid "Leave empty to not filter by result"
-msgstr ""
+msgstr "Để trống để không lọc theo kết quả"
#: templates/problem/manage_submission.html:79
msgid "Need valid values for both start and end IDs."
-msgstr ""
+msgstr "Cần giá trị hợp lệ cho cả ID bắt đầu và kết thúc. "
#: templates/problem/manage_submission.html:82
msgid "End ID must be after start ID."
-msgstr ""
+msgstr "ID kết thúc phải sau ID bắt đầu"
#: templates/problem/manage_submission.html:90
#, python-brace-format
msgid "You are about to rejudge {count} submissions. Are you sure you want to do this?"
-msgstr ""
+msgstr "Bạn chuẩn bị chấm lại {count} bài nộp. Bạn có chắc bạn muốn làm việc này?"
#: templates/problem/manage_submission.html:96
msgid "You are about to rejudge a few submissions. Are you sure you want to do this?"
-msgstr ""
+msgstr "Bạn chuẩn bị chấm lại một vài bài nộp. Bạn có chắc bạn muốn làm việc này?"
#: templates/problem/manage_submission.html:115
msgid "Rejudge Submissions"
@@ -4038,12 +4090,12 @@ msgstr "Tính điểm lại mọi thứ"
#: templates/problem/manage_submission.html:158
#, python-format
msgid "This will rescore %(count)d submissions."
-msgstr ""
+msgstr "Việc này sẽ chấm lại %(count)d bài nộp."
#: templates/problem/manage_submission.html:162
#, python-format
msgid "Are you sure you want to rescore %(count)d submissions?"
-msgstr ""
+msgstr "Bạn có chắc chấm lại %(count)d bài nộp?"
#: templates/problem/manage_submission.html:163
msgid "Rescore all submissions"
@@ -4116,34 +4168,34 @@ msgstr "Giới hạn thời gian:"
msgid "Memory limit:"
msgstr "Giới hạn bộ nhớ:"
-#: templates/problem/problem.html:224
+#: templates/problem/problem.html:226
msgid "Problem type"
msgid_plural "Problem types"
msgstr[0] "Loại đề bài"
-#: templates/problem/problem.html:237
+#: templates/problem/problem.html:239
msgid "Allowed languages"
msgstr "Ngôn ngữ cho phép"
-#: templates/problem/problem.html:245
+#: templates/problem/problem.html:247
#, python-format
msgid "No %(lang)s judge online"
msgstr "Không có máy chấm %(lang)s đang online"
-#: templates/problem/problem.html:256
+#: templates/problem/problem.html:258
msgid "Judge:"
msgid_plural "Judges:"
msgstr[0] "Máy chấm"
-#: templates/problem/problem.html:273
+#: templates/problem/problem.html:275
msgid "none available"
msgstr "đang không khả dụng"
-#: templates/problem/problem.html:298
+#: templates/problem/problem.html:300
msgid "Request clarification"
msgstr "Gửi thắc mắc"
-#: templates/problem/problem.html:300
+#: templates/problem/problem.html:302
msgid "Report an issue"
msgstr "Báo cáo vấn đề"
@@ -4186,9 +4238,9 @@ msgstr "Kiểu bài tập"
#: templates/problem/search-form.html:57
msgid "Point range"
-msgstr ""
+msgstr "Tầm điểm"
-#: templates/problem/search-form.html:63 templates/submission/list.html:329
+#: templates/problem/search-form.html:63 templates/submission/list.html:328
#: templates/ticket/list.html:248
msgid "Go"
msgstr "Tìm"
@@ -4210,7 +4262,7 @@ msgstr " Cảnh báo! Ngôn ngữ mặc định của bạn, %(default
#, python-format
msgid "You have %(left)s submission left"
msgid_plural "You have %(left)s submissions left"
-msgstr[0] ""
+msgstr[0] "Bạn còn %(left)s lần nộp"
#: templates/problem/submit.html:220
msgid "You have 0 submissions left"
@@ -4234,7 +4286,7 @@ msgid "Invalid username or password."
msgstr "Tên người dùng hoặc mật khẩu không hợp lệ."
#: templates/registration/login.html:53
-#: templates/registration/two_factor_auth.html:86
+#: templates/registration/two_factor_auth.html:92
msgid "Login!"
msgstr "Đăng nhập!"
@@ -4280,7 +4332,7 @@ msgstr "Chúng tôi đã gửi bạn những hướng dẫn về việc thiết
#: templates/registration/password_reset_done.html:5
msgid "If you don't receive an email, please make sure you've entered the address you registered with, and check your spam folder."
-msgstr ""
+msgstr "Nếu bạn không nhận được email, hãy đảm bảo bạn đã nhập địa chỉ email mà bạn đã dùng để đăng ký, và kiểm tra mục thư rác của bạn."
#: templates/registration/password_reset_email.html:9
#, python-format
@@ -4354,12 +4406,12 @@ msgid "Default language"
msgstr "Ngôn ngữ mặc định"
#: templates/registration/registration_form.html:184
-#: templates/user/edit-profile.html:310
+#: templates/user/edit-profile.html:314
msgid "Affiliated organizations"
msgstr "Tổ chức đại diện"
#: templates/registration/registration_form.html:190
-#: templates/user/edit-profile.html:324
+#: templates/user/edit-profile.html:328
msgid "Notify me about upcoming contests"
msgstr "Thông báo cho tôi về các cuộc thi sắp tới"
@@ -4375,57 +4427,93 @@ msgstr "Điều khoản & Điều kiện"
msgid "Register!"
msgstr "Đăng ký!"
-#: templates/registration/totp_disable.html:38
+#: templates/registration/totp_disable.html:31
msgid "To protect your account, you must first authenticate before you can disable Two Factor Authentication."
msgstr "Để bảo vệ tài khoản của bạn, bạn cần xác thực trước khi bạn có thể vô hiệu hóa 2FA."
-#: templates/registration/totp_disable.html:45
+#: templates/registration/totp_disable.html:38
msgid "Enter the 6-digit code generated by your app or one of your 16-digit scratch codes:"
msgstr ""
-#: templates/registration/totp_disable.html:48
+#: templates/registration/totp_disable.html:41
msgid "Disable Two Factor Authentication"
-msgstr ""
+msgstr "Vô hiệu hóa Xác thực 2 bước"
-#: templates/registration/totp_enable.html:75
+#: templates/registration/totp_enable.html:72
msgid "Scan this code with your authenticator app:"
msgstr "Quét mã này với ứng dụng xác thực của bạn:"
-#: templates/registration/totp_enable.html:76
+#: templates/registration/totp_enable.html:73
msgid "QR code"
msgstr "Mã QR"
-#: templates/registration/totp_enable.html:77
+#: templates/registration/totp_enable.html:74
msgid "Or enter this code manually:"
msgstr "Hoặc nhập mã này thủ công:"
-#: templates/registration/totp_enable.html:88
+#: templates/registration/totp_enable.html:85
msgid "Enter the 6-digit code generated by your app:"
msgstr "Nhập mã 6 chữ số sinh ra bởi ứng dụng của bạn:"
-#: templates/registration/totp_enable.html:91
+#: templates/registration/totp_enable.html:90
+msgid "Refresh Two Factor Authentication"
+msgstr ""
+
+#: templates/registration/totp_enable.html:92
msgid "Enable Two Factor Authentication"
+msgstr "Kích hoạt xác thực 2 bước"
+
+#: templates/registration/totp_enable.html:98
+msgid "Below is a list of one-time use scratch codes."
+msgstr ""
+
+#: templates/registration/totp_enable.html:99
+msgid "These codes can only be used once and are for emergency use."
+msgstr ""
+
+#: templates/registration/totp_enable.html:100
+msgid "You can use these codes to login to your account or disable two-factor authentication."
+msgstr ""
+
+#: templates/registration/totp_enable.html:101
+msgid "If you ever need more scratch codes, you can regenerate them on the edit profile tab."
+msgstr ""
+
+#: templates/registration/totp_enable.html:102
+msgid "Please write these down and keep them in a secure location."
+msgstr ""
+
+#: templates/registration/totp_enable.html:103
+msgid "These codes will never be shown again after you enable two-factor authentication."
msgstr ""
#: templates/registration/two_factor_auth.html:33
-#: templates/user/edit-profile.html:161
+#: templates/user/edit-profile.html:165
msgid "WebAuthn is not supported by your browser."
-msgstr ""
+msgstr "Trình duyệt của bạn không hỗ trợ WebAuthn."
#: templates/registration/two_factor_auth.html:54
-#: templates/user/edit-profile.html:185
+#: templates/user/edit-profile.html:189
msgid "Failed to contact server."
-msgstr ""
+msgstr "Không thể kết nối với máy chủ."
-#: templates/registration/two_factor_auth.html:77
+#: templates/registration/two_factor_auth.html:79
msgid "Enter the 6-digit code generated by your app or one of your 16-character scratch codes:"
msgstr ""
-#: templates/registration/two_factor_auth.html:83
-msgid "Use security key"
+#: templates/registration/two_factor_auth.html:81
+msgid "Enter one of your 16-character scratch codes:"
msgstr ""
#: templates/registration/two_factor_auth.html:89
+msgid "Use security key"
+msgstr ""
+
+#: templates/registration/two_factor_auth.html:94
+msgid "Use scratch code"
+msgstr ""
+
+#: templates/registration/two_factor_auth.html:97
#, python-format
msgid "If you lost your authentication device and are unable to use your scratch codes, please contact us at %(email)s."
msgstr ""
@@ -4488,7 +4576,7 @@ msgstr "Mã trận phiên bản"
#: templates/submission/internal-error-message.html:3
#, python-format
msgid "An internal error occurred while grading, and the %(SITE_NAME)s administrators have been notified.
In the meantime, try resubmitting in a few seconds."
-msgstr ""
+msgstr "Một lỗi hệ thống vừa xảy ra trong quá trình chấm bài, và các quản trị viên của %(SITE_NAME)s đã được thông báo về điều này.
Hãy thử nộp lại sau vài giây."
#: templates/submission/internal-error-message.html:8
msgid "An internal error occurred while grading."
@@ -4506,15 +4594,15 @@ msgstr "Lọc theo trạng thái..."
msgid "Filter by language..."
msgstr "Lọc theo ngôn ngữ..."
-#: templates/submission/list.html:307
+#: templates/submission/list.html:306
msgid "Filter submissions"
msgstr "Lọc các bài nộp"
-#: templates/submission/list.html:343
+#: templates/submission/list.html:342
msgid "Total:"
msgstr "Tổng:"
-#: templates/submission/list.html:353
+#: templates/submission/list.html:352
msgid "You were disconnected. Refresh to show latest updates."
msgstr "Bạn đã bị ngắt kết nối. Tải lại trang để hiển thị thông tin cập nhật mới nhất."
@@ -4533,7 +4621,7 @@ msgstr "chấm lại"
#: templates/submission/row.html:64
msgid "This submission has been locked, and cannot be rejudged."
-msgstr ""
+msgstr "Bài nộp này đã bị khóa và không thể được chấm lại."
#: templates/submission/row.html:65
msgid "locked"
@@ -4609,7 +4697,7 @@ msgstr "Tài nguyên:"
#: templates/submission/status-testcases.html:138
msgid "Maximum runtime on single test case:"
-msgstr ""
+msgstr "Thời gian chạy tối đa cho một test case:"
#: templates/submission/status-testcases.html:143
msgid "Final pretest score:"
@@ -4633,7 +4721,7 @@ msgstr "Xem nguồn"
#: templates/submission/status.html:100
msgid "Press Ctrl-Enter or Command-Enter to abort."
-msgstr ""
+msgstr "Nhấn Ctrl-Enter hay Command-Enter để hủy bỏ chương trình"
#: templates/submission/status.html:102
msgid "Abort"
@@ -4729,121 +4817,125 @@ msgstr "Xếp hạng"
msgid "Search by handle..."
msgstr "Tìm kiếm theo tên..."
-#: templates/user/edit-profile.html:109
+#: templates/user/edit-profile.html:113
msgid "Are you sure you want to generate or regenerate your API token?"
msgstr ""
-#: templates/user/edit-profile.html:110
+#: templates/user/edit-profile.html:114
msgid "This will invalidate any previous API tokens."
msgstr ""
-#: templates/user/edit-profile.html:111
+#: templates/user/edit-profile.html:115
msgid "It also allows access to your account without Two-factor Authentication."
-msgstr ""
+msgstr "Nó cho phép bạn truy cập tài khoản mà không có xác thực 2 bước"
-#: templates/user/edit-profile.html:112
+#: templates/user/edit-profile.html:116
msgid "You will not be able to view your api token after you leave this page!"
msgstr ""
-#: templates/user/edit-profile.html:113 templates/user/edit-profile.html:207
+#: templates/user/edit-profile.html:117 templates/user/edit-profile.html:211
msgid "Generating..."
msgstr "Đang tạo..."
-#: templates/user/edit-profile.html:121 templates/user/edit-profile.html:243
-#: templates/user/edit-profile.html:371 templates/user/edit-profile.html:390
+#: templates/user/edit-profile.html:125 templates/user/edit-profile.html:247
+#: templates/user/edit-profile.html:373 templates/user/edit-profile.html:395
msgid "Regenerate"
msgstr "Tạo lại"
-#: templates/user/edit-profile.html:127 templates/user/edit-profile.html:392
+#: templates/user/edit-profile.html:131 templates/user/edit-profile.html:397
msgid "Remove"
msgstr "Gỡ bỏ"
-#: templates/user/edit-profile.html:137
+#: templates/user/edit-profile.html:141
msgid "Are you sure you want to remove your API token?"
msgstr ""
-#: templates/user/edit-profile.html:144 templates/user/edit-profile.html:375
-#: templates/user/edit-profile.html:396
+#: templates/user/edit-profile.html:148 templates/user/edit-profile.html:377
+#: templates/user/edit-profile.html:401
msgid "Generate"
msgstr "Tạo"
-#: templates/user/edit-profile.html:190
+#: templates/user/edit-profile.html:194
msgid "Are you sure you want to delete this security key?"
msgstr ""
-#: templates/user/edit-profile.html:280
+#: templates/user/edit-profile.html:284
msgid "Self-description"
msgstr ""
-#: templates/user/edit-profile.html:287
+#: templates/user/edit-profile.html:291
msgid "Select your closest major city"
msgstr "Chọn thành phố lớn gần bạn nhất"
-#: templates/user/edit-profile.html:296
+#: templates/user/edit-profile.html:300
msgid "Editor theme"
msgstr "Giao diện khung viết code"
-#: templates/user/edit-profile.html:301
+#: templates/user/edit-profile.html:305
msgid "Math engine"
msgstr ""
-#: templates/user/edit-profile.html:335 templates/user/edit-profile.html:337
+#: templates/user/edit-profile.html:339 templates/user/edit-profile.html:341
msgid "Change your avatar"
msgstr "Đổi ảnh đại diện của bạn"
-#: templates/user/edit-profile.html:342
+#: templates/user/edit-profile.html:346
msgid "Change your password"
msgstr "Đổi mật khẩu của bạn"
-#: templates/user/edit-profile.html:356
+#: templates/user/edit-profile.html:359
msgid "Two-factor Authentication is enabled"
msgstr "Mã xác thực 2 yếu tố đã được kích hoạt"
-#: templates/user/edit-profile.html:358
-msgid "Two-factor Authentication is disabled"
-msgstr "Mã xác thực 2 yếu tố đã được vô hiệu hóa"
-
-#: templates/user/edit-profile.html:363 templates/user/edit-profile.html:365
+#: templates/user/edit-profile.html:362 templates/user/edit-profile.html:365
msgid "Disable"
msgstr "Vô hiệu hóa"
-#: templates/user/edit-profile.html:368
+#: templates/user/edit-profile.html:367
+msgid "Refresh"
+msgstr ""
+
+#: templates/user/edit-profile.html:370
msgid "Scratch Codes:"
msgstr ""
-#: templates/user/edit-profile.html:372 templates/user/edit-profile.html:393
+#: templates/user/edit-profile.html:374 templates/user/edit-profile.html:398
msgid "Hidden"
-msgstr ""
+msgstr "Ẩn"
-#: templates/user/edit-profile.html:381
+#: templates/user/edit-profile.html:384
+msgid "Two-factor Authentication is disabled"
+msgstr "Mã xác thực 2 yếu tố đã được vô hiệu hóa"
+
+#: templates/user/edit-profile.html:385
msgid "Enable"
-msgstr ""
+msgstr "Kích hoạt"
-#: templates/user/edit-profile.html:387
+#: templates/user/edit-profile.html:392
msgid "API Token"
msgstr ""
-#: templates/user/edit-profile.html:404
+#: templates/user/edit-profile.html:409
msgid "Security keys"
msgstr ""
-#: templates/user/edit-profile.html:414
+#: templates/user/edit-profile.html:419
msgid "Delete"
-msgstr ""
+msgstr "Xóa"
-#: templates/user/edit-profile.html:421
+#: templates/user/edit-profile.html:426
msgid "Enter a name for this key"
-msgstr ""
+msgstr "Đặt tên cho khóa này"
-#: templates/user/edit-profile.html:422
+#: templates/user/edit-profile.html:427
msgid "Add"
-msgstr ""
+msgstr "Thêm"
-#: templates/user/edit-profile.html:430
+#: templates/user/edit-profile.html:435
msgid "User-script"
-msgstr ""
+msgstr "script tự định nghĩa"
-#: templates/user/edit-profile.html:434
+#: templates/user/edit-profile.html:439
msgid "Update profile"
msgstr "Cập nhật profile"
@@ -4866,35 +4958,35 @@ msgstr ""
#: templates/user/prepare-data.html:64
msgid "Are you sure you want to prepare a download?"
-msgstr ""
+msgstr "Bạn có chắc muốn tải về?"
#: templates/user/prepare-data.html:79
msgid "We are currently preparing your data."
-msgstr ""
+msgstr "Chúng tôi đang chuẩn bị dữ liệu cho bạn."
#: templates/user/prepare-data.html:81
msgid "Track progress"
-msgstr ""
+msgstr "Theo dõi quá trình"
#: templates/user/prepare-data.html:86
msgid "Once your data is ready, you will find a download link on this page."
-msgstr ""
+msgstr "Khi mà dữ liệu bạn đã sẵn sàng, bạn sẽ tìm thấy link tải trên trang này."
#: templates/user/prepare-data.html:103
msgid "Submissions"
-msgstr ""
+msgstr "Các bài nộp"
#: templates/user/prepare-data.html:120
msgid "Prepare new download"
-msgstr ""
+msgstr "Chuẩn bị cho tải xuống mới"
#: templates/user/prepare-data.html:122
msgid "Prepare download"
-msgstr ""
+msgstr "Chuẩn bị tải xuống"
#: templates/user/prepare-data.html:126
msgid "Download prepared data"
-msgstr ""
+msgstr "Tải dữ liệu đã được chuẩn bị"
#: templates/user/prepare-data.html:132
msgid "Your data is ready!"
@@ -4902,11 +4994,11 @@ msgstr "Dữ liệu của bạn đã sẵn sàng!"
#: templates/user/prepare-data.html:136
msgid "Download data"
-msgstr ""
+msgstr "Tải dữ liệu"
#: templates/user/user-about.html:14
msgid "From"
-msgstr ""
+msgstr "Từ"
#: templates/user/user-about.html:25
msgid "Admin Notes"
diff --git a/locale/vi/LC_MESSAGES/djangojs.po b/locale/vi/LC_MESSAGES/djangojs.po
index 310234e06c..aff3087877 100644
--- a/locale/vi/LC_MESSAGES/djangojs.po
+++ b/locale/vi/LC_MESSAGES/djangojs.po
@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: dmoj\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-10-01 23:12+0000\n"
-"PO-Revision-Date: 2021-04-25 00:08\n"
+"PO-Revision-Date: 2021-07-07 00:28\n"
"Last-Translator: \n"
"Language-Team: Vietnamese\n"
"Language: vi_VN\n"
diff --git a/locale/zh_Hans/LC_MESSAGES/django.po b/locale/zh_Hans/LC_MESSAGES/django.po
index 5db71cda7e..04f3fdab81 100644
--- a/locale/zh_Hans/LC_MESSAGES/django.po
+++ b/locale/zh_Hans/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: dmoj\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-24 19:15+0000\n"
-"PO-Revision-Date: 2021-04-25 00:08\n"
+"POT-Creation-Date: 2021-06-17 01:38+0000\n"
+"PO-Revision-Date: 2021-07-07 00:27\n"
"Last-Translator: \n"
"Language-Team: Chinese Simplified\n"
"Language: zh_CN\n"
@@ -17,75 +17,75 @@ msgstr ""
"X-Crowdin-File: django.po\n"
"X-Crowdin-File-ID: 10\n"
-#: dmoj/settings.py:364
+#: dmoj/settings.py:365
msgid "Catalan"
msgstr "加泰隆语"
-#: dmoj/settings.py:365
+#: dmoj/settings.py:366
msgid "German"
msgstr "德语"
-#: dmoj/settings.py:366
+#: dmoj/settings.py:367
msgid "English"
msgstr "英语"
-#: dmoj/settings.py:367
+#: dmoj/settings.py:368
msgid "Spanish"
msgstr "西班牙语"
-#: dmoj/settings.py:368
+#: dmoj/settings.py:369
msgid "French"
msgstr "法语"
-#: dmoj/settings.py:369
+#: dmoj/settings.py:370
msgid "Croatian"
msgstr "克罗地亚语"
-#: dmoj/settings.py:370
+#: dmoj/settings.py:371
msgid "Hungarian"
msgstr "匈牙利语"
-#: dmoj/settings.py:371
+#: dmoj/settings.py:372
msgid "Japanese"
msgstr "日语"
-#: dmoj/settings.py:372
+#: dmoj/settings.py:373
msgid "Korean"
msgstr "韩语"
-#: dmoj/settings.py:373
+#: dmoj/settings.py:374
msgid "Brazilian Portuguese"
msgstr "巴西葡萄牙语"
-#: dmoj/settings.py:374
+#: dmoj/settings.py:375
msgid "Romanian"
msgstr "罗马尼亚语"
-#: dmoj/settings.py:375
+#: dmoj/settings.py:376
msgid "Russian"
msgstr "俄语"
-#: dmoj/settings.py:376
+#: dmoj/settings.py:377
msgid "Serbian (Latin)"
msgstr "塞尔维亚文(拉丁字母)"
-#: dmoj/settings.py:377
+#: dmoj/settings.py:378
msgid "Turkish"
msgstr "土耳其语"
-#: dmoj/settings.py:378
+#: dmoj/settings.py:379
msgid "Vietnamese"
msgstr "越南语"
-#: dmoj/settings.py:379
+#: dmoj/settings.py:380
msgid "Simplified Chinese"
msgstr "简体中文"
-#: dmoj/settings.py:380
+#: dmoj/settings.py:381
msgid "Traditional Chinese"
msgstr "繁体中文"
-#: dmoj/urls.py:103 templates/base.html:190
+#: dmoj/urls.py:104 templates/base.html:190
msgid "Home"
msgstr "首页"
@@ -113,106 +113,106 @@ msgstr "取消隐藏选定评论"
msgid "Associated page"
msgstr "关联页"
-#: judge/admin/contest.py:31
+#: judge/admin/contest.py:32
msgid "Included contests"
msgstr "带标签的竞赛"
-#: judge/admin/contest.py:65 templates/contest/contest.html:83
+#: judge/admin/contest.py:66 templates/contest/contest.html:83
#: templates/contest/moss.html:43 templates/problem/list.html:204
#: templates/problem/list.html:219 templates/user/user-problems.html:58
#: templates/user/user-problems.html:100
msgid "Problem"
msgstr "题目"
-#: judge/admin/contest.py:114
+#: judge/admin/contest.py:117
msgid "Settings"
msgstr "设置"
-#: judge/admin/contest.py:116
+#: judge/admin/contest.py:120
msgid "Scheduling"
msgstr "时间计划"
-#: judge/admin/contest.py:117
+#: judge/admin/contest.py:121
msgid "Details"
msgstr "详细信息"
-#: judge/admin/contest.py:118
+#: judge/admin/contest.py:122
msgid "Format"
msgstr "格式"
-#: judge/admin/contest.py:119 templates/contest/ranking-table.html:5
+#: judge/admin/contest.py:123 templates/contest/ranking-table.html:5
msgid "Rating"
msgstr "评分"
-#: judge/admin/contest.py:120
+#: judge/admin/contest.py:124
msgid "Access"
msgstr "访问权限"
-#: judge/admin/contest.py:122 judge/admin/problem.py:134
+#: judge/admin/contest.py:126 judge/admin/problem.py:135
msgid "Justice"
msgstr "司法"
-#: judge/admin/contest.py:211
+#: judge/admin/contest.py:215
#, python-format
msgid "%d contest successfully marked as visible."
msgid_plural "%d contests successfully marked as visible."
msgstr[0] "%d个竞赛已成功公开。"
-#: judge/admin/contest.py:214
+#: judge/admin/contest.py:218
msgid "Mark contests as visible"
msgstr "标记竞赛为可见"
-#: judge/admin/contest.py:220
+#: judge/admin/contest.py:224
#, python-format
msgid "%d contest successfully marked as hidden."
msgid_plural "%d contests successfully marked as hidden."
msgstr[0] "%d个竞赛已成功隐藏。"
-#: judge/admin/contest.py:223
+#: judge/admin/contest.py:227
msgid "Mark contests as hidden"
msgstr "隐藏选定竞赛"
-#: judge/admin/contest.py:229
+#: judge/admin/contest.py:233
#, python-format
msgid "%d contest successfully locked."
msgid_plural "%d contests successfully locked."
msgstr[0] "%d个竞赛锁定成功"
-#: judge/admin/contest.py:232
+#: judge/admin/contest.py:236
msgid "Lock contest submissions"
msgstr "锁定竞赛提交"
-#: judge/admin/contest.py:238
+#: judge/admin/contest.py:242
#, python-format
msgid "%d contest successfully unlocked."
msgid_plural "%d contests successfully unlocked."
msgstr[0] "%d个竞赛解锁成功。"
-#: judge/admin/contest.py:241
+#: judge/admin/contest.py:245
msgid "Unlock contest submissions"
msgstr "解锁竞赛提交"
-#: judge/admin/contest.py:262 judge/admin/submission.py:170
+#: judge/admin/contest.py:266 judge/admin/submission.py:170
#, python-format
msgid "%d submission was successfully scheduled for rejudging."
msgid_plural "%d submissions were successfully scheduled for rejudging."
msgstr[0] "%d个提交被计划重新评分。"
-#: judge/admin/contest.py:337
+#: judge/admin/contest.py:341
#, python-format
msgid "%d participation recalculated."
msgid_plural "%d participations recalculated."
msgstr[0] "重新计算了 %d 个参与。"
-#: judge/admin/contest.py:340
+#: judge/admin/contest.py:344
msgid "Recalculate results"
msgstr "重新计算结果"
-#: judge/admin/contest.py:344 judge/admin/organization.py:63
+#: judge/admin/contest.py:348 judge/admin/organization.py:63
msgid "username"
msgstr "用户名"
-#: judge/admin/contest.py:349 templates/base.html:258
+#: judge/admin/contest.py:353 templates/base.html:258
msgid "virtual"
msgstr "模拟竞赛"
@@ -228,9 +228,9 @@ msgstr "内容"
msgid "Summary"
msgstr "概要"
-#: judge/admin/interface.py:113 judge/models/contest.py:383
-#: judge/models/contest.py:509 judge/models/profile.py:244
-#: judge/models/profile.py:268
+#: judge/admin/interface.py:113 judge/models/contest.py:419
+#: judge/models/contest.py:546 judge/models/profile.py:261
+#: judge/models/profile.py:292
msgid "user"
msgstr "用户"
@@ -238,8 +238,8 @@ msgstr "用户"
msgid "object"
msgstr "对象"
-#: judge/admin/organization.py:32 judge/admin/problem.py:181
-#: judge/admin/profile.py:82
+#: judge/admin/organization.py:32 judge/admin/problem.py:182
+#: judge/admin/profile.py:92
msgid "View on site"
msgstr "查看"
@@ -247,66 +247,66 @@ msgstr "查看"
msgid "Describe the changes you made (optional)"
msgstr "描述所你所做的更改 (可选)"
-#: judge/admin/problem.py:129
+#: judge/admin/problem.py:130
msgid "Social Media"
msgstr "社交媒体"
-#: judge/admin/problem.py:130
+#: judge/admin/problem.py:131
msgid "Taxonomy"
msgstr "分类"
-#: judge/admin/problem.py:131 templates/contest/contest.html:84
+#: judge/admin/problem.py:132 templates/contest/contest.html:84
#: templates/problem/data.html:385 templates/problem/list.html:209
#: templates/problem/list.html:230 templates/user/base-users-table.html:10
#: templates/user/user-problems.html:60
msgid "Points"
msgstr "分数"
-#: judge/admin/problem.py:132
+#: judge/admin/problem.py:133
msgid "Limits"
msgstr "限制"
-#: judge/admin/problem.py:133 judge/admin/submission.py:238
-#: templates/stats/base.html:14 templates/submission/list.html:320
-#: templates/user/edit-profile.html:292
+#: judge/admin/problem.py:134 judge/admin/submission.py:238
+#: templates/stats/base.html:14 templates/submission/list.html:319
+#: templates/user/edit-profile.html:296
msgid "Language"
msgstr "语言"
-#: judge/admin/problem.py:135
+#: judge/admin/problem.py:136
msgid "History"
msgstr "编辑历史"
-#: judge/admin/problem.py:178
+#: judge/admin/problem.py:179
msgid "Authors"
msgstr "作者"
-#: judge/admin/problem.py:191
+#: judge/admin/problem.py:192
#, python-format
msgid "%d problem's publish date successfully updated."
msgid_plural "%d problems' publish date successfully updated."
msgstr[0] "%d 个问题的发表日期更新成功。"
-#: judge/admin/problem.py:195
+#: judge/admin/problem.py:196
msgid "Set publish date to now"
msgstr "设发表日期为现在。"
-#: judge/admin/problem.py:201
+#: judge/admin/problem.py:202
#, python-format
msgid "%d problem successfully marked as public."
msgid_plural "%d problems successfully marked as public."
msgstr[0] "%d 个题目已被成功地公开。"
-#: judge/admin/problem.py:205
+#: judge/admin/problem.py:206
msgid "Mark problems as public"
msgstr "公开题目"
-#: judge/admin/problem.py:211
+#: judge/admin/problem.py:212
#, python-format
msgid "%d problem successfully marked as private."
msgid_plural "%d problems successfully marked as private."
msgstr[0] "%d 个题目已被成功地隐藏。"
-#: judge/admin/problem.py:215
+#: judge/admin/problem.py:216
msgid "Mark problems as private"
msgstr "隐藏题目"
@@ -314,34 +314,34 @@ msgstr "隐藏题目"
msgid "timezone"
msgstr "时区"
-#: judge/admin/profile.py:88 judge/admin/submission.py:217
+#: judge/admin/profile.py:98 judge/admin/submission.py:217
#: templates/organization/requests/log.html:9
#: templates/organization/requests/pending.html:12
#: templates/ticket/list.html:261
msgid "User"
msgstr "用户"
-#: judge/admin/profile.py:93 templates/registration/registration_form.html:143
+#: judge/admin/profile.py:103 templates/registration/registration_form.html:143
msgid "Email"
msgstr "电子邮箱"
-#: judge/admin/profile.py:98 judge/views/register.py:29
+#: judge/admin/profile.py:108 judge/views/register.py:28
#: templates/registration/registration_form.html:171
-#: templates/user/edit-profile.html:288
+#: templates/user/edit-profile.html:292
msgid "Timezone"
msgstr "时区"
-#: judge/admin/profile.py:103
+#: judge/admin/profile.py:113
msgid "date joined"
msgstr "加入日期"
-#: judge/admin/profile.py:110
+#: judge/admin/profile.py:120
#, python-format
msgid "%d user have scores recalculated."
msgid_plural "%d users have scores recalculated."
msgstr[0] "%d 个用户的总分已被重新计算。"
-#: judge/admin/profile.py:113
+#: judge/admin/profile.py:123
msgid "Recalculate scores"
msgstr "重新计算总分"
@@ -493,115 +493,116 @@ msgstr "国际信息学奥林匹克竞赛"
msgid "IOI (pre-2016)"
msgstr "IOI (2016年之前)"
-#: judge/forms.py:26
-msgid "Two-factor authentication tokens must be 6 decimal digits."
-msgstr "双重验证号码必须是 6 位数。"
+#: judge/forms.py:27
+#, python-brace-format
+msgid "Two-factor authentication tokens must be {TOTP_CODE_LENGTH} decimal digits."
+msgstr ""
-#: judge/forms.py:29
+#: judge/forms.py:30
msgid "Invalid two-factor authentication token."
msgstr "无效的双重验证码。"
-#: judge/forms.py:32
+#: judge/forms.py:33
msgid "Scratch codes must be 16 base32 characters."
msgstr "一次性双重验证码必须是16个32十进制字符。"
-#: judge/forms.py:34
+#: judge/forms.py:35 judge/forms.py:264
msgid "Invalid scratch code."
msgstr "无效的一次性代码。"
-#: judge/forms.py:45
+#: judge/forms.py:46
msgid "Subscribe to contest updates"
msgstr "订阅有关于竞赛的资讯"
-#: judge/forms.py:46
+#: judge/forms.py:47
msgid "Enable experimental features"
msgstr "允许使用实验性功能"
-#: judge/forms.py:71
+#: judge/forms.py:72
msgid "You must solve at least one problem before you can update your profile."
msgstr "您投票前必须解决至少一个问题。"
-#: judge/forms.py:80 judge/views/organization.py:127
+#: judge/forms.py:81 judge/views/organization.py:126
#, python-brace-format
msgid "You may not be part of more than {count} public organizations."
msgstr "你不能参与超过 {count} 个组织"
-#: judge/forms.py:96
+#: judge/forms.py:97
msgid "Download comments?"
msgstr "下载评论?"
-#: judge/forms.py:97
+#: judge/forms.py:98
msgid "Download submissions?"
msgstr "下载提交?"
-#: judge/forms.py:98
+#: judge/forms.py:99
msgid "Filter by problem code glob:"
msgstr "按问题代码glob过滤:"
-#: judge/forms.py:102
+#: judge/forms.py:103
msgid "Leave empty to include all submissions"
msgstr "留空以包含所有提交"
-#: judge/forms.py:105 templates/problem/manage_submission.html:142
+#: judge/forms.py:106 templates/problem/manage_submission.html:142
msgid "Filter by result:"
msgstr "以结果过滤"
-#: judge/forms.py:111
+#: judge/forms.py:112
msgid "Please select at least one thing to download."
msgstr "请选择下载至少一个东西。"
-#: judge/forms.py:137
+#: judge/forms.py:138
msgid "Any judge"
msgstr "任何裁判服务器"
-#: judge/forms.py:167 judge/views/register.py:26
+#: judge/forms.py:159 judge/views/register.py:25
#: templates/registration/registration_form.html:137
#: templates/user/base-users-table.html:5
msgid "Username"
msgstr "用户名"
-#: judge/forms.py:168 templates/registration/registration_form.html:149
+#: judge/forms.py:160 templates/registration/registration_form.html:149
#: templates/registration/registration_form.html:163
msgid "Password"
msgstr "密码"
-#: judge/forms.py:201
+#: judge/forms.py:192
msgid "Invalid code length."
msgstr "无效的代码长度。"
-#: judge/forms.py:219
+#: judge/forms.py:223
msgid "Invalid WebAuthn response."
msgstr "WebAuthn回复无效。"
-#: judge/forms.py:222
+#: judge/forms.py:226
msgid "No WebAuthn challenge issued."
msgstr "未发出WebAuthn质疑。"
-#: judge/forms.py:228
+#: judge/forms.py:232
msgid "Invalid WebAuthn credential ID."
msgstr "无效的WebAuthn凭据ID。"
-#: judge/forms.py:257
+#: judge/forms.py:262
msgid "Invalid two-factor authentication token or scratch code."
msgstr "无效的双重验证码或者一次性代码。"
-#: judge/forms.py:259
+#: judge/forms.py:266
msgid "Must specify either totp_token or webauthn_response."
msgstr "必须指定 totp_token 或 webauthn_response。"
-#: judge/forms.py:263 judge/models/problem.py:105
+#: judge/forms.py:270 judge/models/problem.py:119
msgid "Problem code must be ^[a-z0-9]+$"
msgstr "题目代码必须匹配 ^[a-z0-9]+$"
-#: judge/forms.py:268
+#: judge/forms.py:275
msgid "Problem with code already exists."
msgstr "代码已经存在问题。"
-#: judge/forms.py:273 judge/models/contest.py:66
+#: judge/forms.py:280 judge/models/contest.py:66
msgid "Contest id must be ^[a-z0-9]+$"
msgstr "竞赛标识必须匹配 ^[a-z0-9]+$"
-#: judge/forms.py:278
+#: judge/forms.py:285
msgid "Contest with key already exists."
msgstr "有这个代码的竞赛已经存在"
@@ -681,7 +682,7 @@ msgid "comments"
msgstr "评论"
#: judge/models/comment.py:89 judge/models/comment.py:141
-#: judge/models/problem.py:484
+#: judge/models/problem.py:511
#, python-format
msgid "Editorial for %s"
msgstr "%s 的题解"
@@ -722,21 +723,21 @@ msgstr "标签说明"
msgid "contest tag"
msgstr "竞赛标签"
-#: judge/models/contest.py:53 judge/models/contest.py:117
+#: judge/models/contest.py:53 judge/models/contest.py:126
msgid "contest tags"
msgstr "竞赛标签"
#: judge/models/contest.py:61
msgid "Visible"
-msgstr ""
+msgstr "可见"
#: judge/models/contest.py:62
msgid "Hidden for duration of contest"
-msgstr ""
+msgstr "在竞赛持续时间内隐藏"
#: judge/models/contest.py:63
msgid "Hidden for duration of participation"
-msgstr ""
+msgstr "在参与期间隐藏"
#: judge/models/contest.py:65
msgid "contest id"
@@ -747,410 +748,426 @@ msgid "contest name"
msgstr "竞赛名称"
#: judge/models/contest.py:68
-msgid "These people will be able to edit the contest."
-msgstr "这些人将可以编辑竞赛。"
+msgid "These users will be able to edit the contest."
+msgstr ""
+
+#: judge/models/contest.py:70
+msgid "These users will be able to edit the contest, but will not be listed as authors."
+msgstr ""
+
+#: judge/models/contest.py:73
+msgid "These users will be able to view the contest, but not edit it."
+msgstr ""
-#: judge/models/contest.py:70 judge/models/runtime.py:136
+#: judge/models/contest.py:76 judge/models/runtime.py:136
msgid "description"
msgstr "描述"
-#: judge/models/contest.py:71 judge/models/problem.py:431
+#: judge/models/contest.py:77 judge/models/problem.py:458
#: judge/models/runtime.py:138
msgid "problems"
msgstr "题目"
-#: judge/models/contest.py:72 judge/models/contest.py:384
+#: judge/models/contest.py:78 judge/models/contest.py:420
msgid "start time"
msgstr "开始时间"
-#: judge/models/contest.py:73
+#: judge/models/contest.py:79
msgid "end time"
msgstr "结束时间"
-#: judge/models/contest.py:74 judge/models/problem.py:126
-#: judge/models/problem.py:455
+#: judge/models/contest.py:80 judge/models/problem.py:140
+#: judge/models/problem.py:482
msgid "time limit"
msgstr "时间限制"
-#: judge/models/contest.py:75 judge/models/problem.py:144
+#: judge/models/contest.py:81 judge/models/problem.py:158
msgid "publicly visible"
msgstr "公开"
-#: judge/models/contest.py:76
+#: judge/models/contest.py:82
msgid "Should be set even for organization-private contests, where it determines whether the contest is visible to members of the specified organizations."
msgstr "组织内竞赛也需公开,否则责组织成员无法查看本竞赛。"
-#: judge/models/contest.py:79
+#: judge/models/contest.py:85
msgid "contest rated"
msgstr "竞赛参与评分"
-#: judge/models/contest.py:79
+#: judge/models/contest.py:85
msgid "Whether this contest can be rated."
msgstr "竞赛是否参与用户评分"
-#: judge/models/contest.py:81
+#: judge/models/contest.py:87
msgid "view contest scoreboard"
msgstr "查看竞赛记分板"
-#: judge/models/contest.py:83
+#: judge/models/contest.py:89
msgid "These users will be able to view the scoreboard."
msgstr "这些用户将能够查看记分板。"
-#: judge/models/contest.py:84
+#: judge/models/contest.py:90
msgid "scoreboard visibility"
msgstr ""
-#: judge/models/contest.py:85
+#: judge/models/contest.py:91
msgid "Scoreboard visibility through the duration of the contest"
msgstr ""
-#: judge/models/contest.py:87
+#: judge/models/contest.py:93
msgid "no comments"
msgstr "没有评论"
-#: judge/models/contest.py:88
+#: judge/models/contest.py:94
msgid "Use clarification system instead of comments."
msgstr "请使用澄清系统,而不是评论"
-#: judge/models/contest.py:90
+#: judge/models/contest.py:96
msgid "Rating floor for contest"
msgstr "竞赛最低评分"
-#: judge/models/contest.py:92
+#: judge/models/contest.py:98
msgid "Rating ceiling for contest"
msgstr "竞赛最高评分"
-#: judge/models/contest.py:94
+#: judge/models/contest.py:100
msgid "rate all"
msgstr "为所有用户评分"
-#: judge/models/contest.py:94
+#: judge/models/contest.py:100
msgid "Rate all users who joined."
msgstr "所有参与竞赛的用户,包含没有提交任何程序的用户,都将被评分。"
-#: judge/models/contest.py:95
+#: judge/models/contest.py:101
msgid "exclude from ratings"
msgstr "不会被评分"
-#: judge/models/contest.py:97
+#: judge/models/contest.py:103
msgid "private to specific users"
msgstr "私密给特定用户"
-#: judge/models/contest.py:98
+#: judge/models/contest.py:104
msgid "private contestants"
msgstr "秘密参赛者"
-#: judge/models/contest.py:99
+#: judge/models/contest.py:105
msgid "If private, only these users may see the contest"
msgstr "如果是私密的,只有这些用户可以看到比赛"
-#: judge/models/contest.py:101
+#: judge/models/contest.py:107
msgid "hide problem tags"
msgstr "隐藏题目标签"
-#: judge/models/contest.py:102
+#: judge/models/contest.py:108
msgid "Whether problem tags should be hidden by default."
msgstr "设置竞赛内题目标签是否默认被隐藏。"
-#: judge/models/contest.py:104
+#: judge/models/contest.py:110
+msgid "hide problem authors"
+msgstr ""
+
+#: judge/models/contest.py:111
+msgid "Whether problem authors should be hidden by default."
+msgstr ""
+
+#: judge/models/contest.py:113
msgid "run pretests only"
msgstr "只运行预测试"
-#: judge/models/contest.py:105
+#: judge/models/contest.py:114
msgid "Whether judges should grade pretests only, versus all testcases. Commonly set during a contest, then unset prior to rejudging user submissions when the contest ends."
msgstr "设置裁判服务器是否只运行预测试而不是所有测试。通常在竞赛进行时启动,然后在竞赛结束后重新评分前关闭。"
-#: judge/models/contest.py:109 judge/models/problem.py:166
+#: judge/models/contest.py:118 judge/models/problem.py:183
msgid "private to organizations"
msgstr "只对组织可见"
-#: judge/models/contest.py:110 judge/models/problem.py:164
-#: judge/models/profile.py:83
+#: judge/models/contest.py:119 judge/models/problem.py:181
+#: judge/models/profile.py:86
msgid "organizations"
msgstr "组织"
-#: judge/models/contest.py:111
+#: judge/models/contest.py:120
msgid "If private, only these organizations may see the contest"
msgstr "隐藏时,只对选择的组织才可见"
-#: judge/models/contest.py:112 judge/models/problem.py:153
+#: judge/models/contest.py:121 judge/models/problem.py:167
msgid "OpenGraph image"
msgstr "OpenGraph 图像"
-#: judge/models/contest.py:113 judge/models/profile.py:54
+#: judge/models/contest.py:122 judge/models/profile.py:57
msgid "Logo override image"
msgstr "覆盖标志的图片"
-#: judge/models/contest.py:115
+#: judge/models/contest.py:124
msgid "This image will replace the default site logo for users inside the contest."
msgstr "此图片将替换比赛中用户的默认网站标识。"
-#: judge/models/contest.py:118
+#: judge/models/contest.py:127
msgid "the amount of live participants"
msgstr "实时参与者数"
-#: judge/models/contest.py:119
+#: judge/models/contest.py:128
msgid "contest summary"
msgstr "竞赛简介"
-#: judge/models/contest.py:120 judge/models/problem.py:155
+#: judge/models/contest.py:129 judge/models/problem.py:169
msgid "Plain-text, shown in meta description tag, e.g. for social media."
msgstr "在meta description标签内显示的纯文本介绍。"
-#: judge/models/contest.py:121 judge/models/profile.py:53
+#: judge/models/contest.py:130 judge/models/profile.py:56
msgid "access code"
msgstr "访问码"
-#: judge/models/contest.py:122
+#: judge/models/contest.py:131
msgid "An optional code to prompt contestants before they are allowed to join the contest. Leave it blank to disable."
msgstr "在参赛者被允许参加比赛之前的一个可选代码。如无需要请留空白禁用。"
-#: judge/models/contest.py:124 judge/models/problem.py:149
+#: judge/models/contest.py:133 judge/models/problem.py:163
msgid "personae non gratae"
msgstr "不受欢迎人物"
-#: judge/models/contest.py:125
+#: judge/models/contest.py:134
msgid "Bans the selected users from joining this contest."
msgstr "禁止这些用户加入这个比赛。"
-#: judge/models/contest.py:126
+#: judge/models/contest.py:135
msgid "contest format"
msgstr "竞赛格式"
-#: judge/models/contest.py:127
+#: judge/models/contest.py:136
msgid "The contest format module to use."
msgstr "使用的竞赛格式模块。"
-#: judge/models/contest.py:128
+#: judge/models/contest.py:137
msgid "contest format configuration"
msgstr "竞赛格式配置"
-#: judge/models/contest.py:129
+#: judge/models/contest.py:138
msgid "A JSON object to serve as the configuration for the chosen contest format module. Leave empty to use None. Exact format depends on the contest format selected."
msgstr "作为选定竞赛格式模块的配置的JSON对象。留空来不使用。实在格式依赖于所选的竞赛格式。"
-#: judge/models/contest.py:136
+#: judge/models/contest.py:145
msgid "contest lock"
msgstr "竞赛锁定"
-#: judge/models/contest.py:137
-msgid "Prevent submissions from this contest from being rejudged."
-msgstr "阻止重新评分该竞赛的提交。"
+#: judge/models/contest.py:146
+msgid "Prevent submissions from this contest from being rejudged after this date."
+msgstr ""
-#: judge/models/contest.py:138
+#: judge/models/contest.py:148
msgid "precision points"
msgstr "精度"
-#: judge/models/contest.py:140
+#: judge/models/contest.py:150
msgid "Number of digits to round points to."
msgstr "将分数四舍五入到第几位。"
-#: judge/models/contest.py:362
+#: judge/models/contest.py:398
msgid "See private contests"
msgstr "查看私人竞赛"
-#: judge/models/contest.py:363
+#: judge/models/contest.py:399
msgid "Edit own contests"
msgstr "编辑我的竞赛"
-#: judge/models/contest.py:364
+#: judge/models/contest.py:400
msgid "Edit all contests"
msgstr "编辑全部竞赛"
-#: judge/models/contest.py:365
+#: judge/models/contest.py:401
msgid "Clone contest"
msgstr "复制竞赛"
-#: judge/models/contest.py:366 templates/contest/moss.html:74
+#: judge/models/contest.py:402 templates/contest/moss.html:74
msgid "MOSS contest"
msgstr "MOSS竞赛"
-#: judge/models/contest.py:367
+#: judge/models/contest.py:403
msgid "Rate contests"
msgstr "计算积分的比赛"
-#: judge/models/contest.py:368
+#: judge/models/contest.py:404
msgid "Contest access codes"
msgstr "比赛访问码"
-#: judge/models/contest.py:369
+#: judge/models/contest.py:405
msgid "Create private contests"
msgstr "创建私人竞赛"
-#: judge/models/contest.py:370
+#: judge/models/contest.py:406
msgid "Change contest visibility"
msgstr "更改竞赛可见性"
-#: judge/models/contest.py:371
+#: judge/models/contest.py:407
msgid "Edit contest problem label script"
msgstr "编辑竞赛问题标签脚本"
-#: judge/models/contest.py:372
+#: judge/models/contest.py:408
msgid "Change lock status of contest"
msgstr "更改竞赛锁定状态"
-#: judge/models/contest.py:374 judge/models/contest.py:472
-#: judge/models/contest.py:510 judge/models/contest.py:532
-#: judge/models/submission.py:84
+#: judge/models/contest.py:410 judge/models/contest.py:508
+#: judge/models/contest.py:547 judge/models/contest.py:569
+#: judge/models/submission.py:85
msgid "contest"
msgstr "竞赛"
-#: judge/models/contest.py:375
+#: judge/models/contest.py:411
msgid "contests"
msgstr "竞赛"
-#: judge/models/contest.py:382
+#: judge/models/contest.py:418
msgid "associated contest"
msgstr "关联的竞赛"
-#: judge/models/contest.py:385
+#: judge/models/contest.py:421
msgid "score"
msgstr "得分"
-#: judge/models/contest.py:386
+#: judge/models/contest.py:422
msgid "cumulative time"
msgstr "累积时间"
-#: judge/models/contest.py:387
+#: judge/models/contest.py:423
msgid "is disqualified"
msgstr "已被取消资格"
-#: judge/models/contest.py:388
+#: judge/models/contest.py:424
msgid "Whether this participation is disqualified."
msgstr "此参与是否被取消资格。"
-#: judge/models/contest.py:389
+#: judge/models/contest.py:425
msgid "tie-breaking field"
msgstr "以这个抢七"
-#: judge/models/contest.py:390
+#: judge/models/contest.py:426
msgid "virtual participation id"
msgstr "虚拟参与信息编号"
-#: judge/models/contest.py:391
+#: judge/models/contest.py:427
msgid "0 means non-virtual, otherwise the n-th virtual participation."
msgstr "0 表示正式参与,否则表示第n次虚拟参与。"
-#: judge/models/contest.py:392
+#: judge/models/contest.py:428
msgid "contest format specific data"
msgstr "竞赛格式特有的数据"
-#: judge/models/contest.py:458
+#: judge/models/contest.py:494
#, python-format
msgid "%s spectating in %s"
msgstr "%s旁观%s中"
-#: judge/models/contest.py:460
+#: judge/models/contest.py:496
#, python-format
msgid "%s in %s, v%d"
msgstr "%s于%s的第%d次虚拟参与"
-#: judge/models/contest.py:461
+#: judge/models/contest.py:497
#, python-format
msgid "%s in %s"
msgstr "%s参与%s中"
-#: judge/models/contest.py:464
+#: judge/models/contest.py:500
msgid "contest participation"
msgstr "竞赛参与信息"
-#: judge/models/contest.py:465
+#: judge/models/contest.py:501
msgid "contest participations"
msgstr "竞赛参与信息"
-#: judge/models/contest.py:471 judge/models/contest.py:494
-#: judge/models/contest.py:533 judge/models/problem.py:430
-#: judge/models/problem.py:435 judge/models/problem.py:453
+#: judge/models/contest.py:507 judge/models/contest.py:531
+#: judge/models/contest.py:570 judge/models/problem.py:457
+#: judge/models/problem.py:462 judge/models/problem.py:480
#: judge/models/problem_data.py:35
msgid "problem"
msgstr "题目"
-#: judge/models/contest.py:473 judge/models/contest.py:498
-#: judge/models/problem.py:137
+#: judge/models/contest.py:509 judge/models/contest.py:535
+#: judge/models/problem.py:151
msgid "points"
msgstr "分"
-#: judge/models/contest.py:474
+#: judge/models/contest.py:510
msgid "partial"
msgstr "部分"
-#: judge/models/contest.py:475 judge/models/contest.py:499
+#: judge/models/contest.py:511 judge/models/contest.py:536
msgid "is pretested"
msgstr "仅通过预测试"
-#: judge/models/contest.py:476 judge/models/interface.py:43
+#: judge/models/contest.py:512 judge/models/interface.py:43
msgid "order"
msgstr "顺序"
-#: judge/models/contest.py:477
+#: judge/models/contest.py:513
msgid "output prefix length override"
msgstr "输出前缀替换"
-#: judge/models/contest.py:479
+#: judge/models/contest.py:515
msgid "Maximum number of submissions for this problem, or leave blank for no limit."
msgstr "此问题的最大提交数量,或留空白而表示无限制"
-#: judge/models/contest.py:482
+#: judge/models/contest.py:518
msgid "Why include a problem you can't submit to?"
msgstr "为什么包括一个你不能提交的问题?"
-#: judge/models/contest.py:487
+#: judge/models/contest.py:523
msgid "contest problem"
msgstr "竞赛题目"
-#: judge/models/contest.py:488
+#: judge/models/contest.py:524
msgid "contest problems"
msgstr "竞赛题目"
-#: judge/models/contest.py:492 judge/models/submission.py:207
+#: judge/models/contest.py:529 judge/models/submission.py:218
msgid "submission"
msgstr "提交信息"
-#: judge/models/contest.py:496 judge/models/contest.py:511
+#: judge/models/contest.py:533 judge/models/contest.py:548
msgid "participation"
msgstr "参与"
-#: judge/models/contest.py:500
+#: judge/models/contest.py:537
msgid "Whether this submission was ran only on pretests."
msgstr "该程序是否只通过预测试。"
-#: judge/models/contest.py:504
+#: judge/models/contest.py:541
msgid "contest submission"
msgstr "竞赛提交信息"
-#: judge/models/contest.py:505
+#: judge/models/contest.py:542
msgid "contest submissions"
msgstr "竞赛提交历史"
-#: judge/models/contest.py:513
+#: judge/models/contest.py:550
msgid "rank"
msgstr "排名"
-#: judge/models/contest.py:514
+#: judge/models/contest.py:551
msgid "rating"
msgstr "评分"
-#: judge/models/contest.py:515
+#: judge/models/contest.py:552
msgid "volatility"
msgstr "波动性"
-#: judge/models/contest.py:516
+#: judge/models/contest.py:553
msgid "last rated"
msgstr "上次评分"
-#: judge/models/contest.py:520
+#: judge/models/contest.py:557
msgid "contest rating"
msgstr "竞赛评分信息"
-#: judge/models/contest.py:521
+#: judge/models/contest.py:558
msgid "contest ratings"
msgstr "竞赛评分历史"
-#: judge/models/contest.py:540
+#: judge/models/contest.py:577
msgid "contest moss result"
msgstr "竞赛MOSS结果"
-#: judge/models/contest.py:541
+#: judge/models/contest.py:578
msgid "contest moss results"
msgstr "竞赛MOSS结果"
@@ -1190,7 +1207,7 @@ msgstr "父项"
msgid "post title"
msgstr "文章标题"
-#: judge/models/interface.py:67 judge/models/problem.py:473
+#: judge/models/interface.py:67 judge/models/problem.py:500
msgid "authors"
msgstr "作者"
@@ -1198,7 +1215,7 @@ msgstr "作者"
msgid "slug"
msgstr "网址标志"
-#: judge/models/interface.py:69 judge/models/problem.py:471
+#: judge/models/interface.py:69 judge/models/problem.py:498
msgid "public visibility"
msgstr "公共可见性"
@@ -1234,34 +1251,6 @@ msgstr "博客文章"
msgid "blog posts"
msgstr "博客文章"
-#: judge/models/message.py:11
-msgid "message title"
-msgstr "消息标题"
-
-#: judge/models/message.py:12 judge/models/ticket.py:30
-msgid "message body"
-msgstr "消息正文"
-
-#: judge/models/message.py:13
-msgid "sender"
-msgstr "发件人"
-
-#: judge/models/message.py:14
-msgid "target"
-msgstr "目标"
-
-#: judge/models/message.py:15
-msgid "message timestamp"
-msgstr "消息时间戳"
-
-#: judge/models/message.py:16
-msgid "read"
-msgstr "查看"
-
-#: judge/models/message.py:20
-msgid "messages in the thread"
-msgstr "话题中的消息"
-
#: judge/models/problem.py:30
#, python-format
msgid "Disallowed characters: %(value)s"
@@ -1279,7 +1268,7 @@ msgstr "题目类型名称"
msgid "problem type"
msgstr "题目类型"
-#: judge/models/problem.py:44 judge/models/problem.py:121
+#: judge/models/problem.py:44 judge/models/problem.py:135
msgid "problem types"
msgstr "题目类型"
@@ -1291,7 +1280,7 @@ msgstr "题目组标识符"
msgid "problem group name"
msgstr "题目组名称"
-#: judge/models/problem.py:56 judge/models/problem.py:124
+#: judge/models/problem.py:56 judge/models/problem.py:138
msgid "problem group"
msgstr "题目组"
@@ -1311,7 +1300,7 @@ msgstr "链接"
msgid "full name"
msgstr "全名字"
-#: judge/models/problem.py:65 judge/models/profile.py:41
+#: judge/models/problem.py:65 judge/models/profile.py:44
#: judge/models/runtime.py:24
msgid "short name"
msgstr "简称"
@@ -1340,232 +1329,252 @@ msgstr "许可证"
msgid "licenses"
msgstr "许可证"
-#: judge/models/problem.py:104
+#: judge/models/problem.py:112
+msgid "Follow global setting"
+msgstr ""
+
+#: judge/models/problem.py:113
+msgid "Always visible"
+msgstr ""
+
+#: judge/models/problem.py:114
+msgid "Visible if problem solved"
+msgstr ""
+
+#: judge/models/problem.py:115
+msgid "Only own submissions"
+msgstr ""
+
+#: judge/models/problem.py:118
msgid "problem code"
msgstr "题目代码"
-#: judge/models/problem.py:106
+#: judge/models/problem.py:120
msgid "A short, unique code for the problem, used in the url after /problem/"
msgstr "一个简短,独特的问题代码,将在URL里/problem/之后显示"
-#: judge/models/problem.py:108
+#: judge/models/problem.py:122
msgid "problem name"
msgstr "题目名称"
-#: judge/models/problem.py:109
+#: judge/models/problem.py:123
msgid "The full name of the problem, as shown in the problem list."
msgstr "问题列表中显示的问题全名。"
-#: judge/models/problem.py:111
+#: judge/models/problem.py:125
msgid "problem body"
msgstr "题目正文"
-#: judge/models/problem.py:112
+#: judge/models/problem.py:126
msgid "creators"
msgstr "作者"
-#: judge/models/problem.py:113
+#: judge/models/problem.py:127
msgid "These users will be able to edit the problem, and be listed as authors."
msgstr "这些用户将能够编辑问题并被列为提问者。"
-#: judge/models/problem.py:115
+#: judge/models/problem.py:129
msgid "curators"
msgstr "管理员"
-#: judge/models/problem.py:116
+#: judge/models/problem.py:130
msgid "These users will be able to edit the problem, but not be listed as authors."
msgstr "这些用户将可以编辑这个问题,但不会公开显示为提问者。"
-#: judge/models/problem.py:118
+#: judge/models/problem.py:132
msgid "testers"
msgstr "测试人员"
-#: judge/models/problem.py:120
+#: judge/models/problem.py:134
msgid "These users will be able to view the private problem, but not edit it."
msgstr "这些用户将能查看这个隐藏的问题,但无法编辑。"
-#: judge/models/problem.py:122
+#: judge/models/problem.py:136
msgid "The type of problem, as shown on the problem's page."
msgstr "在问题页面显示的问题类型。"
-#: judge/models/problem.py:125
+#: judge/models/problem.py:139
msgid "The group of problem, shown under Category in the problem list."
msgstr "在问题列表显示的问题组"
-#: judge/models/problem.py:127
+#: judge/models/problem.py:141
msgid "The time limit for this problem, in seconds. Fractional seconds (e.g. 1.5) are supported."
msgstr "这个问题的时间限制(以秒为单位。支持小数秒计时方式(例如1.5)。"
-#: judge/models/problem.py:131 judge/models/problem.py:458
+#: judge/models/problem.py:145 judge/models/problem.py:485
msgid "memory limit"
msgstr "内存限制"
-#: judge/models/problem.py:132
+#: judge/models/problem.py:146
msgid "The memory limit for this problem, in kilobytes (e.g. 64mb = 65536 kilobytes)."
msgstr "此问题的存储限制,以kb为单位(例如 64mb = 65536 kb)"
-#: judge/models/problem.py:138
+#: judge/models/problem.py:152
msgid "Points awarded for problem completion. Points are displayed with a 'p' suffix if partial."
msgstr "完成问题得分的分数,如果有部分分数而显示'p'结尾。"
-#: judge/models/problem.py:141
+#: judge/models/problem.py:155
msgid "allows partial points"
msgstr "允许部分分数"
-#: judge/models/problem.py:142
+#: judge/models/problem.py:156
msgid "allowed languages"
msgstr "允许的语言"
-#: judge/models/problem.py:143
+#: judge/models/problem.py:157
msgid "List of allowed submission languages."
msgstr "允许提交语言。"
-#: judge/models/problem.py:145
+#: judge/models/problem.py:159
msgid "manually managed"
msgstr "手动管理"
-#: judge/models/problem.py:146
+#: judge/models/problem.py:160
msgid "Whether judges should be allowed to manage data or not."
msgstr "是否允许裁判管理数据"
-#: judge/models/problem.py:147
+#: judge/models/problem.py:161
msgid "date of publishing"
msgstr "公开日期"
-#: judge/models/problem.py:148
+#: judge/models/problem.py:162
msgid "Doesn't have magic ability to auto-publish due to backward compatibility"
msgstr "无法自动在时间后公开题目"
-#: judge/models/problem.py:150
+#: judge/models/problem.py:164
msgid "Bans the selected users from submitting to this problem."
msgstr "禁止这些用户对该题目提交答案。"
-#: judge/models/problem.py:152
+#: judge/models/problem.py:166
msgid "The license under which this problem is published."
msgstr "此问题的許可證。"
-#: judge/models/problem.py:154
+#: judge/models/problem.py:168
msgid "problem summary"
msgstr "问题摘要"
-#: judge/models/problem.py:156
+#: judge/models/problem.py:170
msgid "number of users"
msgstr "用户数"
-#: judge/models/problem.py:157
+#: judge/models/problem.py:171
msgid "The number of users who solved the problem."
msgstr "解决这个问题的用户数量。"
-#: judge/models/problem.py:158
+#: judge/models/problem.py:172
msgid "solve rate"
msgstr "通过率"
-#: judge/models/problem.py:159
+#: judge/models/problem.py:173
msgid "allow full markdown access"
msgstr "允许使用所有markup"
-#: judge/models/problem.py:165
+#: judge/models/problem.py:174
+msgid "submission source visibility"
+msgstr ""
+
+#: judge/models/problem.py:182
msgid "If private, only these organizations may see the problem."
msgstr "隐藏时,只对选择的组织才可见"
-#: judge/models/problem.py:420
+#: judge/models/problem.py:447
msgid "See hidden problems"
msgstr "查看隐藏问题"
-#: judge/models/problem.py:421
+#: judge/models/problem.py:448
msgid "Edit own problems"
msgstr "编辑自己的问题"
-#: judge/models/problem.py:422
+#: judge/models/problem.py:449
msgid "Edit all problems"
msgstr "编辑所有问题"
-#: judge/models/problem.py:423
+#: judge/models/problem.py:450
msgid "Edit all public problems"
msgstr "编辑所有公共问题"
-#: judge/models/problem.py:424
+#: judge/models/problem.py:451
msgid "Edit problems with full markup"
msgstr "使用所有markup来编辑问题"
-#: judge/models/problem.py:425 templates/problem/problem.html:161
+#: judge/models/problem.py:452 templates/problem/problem.html:161
msgid "Clone problem"
msgstr "复制题目"
-#: judge/models/problem.py:426
+#: judge/models/problem.py:453
msgid "Change is_public field"
msgstr "改变is_public领域"
-#: judge/models/problem.py:427
+#: judge/models/problem.py:454
msgid "Change is_manually_managed field"
msgstr "改变is_manually_managed领域"
-#: judge/models/problem.py:428
+#: judge/models/problem.py:455
msgid "See organization-private problems"
msgstr "查看对组织私有的问题"
-#: judge/models/problem.py:436 judge/models/problem.py:454
+#: judge/models/problem.py:463 judge/models/problem.py:481
#: judge/models/runtime.py:111
msgid "language"
msgstr "语言"
-#: judge/models/problem.py:437
+#: judge/models/problem.py:464
msgid "translated name"
msgstr "翻译题目名"
-#: judge/models/problem.py:438
+#: judge/models/problem.py:465
msgid "translated description"
msgstr "翻译题目正文"
-#: judge/models/problem.py:442
+#: judge/models/problem.py:469
msgid "problem translation"
msgstr "题目翻译"
-#: judge/models/problem.py:443
+#: judge/models/problem.py:470
msgid "problem translations"
msgstr "题目翻译"
-#: judge/models/problem.py:447
+#: judge/models/problem.py:474
msgid "clarified problem"
msgstr "已澄清的问题"
-#: judge/models/problem.py:448
+#: judge/models/problem.py:475
msgid "clarification body"
msgstr "澄清的身体"
-#: judge/models/problem.py:449
+#: judge/models/problem.py:476
msgid "clarification timestamp"
msgstr "澄清时间戳"
-#: judge/models/problem.py:464
+#: judge/models/problem.py:491
msgid "language-specific resource limit"
msgstr "语言特定资源限制"
-#: judge/models/problem.py:465
+#: judge/models/problem.py:492
msgid "language-specific resource limits"
msgstr "语言特定资源限制"
-#: judge/models/problem.py:469
+#: judge/models/problem.py:496
msgid "associated problem"
msgstr "关联的题目"
-#: judge/models/problem.py:472
+#: judge/models/problem.py:499
msgid "publish date"
msgstr "发布日期"
-#: judge/models/problem.py:474
+#: judge/models/problem.py:501
msgid "editorial content"
msgstr "可编辑的内容"
-#: judge/models/problem.py:497
+#: judge/models/problem.py:524
msgid "See hidden solutions"
msgstr "查看隐藏的解答"
-#: judge/models/problem.py:499
+#: judge/models/problem.py:526
msgid "solution"
msgstr "题目讲解"
-#: judge/models/problem.py:500
+#: judge/models/problem.py:527
msgid "solutions"
msgstr "题目讲解"
@@ -1677,112 +1686,112 @@ msgstr "分数"
msgid "case is pretest?"
msgstr "是否为预测试?"
-#: judge/models/profile.py:38
+#: judge/models/profile.py:41
msgid "organization title"
msgstr "组织名称"
-#: judge/models/profile.py:39
+#: judge/models/profile.py:42
msgid "organization slug"
msgstr "组织代码"
-#: judge/models/profile.py:40
+#: judge/models/profile.py:43
msgid "Organization name shown in URL"
msgstr "组织名称在 URL 中显示"
-#: judge/models/profile.py:42
+#: judge/models/profile.py:45
msgid "Displayed beside user name during contests"
msgstr "竞赛时显示在用户名旁边"
-#: judge/models/profile.py:43
+#: judge/models/profile.py:46
msgid "organization description"
msgstr "组织描述"
-#: judge/models/profile.py:44
+#: judge/models/profile.py:47
msgid "administrators"
msgstr "管理员"
-#: judge/models/profile.py:45
+#: judge/models/profile.py:48
msgid "Those who can edit this organization"
msgstr "这些用户可以编辑此组织"
-#: judge/models/profile.py:46
+#: judge/models/profile.py:49
msgid "creation date"
msgstr "创建日期"
-#: judge/models/profile.py:47
+#: judge/models/profile.py:50
msgid "is open organization?"
msgstr "是开放的组织吗?"
-#: judge/models/profile.py:48
+#: judge/models/profile.py:51
msgid "Allow joining organization"
msgstr "允许加入组织"
-#: judge/models/profile.py:49
+#: judge/models/profile.py:52
msgid "maximum size"
msgstr "最大大小"
-#: judge/models/profile.py:50
+#: judge/models/profile.py:53
msgid "Maximum amount of users in this organization, only applicable to private organizations"
msgstr "这个组织用户最大数量,只适用于私人组织"
-#: judge/models/profile.py:52
+#: judge/models/profile.py:55
msgid "Student access code"
msgstr "学生访问码"
-#: judge/models/profile.py:56
+#: judge/models/profile.py:59
msgid "This image will replace the default site logo for users viewing the organization."
msgstr "此图片将替换访问该组织的用户的默认网站标识。"
-#: judge/models/profile.py:79
+#: judge/models/profile.py:82
msgid "Administer organizations"
msgstr "管理组织"
-#: judge/models/profile.py:80
+#: judge/models/profile.py:83
msgid "Edit all organizations"
msgstr "编辑所有组织"
-#: judge/models/profile.py:82 judge/models/profile.py:99
-#: judge/models/profile.py:269
+#: judge/models/profile.py:85 judge/models/profile.py:102
+#: judge/models/profile.py:293
msgid "organization"
msgstr "组织"
-#: judge/models/profile.py:87
+#: judge/models/profile.py:90
msgid "user associated"
msgstr "关联的用户"
-#: judge/models/profile.py:88
+#: judge/models/profile.py:91
msgid "self-description"
msgstr "自我描述"
-#: judge/models/profile.py:89
+#: judge/models/profile.py:92
msgid "location"
msgstr "位置"
-#: judge/models/profile.py:91
+#: judge/models/profile.py:94
msgid "preferred language"
msgstr "首选语言"
-#: judge/models/profile.py:97
+#: judge/models/profile.py:100
msgid "last access time"
msgstr "上次访问时间"
-#: judge/models/profile.py:98
+#: judge/models/profile.py:101
msgid "last IP"
msgstr "上次访问 IP"
-#: judge/models/profile.py:101
+#: judge/models/profile.py:104
msgid "display rank"
msgstr "显示排名"
-#: judge/models/profile.py:103
+#: judge/models/profile.py:106
msgid "Normal User"
msgstr "普通用户"
-#: judge/models/profile.py:104
+#: judge/models/profile.py:107
msgid "Problem Setter"
msgstr "问题作家"
-#: judge/models/profile.py:105 templates/base.html:220
+#: judge/models/profile.py:108 templates/base.html:220
#: templates/comments/list.html:99 templates/contest/contest-list-tabs.html:24
#: templates/contest/ranking-table.html:49
#: templates/problem/problem-list-tabs.html:6
@@ -1791,155 +1800,167 @@ msgstr "问题作家"
msgid "Admin"
msgstr "管理"
-#: judge/models/profile.py:106
+#: judge/models/profile.py:109
msgid "comment mute"
msgstr "禁止评论"
-#: judge/models/profile.py:106
+#: judge/models/profile.py:109
msgid "Some users are at their best when silent."
msgstr "某些用户在沉默时表现最佳。"
-#: judge/models/profile.py:108
+#: judge/models/profile.py:111
msgid "unlisted user"
msgstr "未列出用户"
-#: judge/models/profile.py:108
+#: judge/models/profile.py:111
msgid "User will not be ranked."
msgstr "用户将不被排名。"
-#: judge/models/profile.py:111
+#: judge/models/profile.py:114
msgid "user script"
msgstr "用户脚本"
-#: judge/models/profile.py:112
+#: judge/models/profile.py:115
msgid "User-defined JavaScript for site customization."
msgstr "用户自定义 JavaScript。"
-#: judge/models/profile.py:113
+#: judge/models/profile.py:116
msgid "current contest"
msgstr "当前竞赛"
-#: judge/models/profile.py:115
+#: judge/models/profile.py:118
msgid "math engine"
msgstr "数学引擎"
-#: judge/models/profile.py:117
+#: judge/models/profile.py:120
msgid "the rendering engine used to render math"
msgstr "数学渲染使用的引擎"
-#: judge/models/profile.py:118
+#: judge/models/profile.py:121
msgid "TOTP 2FA enabled"
msgstr "TOTP 2FA 已启用"
-#: judge/models/profile.py:119
+#: judge/models/profile.py:122
msgid "check to enable TOTP-based two-factor authentication"
msgstr "打钩以启用TOTP双重验证"
-#: judge/models/profile.py:120
+#: judge/models/profile.py:123
msgid "WebAuthn 2FA enabled"
msgstr "WebAuthn 2FA 已启用"
-#: judge/models/profile.py:121
+#: judge/models/profile.py:124
msgid "check to enable WebAuthn-based two-factor authentication"
msgstr "打钩以启用WebAuthn双重验证"
-#: judge/models/profile.py:122
+#: judge/models/profile.py:125
msgid "TOTP key"
msgstr "TOTP 密钥"
-#: judge/models/profile.py:123
+#: judge/models/profile.py:126
msgid "32 character base32-encoded key for TOTP"
msgstr "TOTP的32字符,32进制密钥"
-#: judge/models/profile.py:125
+#: judge/models/profile.py:128
msgid "TOTP key must be empty or base32"
msgstr "TOTP 密钥必须为空或三十二进制"
-#: judge/models/profile.py:126
+#: judge/models/profile.py:129
msgid "scratch codes"
msgstr "一次性代码:"
-#: judge/models/profile.py:127
+#: judge/models/profile.py:130
msgid "JSON array of 16 character base32-encoded codes for scratch codes"
msgstr "含有16字符的32进制代码的JSON数组"
-#: judge/models/profile.py:131
+#: judge/models/profile.py:134
msgid "Scratch codes must be empty or a JSON array of 16-character base32 codes"
msgstr "一次性代码必须是空的或者是一个含有32进制代码的JSON数组"
-#: judge/models/profile.py:133
+#: judge/models/profile.py:136
+msgid "last TOTP timecode"
+msgstr ""
+
+#: judge/models/profile.py:137
msgid "API token"
msgstr "API令牌"
-#: judge/models/profile.py:134
+#: judge/models/profile.py:138
msgid "64 character hex-encoded API access token"
msgstr "64 个字符hex编码的API访问令牌"
-#: judge/models/profile.py:136
+#: judge/models/profile.py:140
msgid "API token must be None or hexadecimal"
msgstr "API 令牌必须是莫或十六进制的"
-#: judge/models/profile.py:137
+#: judge/models/profile.py:141
msgid "internal notes"
msgstr "内部备注"
-#: judge/models/profile.py:138
+#: judge/models/profile.py:142
msgid "Notes for administrators regarding this user."
msgstr "此用户的管理员备注。"
-#: judge/models/profile.py:139
+#: judge/models/profile.py:143
msgid "last data download time"
msgstr "上次数据下载时间"
-#: judge/models/profile.py:236
+#: judge/models/profile.py:253
msgid "Shows in-progress development stuff"
msgstr "显示正在开发的内容"
-#: judge/models/profile.py:237
+#: judge/models/profile.py:254
msgid "Edit TOTP settings"
msgstr "编辑 TOTP 设置"
-#: judge/models/profile.py:239
+#: judge/models/profile.py:256
msgid "user profile"
msgstr "用户信息"
-#: judge/models/profile.py:240
+#: judge/models/profile.py:257
msgid "user profiles"
msgstr "用户信息"
-#: judge/models/profile.py:246
+#: judge/models/profile.py:263
msgid "device name"
msgstr "设备名称"
-#: judge/models/profile.py:247
+#: judge/models/profile.py:264
msgid "credential ID"
msgstr "凭据ID"
-#: judge/models/profile.py:248
+#: judge/models/profile.py:265
msgid "public key"
msgstr "公钥"
-#: judge/models/profile.py:249
+#: judge/models/profile.py:266
msgid "sign counter"
msgstr "签名数量"
-#: judge/models/profile.py:271
+#: judge/models/profile.py:287
+msgid "WebAuthn credential"
+msgstr ""
+
+#: judge/models/profile.py:288
+msgid "WebAuthn credentials"
+msgstr ""
+
+#: judge/models/profile.py:295
msgid "request time"
msgstr "请求时间"
-#: judge/models/profile.py:272
+#: judge/models/profile.py:296
msgid "state"
msgstr "状态"
-#: judge/models/profile.py:277
+#: judge/models/profile.py:301
msgid "reason"
msgstr "原因"
-#: judge/models/profile.py:280
+#: judge/models/profile.py:304
msgid "organization join request"
msgstr "组织加入请求"
-#: judge/models/profile.py:281
+#: judge/models/profile.py:305
msgid "organization join requests"
msgstr "组织加入请求"
@@ -2095,210 +2116,210 @@ msgstr "裁判服务器"
msgid "judge"
msgstr "裁判服务器"
-#: judge/models/submission.py:20 judge/models/submission.py:47
+#: judge/models/submission.py:21 judge/models/submission.py:48
#: judge/utils/problems.py:74
msgid "Accepted"
msgstr "接受"
-#: judge/models/submission.py:21 judge/models/submission.py:48
+#: judge/models/submission.py:22 judge/models/submission.py:49
msgid "Wrong Answer"
msgstr "答案错误"
-#: judge/models/submission.py:22 judge/models/submission.py:50
+#: judge/models/submission.py:23 judge/models/submission.py:51
msgid "Time Limit Exceeded"
msgstr "超出时间限制"
-#: judge/models/submission.py:23 judge/models/submission.py:51
+#: judge/models/submission.py:24 judge/models/submission.py:52
msgid "Memory Limit Exceeded"
msgstr "超出内存限制"
-#: judge/models/submission.py:24 judge/models/submission.py:52
+#: judge/models/submission.py:25 judge/models/submission.py:53
msgid "Output Limit Exceeded"
msgstr "超出输出限制"
-#: judge/models/submission.py:25 judge/models/submission.py:53
+#: judge/models/submission.py:26 judge/models/submission.py:54
msgid "Invalid Return"
msgstr "错误退出代码"
-#: judge/models/submission.py:26 judge/models/submission.py:54
+#: judge/models/submission.py:27 judge/models/submission.py:55
msgid "Runtime Error"
msgstr "运行错误"
-#: judge/models/submission.py:27 judge/models/submission.py:41
-#: judge/models/submission.py:55 judge/utils/problems.py:76
+#: judge/models/submission.py:28 judge/models/submission.py:42
+#: judge/models/submission.py:56 judge/utils/problems.py:76
msgid "Compile Error"
msgstr "编译错误"
-#: judge/models/submission.py:28 judge/models/submission.py:40
+#: judge/models/submission.py:29 judge/models/submission.py:41
msgid "Internal Error"
msgstr "内部错误"
-#: judge/models/submission.py:29
+#: judge/models/submission.py:30
msgid "Short circuit"
msgstr "跳过"
-#: judge/models/submission.py:30 judge/models/submission.py:42
-#: judge/models/submission.py:61
+#: judge/models/submission.py:31 judge/models/submission.py:43
+#: judge/models/submission.py:62
msgid "Aborted"
msgstr "中止"
-#: judge/models/submission.py:36 judge/models/submission.py:57
+#: judge/models/submission.py:37 judge/models/submission.py:58
msgid "Queued"
msgstr "等待中"
-#: judge/models/submission.py:37 judge/models/submission.py:58
+#: judge/models/submission.py:38 judge/models/submission.py:59
msgid "Processing"
msgstr "处理中"
-#: judge/models/submission.py:38 judge/models/submission.py:59
+#: judge/models/submission.py:39 judge/models/submission.py:60
msgid "Grading"
msgstr "评分中"
-#: judge/models/submission.py:39 judge/models/submission.py:60
+#: judge/models/submission.py:40 judge/models/submission.py:61
msgid "Completed"
msgstr "完成"
-#: judge/models/submission.py:56
+#: judge/models/submission.py:57
msgid "Internal Error (judging server error)"
msgstr "内部错误 (裁判服务器错误)"
-#: judge/models/submission.py:66
+#: judge/models/submission.py:67
msgid "submission time"
msgstr "提交时间"
-#: judge/models/submission.py:67 judge/models/submission.py:227
+#: judge/models/submission.py:68 judge/models/submission.py:238
msgid "execution time"
msgstr "执行时间"
-#: judge/models/submission.py:68 judge/models/submission.py:228
+#: judge/models/submission.py:69 judge/models/submission.py:239
msgid "memory usage"
msgstr "内存使用"
-#: judge/models/submission.py:69 judge/models/submission.py:229
+#: judge/models/submission.py:70 judge/models/submission.py:240
msgid "points granted"
msgstr "获得分数"
-#: judge/models/submission.py:70
+#: judge/models/submission.py:71
msgid "submission language"
msgstr "提交语言"
-#: judge/models/submission.py:71
+#: judge/models/submission.py:72
msgid "status"
msgstr "状态"
-#: judge/models/submission.py:72
+#: judge/models/submission.py:73
msgid "result"
msgstr "结果"
-#: judge/models/submission.py:74
+#: judge/models/submission.py:75
msgid "compile errors"
msgstr "编译错误"
-#: judge/models/submission.py:76
+#: judge/models/submission.py:77
msgid "batched cases"
msgstr "测试组"
-#: judge/models/submission.py:77
+#: judge/models/submission.py:78
msgid "test case points"
msgstr "测试点分值"
-#: judge/models/submission.py:78
+#: judge/models/submission.py:79
msgid "test case total points"
msgstr "测试用例总分"
-#: judge/models/submission.py:79
+#: judge/models/submission.py:80
msgid "judged on"
msgstr "裁判服务器"
-#: judge/models/submission.py:81
+#: judge/models/submission.py:82
msgid "submission judge time"
msgstr "提交评论时间"
-#: judge/models/submission.py:82
-msgid "was rejudged by admin"
-msgstr "被管理员重新评分"
-
#: judge/models/submission.py:83
+msgid "last rejudge date by admin"
+msgstr ""
+
+#: judge/models/submission.py:84
msgid "was ran on pretests only"
msgstr "只进行过预测试"
-#: judge/models/submission.py:86
-msgid "lock submission"
-msgstr "锁定提交"
+#: judge/models/submission.py:87
+msgid "submission lock"
+msgstr ""
-#: judge/models/submission.py:199
+#: judge/models/submission.py:210
msgid "Abort any submission"
msgstr "中止任何提交"
-#: judge/models/submission.py:200
+#: judge/models/submission.py:211
msgid "Rejudge the submission"
msgstr "重新评分提交"
-#: judge/models/submission.py:201
+#: judge/models/submission.py:212
msgid "Rejudge a lot of submissions"
msgstr "重新评分很多提交"
-#: judge/models/submission.py:202
+#: judge/models/submission.py:213
msgid "Submit without limit"
msgstr "不受限制提交"
-#: judge/models/submission.py:203
+#: judge/models/submission.py:214
msgid "View all submission"
msgstr "查看所有提交"
-#: judge/models/submission.py:204
+#: judge/models/submission.py:215
msgid "Resubmit others' submission"
msgstr "重新提交他人的提交"
-#: judge/models/submission.py:205
+#: judge/models/submission.py:216
msgid "Change lock status of submission"
msgstr "更改提交锁定状态"
-#: judge/models/submission.py:208 templates/contest/moss.html:58
+#: judge/models/submission.py:219 templates/contest/moss.html:58
msgid "submissions"
msgstr "提交历史"
-#: judge/models/submission.py:212 judge/models/submission.py:223
+#: judge/models/submission.py:223 judge/models/submission.py:234
msgid "associated submission"
msgstr "相关提交"
-#: judge/models/submission.py:214
+#: judge/models/submission.py:225
msgid "source code"
msgstr "源码"
-#: judge/models/submission.py:225
+#: judge/models/submission.py:236
msgid "test case ID"
msgstr "测试编号"
-#: judge/models/submission.py:226
+#: judge/models/submission.py:237
msgid "status flag"
msgstr "状态标志"
-#: judge/models/submission.py:230
+#: judge/models/submission.py:241
msgid "points possible"
msgstr "满分"
-#: judge/models/submission.py:231
+#: judge/models/submission.py:242
msgid "batch number"
msgstr "批号"
-#: judge/models/submission.py:232
+#: judge/models/submission.py:243
msgid "judging feedback"
msgstr "评测反馈"
-#: judge/models/submission.py:233
+#: judge/models/submission.py:244
msgid "extended judging feedback"
msgstr "延长的裁判反馈"
-#: judge/models/submission.py:234
+#: judge/models/submission.py:245
msgid "program output"
msgstr "程序输出"
-#: judge/models/submission.py:242
+#: judge/models/submission.py:253
msgid "submission test case"
msgstr "程序测试"
-#: judge/models/submission.py:243
+#: judge/models/submission.py:254
msgid "submission test cases"
msgstr "程序测试"
@@ -2346,6 +2367,10 @@ msgstr "票"
msgid "poster"
msgstr "海报"
+#: judge/models/ticket.py:30
+msgid "message body"
+msgstr "消息正文"
+
#: judge/models/ticket.py:31
msgid "message time"
msgstr "消息时间"
@@ -2368,19 +2393,23 @@ msgstr "正在重新计算比赛分数"
msgid "Running MOSS"
msgstr "正在运行 MOSS。"
-#: judge/tasks/submission.py:43
+#: judge/tasks/submission.py:45
msgid "Modifying submissions"
msgstr "正在改变提交"
-#: judge/tasks/submission.py:56
+#: judge/tasks/submission.py:58
msgid "Recalculating user points"
msgstr "正在重新计算用户分数"
-#: judge/tasks/user.py:50
+#: judge/tasks/user.py:49
+msgid "Applying filters"
+msgstr ""
+
+#: judge/tasks/user.py:64
msgid "Preparing your submission data"
msgstr "正在准备您的提交资料"
-#: judge/tasks/user.py:81
+#: judge/tasks/user.py:95
msgid "Preparing your comment data"
msgstr "正在准备您的评论资料"
@@ -2490,7 +2519,7 @@ msgstr "您投票前必须解决至少一个问题。"
msgid "You already voted."
msgstr "你已经投了票。"
-#: judge/views/comment.py:129 judge/views/organization.py:298
+#: judge/views/comment.py:129 judge/views/organization.py:297
msgid "Edited from site"
msgstr "从网站中上编辑"
@@ -2498,125 +2527,130 @@ msgstr "从网站中上编辑"
msgid "Editing comment"
msgstr "编辑评论"
-#: judge/views/contests.py:56 judge/views/contests.py:201
-#: judge/views/contests.py:204 judge/views/contests.py:382
+#: judge/views/contests.py:57 judge/views/contests.py:210
+#: judge/views/contests.py:213 judge/views/contests.py:395
msgid "No such contest"
msgstr "该竞赛不存在"
-#: judge/views/contests.py:57 judge/views/contests.py:202
+#: judge/views/contests.py:58 judge/views/contests.py:211
#, python-format
msgid "Could not find a contest with the key \"%s\"."
msgstr "找不到标识符为“%s“的竞赛。"
-#: judge/views/contests.py:70
+#: judge/views/contests.py:71
msgid "Contests"
msgstr "竞赛"
-#: judge/views/contests.py:205
+#: judge/views/contests.py:214
msgid "Could not find such contest."
msgstr "找不到该竞赛。"
-#: judge/views/contests.py:208
+#: judge/views/contests.py:217
#, python-format
msgid "Access to contest \"%s\" denied"
msgstr "对竞赛”%s“的访问被拒绝"
-#: judge/views/contests.py:235
+#: judge/views/contests.py:244
msgid "Clone Contest"
msgstr "复制竞赛"
-#: judge/views/contests.py:301
+#: judge/views/contests.py:278
+#, python-format
+msgid "Cloned contest from %s"
+msgstr ""
+
+#: judge/views/contests.py:314
msgid "Contest not ongoing"
msgstr "竞赛不在进行"
-#: judge/views/contests.py:302
+#: judge/views/contests.py:315
#, python-format
msgid "\"%s\" is not currently ongoing."
msgstr "“%s“不在进行。"
-#: judge/views/contests.py:306
+#: judge/views/contests.py:319
msgid "Already in contest"
msgstr "已经参与了竞赛"
-#: judge/views/contests.py:307
+#: judge/views/contests.py:320
#, python-format
msgid "You are already in a contest: \"%s\"."
msgstr "您已经参与了竞赛:”%s“。"
-#: judge/views/contests.py:310
+#: judge/views/contests.py:323
msgid "Banned from joining"
msgstr "禁止加入"
-#: judge/views/contests.py:311
+#: judge/views/contests.py:324
msgid "You have been declared persona non grata for this contest. You are permanently barred from joining this contest."
msgstr "您在该竞赛不受欢迎。您被永久禁止参加该竞赛。"
-#: judge/views/contests.py:372
+#: judge/views/contests.py:385
#, python-format
msgid "Enter access code for \"%s\""
msgstr "输入”%s“的访问码"
-#: judge/views/contests.py:383
+#: judge/views/contests.py:396
#, python-format
msgid "You are not in contest \"%s\"."
msgstr "你不是在竞赛\"%s\"中。"
-#: judge/views/contests.py:402
+#: judge/views/contests.py:415
msgid "ContestCalendar requires integer year and month"
msgstr "ContestCalender 需要整数年份和月份"
-#: judge/views/contests.py:442
+#: judge/views/contests.py:455
#, python-format
msgid "Contests in %(month)s"
msgstr "%(month)s的竞赛"
-#: judge/views/contests.py:442
+#: judge/views/contests.py:455
msgid "F Y"
msgstr "Y年n月"
-#: judge/views/contests.py:489
+#: judge/views/contests.py:502
#, python-format
msgid "%s Statistics"
msgstr "%s 数据"
-#: judge/views/contests.py:662
+#: judge/views/contests.py:675
#, python-format
msgid "%s Rankings"
msgstr "%s 排行榜"
-#: judge/views/contests.py:670
+#: judge/views/contests.py:683
msgid "???"
msgstr "???"
-#: judge/views/contests.py:686
+#: judge/views/contests.py:699
#, python-format
msgid "Your participation in %s"
msgstr "你在%s中的参与历史"
-#: judge/views/contests.py:687
+#: judge/views/contests.py:700
#, python-format
msgid "%s's participation in %s"
msgstr "%s在%s中的参与历史"
-#: judge/views/contests.py:694
+#: judge/views/contests.py:707
msgid "Live"
msgstr "实时"
-#: judge/views/contests.py:706 templates/contest/contest-tabs.html:13
+#: judge/views/contests.py:719 templates/contest/contest-tabs.html:13
msgid "Participation"
msgstr "参与历史"
-#: judge/views/contests.py:750
+#: judge/views/contests.py:763
#, python-format
msgid "%s MOSS Results"
msgstr "%s MOSS 结果"
-#: judge/views/contests.py:777
+#: judge/views/contests.py:790
#, python-format
msgid "Running MOSS for %s..."
msgstr "正在为 %s 运行 MOSS..."
-#: judge/views/contests.py:800
+#: judge/views/contests.py:813
#, python-format
msgid "Contest tag: %s"
msgstr "竞赛标签:%s"
@@ -2645,161 +2679,175 @@ msgstr "页面错误 %s"
msgid "Runtimes"
msgstr "语言"
-#: judge/views/organization.py:44 judge/views/organization.py:47
+#: judge/views/organization.py:43 judge/views/organization.py:46
msgid "No such organization"
msgstr "无该组织"
-#: judge/views/organization.py:45
+#: judge/views/organization.py:44
#, python-format
msgid "Could not find an organization with the key \"%s\"."
msgstr "找不到标识符为”%s“的组织。"
-#: judge/views/organization.py:48
+#: judge/views/organization.py:47
msgid "Could not find such organization."
msgstr "找不到该组织。"
-#: judge/views/organization.py:72 judge/views/register.py:34
+#: judge/views/organization.py:71 judge/views/register.py:33
#: templates/organization/list.html:15 templates/user/user-list-tabs.html:5
msgid "Organizations"
msgstr "组织"
-#: judge/views/organization.py:93
+#: judge/views/organization.py:92
#, python-format
msgid "%s Members"
msgstr "%s 成员列表"
-#: judge/views/organization.py:118 judge/views/organization.py:121
-#: judge/views/organization.py:126
+#: judge/views/organization.py:117 judge/views/organization.py:120
+#: judge/views/organization.py:125
msgid "Joining organization"
msgstr "加入组织"
-#: judge/views/organization.py:118
+#: judge/views/organization.py:117
msgid "You are already in the organization."
msgstr "你已经是该组织的成员。"
-#: judge/views/organization.py:121
+#: judge/views/organization.py:120
msgid "This organization is not open."
msgstr "该组织不开放。"
-#: judge/views/organization.py:138
+#: judge/views/organization.py:137
msgid "Leaving organization"
msgstr "离开组织"
-#: judge/views/organization.py:138
+#: judge/views/organization.py:137
#, python-format
msgid "You are not in \"%s\"."
msgstr "你不是是“%s”的成员。"
-#: judge/views/organization.py:162
+#: judge/views/organization.py:161
#, python-format
msgid "Request to join %s"
msgstr "请求加入 %s"
-#: judge/views/organization.py:180
+#: judge/views/organization.py:179
msgid "Join request detail"
msgstr "组织加入请求详细信息"
-#: judge/views/organization.py:208
+#: judge/views/organization.py:207
#, python-format
msgid "Managing join requests for %s"
msgstr "管理 %s 的加入请求"
-#: judge/views/organization.py:239
+#: judge/views/organization.py:238
#, python-format
msgid "Your organization can only receive %d more members. You cannot approve %d users."
msgstr "你的组织只能再接受%d个用户,无法接受%d个。"
-#: judge/views/organization.py:251
+#: judge/views/organization.py:250
#, python-format
msgid "Approved %d user."
msgid_plural "Approved %d users."
msgstr[0] "批准了%d个用户。"
-#: judge/views/organization.py:252
+#: judge/views/organization.py:251
#, python-format
msgid "Rejected %d user."
msgid_plural "Rejected %d users."
msgstr[0] "拒绝了%d个用户。"
-#: judge/views/organization.py:282
+#: judge/views/organization.py:281
#, python-format
msgid "Editing %s"
msgstr "编辑 %s"
-#: judge/views/organization.py:306 judge/views/organization.py:314
+#: judge/views/organization.py:305 judge/views/organization.py:313
msgid "Can't edit organization"
msgstr "无法编辑组织"
-#: judge/views/organization.py:307
+#: judge/views/organization.py:306
msgid "You are not allowed to edit this organization."
msgstr "您没有编辑该组织的权利。"
-#: judge/views/organization.py:315
+#: judge/views/organization.py:314
msgid "You are not allowed to kick people from this organization."
msgstr "你没有踢组织成员的权利。"
-#: judge/views/organization.py:320 judge/views/organization.py:324
+#: judge/views/organization.py:319 judge/views/organization.py:323
msgid "Can't kick user"
msgstr "无法踢用户"
-#: judge/views/organization.py:321
+#: judge/views/organization.py:320
msgid "The user you are trying to kick does not exist!"
msgstr "你想踢的用户不存在!"
-#: judge/views/organization.py:325
+#: judge/views/organization.py:324
#, python-format
msgid "The user you are trying to kick is not in organization: %s."
msgstr "你想踢的用户不是组织成员:%s"
-#: judge/views/problem.py:67
+#: judge/views/problem.py:68
msgid "No such problem"
msgstr "无该题目"
-#: judge/views/problem.py:68
+#: judge/views/problem.py:69
#, python-format
msgid "Could not find a problem with the code \"%s\"."
msgstr "找不到代码为“%s”的题目。"
-#: judge/views/problem.py:110
+#: judge/views/problem.py:111
#, python-brace-format
msgid "Editorial for {0}"
msgstr "{0} 的题解"
-#: judge/views/problem.py:113
+#: judge/views/problem.py:114
#, python-brace-format
msgid "Editorial for {0}"
msgstr "{0}的题解"
-#: judge/views/problem.py:283 templates/contest/contest.html:79
+#: judge/views/problem.py:133
+msgid "No such editorial"
+msgstr ""
+
+#: judge/views/problem.py:134
+#, python-format
+msgid "Could not find an editorial with the code \"%s\"."
+msgstr ""
+
+#: judge/views/problem.py:289 templates/contest/contest.html:79
#: templates/user/user-tabs.html:5 templates/user/users-table.html:23
msgid "Problems"
msgstr "题目"
-#: judge/views/problem.py:556 judge/views/problem.py:564
+#: judge/views/problem.py:562 judge/views/problem.py:570
#, python-format
msgid "Submit to %s"
msgstr "提交给 %s"
-#: judge/views/problem.py:613
+#: judge/views/problem.py:619
msgid "Banned from submitting"
msgstr "禁止提交"
-#: judge/views/problem.py:614
+#: judge/views/problem.py:620
msgid "You have been declared persona non grata for this problem. You are permanently barred from submitting this problem."
msgstr "您在该题目不受欢迎。您被永久禁止为该题目提交解决程序。"
-#: judge/views/problem.py:618
+#: judge/views/problem.py:624
msgid "Too many submissions"
msgstr "提交太多了"
-#: judge/views/problem.py:619
+#: judge/views/problem.py:625
msgid "You have exceeded the submission limit for this problem."
msgstr "您已超出此问题的提交限制。"
-#: judge/views/problem.py:681
+#: judge/views/problem.py:693
msgid "Clone Problem"
msgstr "复制问题"
+#: judge/views/problem.py:720
+#, python-format
+msgid "Cloned problem from %s"
+msgstr ""
+
#: judge/views/problem_data.py:37
msgid "Checker arguments must be a JSON object"
msgstr "检查器参数必须是一个 JSON 对象"
@@ -2868,52 +2916,52 @@ msgstr "%s 排行榜"
msgid "Best solutions for {0}"
msgstr "{0} 排行榜"
-#: judge/views/ranked_submission.py:80
+#: judge/views/ranked_submission.py:82
#, python-format
msgid "Best solutions for %(problem)s in %(contest)s"
msgstr "竞赛 %(contest)s 中 %(problem)s 排行榜"
-#: judge/views/ranked_submission.py:83
+#: judge/views/ranked_submission.py:85
#, python-format
msgid "Best solutions for problem %(number)s in %(contest)s"
msgstr "%(contest)s 第 %(number)s 题的最佳解决方案"
-#: judge/views/ranked_submission.py:89
+#: judge/views/ranked_submission.py:91
#, python-brace-format
msgid "Best solutions for {0} in {2}"
msgstr "竞赛 {2} 中 {0} 排行榜"
-#: judge/views/ranked_submission.py:92
+#: judge/views/ranked_submission.py:94
#, python-brace-format
msgid "Best solutions for problem {0} in {1}"
msgstr "{1} 第 {0} 题的最佳解决方案"
-#: judge/views/register.py:27
+#: judge/views/register.py:26
msgid "A username must contain letters, numbers, or underscores"
msgstr "用户名只能包含字母、 数字或下划线。"
-#: judge/views/register.py:31
+#: judge/views/register.py:30
msgid "Preferred language"
msgstr "首选语言"
-#: judge/views/register.py:38
+#: judge/views/register.py:37
msgid "Subscribe to newsletter?"
msgstr "订阅简讯"
-#: judge/views/register.py:45
+#: judge/views/register.py:44
#, python-format
msgid "The email address \"%s\" is already taken. Only one registration is allowed per address."
msgstr "电子邮件地址“%s“已被使用。每个电子邮件地址只允许一个账户。"
-#: judge/views/register.py:51
+#: judge/views/register.py:50
msgid "Your email provider is not allowed due to history of abuse. Please use a reputable email provider."
msgstr "由于滥用历史,我们不允许您的电子邮件提供商。请使用有信誉的电子邮件提供商。"
-#: judge/views/register.py:57 judge/views/register.py:95
+#: judge/views/register.py:56 judge/views/register.py:94
msgid "Registration"
msgstr "注册"
-#: judge/views/register.py:106
+#: judge/views/register.py:105
msgid "Authentication failure"
msgstr "身份验证失败"
@@ -2921,7 +2969,7 @@ msgstr "身份验证失败"
msgid "Language statistics"
msgstr "语言统计信息"
-#: judge/views/status.py:24 templates/submission/list.html:311
+#: judge/views/status.py:24 templates/submission/list.html:310
msgid "Status"
msgstr "状态"
@@ -2929,74 +2977,74 @@ msgstr "状态"
msgid "Version matrix"
msgstr "版本矩阵"
-#: judge/views/submission.py:53 judge/views/submission.py:60
+#: judge/views/submission.py:55 judge/views/submission.py:62
#, python-format
msgid "Submission of %(problem)s by %(user)s"
msgstr "%(user)s 在 %(problem)s 的提交结果"
-#: judge/views/submission.py:203 judge/views/submission.py:204
+#: judge/views/submission.py:205 judge/views/submission.py:206
#: templates/problem/problem.html:127
msgid "All submissions"
msgstr "所有提交历史"
-#: judge/views/submission.py:349
+#: judge/views/submission.py:355
msgid "All my submissions"
msgstr "我提交的程序"
-#: judge/views/submission.py:350
+#: judge/views/submission.py:356
#, python-format
msgid "All submissions by %s"
msgstr "%s 的提交历史"
-#: judge/views/submission.py:381
+#: judge/views/submission.py:387
#, python-format
msgid "All submissions for %s"
msgstr "%s 的提交历史"
-#: judge/views/submission.py:400
+#: judge/views/submission.py:410
msgid "Must pass a problem"
msgstr "必须给予题目"
-#: judge/views/submission.py:439
+#: judge/views/submission.py:449
#, python-format
msgid "My submissions for %(problem)s"
msgstr "我对 %(problem)s 提交的程序"
-#: judge/views/submission.py:440
+#: judge/views/submission.py:450
#, python-format
msgid "%(user)s's submissions for %(problem)s"
msgstr "%(user)s 在 %(problem)s 的提交历史"
-#: judge/views/submission.py:536
+#: judge/views/submission.py:546
msgid "Must pass a contest"
msgstr "必须给予竞赛"
-#: judge/views/submission.py:544
+#: judge/views/submission.py:554
#, python-format
msgid "My submissions in %(contest)s"
msgstr "我在 %(contest)s 的提交"
-#: judge/views/submission.py:545
+#: judge/views/submission.py:555
#, python-format
msgid "%(user)s's submissions in %(contest)s"
msgstr "%(user)s 在 %(contest)s 的提交历史"
-#: judge/views/submission.py:559
+#: judge/views/submission.py:569
#, python-brace-format
msgid "My submissions in {0}"
msgstr "我在 {0}的提交"
-#: judge/views/submission.py:561
+#: judge/views/submission.py:571
#, python-brace-format
msgid "{0}'s submissions in {2}"
msgstr "{0}对{2}的提交"
-#: judge/views/submission.py:585
+#: judge/views/submission.py:597
#, python-brace-format
msgid "{0}'s submissions for {2} in {4}"
msgstr "{4} 中 {0} 在 {2} 的提交历史"
-#: judge/views/submission.py:590
+#: judge/views/submission.py:602
#, python-brace-format
msgid "{0}'s submissions for problem {2} in {3}"
msgstr "{0} 对 {3} 第 {2} 题提交的程序"
@@ -3013,40 +3061,40 @@ msgstr "问题说明"
msgid "You must solve at least one problem before you can create a ticket."
msgstr ""
-#: judge/views/ticket.py:87 judge/views/ticket.py:90
+#: judge/views/ticket.py:91 judge/views/ticket.py:94
#, python-format
msgid "New ticket for %s"
msgstr "新工单:%s"
-#: judge/views/ticket.py:144
+#: judge/views/ticket.py:148
#, python-format
msgid "%(title)s - Ticket %(id)d"
msgstr "%(title)s -工单 %(id)d"
-#: judge/views/ticket.py:249
+#: judge/views/ticket.py:253
#, python-format
msgid "Tickets - Page %(number)d of %(total)d"
msgstr "工单 - 第 %(number)d 页,共 %(total)d 页"
-#: judge/views/ticket.py:298
+#: judge/views/ticket.py:302
#, python-format
msgid "New Ticket: %s"
msgstr "新工单:%s"
-#: judge/views/ticket.py:299
+#: judge/views/ticket.py:303
#, python-format
msgid "#%(id)d, assigned to: %(users)s"
msgstr "#%(id)d, 分配给: %(users)s"
-#: judge/views/ticket.py:301
+#: judge/views/ticket.py:305
msgid ", "
msgstr ", "
-#: judge/views/ticket.py:301
+#: judge/views/ticket.py:305
msgid "no one"
msgstr "没人"
-#: judge/views/ticket.py:321
+#: judge/views/ticket.py:325
#, python-format
msgid "New Ticket Message For: %s"
msgstr "%s的新工单消息"
@@ -3055,87 +3103,91 @@ msgstr "%s的新工单消息"
msgid "Enable Two-factor Authentication"
msgstr "启用双因素身份认证"
-#: judge/views/two_factor.py:99
+#: judge/views/two_factor.py:108
+msgid "Refresh Two-factor Authentication"
+msgstr ""
+
+#: judge/views/two_factor.py:116
msgid "Disable Two-factor Authentication"
msgstr "禁用双因素身份认证"
-#: judge/views/two_factor.py:148
+#: judge/views/two_factor.py:165
msgid "Invalid WebAuthn response"
msgstr "WebAuthn回复无效"
-#: judge/views/two_factor.py:151
+#: judge/views/two_factor.py:168
msgid "Invalid name"
msgstr "名称无效"
-#: judge/views/two_factor.py:204
+#: judge/views/two_factor.py:221
msgid "Staff may not disable 2FA"
msgstr "员工不能禁用 2FA"
-#: judge/views/two_factor.py:216
+#: judge/views/two_factor.py:229
msgid "Perform Two-factor Authentication"
msgstr "执行双因素身份认证"
-#: judge/views/user.py:79
+#: judge/views/user.py:78
msgid "No such user"
msgstr "无该用户"
-#: judge/views/user.py:79
+#: judge/views/user.py:78
#, python-format
msgid "No user handle \"%s\"."
msgstr "无名为“%s“的用户"
-#: judge/views/user.py:83
+#: judge/views/user.py:82
msgid "My account"
msgstr "我的帐户"
-#: judge/views/user.py:84
+#: judge/views/user.py:83
#, python-format
msgid "User %s"
msgstr "用户 %s"
-#: judge/views/user.py:132
+#: judge/views/user.py:131
msgid "Login"
msgstr "登录"
-#: judge/views/user.py:173
+#: judge/views/user.py:172
msgid "M j, Y, G:i"
msgstr "Y年n月j日 G:i"
-#: judge/views/user.py:307
+#: judge/views/user.py:306
msgid "Preparing your data..."
msgstr "正在准备您的数据..."
-#: judge/views/user.py:311 templates/user/edit-profile.html:348
+#: judge/views/user.py:310 templates/user/edit-profile.html:352
msgid "Download your data"
msgstr "下载您的数据"
-#: judge/views/user.py:367
+#: judge/views/user.py:366
msgid "Updated on site"
msgstr "在网站上更新"
-#: judge/views/user.py:400 templates/admin/auth/user/change_form.html:14
+#: judge/views/user.py:399 templates/admin/auth/user/change_form.html:14
#: templates/admin/auth/user/change_form.html:17 templates/base.html:222
#: templates/user/user-tabs.html:16
msgid "Edit profile"
msgstr "编辑个人资料"
-#: judge/views/user.py:415
+#: judge/views/user.py:414
msgid "Generated API token for user"
msgstr "为用户生成 API 令牌"
-#: judge/views/user.py:427
+#: judge/views/user.py:426
msgid "Removed API token for user"
msgstr "为用户清除API令牌"
-#: judge/views/user.py:437
+#: judge/views/user.py:436
msgid "Generated scratch codes for user"
msgstr "为用户生成一次性代码"
-#: judge/views/user.py:443 templates/user/user-list-tabs.html:4
+#: judge/views/user.py:442 templates/user/user-list-tabs.html:4
msgid "Leaderboard"
msgstr "排行榜"
-#: judge/views/user.py:504
+#: judge/views/user.py:503
msgid "You have been successfully logged out."
msgstr ""
@@ -3264,11 +3316,11 @@ msgstr "新闻"
msgid "posted on {time}"
msgstr "贴在 {time}"
-#: templates/blog/list.html:130 templates/problem/problem.html:309
+#: templates/blog/list.html:130 templates/problem/problem.html:311
msgid "Clarifications"
msgstr "澄清"
-#: templates/blog/list.html:146 templates/problem/problem.html:320
+#: templates/blog/list.html:146 templates/problem/problem.html:322
msgid "No clarifications have been made at this time."
msgstr "目前还没有作出任何澄清。"
@@ -3464,7 +3516,7 @@ msgid "Info"
msgstr "资料和信息"
#: templates/contest/contest-tabs.html:6 templates/stats/base.html:9
-#: templates/submission/list.html:337
+#: templates/submission/list.html:336
msgid "Statistics"
msgstr "统计数据"
@@ -3667,19 +3719,19 @@ msgstr "取消取消资格"
msgid "Disqualify"
msgstr "取消资格"
-#: templates/contest/ranking.html:169
+#: templates/contest/ranking.html:173
msgid "Are you sure you want to disqualify this participation?"
msgstr "您确定要取消此参与资格吗?"
-#: templates/contest/ranking.html:174
+#: templates/contest/ranking.html:178
msgid "Are you sure you want to un-disqualify this participation?"
msgstr "您确定要取消取消此参与资格吗?"
-#: templates/contest/ranking.html:246
+#: templates/contest/ranking.html:250
msgid "View user participation"
msgstr "查看用户参与历史"
-#: templates/contest/ranking.html:250
+#: templates/contest/ranking.html:254
msgid "Show organizations"
msgstr "显示机构"
@@ -3955,7 +4007,7 @@ msgstr "保存"
msgid "Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence."
msgstr "记住只在没有思路时使用题解,不要从它复制粘贴代码。请尊重题目和题解的作者。
在解题之前提交题解的代码会导致封禁。"
-#: templates/problem/editorial.html:27 templates/problem/problem.html:209
+#: templates/problem/editorial.html:27 templates/problem/problem.html:210
msgid "Author:"
msgid_plural "Authors:"
msgstr[0] "作者:"
@@ -4120,34 +4172,34 @@ msgstr "时间限制:"
msgid "Memory limit:"
msgstr "内存限制:"
-#: templates/problem/problem.html:224
+#: templates/problem/problem.html:226
msgid "Problem type"
msgid_plural "Problem types"
msgstr[0] "题目类型"
-#: templates/problem/problem.html:237
+#: templates/problem/problem.html:239
msgid "Allowed languages"
msgstr "允许的语言"
-#: templates/problem/problem.html:245
+#: templates/problem/problem.html:247
#, python-format
msgid "No %(lang)s judge online"
msgstr "没有支持 %(lang)s 的裁判服务器。"
-#: templates/problem/problem.html:256
+#: templates/problem/problem.html:258
msgid "Judge:"
msgid_plural "Judges:"
msgstr[0] "裁判服务器"
-#: templates/problem/problem.html:273
+#: templates/problem/problem.html:275
msgid "none available"
msgstr "无可用项"
-#: templates/problem/problem.html:298
+#: templates/problem/problem.html:300
msgid "Request clarification"
msgstr "提出问题"
-#: templates/problem/problem.html:300
+#: templates/problem/problem.html:302
msgid "Report an issue"
msgstr "反馈问题"
@@ -4192,7 +4244,7 @@ msgstr "题目类型"
msgid "Point range"
msgstr "分数范围"
-#: templates/problem/search-form.html:63 templates/submission/list.html:329
+#: templates/problem/search-form.html:63 templates/submission/list.html:328
#: templates/ticket/list.html:248
msgid "Go"
msgstr "搜索"
@@ -4238,7 +4290,7 @@ msgid "Invalid username or password."
msgstr "无效的用户名或密码!"
#: templates/registration/login.html:53
-#: templates/registration/two_factor_auth.html:86
+#: templates/registration/two_factor_auth.html:92
msgid "Login!"
msgstr "登录!"
@@ -4360,12 +4412,12 @@ msgid "Default language"
msgstr "默认语言"
#: templates/registration/registration_form.html:184
-#: templates/user/edit-profile.html:310
+#: templates/user/edit-profile.html:314
msgid "Affiliated organizations"
msgstr "关联的组织"
#: templates/registration/registration_form.html:190
-#: templates/user/edit-profile.html:324
+#: templates/user/edit-profile.html:328
msgid "Notify me about upcoming contests"
msgstr "通过Email发送未来竞赛的通知"
@@ -4381,57 +4433,93 @@ msgstr "使用条款"
msgid "Register!"
msgstr "注册!"
-#: templates/registration/totp_disable.html:38
+#: templates/registration/totp_disable.html:31
msgid "To protect your account, you must first authenticate before you can disable Two Factor Authentication."
msgstr "为了保护您的帐户,您必须先进行身份验证才能禁用两因素认证。"
-#: templates/registration/totp_disable.html:45
+#: templates/registration/totp_disable.html:38
msgid "Enter the 6-digit code generated by your app or one of your 16-digit scratch codes:"
msgstr "输入您应用生成的6位数代码或者一个16位一次性代码:"
-#: templates/registration/totp_disable.html:48
+#: templates/registration/totp_disable.html:41
msgid "Disable Two Factor Authentication"
msgstr "禁用两因素认证。"
-#: templates/registration/totp_enable.html:75
+#: templates/registration/totp_enable.html:72
msgid "Scan this code with your authenticator app:"
msgstr "使用身份验证应用扫描这个二维码"
-#: templates/registration/totp_enable.html:76
+#: templates/registration/totp_enable.html:73
msgid "QR code"
msgstr "二维码"
-#: templates/registration/totp_enable.html:77
+#: templates/registration/totp_enable.html:74
msgid "Or enter this code manually:"
msgstr "或者手动输入此代码:"
-#: templates/registration/totp_enable.html:88
+#: templates/registration/totp_enable.html:85
msgid "Enter the 6-digit code generated by your app:"
msgstr "输入您应用生成的6位数代码:"
-#: templates/registration/totp_enable.html:91
+#: templates/registration/totp_enable.html:90
+msgid "Refresh Two Factor Authentication"
+msgstr ""
+
+#: templates/registration/totp_enable.html:92
msgid "Enable Two Factor Authentication"
msgstr "启用两因素认证"
+#: templates/registration/totp_enable.html:98
+msgid "Below is a list of one-time use scratch codes."
+msgstr ""
+
+#: templates/registration/totp_enable.html:99
+msgid "These codes can only be used once and are for emergency use."
+msgstr ""
+
+#: templates/registration/totp_enable.html:100
+msgid "You can use these codes to login to your account or disable two-factor authentication."
+msgstr ""
+
+#: templates/registration/totp_enable.html:101
+msgid "If you ever need more scratch codes, you can regenerate them on the edit profile tab."
+msgstr ""
+
+#: templates/registration/totp_enable.html:102
+msgid "Please write these down and keep them in a secure location."
+msgstr ""
+
+#: templates/registration/totp_enable.html:103
+msgid "These codes will never be shown again after you enable two-factor authentication."
+msgstr ""
+
#: templates/registration/two_factor_auth.html:33
-#: templates/user/edit-profile.html:161
+#: templates/user/edit-profile.html:165
msgid "WebAuthn is not supported by your browser."
msgstr "你的浏览器不支持 WebAuthn。"
#: templates/registration/two_factor_auth.html:54
-#: templates/user/edit-profile.html:185
+#: templates/user/edit-profile.html:189
msgid "Failed to contact server."
msgstr "联系服务器失败。"
-#: templates/registration/two_factor_auth.html:77
+#: templates/registration/two_factor_auth.html:79
msgid "Enter the 6-digit code generated by your app or one of your 16-character scratch codes:"
msgstr "输入您应用生成的6位数代码或者一个16位一次性代码:"
-#: templates/registration/two_factor_auth.html:83
+#: templates/registration/two_factor_auth.html:81
+msgid "Enter one of your 16-character scratch codes:"
+msgstr ""
+
+#: templates/registration/two_factor_auth.html:89
msgid "Use security key"
msgstr "使用安全密钥"
-#: templates/registration/two_factor_auth.html:89
+#: templates/registration/two_factor_auth.html:94
+msgid "Use scratch code"
+msgstr ""
+
+#: templates/registration/two_factor_auth.html:97
#, python-format
msgid "If you lost your authentication device and are unable to use your scratch codes, please contact us at %(email)s."
msgstr "如果您丢失了您的身份验证设备且无法使用您的验证码,请联系我们 %(email)s。"
@@ -4512,15 +4600,15 @@ msgstr "按状态过滤"
msgid "Filter by language..."
msgstr "按语言筛选......"
-#: templates/submission/list.html:307
+#: templates/submission/list.html:306
msgid "Filter submissions"
msgstr "提交筛选"
-#: templates/submission/list.html:343
+#: templates/submission/list.html:342
msgid "Total:"
msgstr "总计:"
-#: templates/submission/list.html:353
+#: templates/submission/list.html:352
msgid "You were disconnected. Refresh to show latest updates."
msgstr "您处于离线状态。刷新以显示最近的更新。"
@@ -4735,121 +4823,125 @@ msgstr "排名"
msgid "Search by handle..."
msgstr "用户名搜索…"
-#: templates/user/edit-profile.html:109
+#: templates/user/edit-profile.html:113
msgid "Are you sure you want to generate or regenerate your API token?"
msgstr "您确定要生成或重新生成您的API令牌吗?"
-#: templates/user/edit-profile.html:110
+#: templates/user/edit-profile.html:114
msgid "This will invalidate any previous API tokens."
msgstr "这将使任何之前的 API 令牌无效。"
-#: templates/user/edit-profile.html:111
+#: templates/user/edit-profile.html:115
msgid "It also allows access to your account without Two-factor Authentication."
msgstr "它还允许不需要双重身份验证而访问您的帐户。"
-#: templates/user/edit-profile.html:112
+#: templates/user/edit-profile.html:116
msgid "You will not be able to view your api token after you leave this page!"
msgstr "离开此页面后,您将无法查看您的API令牌!"
-#: templates/user/edit-profile.html:113 templates/user/edit-profile.html:207
+#: templates/user/edit-profile.html:117 templates/user/edit-profile.html:211
msgid "Generating..."
msgstr "正在生成…"
-#: templates/user/edit-profile.html:121 templates/user/edit-profile.html:243
-#: templates/user/edit-profile.html:371 templates/user/edit-profile.html:390
+#: templates/user/edit-profile.html:125 templates/user/edit-profile.html:247
+#: templates/user/edit-profile.html:373 templates/user/edit-profile.html:395
msgid "Regenerate"
msgstr "重新生成"
-#: templates/user/edit-profile.html:127 templates/user/edit-profile.html:392
+#: templates/user/edit-profile.html:131 templates/user/edit-profile.html:397
msgid "Remove"
msgstr "删除"
-#: templates/user/edit-profile.html:137
+#: templates/user/edit-profile.html:141
msgid "Are you sure you want to remove your API token?"
msgstr "您确定要删除您的API令牌吗?"
-#: templates/user/edit-profile.html:144 templates/user/edit-profile.html:375
-#: templates/user/edit-profile.html:396
+#: templates/user/edit-profile.html:148 templates/user/edit-profile.html:377
+#: templates/user/edit-profile.html:401
msgid "Generate"
msgstr "生成"
-#: templates/user/edit-profile.html:190
+#: templates/user/edit-profile.html:194
msgid "Are you sure you want to delete this security key?"
msgstr "您确定要删除此安全密钥吗?"
-#: templates/user/edit-profile.html:280
+#: templates/user/edit-profile.html:284
msgid "Self-description"
msgstr "自我描述"
-#: templates/user/edit-profile.html:287
+#: templates/user/edit-profile.html:291
msgid "Select your closest major city"
msgstr "选择离您最近的主要城市"
-#: templates/user/edit-profile.html:296
+#: templates/user/edit-profile.html:300
msgid "Editor theme"
msgstr "编辑主题"
-#: templates/user/edit-profile.html:301
+#: templates/user/edit-profile.html:305
msgid "Math engine"
msgstr "数学引擎"
-#: templates/user/edit-profile.html:335 templates/user/edit-profile.html:337
+#: templates/user/edit-profile.html:339 templates/user/edit-profile.html:341
msgid "Change your avatar"
msgstr "修改头像"
-#: templates/user/edit-profile.html:342
+#: templates/user/edit-profile.html:346
msgid "Change your password"
msgstr "更改密码"
-#: templates/user/edit-profile.html:356
+#: templates/user/edit-profile.html:359
msgid "Two-factor Authentication is enabled"
msgstr "已激活双元素认证"
-#: templates/user/edit-profile.html:358
-msgid "Two-factor Authentication is disabled"
-msgstr "已禁用双元素认证"
-
-#: templates/user/edit-profile.html:363 templates/user/edit-profile.html:365
+#: templates/user/edit-profile.html:362 templates/user/edit-profile.html:365
msgid "Disable"
msgstr "禁用"
-#: templates/user/edit-profile.html:368
+#: templates/user/edit-profile.html:367
+msgid "Refresh"
+msgstr "刷新"
+
+#: templates/user/edit-profile.html:370
msgid "Scratch Codes:"
msgstr "一次性代码:"
-#: templates/user/edit-profile.html:372 templates/user/edit-profile.html:393
+#: templates/user/edit-profile.html:374 templates/user/edit-profile.html:398
msgid "Hidden"
msgstr "隐藏"
-#: templates/user/edit-profile.html:381
+#: templates/user/edit-profile.html:384
+msgid "Two-factor Authentication is disabled"
+msgstr "已禁用双元素认证"
+
+#: templates/user/edit-profile.html:385
msgid "Enable"
msgstr "启用"
-#: templates/user/edit-profile.html:387
+#: templates/user/edit-profile.html:392
msgid "API Token"
msgstr "API令牌"
-#: templates/user/edit-profile.html:404
+#: templates/user/edit-profile.html:409
msgid "Security keys"
msgstr "安全密钥"
-#: templates/user/edit-profile.html:414
+#: templates/user/edit-profile.html:419
msgid "Delete"
msgstr "删除"
-#: templates/user/edit-profile.html:421
+#: templates/user/edit-profile.html:426
msgid "Enter a name for this key"
msgstr "输入此密钥的名称"
-#: templates/user/edit-profile.html:422
+#: templates/user/edit-profile.html:427
msgid "Add"
msgstr "添加"
-#: templates/user/edit-profile.html:430
+#: templates/user/edit-profile.html:435
msgid "User-script"
msgstr "用户脚本"
-#: templates/user/edit-profile.html:434
+#: templates/user/edit-profile.html:439
msgid "Update profile"
msgstr "更新资料"
diff --git a/locale/zh_Hans/LC_MESSAGES/djangojs.po b/locale/zh_Hans/LC_MESSAGES/djangojs.po
index 963fb77b5b..1991925989 100644
--- a/locale/zh_Hans/LC_MESSAGES/djangojs.po
+++ b/locale/zh_Hans/LC_MESSAGES/djangojs.po
@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: dmoj\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-10-01 23:12+0000\n"
-"PO-Revision-Date: 2021-04-25 00:08\n"
+"PO-Revision-Date: 2021-07-07 00:27\n"
"Last-Translator: \n"
"Language-Team: Chinese Simplified\n"
"Language: zh_CN\n"
diff --git a/locale/zh_Hant/LC_MESSAGES/django.po b/locale/zh_Hant/LC_MESSAGES/django.po
index 90cc35b790..8970ece69e 100644
--- a/locale/zh_Hant/LC_MESSAGES/django.po
+++ b/locale/zh_Hant/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: dmoj\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-24 19:15+0000\n"
-"PO-Revision-Date: 2021-04-25 00:08\n"
+"POT-Creation-Date: 2021-06-17 01:38+0000\n"
+"PO-Revision-Date: 2021-07-07 00:27\n"
"Last-Translator: \n"
"Language-Team: Chinese Traditional\n"
"Language: zh_TW\n"
@@ -17,75 +17,75 @@ msgstr ""
"X-Crowdin-File: django.po\n"
"X-Crowdin-File-ID: 10\n"
-#: dmoj/settings.py:364
+#: dmoj/settings.py:365
msgid "Catalan"
msgstr "加泰隆語"
-#: dmoj/settings.py:365
+#: dmoj/settings.py:366
msgid "German"
msgstr "德文"
-#: dmoj/settings.py:366
+#: dmoj/settings.py:367
msgid "English"
msgstr "英文"
-#: dmoj/settings.py:367
+#: dmoj/settings.py:368
msgid "Spanish"
msgstr "西班牙文"
-#: dmoj/settings.py:368
+#: dmoj/settings.py:369
msgid "French"
msgstr "法文"
-#: dmoj/settings.py:369
+#: dmoj/settings.py:370
msgid "Croatian"
msgstr "克羅地亞文"
-#: dmoj/settings.py:370
+#: dmoj/settings.py:371
msgid "Hungarian"
msgstr "匈牙利文"
-#: dmoj/settings.py:371
+#: dmoj/settings.py:372
msgid "Japanese"
msgstr "日語"
-#: dmoj/settings.py:372
+#: dmoj/settings.py:373
msgid "Korean"
msgstr "韓文"
-#: dmoj/settings.py:373
+#: dmoj/settings.py:374
msgid "Brazilian Portuguese"
msgstr "巴西葡萄牙語"
-#: dmoj/settings.py:374
+#: dmoj/settings.py:375
msgid "Romanian"
msgstr "羅馬尼亞文"
-#: dmoj/settings.py:375
+#: dmoj/settings.py:376
msgid "Russian"
msgstr "俄文"
-#: dmoj/settings.py:376
+#: dmoj/settings.py:377
msgid "Serbian (Latin)"
msgstr "塞爾維亞文 (拉丁語系)"
-#: dmoj/settings.py:377
+#: dmoj/settings.py:378
msgid "Turkish"
msgstr "土耳其文"
-#: dmoj/settings.py:378
+#: dmoj/settings.py:379
msgid "Vietnamese"
msgstr "越南文"
-#: dmoj/settings.py:379
+#: dmoj/settings.py:380
msgid "Simplified Chinese"
msgstr "簡體中文"
-#: dmoj/settings.py:380
+#: dmoj/settings.py:381
msgid "Traditional Chinese"
msgstr "繁体中文"
-#: dmoj/urls.py:103 templates/base.html:190
+#: dmoj/urls.py:104 templates/base.html:190
msgid "Home"
msgstr "首頁"
@@ -113,106 +113,106 @@ msgstr "取消隱藏回應"
msgid "Associated page"
msgstr "關聯頁"
-#: judge/admin/contest.py:31
+#: judge/admin/contest.py:32
msgid "Included contests"
msgstr "帶標籤的競賽"
-#: judge/admin/contest.py:65 templates/contest/contest.html:83
+#: judge/admin/contest.py:66 templates/contest/contest.html:83
#: templates/contest/moss.html:43 templates/problem/list.html:204
#: templates/problem/list.html:219 templates/user/user-problems.html:58
#: templates/user/user-problems.html:100
msgid "Problem"
msgstr "題目"
-#: judge/admin/contest.py:114
+#: judge/admin/contest.py:117
msgid "Settings"
msgstr "设置"
-#: judge/admin/contest.py:116
+#: judge/admin/contest.py:120
msgid "Scheduling"
msgstr "排程"
-#: judge/admin/contest.py:117
+#: judge/admin/contest.py:121
msgid "Details"
msgstr "詳細資訊"
-#: judge/admin/contest.py:118
+#: judge/admin/contest.py:122
msgid "Format"
msgstr "格式"
-#: judge/admin/contest.py:119 templates/contest/ranking-table.html:5
+#: judge/admin/contest.py:123 templates/contest/ranking-table.html:5
msgid "Rating"
msgstr "評分"
-#: judge/admin/contest.py:120
+#: judge/admin/contest.py:124
msgid "Access"
msgstr "权限"
-#: judge/admin/contest.py:122 judge/admin/problem.py:134
+#: judge/admin/contest.py:126 judge/admin/problem.py:135
msgid "Justice"
msgstr "司法"
-#: judge/admin/contest.py:211
+#: judge/admin/contest.py:215
#, python-format
msgid "%d contest successfully marked as visible."
msgid_plural "%d contests successfully marked as visible."
msgstr[0] "%d個競賽已成功公開。"
-#: judge/admin/contest.py:214
+#: judge/admin/contest.py:218
msgid "Mark contests as visible"
msgstr "標記競賽為可見"
-#: judge/admin/contest.py:220
+#: judge/admin/contest.py:224
#, python-format
msgid "%d contest successfully marked as hidden."
msgid_plural "%d contests successfully marked as hidden."
msgstr[0] "%d個競賽已成功隱藏。"
-#: judge/admin/contest.py:223
+#: judge/admin/contest.py:227
msgid "Mark contests as hidden"
msgstr "標記競賽為隐藏"
-#: judge/admin/contest.py:229
+#: judge/admin/contest.py:233
#, python-format
msgid "%d contest successfully locked."
msgid_plural "%d contests successfully locked."
msgstr[0] "%d個競賽鎖定成功"
-#: judge/admin/contest.py:232
+#: judge/admin/contest.py:236
msgid "Lock contest submissions"
msgstr "鎖定競賽提交"
-#: judge/admin/contest.py:238
+#: judge/admin/contest.py:242
#, python-format
msgid "%d contest successfully unlocked."
msgid_plural "%d contests successfully unlocked."
msgstr[0] ""
-#: judge/admin/contest.py:241
+#: judge/admin/contest.py:245
msgid "Unlock contest submissions"
msgstr ""
-#: judge/admin/contest.py:262 judge/admin/submission.py:170
+#: judge/admin/contest.py:266 judge/admin/submission.py:170
#, python-format
msgid "%d submission was successfully scheduled for rejudging."
msgid_plural "%d submissions were successfully scheduled for rejudging."
msgstr[0] "%d 筆提交紀錄已被計畫重新評分"
-#: judge/admin/contest.py:337
+#: judge/admin/contest.py:341
#, python-format
msgid "%d participation recalculated."
msgid_plural "%d participations recalculated."
msgstr[0] "%d位選手的分數被重判了"
-#: judge/admin/contest.py:340
+#: judge/admin/contest.py:344
msgid "Recalculate results"
msgstr ""
-#: judge/admin/contest.py:344 judge/admin/organization.py:63
+#: judge/admin/contest.py:348 judge/admin/organization.py:63
msgid "username"
msgstr "使用者名稱"
-#: judge/admin/contest.py:349 templates/base.html:258
+#: judge/admin/contest.py:353 templates/base.html:258
msgid "virtual"
msgstr "模擬競賽"
@@ -228,9 +228,9 @@ msgstr "内容"
msgid "Summary"
msgstr "概要"
-#: judge/admin/interface.py:113 judge/models/contest.py:383
-#: judge/models/contest.py:509 judge/models/profile.py:244
-#: judge/models/profile.py:268
+#: judge/admin/interface.py:113 judge/models/contest.py:419
+#: judge/models/contest.py:546 judge/models/profile.py:261
+#: judge/models/profile.py:292
msgid "user"
msgstr "使用者"
@@ -238,8 +238,8 @@ msgstr "使用者"
msgid "object"
msgstr "对象"
-#: judge/admin/organization.py:32 judge/admin/problem.py:181
-#: judge/admin/profile.py:82
+#: judge/admin/organization.py:32 judge/admin/problem.py:182
+#: judge/admin/profile.py:92
msgid "View on site"
msgstr ""
@@ -247,66 +247,66 @@ msgstr ""
msgid "Describe the changes you made (optional)"
msgstr "解釋你所做的改變(可選)"
-#: judge/admin/problem.py:129
+#: judge/admin/problem.py:130
msgid "Social Media"
msgstr "社交媒體"
-#: judge/admin/problem.py:130
+#: judge/admin/problem.py:131
msgid "Taxonomy"
msgstr ""
-#: judge/admin/problem.py:131 templates/contest/contest.html:84
+#: judge/admin/problem.py:132 templates/contest/contest.html:84
#: templates/problem/data.html:385 templates/problem/list.html:209
#: templates/problem/list.html:230 templates/user/base-users-table.html:10
#: templates/user/user-problems.html:60
msgid "Points"
msgstr "分數"
-#: judge/admin/problem.py:132
+#: judge/admin/problem.py:133
msgid "Limits"
msgstr "限制"
-#: judge/admin/problem.py:133 judge/admin/submission.py:238
-#: templates/stats/base.html:14 templates/submission/list.html:320
-#: templates/user/edit-profile.html:292
+#: judge/admin/problem.py:134 judge/admin/submission.py:238
+#: templates/stats/base.html:14 templates/submission/list.html:319
+#: templates/user/edit-profile.html:296
msgid "Language"
msgstr "語言"
-#: judge/admin/problem.py:135
+#: judge/admin/problem.py:136
msgid "History"
msgstr "歷史記錄"
-#: judge/admin/problem.py:178
+#: judge/admin/problem.py:179
msgid "Authors"
msgstr "作者"
-#: judge/admin/problem.py:191
+#: judge/admin/problem.py:192
#, python-format
msgid "%d problem's publish date successfully updated."
msgid_plural "%d problems' publish date successfully updated."
msgstr[0] "%d個問題的發布日期被成功更新"
-#: judge/admin/problem.py:195
+#: judge/admin/problem.py:196
msgid "Set publish date to now"
msgstr "把上傳日期變成今天"
-#: judge/admin/problem.py:201
+#: judge/admin/problem.py:202
#, python-format
msgid "%d problem successfully marked as public."
msgid_plural "%d problems successfully marked as public."
msgstr[0] ""
-#: judge/admin/problem.py:205
+#: judge/admin/problem.py:206
msgid "Mark problems as public"
msgstr "把問題設置成公開的"
-#: judge/admin/problem.py:211
+#: judge/admin/problem.py:212
#, python-format
msgid "%d problem successfully marked as private."
msgid_plural "%d problems successfully marked as private."
msgstr[0] ""
-#: judge/admin/problem.py:215
+#: judge/admin/problem.py:216
msgid "Mark problems as private"
msgstr "把問題應藏"
@@ -314,34 +314,34 @@ msgstr "把問題應藏"
msgid "timezone"
msgstr "時區"
-#: judge/admin/profile.py:88 judge/admin/submission.py:217
+#: judge/admin/profile.py:98 judge/admin/submission.py:217
#: templates/organization/requests/log.html:9
#: templates/organization/requests/pending.html:12
#: templates/ticket/list.html:261
msgid "User"
msgstr "使用者"
-#: judge/admin/profile.py:93 templates/registration/registration_form.html:143
+#: judge/admin/profile.py:103 templates/registration/registration_form.html:143
msgid "Email"
msgstr "電子郵件"
-#: judge/admin/profile.py:98 judge/views/register.py:29
+#: judge/admin/profile.py:108 judge/views/register.py:28
#: templates/registration/registration_form.html:171
-#: templates/user/edit-profile.html:288
+#: templates/user/edit-profile.html:292
msgid "Timezone"
msgstr "時區"
-#: judge/admin/profile.py:103
+#: judge/admin/profile.py:113
msgid "date joined"
msgstr ""
-#: judge/admin/profile.py:110
+#: judge/admin/profile.py:120
#, python-format
msgid "%d user have scores recalculated."
msgid_plural "%d users have scores recalculated."
msgstr[0] "%d個用戶的分數被重判了"
-#: judge/admin/profile.py:113
+#: judge/admin/profile.py:123
msgid "Recalculate scores"
msgstr ""
@@ -493,115 +493,116 @@ msgstr "國際信息學奧林匹克競賽"
msgid "IOI (pre-2016)"
msgstr ""
-#: judge/forms.py:26
-msgid "Two-factor authentication tokens must be 6 decimal digits."
+#: judge/forms.py:27
+#, python-brace-format
+msgid "Two-factor authentication tokens must be {TOTP_CODE_LENGTH} decimal digits."
msgstr ""
-#: judge/forms.py:29
+#: judge/forms.py:30
msgid "Invalid two-factor authentication token."
msgstr ""
-#: judge/forms.py:32
+#: judge/forms.py:33
msgid "Scratch codes must be 16 base32 characters."
msgstr ""
-#: judge/forms.py:34
+#: judge/forms.py:35 judge/forms.py:264
msgid "Invalid scratch code."
msgstr ""
-#: judge/forms.py:45
+#: judge/forms.py:46
msgid "Subscribe to contest updates"
msgstr ""
-#: judge/forms.py:46
+#: judge/forms.py:47
msgid "Enable experimental features"
msgstr ""
-#: judge/forms.py:71
+#: judge/forms.py:72
msgid "You must solve at least one problem before you can update your profile."
msgstr ""
-#: judge/forms.py:80 judge/views/organization.py:127
+#: judge/forms.py:81 judge/views/organization.py:126
#, python-brace-format
msgid "You may not be part of more than {count} public organizations."
msgstr "您不可以同時在多餘{count}的公共組織"
-#: judge/forms.py:96
+#: judge/forms.py:97
msgid "Download comments?"
msgstr "下載評論?"
-#: judge/forms.py:97
+#: judge/forms.py:98
msgid "Download submissions?"
msgstr "下載提交紀錄?"
-#: judge/forms.py:98
+#: judge/forms.py:99
msgid "Filter by problem code glob:"
msgstr ""
-#: judge/forms.py:102
+#: judge/forms.py:103
msgid "Leave empty to include all submissions"
msgstr ""
-#: judge/forms.py:105 templates/problem/manage_submission.html:142
+#: judge/forms.py:106 templates/problem/manage_submission.html:142
msgid "Filter by result:"
msgstr ""
-#: judge/forms.py:111
+#: judge/forms.py:112
msgid "Please select at least one thing to download."
msgstr ""
-#: judge/forms.py:137
+#: judge/forms.py:138
msgid "Any judge"
msgstr ""
-#: judge/forms.py:167 judge/views/register.py:26
+#: judge/forms.py:159 judge/views/register.py:25
#: templates/registration/registration_form.html:137
#: templates/user/base-users-table.html:5
msgid "Username"
msgstr "使用者名稱"
-#: judge/forms.py:168 templates/registration/registration_form.html:149
+#: judge/forms.py:160 templates/registration/registration_form.html:149
#: templates/registration/registration_form.html:163
msgid "Password"
msgstr "密碼"
-#: judge/forms.py:201
+#: judge/forms.py:192
msgid "Invalid code length."
msgstr ""
-#: judge/forms.py:219
+#: judge/forms.py:223
msgid "Invalid WebAuthn response."
msgstr ""
-#: judge/forms.py:222
+#: judge/forms.py:226
msgid "No WebAuthn challenge issued."
msgstr ""
-#: judge/forms.py:228
+#: judge/forms.py:232
msgid "Invalid WebAuthn credential ID."
msgstr ""
-#: judge/forms.py:257
+#: judge/forms.py:262
msgid "Invalid two-factor authentication token or scratch code."
msgstr ""
-#: judge/forms.py:259
+#: judge/forms.py:266
msgid "Must specify either totp_token or webauthn_response."
msgstr ""
-#: judge/forms.py:263 judge/models/problem.py:105
+#: judge/forms.py:270 judge/models/problem.py:119
msgid "Problem code must be ^[a-z0-9]+$"
msgstr ""
-#: judge/forms.py:268
+#: judge/forms.py:275
msgid "Problem with code already exists."
msgstr ""
-#: judge/forms.py:273 judge/models/contest.py:66
+#: judge/forms.py:280 judge/models/contest.py:66
msgid "Contest id must be ^[a-z0-9]+$"
msgstr ""
-#: judge/forms.py:278
+#: judge/forms.py:285
msgid "Contest with key already exists."
msgstr ""
@@ -681,7 +682,7 @@ msgid "comments"
msgstr "評論"
#: judge/models/comment.py:89 judge/models/comment.py:141
-#: judge/models/problem.py:484
+#: judge/models/problem.py:511
#, python-format
msgid "Editorial for %s"
msgstr ""
@@ -722,7 +723,7 @@ msgstr ""
msgid "contest tag"
msgstr "禁賽標籤"
-#: judge/models/contest.py:53 judge/models/contest.py:117
+#: judge/models/contest.py:53 judge/models/contest.py:126
msgid "contest tags"
msgstr ""
@@ -747,410 +748,426 @@ msgid "contest name"
msgstr ""
#: judge/models/contest.py:68
-msgid "These people will be able to edit the contest."
-msgstr "這些人將有權更改競賽"
+msgid "These users will be able to edit the contest."
+msgstr ""
-#: judge/models/contest.py:70 judge/models/runtime.py:136
+#: judge/models/contest.py:70
+msgid "These users will be able to edit the contest, but will not be listed as authors."
+msgstr ""
+
+#: judge/models/contest.py:73
+msgid "These users will be able to view the contest, but not edit it."
+msgstr ""
+
+#: judge/models/contest.py:76 judge/models/runtime.py:136
msgid "description"
msgstr ""
-#: judge/models/contest.py:71 judge/models/problem.py:431
+#: judge/models/contest.py:77 judge/models/problem.py:458
#: judge/models/runtime.py:138
msgid "problems"
msgstr "題目"
-#: judge/models/contest.py:72 judge/models/contest.py:384
+#: judge/models/contest.py:78 judge/models/contest.py:420
msgid "start time"
msgstr "開始時間"
-#: judge/models/contest.py:73
+#: judge/models/contest.py:79
msgid "end time"
msgstr "結束時間"
-#: judge/models/contest.py:74 judge/models/problem.py:126
-#: judge/models/problem.py:455
+#: judge/models/contest.py:80 judge/models/problem.py:140
+#: judge/models/problem.py:482
msgid "time limit"
msgstr "時間限制"
-#: judge/models/contest.py:75 judge/models/problem.py:144
+#: judge/models/contest.py:81 judge/models/problem.py:158
msgid "publicly visible"
msgstr ""
-#: judge/models/contest.py:76
+#: judge/models/contest.py:82
msgid "Should be set even for organization-private contests, where it determines whether the contest is visible to members of the specified organizations."
msgstr "組織內競賽也需公開,否則責組織成員無法查看本競賽。"
-#: judge/models/contest.py:79
+#: judge/models/contest.py:85
msgid "contest rated"
msgstr "次競賽會被評判"
-#: judge/models/contest.py:79
+#: judge/models/contest.py:85
msgid "Whether this contest can be rated."
msgstr ""
-#: judge/models/contest.py:81
+#: judge/models/contest.py:87
msgid "view contest scoreboard"
msgstr "查看競賽排行榜"
-#: judge/models/contest.py:83
+#: judge/models/contest.py:89
msgid "These users will be able to view the scoreboard."
msgstr "這些用戶可以看排行榜"
-#: judge/models/contest.py:84
+#: judge/models/contest.py:90
msgid "scoreboard visibility"
msgstr ""
-#: judge/models/contest.py:85
+#: judge/models/contest.py:91
msgid "Scoreboard visibility through the duration of the contest"
msgstr ""
-#: judge/models/contest.py:87
+#: judge/models/contest.py:93
msgid "no comments"
msgstr ""
-#: judge/models/contest.py:88
+#: judge/models/contest.py:94
msgid "Use clarification system instead of comments."
msgstr ""
-#: judge/models/contest.py:90
+#: judge/models/contest.py:96
msgid "Rating floor for contest"
msgstr ""
-#: judge/models/contest.py:92
+#: judge/models/contest.py:98
msgid "Rating ceiling for contest"
msgstr ""
-#: judge/models/contest.py:94
+#: judge/models/contest.py:100
msgid "rate all"
msgstr ""
-#: judge/models/contest.py:94
+#: judge/models/contest.py:100
msgid "Rate all users who joined."
msgstr ""
-#: judge/models/contest.py:95
+#: judge/models/contest.py:101
msgid "exclude from ratings"
msgstr ""
-#: judge/models/contest.py:97
+#: judge/models/contest.py:103
msgid "private to specific users"
msgstr ""
-#: judge/models/contest.py:98
+#: judge/models/contest.py:104
msgid "private contestants"
msgstr ""
-#: judge/models/contest.py:99
+#: judge/models/contest.py:105
msgid "If private, only these users may see the contest"
msgstr ""
-#: judge/models/contest.py:101
+#: judge/models/contest.py:107
msgid "hide problem tags"
msgstr ""
-#: judge/models/contest.py:102
+#: judge/models/contest.py:108
msgid "Whether problem tags should be hidden by default."
msgstr ""
-#: judge/models/contest.py:104
+#: judge/models/contest.py:110
+msgid "hide problem authors"
+msgstr ""
+
+#: judge/models/contest.py:111
+msgid "Whether problem authors should be hidden by default."
+msgstr ""
+
+#: judge/models/contest.py:113
msgid "run pretests only"
msgstr ""
-#: judge/models/contest.py:105
+#: judge/models/contest.py:114
msgid "Whether judges should grade pretests only, versus all testcases. Commonly set during a contest, then unset prior to rejudging user submissions when the contest ends."
msgstr "設置裁判服務器是否只運行預測試而不是所有測試。通常在競賽進行時啟動,然後在競賽結束後重新評分前關閉。"
-#: judge/models/contest.py:109 judge/models/problem.py:166
+#: judge/models/contest.py:118 judge/models/problem.py:183
msgid "private to organizations"
msgstr ""
-#: judge/models/contest.py:110 judge/models/problem.py:164
-#: judge/models/profile.py:83
+#: judge/models/contest.py:119 judge/models/problem.py:181
+#: judge/models/profile.py:86
msgid "organizations"
msgstr ""
-#: judge/models/contest.py:111
+#: judge/models/contest.py:120
msgid "If private, only these organizations may see the contest"
msgstr ""
-#: judge/models/contest.py:112 judge/models/problem.py:153
+#: judge/models/contest.py:121 judge/models/problem.py:167
msgid "OpenGraph image"
msgstr ""
-#: judge/models/contest.py:113 judge/models/profile.py:54
+#: judge/models/contest.py:122 judge/models/profile.py:57
msgid "Logo override image"
msgstr ""
-#: judge/models/contest.py:115
+#: judge/models/contest.py:124
msgid "This image will replace the default site logo for users inside the contest."
msgstr ""
-#: judge/models/contest.py:118
+#: judge/models/contest.py:127
msgid "the amount of live participants"
msgstr ""
-#: judge/models/contest.py:119
+#: judge/models/contest.py:128
msgid "contest summary"
msgstr ""
-#: judge/models/contest.py:120 judge/models/problem.py:155
+#: judge/models/contest.py:129 judge/models/problem.py:169
msgid "Plain-text, shown in meta description tag, e.g. for social media."
msgstr ""
-#: judge/models/contest.py:121 judge/models/profile.py:53
+#: judge/models/contest.py:130 judge/models/profile.py:56
msgid "access code"
msgstr ""
-#: judge/models/contest.py:122
+#: judge/models/contest.py:131
msgid "An optional code to prompt contestants before they are allowed to join the contest. Leave it blank to disable."
msgstr "在參賽者被允許參加比賽之前的一個可選代碼。如無需要請留空白禁用。"
-#: judge/models/contest.py:124 judge/models/problem.py:149
+#: judge/models/contest.py:133 judge/models/problem.py:163
msgid "personae non gratae"
msgstr ""
-#: judge/models/contest.py:125
+#: judge/models/contest.py:134
msgid "Bans the selected users from joining this contest."
msgstr ""
-#: judge/models/contest.py:126
+#: judge/models/contest.py:135
msgid "contest format"
msgstr "競賽格式"
-#: judge/models/contest.py:127
+#: judge/models/contest.py:136
msgid "The contest format module to use."
msgstr ""
-#: judge/models/contest.py:128
+#: judge/models/contest.py:137
msgid "contest format configuration"
msgstr ""
-#: judge/models/contest.py:129
+#: judge/models/contest.py:138
msgid "A JSON object to serve as the configuration for the chosen contest format module. Leave empty to use None. Exact format depends on the contest format selected."
msgstr "作為選定競賽格式模塊的配置的JSON對象。留空來不使用。實在格式依賴於所選的競賽格式。"
-#: judge/models/contest.py:136
+#: judge/models/contest.py:145
msgid "contest lock"
msgstr ""
-#: judge/models/contest.py:137
-msgid "Prevent submissions from this contest from being rejudged."
+#: judge/models/contest.py:146
+msgid "Prevent submissions from this contest from being rejudged after this date."
msgstr ""
-#: judge/models/contest.py:138
+#: judge/models/contest.py:148
msgid "precision points"
msgstr ""
-#: judge/models/contest.py:140
+#: judge/models/contest.py:150
msgid "Number of digits to round points to."
msgstr ""
-#: judge/models/contest.py:362
+#: judge/models/contest.py:398
msgid "See private contests"
msgstr ""
-#: judge/models/contest.py:363
+#: judge/models/contest.py:399
msgid "Edit own contests"
msgstr ""
-#: judge/models/contest.py:364
+#: judge/models/contest.py:400
msgid "Edit all contests"
msgstr "編輯所有競賽"
-#: judge/models/contest.py:365
+#: judge/models/contest.py:401
msgid "Clone contest"
msgstr "複製競賽"
-#: judge/models/contest.py:366 templates/contest/moss.html:74
+#: judge/models/contest.py:402 templates/contest/moss.html:74
msgid "MOSS contest"
msgstr ""
-#: judge/models/contest.py:367
+#: judge/models/contest.py:403
msgid "Rate contests"
msgstr ""
-#: judge/models/contest.py:368
+#: judge/models/contest.py:404
msgid "Contest access codes"
msgstr ""
-#: judge/models/contest.py:369
+#: judge/models/contest.py:405
msgid "Create private contests"
msgstr ""
-#: judge/models/contest.py:370
+#: judge/models/contest.py:406
msgid "Change contest visibility"
msgstr ""
-#: judge/models/contest.py:371
+#: judge/models/contest.py:407
msgid "Edit contest problem label script"
msgstr ""
-#: judge/models/contest.py:372
+#: judge/models/contest.py:408
msgid "Change lock status of contest"
msgstr ""
-#: judge/models/contest.py:374 judge/models/contest.py:472
-#: judge/models/contest.py:510 judge/models/contest.py:532
-#: judge/models/submission.py:84
+#: judge/models/contest.py:410 judge/models/contest.py:508
+#: judge/models/contest.py:547 judge/models/contest.py:569
+#: judge/models/submission.py:85
msgid "contest"
msgstr "競賽"
-#: judge/models/contest.py:375
+#: judge/models/contest.py:411
msgid "contests"
msgstr "競賽"
-#: judge/models/contest.py:382
+#: judge/models/contest.py:418
msgid "associated contest"
msgstr ""
-#: judge/models/contest.py:385
+#: judge/models/contest.py:421
msgid "score"
msgstr "得分"
-#: judge/models/contest.py:386
+#: judge/models/contest.py:422
msgid "cumulative time"
msgstr "累計時間"
-#: judge/models/contest.py:387
+#: judge/models/contest.py:423
msgid "is disqualified"
msgstr ""
-#: judge/models/contest.py:388
+#: judge/models/contest.py:424
msgid "Whether this participation is disqualified."
msgstr ""
-#: judge/models/contest.py:389
+#: judge/models/contest.py:425
msgid "tie-breaking field"
msgstr ""
-#: judge/models/contest.py:390
+#: judge/models/contest.py:426
msgid "virtual participation id"
msgstr ""
-#: judge/models/contest.py:391
+#: judge/models/contest.py:427
msgid "0 means non-virtual, otherwise the n-th virtual participation."
msgstr ""
-#: judge/models/contest.py:392
+#: judge/models/contest.py:428
msgid "contest format specific data"
msgstr ""
-#: judge/models/contest.py:458
+#: judge/models/contest.py:494
#, python-format
msgid "%s spectating in %s"
msgstr ""
-#: judge/models/contest.py:460
+#: judge/models/contest.py:496
#, python-format
msgid "%s in %s, v%d"
msgstr ""
-#: judge/models/contest.py:461
+#: judge/models/contest.py:497
#, python-format
msgid "%s in %s"
msgstr ""
-#: judge/models/contest.py:464
+#: judge/models/contest.py:500
msgid "contest participation"
msgstr ""
-#: judge/models/contest.py:465
+#: judge/models/contest.py:501
msgid "contest participations"
msgstr ""
-#: judge/models/contest.py:471 judge/models/contest.py:494
-#: judge/models/contest.py:533 judge/models/problem.py:430
-#: judge/models/problem.py:435 judge/models/problem.py:453
+#: judge/models/contest.py:507 judge/models/contest.py:531
+#: judge/models/contest.py:570 judge/models/problem.py:457
+#: judge/models/problem.py:462 judge/models/problem.py:480
#: judge/models/problem_data.py:35
msgid "problem"
msgstr "題目"
-#: judge/models/contest.py:473 judge/models/contest.py:498
-#: judge/models/problem.py:137
+#: judge/models/contest.py:509 judge/models/contest.py:535
+#: judge/models/problem.py:151
msgid "points"
msgstr "分"
-#: judge/models/contest.py:474
+#: judge/models/contest.py:510
msgid "partial"
msgstr "部分"
-#: judge/models/contest.py:475 judge/models/contest.py:499
+#: judge/models/contest.py:511 judge/models/contest.py:536
msgid "is pretested"
msgstr ""
-#: judge/models/contest.py:476 judge/models/interface.py:43
+#: judge/models/contest.py:512 judge/models/interface.py:43
msgid "order"
msgstr "順序"
-#: judge/models/contest.py:477
+#: judge/models/contest.py:513
msgid "output prefix length override"
msgstr ""
-#: judge/models/contest.py:479
+#: judge/models/contest.py:515
msgid "Maximum number of submissions for this problem, or leave blank for no limit."
msgstr "此問題的最大提交數量,或留空白而表示無限制。"
-#: judge/models/contest.py:482
+#: judge/models/contest.py:518
msgid "Why include a problem you can't submit to?"
msgstr ""
-#: judge/models/contest.py:487
+#: judge/models/contest.py:523
msgid "contest problem"
msgstr ""
-#: judge/models/contest.py:488
+#: judge/models/contest.py:524
msgid "contest problems"
msgstr ""
-#: judge/models/contest.py:492 judge/models/submission.py:207
+#: judge/models/contest.py:529 judge/models/submission.py:218
msgid "submission"
msgstr "提交訊息"
-#: judge/models/contest.py:496 judge/models/contest.py:511
+#: judge/models/contest.py:533 judge/models/contest.py:548
msgid "participation"
msgstr ""
-#: judge/models/contest.py:500
+#: judge/models/contest.py:537
msgid "Whether this submission was ran only on pretests."
msgstr ""
-#: judge/models/contest.py:504
+#: judge/models/contest.py:541
msgid "contest submission"
msgstr ""
-#: judge/models/contest.py:505
+#: judge/models/contest.py:542
msgid "contest submissions"
msgstr ""
-#: judge/models/contest.py:513
+#: judge/models/contest.py:550
msgid "rank"
msgstr "排名"
-#: judge/models/contest.py:514
+#: judge/models/contest.py:551
msgid "rating"
msgstr "評分"
-#: judge/models/contest.py:515
+#: judge/models/contest.py:552
msgid "volatility"
msgstr ""
-#: judge/models/contest.py:516
+#: judge/models/contest.py:553
msgid "last rated"
msgstr ""
-#: judge/models/contest.py:520
+#: judge/models/contest.py:557
msgid "contest rating"
msgstr ""
-#: judge/models/contest.py:521
+#: judge/models/contest.py:558
msgid "contest ratings"
msgstr ""
-#: judge/models/contest.py:540
+#: judge/models/contest.py:577
msgid "contest moss result"
msgstr ""
-#: judge/models/contest.py:541
+#: judge/models/contest.py:578
msgid "contest moss results"
msgstr ""
@@ -1190,7 +1207,7 @@ msgstr ""
msgid "post title"
msgstr ""
-#: judge/models/interface.py:67 judge/models/problem.py:473
+#: judge/models/interface.py:67 judge/models/problem.py:500
msgid "authors"
msgstr "作者"
@@ -1198,7 +1215,7 @@ msgstr "作者"
msgid "slug"
msgstr "網址標誌"
-#: judge/models/interface.py:69 judge/models/problem.py:471
+#: judge/models/interface.py:69 judge/models/problem.py:498
msgid "public visibility"
msgstr ""
@@ -1234,34 +1251,6 @@ msgstr ""
msgid "blog posts"
msgstr ""
-#: judge/models/message.py:11
-msgid "message title"
-msgstr ""
-
-#: judge/models/message.py:12 judge/models/ticket.py:30
-msgid "message body"
-msgstr ""
-
-#: judge/models/message.py:13
-msgid "sender"
-msgstr "發件人"
-
-#: judge/models/message.py:14
-msgid "target"
-msgstr "目標"
-
-#: judge/models/message.py:15
-msgid "message timestamp"
-msgstr ""
-
-#: judge/models/message.py:16
-msgid "read"
-msgstr "查看"
-
-#: judge/models/message.py:20
-msgid "messages in the thread"
-msgstr ""
-
#: judge/models/problem.py:30
#, python-format
msgid "Disallowed characters: %(value)s"
@@ -1279,7 +1268,7 @@ msgstr ""
msgid "problem type"
msgstr "題目類型"
-#: judge/models/problem.py:44 judge/models/problem.py:121
+#: judge/models/problem.py:44 judge/models/problem.py:135
msgid "problem types"
msgstr "題目類型"
@@ -1291,7 +1280,7 @@ msgstr ""
msgid "problem group name"
msgstr ""
-#: judge/models/problem.py:56 judge/models/problem.py:124
+#: judge/models/problem.py:56 judge/models/problem.py:138
msgid "problem group"
msgstr ""
@@ -1311,7 +1300,7 @@ msgstr "链接"
msgid "full name"
msgstr ""
-#: judge/models/problem.py:65 judge/models/profile.py:41
+#: judge/models/problem.py:65 judge/models/profile.py:44
#: judge/models/runtime.py:24
msgid "short name"
msgstr ""
@@ -1340,232 +1329,252 @@ msgstr "許可證"
msgid "licenses"
msgstr "許可證"
-#: judge/models/problem.py:104
+#: judge/models/problem.py:112
+msgid "Follow global setting"
+msgstr ""
+
+#: judge/models/problem.py:113
+msgid "Always visible"
+msgstr ""
+
+#: judge/models/problem.py:114
+msgid "Visible if problem solved"
+msgstr ""
+
+#: judge/models/problem.py:115
+msgid "Only own submissions"
+msgstr ""
+
+#: judge/models/problem.py:118
msgid "problem code"
msgstr ""
-#: judge/models/problem.py:106
+#: judge/models/problem.py:120
msgid "A short, unique code for the problem, used in the url after /problem/"
msgstr ""
-#: judge/models/problem.py:108
+#: judge/models/problem.py:122
msgid "problem name"
msgstr "題目名稱"
-#: judge/models/problem.py:109
+#: judge/models/problem.py:123
msgid "The full name of the problem, as shown in the problem list."
msgstr ""
-#: judge/models/problem.py:111
+#: judge/models/problem.py:125
msgid "problem body"
msgstr ""
-#: judge/models/problem.py:112
+#: judge/models/problem.py:126
msgid "creators"
msgstr "建立者"
-#: judge/models/problem.py:113
+#: judge/models/problem.py:127
msgid "These users will be able to edit the problem, and be listed as authors."
msgstr ""
-#: judge/models/problem.py:115
+#: judge/models/problem.py:129
msgid "curators"
msgstr ""
-#: judge/models/problem.py:116
+#: judge/models/problem.py:130
msgid "These users will be able to edit the problem, but not be listed as authors."
msgstr ""
-#: judge/models/problem.py:118
+#: judge/models/problem.py:132
msgid "testers"
msgstr "測試人員"
-#: judge/models/problem.py:120
+#: judge/models/problem.py:134
msgid "These users will be able to view the private problem, but not edit it."
msgstr ""
-#: judge/models/problem.py:122
+#: judge/models/problem.py:136
msgid "The type of problem, as shown on the problem's page."
msgstr ""
-#: judge/models/problem.py:125
+#: judge/models/problem.py:139
msgid "The group of problem, shown under Category in the problem list."
msgstr ""
-#: judge/models/problem.py:127
+#: judge/models/problem.py:141
msgid "The time limit for this problem, in seconds. Fractional seconds (e.g. 1.5) are supported."
msgstr "這個問題的時間限制(以秒為單位。支持小數秒計時方式(例如1.5)。"
-#: judge/models/problem.py:131 judge/models/problem.py:458
+#: judge/models/problem.py:145 judge/models/problem.py:485
msgid "memory limit"
msgstr "記憶體限制"
-#: judge/models/problem.py:132
+#: judge/models/problem.py:146
msgid "The memory limit for this problem, in kilobytes (e.g. 64mb = 65536 kilobytes)."
msgstr "此問題的記憶體限制,以kb為單位 ( 例如 64mb = 65536 kb)"
-#: judge/models/problem.py:138
+#: judge/models/problem.py:152
msgid "Points awarded for problem completion. Points are displayed with a 'p' suffix if partial."
msgstr "完成問題得分的分數,如果有部分分數而顯示'p'結尾。"
-#: judge/models/problem.py:141
+#: judge/models/problem.py:155
msgid "allows partial points"
msgstr ""
-#: judge/models/problem.py:142
+#: judge/models/problem.py:156
msgid "allowed languages"
msgstr "允許的語言"
-#: judge/models/problem.py:143
+#: judge/models/problem.py:157
msgid "List of allowed submission languages."
msgstr ""
-#: judge/models/problem.py:145
+#: judge/models/problem.py:159
msgid "manually managed"
msgstr ""
-#: judge/models/problem.py:146
+#: judge/models/problem.py:160
msgid "Whether judges should be allowed to manage data or not."
msgstr ""
-#: judge/models/problem.py:147
+#: judge/models/problem.py:161
msgid "date of publishing"
msgstr ""
-#: judge/models/problem.py:148
+#: judge/models/problem.py:162
msgid "Doesn't have magic ability to auto-publish due to backward compatibility"
msgstr ""
-#: judge/models/problem.py:150
+#: judge/models/problem.py:164
msgid "Bans the selected users from submitting to this problem."
msgstr ""
-#: judge/models/problem.py:152
+#: judge/models/problem.py:166
msgid "The license under which this problem is published."
msgstr ""
-#: judge/models/problem.py:154
+#: judge/models/problem.py:168
msgid "problem summary"
msgstr ""
-#: judge/models/problem.py:156
+#: judge/models/problem.py:170
msgid "number of users"
msgstr ""
-#: judge/models/problem.py:157
+#: judge/models/problem.py:171
msgid "The number of users who solved the problem."
msgstr ""
-#: judge/models/problem.py:158
+#: judge/models/problem.py:172
msgid "solve rate"
msgstr ""
-#: judge/models/problem.py:159
+#: judge/models/problem.py:173
msgid "allow full markdown access"
msgstr ""
-#: judge/models/problem.py:165
+#: judge/models/problem.py:174
+msgid "submission source visibility"
+msgstr ""
+
+#: judge/models/problem.py:182
msgid "If private, only these organizations may see the problem."
msgstr ""
-#: judge/models/problem.py:420
+#: judge/models/problem.py:447
msgid "See hidden problems"
msgstr ""
-#: judge/models/problem.py:421
+#: judge/models/problem.py:448
msgid "Edit own problems"
msgstr ""
-#: judge/models/problem.py:422
+#: judge/models/problem.py:449
msgid "Edit all problems"
msgstr ""
-#: judge/models/problem.py:423
+#: judge/models/problem.py:450
msgid "Edit all public problems"
msgstr ""
-#: judge/models/problem.py:424
+#: judge/models/problem.py:451
msgid "Edit problems with full markup"
msgstr ""
-#: judge/models/problem.py:425 templates/problem/problem.html:161
+#: judge/models/problem.py:452 templates/problem/problem.html:161
msgid "Clone problem"
msgstr ""
-#: judge/models/problem.py:426
+#: judge/models/problem.py:453
msgid "Change is_public field"
msgstr ""
-#: judge/models/problem.py:427
+#: judge/models/problem.py:454
msgid "Change is_manually_managed field"
msgstr ""
-#: judge/models/problem.py:428
+#: judge/models/problem.py:455
msgid "See organization-private problems"
msgstr ""
-#: judge/models/problem.py:436 judge/models/problem.py:454
+#: judge/models/problem.py:463 judge/models/problem.py:481
#: judge/models/runtime.py:111
msgid "language"
msgstr "語言"
-#: judge/models/problem.py:437
+#: judge/models/problem.py:464
msgid "translated name"
msgstr ""
-#: judge/models/problem.py:438
+#: judge/models/problem.py:465
msgid "translated description"
msgstr ""
-#: judge/models/problem.py:442
+#: judge/models/problem.py:469
msgid "problem translation"
msgstr ""
-#: judge/models/problem.py:443
+#: judge/models/problem.py:470
msgid "problem translations"
msgstr ""
-#: judge/models/problem.py:447
+#: judge/models/problem.py:474
msgid "clarified problem"
msgstr ""
-#: judge/models/problem.py:448
+#: judge/models/problem.py:475
msgid "clarification body"
msgstr ""
-#: judge/models/problem.py:449
+#: judge/models/problem.py:476
msgid "clarification timestamp"
msgstr ""
-#: judge/models/problem.py:464
+#: judge/models/problem.py:491
msgid "language-specific resource limit"
msgstr ""
-#: judge/models/problem.py:465
+#: judge/models/problem.py:492
msgid "language-specific resource limits"
msgstr ""
-#: judge/models/problem.py:469
+#: judge/models/problem.py:496
msgid "associated problem"
msgstr ""
-#: judge/models/problem.py:472
+#: judge/models/problem.py:499
msgid "publish date"
msgstr ""
-#: judge/models/problem.py:474
+#: judge/models/problem.py:501
msgid "editorial content"
msgstr ""
-#: judge/models/problem.py:497
+#: judge/models/problem.py:524
msgid "See hidden solutions"
msgstr ""
-#: judge/models/problem.py:499
+#: judge/models/problem.py:526
msgid "solution"
msgstr "題解"
-#: judge/models/problem.py:500
+#: judge/models/problem.py:527
msgid "solutions"
msgstr "題解"
@@ -1677,112 +1686,112 @@ msgstr "分數"
msgid "case is pretest?"
msgstr ""
-#: judge/models/profile.py:38
+#: judge/models/profile.py:41
msgid "organization title"
msgstr ""
-#: judge/models/profile.py:39
+#: judge/models/profile.py:42
msgid "organization slug"
msgstr ""
-#: judge/models/profile.py:40
+#: judge/models/profile.py:43
msgid "Organization name shown in URL"
msgstr ""
-#: judge/models/profile.py:42
+#: judge/models/profile.py:45
msgid "Displayed beside user name during contests"
msgstr ""
-#: judge/models/profile.py:43
+#: judge/models/profile.py:46
msgid "organization description"
msgstr ""
-#: judge/models/profile.py:44
+#: judge/models/profile.py:47
msgid "administrators"
msgstr "管理員"
-#: judge/models/profile.py:45
+#: judge/models/profile.py:48
msgid "Those who can edit this organization"
msgstr ""
-#: judge/models/profile.py:46
+#: judge/models/profile.py:49
msgid "creation date"
msgstr ""
-#: judge/models/profile.py:47
+#: judge/models/profile.py:50
msgid "is open organization?"
msgstr ""
-#: judge/models/profile.py:48
+#: judge/models/profile.py:51
msgid "Allow joining organization"
msgstr ""
-#: judge/models/profile.py:49
+#: judge/models/profile.py:52
msgid "maximum size"
msgstr ""
-#: judge/models/profile.py:50
+#: judge/models/profile.py:53
msgid "Maximum amount of users in this organization, only applicable to private organizations"
msgstr "這個組織用戶最大數量,只適用於私人組織"
-#: judge/models/profile.py:52
+#: judge/models/profile.py:55
msgid "Student access code"
msgstr ""
-#: judge/models/profile.py:56
+#: judge/models/profile.py:59
msgid "This image will replace the default site logo for users viewing the organization."
msgstr "此圖片將替換訪問該組織的用戶的默認網站標識。"
-#: judge/models/profile.py:79
+#: judge/models/profile.py:82
msgid "Administer organizations"
msgstr ""
-#: judge/models/profile.py:80
+#: judge/models/profile.py:83
msgid "Edit all organizations"
msgstr ""
-#: judge/models/profile.py:82 judge/models/profile.py:99
-#: judge/models/profile.py:269
+#: judge/models/profile.py:85 judge/models/profile.py:102
+#: judge/models/profile.py:293
msgid "organization"
msgstr ""
-#: judge/models/profile.py:87
+#: judge/models/profile.py:90
msgid "user associated"
msgstr ""
-#: judge/models/profile.py:88
+#: judge/models/profile.py:91
msgid "self-description"
msgstr ""
-#: judge/models/profile.py:89
+#: judge/models/profile.py:92
msgid "location"
msgstr "位置"
-#: judge/models/profile.py:91
+#: judge/models/profile.py:94
msgid "preferred language"
msgstr ""
-#: judge/models/profile.py:97
+#: judge/models/profile.py:100
msgid "last access time"
msgstr ""
-#: judge/models/profile.py:98
+#: judge/models/profile.py:101
msgid "last IP"
msgstr "上一訪問 IP"
-#: judge/models/profile.py:101
+#: judge/models/profile.py:104
msgid "display rank"
msgstr "顯示排名"
-#: judge/models/profile.py:103
+#: judge/models/profile.py:106
msgid "Normal User"
msgstr ""
-#: judge/models/profile.py:104
+#: judge/models/profile.py:107
msgid "Problem Setter"
msgstr ""
-#: judge/models/profile.py:105 templates/base.html:220
+#: judge/models/profile.py:108 templates/base.html:220
#: templates/comments/list.html:99 templates/contest/contest-list-tabs.html:24
#: templates/contest/ranking-table.html:49
#: templates/problem/problem-list-tabs.html:6
@@ -1791,155 +1800,167 @@ msgstr ""
msgid "Admin"
msgstr "管理員"
-#: judge/models/profile.py:106
+#: judge/models/profile.py:109
msgid "comment mute"
msgstr ""
-#: judge/models/profile.py:106
+#: judge/models/profile.py:109
msgid "Some users are at their best when silent."
msgstr ""
-#: judge/models/profile.py:108
+#: judge/models/profile.py:111
msgid "unlisted user"
msgstr ""
-#: judge/models/profile.py:108
+#: judge/models/profile.py:111
msgid "User will not be ranked."
msgstr ""
-#: judge/models/profile.py:111
+#: judge/models/profile.py:114
msgid "user script"
msgstr ""
-#: judge/models/profile.py:112
+#: judge/models/profile.py:115
msgid "User-defined JavaScript for site customization."
msgstr ""
-#: judge/models/profile.py:113
+#: judge/models/profile.py:116
msgid "current contest"
msgstr "目前競賽"
-#: judge/models/profile.py:115
+#: judge/models/profile.py:118
msgid "math engine"
msgstr ""
-#: judge/models/profile.py:117
+#: judge/models/profile.py:120
msgid "the rendering engine used to render math"
msgstr ""
-#: judge/models/profile.py:118
+#: judge/models/profile.py:121
msgid "TOTP 2FA enabled"
msgstr ""
-#: judge/models/profile.py:119
+#: judge/models/profile.py:122
msgid "check to enable TOTP-based two-factor authentication"
msgstr ""
-#: judge/models/profile.py:120
+#: judge/models/profile.py:123
msgid "WebAuthn 2FA enabled"
msgstr ""
-#: judge/models/profile.py:121
+#: judge/models/profile.py:124
msgid "check to enable WebAuthn-based two-factor authentication"
msgstr ""
-#: judge/models/profile.py:122
+#: judge/models/profile.py:125
msgid "TOTP key"
msgstr ""
-#: judge/models/profile.py:123
+#: judge/models/profile.py:126
msgid "32 character base32-encoded key for TOTP"
msgstr ""
-#: judge/models/profile.py:125
+#: judge/models/profile.py:128
msgid "TOTP key must be empty or base32"
msgstr ""
-#: judge/models/profile.py:126
+#: judge/models/profile.py:129
msgid "scratch codes"
msgstr ""
-#: judge/models/profile.py:127
+#: judge/models/profile.py:130
msgid "JSON array of 16 character base32-encoded codes for scratch codes"
msgstr "含有16字符的32進制代碼的JSON數組"
-#: judge/models/profile.py:131
+#: judge/models/profile.py:134
msgid "Scratch codes must be empty or a JSON array of 16-character base32 codes"
msgstr "一次性代碼必須是空的或者是一個含有32進制代碼的JSON數組"
-#: judge/models/profile.py:133
+#: judge/models/profile.py:136
+msgid "last TOTP timecode"
+msgstr ""
+
+#: judge/models/profile.py:137
msgid "API token"
msgstr "API 令牌"
-#: judge/models/profile.py:134
+#: judge/models/profile.py:138
msgid "64 character hex-encoded API access token"
msgstr ""
-#: judge/models/profile.py:136
+#: judge/models/profile.py:140
msgid "API token must be None or hexadecimal"
msgstr ""
-#: judge/models/profile.py:137
+#: judge/models/profile.py:141
msgid "internal notes"
msgstr ""
-#: judge/models/profile.py:138
+#: judge/models/profile.py:142
msgid "Notes for administrators regarding this user."
msgstr ""
-#: judge/models/profile.py:139
+#: judge/models/profile.py:143
msgid "last data download time"
msgstr ""
-#: judge/models/profile.py:236
+#: judge/models/profile.py:253
msgid "Shows in-progress development stuff"
msgstr ""
-#: judge/models/profile.py:237
+#: judge/models/profile.py:254
msgid "Edit TOTP settings"
msgstr ""
-#: judge/models/profile.py:239
+#: judge/models/profile.py:256
msgid "user profile"
msgstr "使用者個人檔案"
-#: judge/models/profile.py:240
+#: judge/models/profile.py:257
msgid "user profiles"
msgstr "使用者個人檔案"
-#: judge/models/profile.py:246
+#: judge/models/profile.py:263
msgid "device name"
msgstr ""
-#: judge/models/profile.py:247
+#: judge/models/profile.py:264
msgid "credential ID"
msgstr ""
-#: judge/models/profile.py:248
+#: judge/models/profile.py:265
msgid "public key"
msgstr ""
-#: judge/models/profile.py:249
+#: judge/models/profile.py:266
msgid "sign counter"
msgstr ""
-#: judge/models/profile.py:271
+#: judge/models/profile.py:287
+msgid "WebAuthn credential"
+msgstr ""
+
+#: judge/models/profile.py:288
+msgid "WebAuthn credentials"
+msgstr ""
+
+#: judge/models/profile.py:295
msgid "request time"
msgstr ""
-#: judge/models/profile.py:272
+#: judge/models/profile.py:296
msgid "state"
msgstr "狀態"
-#: judge/models/profile.py:277
+#: judge/models/profile.py:301
msgid "reason"
msgstr "原因"
-#: judge/models/profile.py:280
+#: judge/models/profile.py:304
msgid "organization join request"
msgstr ""
-#: judge/models/profile.py:281
+#: judge/models/profile.py:305
msgid "organization join requests"
msgstr ""
@@ -2095,210 +2116,210 @@ msgstr "裁判服務器"
msgid "judge"
msgstr "裁判服務器"
-#: judge/models/submission.py:20 judge/models/submission.py:47
+#: judge/models/submission.py:21 judge/models/submission.py:48
#: judge/utils/problems.py:74
msgid "Accepted"
msgstr "接受"
-#: judge/models/submission.py:21 judge/models/submission.py:48
+#: judge/models/submission.py:22 judge/models/submission.py:49
msgid "Wrong Answer"
msgstr "錯誤答案"
-#: judge/models/submission.py:22 judge/models/submission.py:50
+#: judge/models/submission.py:23 judge/models/submission.py:51
msgid "Time Limit Exceeded"
msgstr "超出了時間限制"
-#: judge/models/submission.py:23 judge/models/submission.py:51
+#: judge/models/submission.py:24 judge/models/submission.py:52
msgid "Memory Limit Exceeded"
msgstr "超出了記憶體限制"
-#: judge/models/submission.py:24 judge/models/submission.py:52
+#: judge/models/submission.py:25 judge/models/submission.py:53
msgid "Output Limit Exceeded"
msgstr "超出了輸出限制"
-#: judge/models/submission.py:25 judge/models/submission.py:53
+#: judge/models/submission.py:26 judge/models/submission.py:54
msgid "Invalid Return"
msgstr ""
-#: judge/models/submission.py:26 judge/models/submission.py:54
+#: judge/models/submission.py:27 judge/models/submission.py:55
msgid "Runtime Error"
msgstr "運行時錯誤"
-#: judge/models/submission.py:27 judge/models/submission.py:41
-#: judge/models/submission.py:55 judge/utils/problems.py:76
+#: judge/models/submission.py:28 judge/models/submission.py:42
+#: judge/models/submission.py:56 judge/utils/problems.py:76
msgid "Compile Error"
msgstr "編譯錯誤"
-#: judge/models/submission.py:28 judge/models/submission.py:40
+#: judge/models/submission.py:29 judge/models/submission.py:41
msgid "Internal Error"
msgstr "內部錯誤"
-#: judge/models/submission.py:29
+#: judge/models/submission.py:30
msgid "Short circuit"
msgstr ""
-#: judge/models/submission.py:30 judge/models/submission.py:42
-#: judge/models/submission.py:61
+#: judge/models/submission.py:31 judge/models/submission.py:43
+#: judge/models/submission.py:62
msgid "Aborted"
msgstr "中止"
-#: judge/models/submission.py:36 judge/models/submission.py:57
+#: judge/models/submission.py:37 judge/models/submission.py:58
msgid "Queued"
msgstr "已排入佇列"
-#: judge/models/submission.py:37 judge/models/submission.py:58
+#: judge/models/submission.py:38 judge/models/submission.py:59
msgid "Processing"
msgstr "正在處理"
-#: judge/models/submission.py:38 judge/models/submission.py:59
+#: judge/models/submission.py:39 judge/models/submission.py:60
msgid "Grading"
msgstr "評分中"
-#: judge/models/submission.py:39 judge/models/submission.py:60
+#: judge/models/submission.py:40 judge/models/submission.py:61
msgid "Completed"
msgstr "已完成"
-#: judge/models/submission.py:56
+#: judge/models/submission.py:57
msgid "Internal Error (judging server error)"
msgstr ""
-#: judge/models/submission.py:66
+#: judge/models/submission.py:67
msgid "submission time"
msgstr "提交時間"
-#: judge/models/submission.py:67 judge/models/submission.py:227
+#: judge/models/submission.py:68 judge/models/submission.py:238
msgid "execution time"
msgstr "執行時間"
-#: judge/models/submission.py:68 judge/models/submission.py:228
+#: judge/models/submission.py:69 judge/models/submission.py:239
msgid "memory usage"
msgstr "記憶體使用量"
-#: judge/models/submission.py:69 judge/models/submission.py:229
+#: judge/models/submission.py:70 judge/models/submission.py:240
msgid "points granted"
msgstr "獲得分數"
-#: judge/models/submission.py:70
+#: judge/models/submission.py:71
msgid "submission language"
msgstr "提交語言"
-#: judge/models/submission.py:71
+#: judge/models/submission.py:72
msgid "status"
msgstr "狀態"
-#: judge/models/submission.py:72
+#: judge/models/submission.py:73
msgid "result"
msgstr "結果"
-#: judge/models/submission.py:74
+#: judge/models/submission.py:75
msgid "compile errors"
msgstr "編譯錯誤"
-#: judge/models/submission.py:76
+#: judge/models/submission.py:77
msgid "batched cases"
msgstr ""
-#: judge/models/submission.py:77
+#: judge/models/submission.py:78
msgid "test case points"
msgstr ""
-#: judge/models/submission.py:78
+#: judge/models/submission.py:79
msgid "test case total points"
msgstr ""
-#: judge/models/submission.py:79
+#: judge/models/submission.py:80
msgid "judged on"
msgstr ""
-#: judge/models/submission.py:81
+#: judge/models/submission.py:82
msgid "submission judge time"
msgstr ""
-#: judge/models/submission.py:82
-msgid "was rejudged by admin"
+#: judge/models/submission.py:83
+msgid "last rejudge date by admin"
msgstr ""
-#: judge/models/submission.py:83
+#: judge/models/submission.py:84
msgid "was ran on pretests only"
msgstr ""
-#: judge/models/submission.py:86
-msgid "lock submission"
-msgstr "鎖定提交"
+#: judge/models/submission.py:87
+msgid "submission lock"
+msgstr ""
-#: judge/models/submission.py:199
+#: judge/models/submission.py:210
msgid "Abort any submission"
msgstr ""
-#: judge/models/submission.py:200
+#: judge/models/submission.py:211
msgid "Rejudge the submission"
msgstr ""
-#: judge/models/submission.py:201
+#: judge/models/submission.py:212
msgid "Rejudge a lot of submissions"
msgstr ""
-#: judge/models/submission.py:202
+#: judge/models/submission.py:213
msgid "Submit without limit"
msgstr ""
-#: judge/models/submission.py:203
+#: judge/models/submission.py:214
msgid "View all submission"
msgstr "檢視所有提交紀錄"
-#: judge/models/submission.py:204
+#: judge/models/submission.py:215
msgid "Resubmit others' submission"
msgstr "重新提交他人的提交紀錄"
-#: judge/models/submission.py:205
+#: judge/models/submission.py:216
msgid "Change lock status of submission"
msgstr ""
-#: judge/models/submission.py:208 templates/contest/moss.html:58
+#: judge/models/submission.py:219 templates/contest/moss.html:58
msgid "submissions"
msgstr ""
-#: judge/models/submission.py:212 judge/models/submission.py:223
+#: judge/models/submission.py:223 judge/models/submission.py:234
msgid "associated submission"
msgstr ""
-#: judge/models/submission.py:214
+#: judge/models/submission.py:225
msgid "source code"
msgstr "源碼"
-#: judge/models/submission.py:225
+#: judge/models/submission.py:236
msgid "test case ID"
msgstr ""
-#: judge/models/submission.py:226
+#: judge/models/submission.py:237
msgid "status flag"
msgstr ""
-#: judge/models/submission.py:230
+#: judge/models/submission.py:241
msgid "points possible"
msgstr ""
-#: judge/models/submission.py:231
+#: judge/models/submission.py:242
msgid "batch number"
msgstr ""
-#: judge/models/submission.py:232
+#: judge/models/submission.py:243
msgid "judging feedback"
msgstr ""
-#: judge/models/submission.py:233
+#: judge/models/submission.py:244
msgid "extended judging feedback"
msgstr ""
-#: judge/models/submission.py:234
+#: judge/models/submission.py:245
msgid "program output"
msgstr ""
-#: judge/models/submission.py:242
+#: judge/models/submission.py:253
msgid "submission test case"
msgstr ""
-#: judge/models/submission.py:243
+#: judge/models/submission.py:254
msgid "submission test cases"
msgstr ""
@@ -2346,6 +2367,10 @@ msgstr "票"
msgid "poster"
msgstr "海報"
+#: judge/models/ticket.py:30
+msgid "message body"
+msgstr ""
+
#: judge/models/ticket.py:31
msgid "message time"
msgstr ""
@@ -2368,19 +2393,23 @@ msgstr ""
msgid "Running MOSS"
msgstr ""
-#: judge/tasks/submission.py:43
+#: judge/tasks/submission.py:45
msgid "Modifying submissions"
msgstr ""
-#: judge/tasks/submission.py:56
+#: judge/tasks/submission.py:58
msgid "Recalculating user points"
msgstr ""
-#: judge/tasks/user.py:50
+#: judge/tasks/user.py:49
+msgid "Applying filters"
+msgstr ""
+
+#: judge/tasks/user.py:64
msgid "Preparing your submission data"
msgstr ""
-#: judge/tasks/user.py:81
+#: judge/tasks/user.py:95
msgid "Preparing your comment data"
msgstr ""
@@ -2490,7 +2519,7 @@ msgstr ""
msgid "You already voted."
msgstr ""
-#: judge/views/comment.py:129 judge/views/organization.py:298
+#: judge/views/comment.py:129 judge/views/organization.py:297
msgid "Edited from site"
msgstr ""
@@ -2498,125 +2527,130 @@ msgstr ""
msgid "Editing comment"
msgstr ""
-#: judge/views/contests.py:56 judge/views/contests.py:201
-#: judge/views/contests.py:204 judge/views/contests.py:382
+#: judge/views/contests.py:57 judge/views/contests.py:210
+#: judge/views/contests.py:213 judge/views/contests.py:395
msgid "No such contest"
msgstr ""
-#: judge/views/contests.py:57 judge/views/contests.py:202
+#: judge/views/contests.py:58 judge/views/contests.py:211
#, python-format
msgid "Could not find a contest with the key \"%s\"."
msgstr ""
-#: judge/views/contests.py:70
+#: judge/views/contests.py:71
msgid "Contests"
msgstr "競賽"
-#: judge/views/contests.py:205
+#: judge/views/contests.py:214
msgid "Could not find such contest."
msgstr ""
-#: judge/views/contests.py:208
+#: judge/views/contests.py:217
#, python-format
msgid "Access to contest \"%s\" denied"
msgstr ""
-#: judge/views/contests.py:235
+#: judge/views/contests.py:244
msgid "Clone Contest"
msgstr ""
-#: judge/views/contests.py:301
+#: judge/views/contests.py:278
+#, python-format
+msgid "Cloned contest from %s"
+msgstr ""
+
+#: judge/views/contests.py:314
msgid "Contest not ongoing"
msgstr ""
-#: judge/views/contests.py:302
+#: judge/views/contests.py:315
#, python-format
msgid "\"%s\" is not currently ongoing."
msgstr ""
-#: judge/views/contests.py:306
+#: judge/views/contests.py:319
msgid "Already in contest"
msgstr ""
-#: judge/views/contests.py:307
+#: judge/views/contests.py:320
#, python-format
msgid "You are already in a contest: \"%s\"."
msgstr ""
-#: judge/views/contests.py:310
+#: judge/views/contests.py:323
msgid "Banned from joining"
msgstr ""
-#: judge/views/contests.py:311
+#: judge/views/contests.py:324
msgid "You have been declared persona non grata for this contest. You are permanently barred from joining this contest."
msgstr "您在該競賽不受歡迎。您被永久禁止參加該競賽。"
-#: judge/views/contests.py:372
+#: judge/views/contests.py:385
#, python-format
msgid "Enter access code for \"%s\""
msgstr ""
-#: judge/views/contests.py:383
+#: judge/views/contests.py:396
#, python-format
msgid "You are not in contest \"%s\"."
msgstr ""
-#: judge/views/contests.py:402
+#: judge/views/contests.py:415
msgid "ContestCalendar requires integer year and month"
msgstr ""
-#: judge/views/contests.py:442
+#: judge/views/contests.py:455
#, python-format
msgid "Contests in %(month)s"
msgstr ""
-#: judge/views/contests.py:442
+#: judge/views/contests.py:455
msgid "F Y"
msgstr "Y年n月"
-#: judge/views/contests.py:489
+#: judge/views/contests.py:502
#, python-format
msgid "%s Statistics"
msgstr ""
-#: judge/views/contests.py:662
+#: judge/views/contests.py:675
#, python-format
msgid "%s Rankings"
msgstr ""
-#: judge/views/contests.py:670
+#: judge/views/contests.py:683
msgid "???"
msgstr "???"
-#: judge/views/contests.py:686
+#: judge/views/contests.py:699
#, python-format
msgid "Your participation in %s"
msgstr ""
-#: judge/views/contests.py:687
+#: judge/views/contests.py:700
#, python-format
msgid "%s's participation in %s"
msgstr ""
-#: judge/views/contests.py:694
+#: judge/views/contests.py:707
msgid "Live"
msgstr "實時"
-#: judge/views/contests.py:706 templates/contest/contest-tabs.html:13
+#: judge/views/contests.py:719 templates/contest/contest-tabs.html:13
msgid "Participation"
msgstr ""
-#: judge/views/contests.py:750
+#: judge/views/contests.py:763
#, python-format
msgid "%s MOSS Results"
msgstr ""
-#: judge/views/contests.py:777
+#: judge/views/contests.py:790
#, python-format
msgid "Running MOSS for %s..."
msgstr ""
-#: judge/views/contests.py:800
+#: judge/views/contests.py:813
#, python-format
msgid "Contest tag: %s"
msgstr ""
@@ -2645,161 +2679,175 @@ msgstr ""
msgid "Runtimes"
msgstr "語言"
-#: judge/views/organization.py:44 judge/views/organization.py:47
+#: judge/views/organization.py:43 judge/views/organization.py:46
msgid "No such organization"
msgstr ""
-#: judge/views/organization.py:45
+#: judge/views/organization.py:44
#, python-format
msgid "Could not find an organization with the key \"%s\"."
msgstr ""
-#: judge/views/organization.py:48
+#: judge/views/organization.py:47
msgid "Could not find such organization."
msgstr ""
-#: judge/views/organization.py:72 judge/views/register.py:34
+#: judge/views/organization.py:71 judge/views/register.py:33
#: templates/organization/list.html:15 templates/user/user-list-tabs.html:5
msgid "Organizations"
msgstr ""
-#: judge/views/organization.py:93
+#: judge/views/organization.py:92
#, python-format
msgid "%s Members"
msgstr ""
-#: judge/views/organization.py:118 judge/views/organization.py:121
-#: judge/views/organization.py:126
+#: judge/views/organization.py:117 judge/views/organization.py:120
+#: judge/views/organization.py:125
msgid "Joining organization"
msgstr ""
-#: judge/views/organization.py:118
+#: judge/views/organization.py:117
msgid "You are already in the organization."
msgstr ""
-#: judge/views/organization.py:121
+#: judge/views/organization.py:120
msgid "This organization is not open."
msgstr ""
-#: judge/views/organization.py:138
+#: judge/views/organization.py:137
msgid "Leaving organization"
msgstr ""
-#: judge/views/organization.py:138
+#: judge/views/organization.py:137
#, python-format
msgid "You are not in \"%s\"."
msgstr ""
-#: judge/views/organization.py:162
+#: judge/views/organization.py:161
#, python-format
msgid "Request to join %s"
msgstr ""
-#: judge/views/organization.py:180
+#: judge/views/organization.py:179
msgid "Join request detail"
msgstr ""
-#: judge/views/organization.py:208
+#: judge/views/organization.py:207
#, python-format
msgid "Managing join requests for %s"
msgstr ""
-#: judge/views/organization.py:239
+#: judge/views/organization.py:238
#, python-format
msgid "Your organization can only receive %d more members. You cannot approve %d users."
msgstr "你的組織只能再接受%d個用戶,無法接受%d個。"
-#: judge/views/organization.py:251
+#: judge/views/organization.py:250
#, python-format
msgid "Approved %d user."
msgid_plural "Approved %d users."
msgstr[0] ""
-#: judge/views/organization.py:252
+#: judge/views/organization.py:251
#, python-format
msgid "Rejected %d user."
msgid_plural "Rejected %d users."
msgstr[0] ""
-#: judge/views/organization.py:282
+#: judge/views/organization.py:281
#, python-format
msgid "Editing %s"
msgstr ""
-#: judge/views/organization.py:306 judge/views/organization.py:314
+#: judge/views/organization.py:305 judge/views/organization.py:313
msgid "Can't edit organization"
msgstr ""
-#: judge/views/organization.py:307
+#: judge/views/organization.py:306
msgid "You are not allowed to edit this organization."
msgstr ""
-#: judge/views/organization.py:315
+#: judge/views/organization.py:314
msgid "You are not allowed to kick people from this organization."
msgstr ""
-#: judge/views/organization.py:320 judge/views/organization.py:324
+#: judge/views/organization.py:319 judge/views/organization.py:323
msgid "Can't kick user"
msgstr ""
-#: judge/views/organization.py:321
+#: judge/views/organization.py:320
msgid "The user you are trying to kick does not exist!"
msgstr ""
-#: judge/views/organization.py:325
+#: judge/views/organization.py:324
#, python-format
msgid "The user you are trying to kick is not in organization: %s."
msgstr ""
-#: judge/views/problem.py:67
+#: judge/views/problem.py:68
msgid "No such problem"
msgstr "沒有這個題目"
-#: judge/views/problem.py:68
+#: judge/views/problem.py:69
#, python-format
msgid "Could not find a problem with the code \"%s\"."
msgstr ""
-#: judge/views/problem.py:110
+#: judge/views/problem.py:111
#, python-brace-format
msgid "Editorial for {0}"
msgstr ""
-#: judge/views/problem.py:113
+#: judge/views/problem.py:114
#, python-brace-format
msgid "Editorial for {0}"
msgstr ""
-#: judge/views/problem.py:283 templates/contest/contest.html:79
+#: judge/views/problem.py:133
+msgid "No such editorial"
+msgstr ""
+
+#: judge/views/problem.py:134
+#, python-format
+msgid "Could not find an editorial with the code \"%s\"."
+msgstr ""
+
+#: judge/views/problem.py:289 templates/contest/contest.html:79
#: templates/user/user-tabs.html:5 templates/user/users-table.html:23
msgid "Problems"
msgstr "問題"
-#: judge/views/problem.py:556 judge/views/problem.py:564
+#: judge/views/problem.py:562 judge/views/problem.py:570
#, python-format
msgid "Submit to %s"
msgstr ""
-#: judge/views/problem.py:613
+#: judge/views/problem.py:619
msgid "Banned from submitting"
msgstr ""
-#: judge/views/problem.py:614
+#: judge/views/problem.py:620
msgid "You have been declared persona non grata for this problem. You are permanently barred from submitting this problem."
msgstr "您在該題目不受歡迎。您被永久禁止為該題目提交解決程序。"
-#: judge/views/problem.py:618
+#: judge/views/problem.py:624
msgid "Too many submissions"
msgstr ""
-#: judge/views/problem.py:619
+#: judge/views/problem.py:625
msgid "You have exceeded the submission limit for this problem."
msgstr ""
-#: judge/views/problem.py:681
+#: judge/views/problem.py:693
msgid "Clone Problem"
msgstr ""
+#: judge/views/problem.py:720
+#, python-format
+msgid "Cloned problem from %s"
+msgstr ""
+
#: judge/views/problem_data.py:37
msgid "Checker arguments must be a JSON object"
msgstr ""
@@ -2868,52 +2916,52 @@ msgstr ""
msgid "Best solutions for {0}"
msgstr ""
-#: judge/views/ranked_submission.py:80
+#: judge/views/ranked_submission.py:82
#, python-format
msgid "Best solutions for %(problem)s in %(contest)s"
msgstr ""
-#: judge/views/ranked_submission.py:83
+#: judge/views/ranked_submission.py:85
#, python-format
msgid "Best solutions for problem %(number)s in %(contest)s"
msgstr ""
-#: judge/views/ranked_submission.py:89
+#: judge/views/ranked_submission.py:91
#, python-brace-format
msgid "Best solutions for {0} in {2}"
msgstr ""
-#: judge/views/ranked_submission.py:92
+#: judge/views/ranked_submission.py:94
#, python-brace-format
msgid "Best solutions for problem {0} in {1}"
msgstr ""
-#: judge/views/register.py:27
+#: judge/views/register.py:26
msgid "A username must contain letters, numbers, or underscores"
msgstr ""
-#: judge/views/register.py:31
+#: judge/views/register.py:30
msgid "Preferred language"
msgstr ""
-#: judge/views/register.py:38
+#: judge/views/register.py:37
msgid "Subscribe to newsletter?"
msgstr ""
-#: judge/views/register.py:45
+#: judge/views/register.py:44
#, python-format
msgid "The email address \"%s\" is already taken. Only one registration is allowed per address."
msgstr "電子郵件地址“%s“已被使用。每個電子郵件地址只允許一個賬戶。"
-#: judge/views/register.py:51
+#: judge/views/register.py:50
msgid "Your email provider is not allowed due to history of abuse. Please use a reputable email provider."
msgstr "由於濫用歷史,我們不允許您的電子郵件提供商。請使用有信譽的電子郵件提供商。"
-#: judge/views/register.py:57 judge/views/register.py:95
+#: judge/views/register.py:56 judge/views/register.py:94
msgid "Registration"
msgstr ""
-#: judge/views/register.py:106
+#: judge/views/register.py:105
msgid "Authentication failure"
msgstr ""
@@ -2921,7 +2969,7 @@ msgstr ""
msgid "Language statistics"
msgstr ""
-#: judge/views/status.py:24 templates/submission/list.html:311
+#: judge/views/status.py:24 templates/submission/list.html:310
msgid "Status"
msgstr "狀態"
@@ -2929,74 +2977,74 @@ msgstr "狀態"
msgid "Version matrix"
msgstr ""
-#: judge/views/submission.py:53 judge/views/submission.py:60
+#: judge/views/submission.py:55 judge/views/submission.py:62
#, python-format
msgid "Submission of %(problem)s by %(user)s"
msgstr ""
-#: judge/views/submission.py:203 judge/views/submission.py:204
+#: judge/views/submission.py:205 judge/views/submission.py:206
#: templates/problem/problem.html:127
msgid "All submissions"
msgstr "全部的提交紀錄"
-#: judge/views/submission.py:349
+#: judge/views/submission.py:355
msgid "All my submissions"
msgstr "我的提交紀錄"
-#: judge/views/submission.py:350
+#: judge/views/submission.py:356
#, python-format
msgid "All submissions by %s"
msgstr "%s 的提交"
-#: judge/views/submission.py:381
+#: judge/views/submission.py:387
#, python-format
msgid "All submissions for %s"
msgstr ""
-#: judge/views/submission.py:400
+#: judge/views/submission.py:410
msgid "Must pass a problem"
msgstr ""
-#: judge/views/submission.py:439
+#: judge/views/submission.py:449
#, python-format
msgid "My submissions for %(problem)s"
msgstr ""
-#: judge/views/submission.py:440
+#: judge/views/submission.py:450
#, python-format
msgid "%(user)s's submissions for %(problem)s"
msgstr ""
-#: judge/views/submission.py:536
+#: judge/views/submission.py:546
msgid "Must pass a contest"
msgstr ""
-#: judge/views/submission.py:544
+#: judge/views/submission.py:554
#, python-format
msgid "My submissions in %(contest)s"
msgstr ""
-#: judge/views/submission.py:545
+#: judge/views/submission.py:555
#, python-format
msgid "%(user)s's submissions in %(contest)s"
msgstr ""
-#: judge/views/submission.py:559
+#: judge/views/submission.py:569
#, python-brace-format
msgid "My submissions in {0}"
msgstr ""
-#: judge/views/submission.py:561
+#: judge/views/submission.py:571
#, python-brace-format
msgid "{0}'s submissions in {2}"
msgstr ""
-#: judge/views/submission.py:585
+#: judge/views/submission.py:597
#, python-brace-format
msgid "{0}'s submissions for {2} in {4}"
msgstr "{4} 中{0} 在{2}< /a> 的提交歷史"
-#: judge/views/submission.py:590
+#: judge/views/submission.py:602
#, python-brace-format
msgid "{0}'s submissions for problem {2} in {3}"
msgstr "{0} 對 {3} 第 {2} 題提交的程序"
@@ -3013,40 +3061,40 @@ msgstr ""
msgid "You must solve at least one problem before you can create a ticket."
msgstr ""
-#: judge/views/ticket.py:87 judge/views/ticket.py:90
+#: judge/views/ticket.py:91 judge/views/ticket.py:94
#, python-format
msgid "New ticket for %s"
msgstr ""
-#: judge/views/ticket.py:144
+#: judge/views/ticket.py:148
#, python-format
msgid "%(title)s - Ticket %(id)d"
msgstr ""
-#: judge/views/ticket.py:249
+#: judge/views/ticket.py:253
#, python-format
msgid "Tickets - Page %(number)d of %(total)d"
msgstr ""
-#: judge/views/ticket.py:298
+#: judge/views/ticket.py:302
#, python-format
msgid "New Ticket: %s"
msgstr ""
-#: judge/views/ticket.py:299
+#: judge/views/ticket.py:303
#, python-format
msgid "#%(id)d, assigned to: %(users)s"
msgstr ""
-#: judge/views/ticket.py:301
+#: judge/views/ticket.py:305
msgid ", "
msgstr ","
-#: judge/views/ticket.py:301
+#: judge/views/ticket.py:305
msgid "no one"
msgstr "沒人"
-#: judge/views/ticket.py:321
+#: judge/views/ticket.py:325
#, python-format
msgid "New Ticket Message For: %s"
msgstr ""
@@ -3055,87 +3103,91 @@ msgstr ""
msgid "Enable Two-factor Authentication"
msgstr ""
-#: judge/views/two_factor.py:99
+#: judge/views/two_factor.py:108
+msgid "Refresh Two-factor Authentication"
+msgstr ""
+
+#: judge/views/two_factor.py:116
msgid "Disable Two-factor Authentication"
msgstr ""
-#: judge/views/two_factor.py:148
+#: judge/views/two_factor.py:165
msgid "Invalid WebAuthn response"
msgstr ""
-#: judge/views/two_factor.py:151
+#: judge/views/two_factor.py:168
msgid "Invalid name"
msgstr ""
-#: judge/views/two_factor.py:204
+#: judge/views/two_factor.py:221
msgid "Staff may not disable 2FA"
msgstr ""
-#: judge/views/two_factor.py:216
+#: judge/views/two_factor.py:229
msgid "Perform Two-factor Authentication"
msgstr ""
-#: judge/views/user.py:79
+#: judge/views/user.py:78
msgid "No such user"
msgstr ""
-#: judge/views/user.py:79
+#: judge/views/user.py:78
#, python-format
msgid "No user handle \"%s\"."
msgstr ""
-#: judge/views/user.py:83
+#: judge/views/user.py:82
msgid "My account"
msgstr "我的帳戶"
-#: judge/views/user.py:84
+#: judge/views/user.py:83
#, python-format
msgid "User %s"
msgstr "用戶 %s"
-#: judge/views/user.py:132
+#: judge/views/user.py:131
msgid "Login"
msgstr "登入"
-#: judge/views/user.py:173
+#: judge/views/user.py:172
msgid "M j, Y, G:i"
msgstr ""
-#: judge/views/user.py:307
+#: judge/views/user.py:306
msgid "Preparing your data..."
msgstr ""
-#: judge/views/user.py:311 templates/user/edit-profile.html:348
+#: judge/views/user.py:310 templates/user/edit-profile.html:352
msgid "Download your data"
msgstr ""
-#: judge/views/user.py:367
+#: judge/views/user.py:366
msgid "Updated on site"
msgstr ""
-#: judge/views/user.py:400 templates/admin/auth/user/change_form.html:14
+#: judge/views/user.py:399 templates/admin/auth/user/change_form.html:14
#: templates/admin/auth/user/change_form.html:17 templates/base.html:222
#: templates/user/user-tabs.html:16
msgid "Edit profile"
msgstr ""
-#: judge/views/user.py:415
+#: judge/views/user.py:414
msgid "Generated API token for user"
msgstr ""
-#: judge/views/user.py:427
+#: judge/views/user.py:426
msgid "Removed API token for user"
msgstr ""
-#: judge/views/user.py:437
+#: judge/views/user.py:436
msgid "Generated scratch codes for user"
msgstr ""
-#: judge/views/user.py:443 templates/user/user-list-tabs.html:4
+#: judge/views/user.py:442 templates/user/user-list-tabs.html:4
msgid "Leaderboard"
msgstr ""
-#: judge/views/user.py:504
+#: judge/views/user.py:503
msgid "You have been successfully logged out."
msgstr ""
@@ -3262,11 +3314,11 @@ msgstr "新聞 "
msgid "posted on {time}"
msgstr ""
-#: templates/blog/list.html:130 templates/problem/problem.html:309
+#: templates/blog/list.html:130 templates/problem/problem.html:311
msgid "Clarifications"
msgstr ""
-#: templates/blog/list.html:146 templates/problem/problem.html:320
+#: templates/blog/list.html:146 templates/problem/problem.html:322
msgid "No clarifications have been made at this time."
msgstr ""
@@ -3462,7 +3514,7 @@ msgid "Info"
msgstr "資料和信息"
#: templates/contest/contest-tabs.html:6 templates/stats/base.html:9
-#: templates/submission/list.html:337
+#: templates/submission/list.html:336
msgid "Statistics"
msgstr "統計数据"
@@ -3665,19 +3717,19 @@ msgstr ""
msgid "Disqualify"
msgstr ""
-#: templates/contest/ranking.html:169
+#: templates/contest/ranking.html:173
msgid "Are you sure you want to disqualify this participation?"
msgstr ""
-#: templates/contest/ranking.html:174
+#: templates/contest/ranking.html:178
msgid "Are you sure you want to un-disqualify this participation?"
msgstr ""
-#: templates/contest/ranking.html:246
+#: templates/contest/ranking.html:250
msgid "View user participation"
msgstr ""
-#: templates/contest/ranking.html:250
+#: templates/contest/ranking.html:254
msgid "Show organizations"
msgstr ""
@@ -3952,7 +4004,7 @@ msgstr ""
msgid "Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence."
msgstr "記住 只 在沒有思路時使用題解,不要從它複製粘貼代碼。請尊重題目和題解的作者。
在真正解決問題之前提交題解的代碼是可以封禁的罪行。 "
-#: templates/problem/editorial.html:27 templates/problem/problem.html:209
+#: templates/problem/editorial.html:27 templates/problem/problem.html:210
msgid "Author:"
msgid_plural "Authors:"
msgstr[0] "作者:"
@@ -4117,34 +4169,34 @@ msgstr "時間限制:"
msgid "Memory limit:"
msgstr "記憶體限制:"
-#: templates/problem/problem.html:224
+#: templates/problem/problem.html:226
msgid "Problem type"
msgid_plural "Problem types"
msgstr[0] "題目類型"
-#: templates/problem/problem.html:237
+#: templates/problem/problem.html:239
msgid "Allowed languages"
msgstr "允許的語言"
-#: templates/problem/problem.html:245
+#: templates/problem/problem.html:247
#, python-format
msgid "No %(lang)s judge online"
msgstr ""
-#: templates/problem/problem.html:256
+#: templates/problem/problem.html:258
msgid "Judge:"
msgid_plural "Judges:"
msgstr[0] "裁判服務器:"
-#: templates/problem/problem.html:273
+#: templates/problem/problem.html:275
msgid "none available"
msgstr ""
-#: templates/problem/problem.html:298
+#: templates/problem/problem.html:300
msgid "Request clarification"
msgstr ""
-#: templates/problem/problem.html:300
+#: templates/problem/problem.html:302
msgid "Report an issue"
msgstr ""
@@ -4189,7 +4241,7 @@ msgstr ""
msgid "Point range"
msgstr ""
-#: templates/problem/search-form.html:63 templates/submission/list.html:329
+#: templates/problem/search-form.html:63 templates/submission/list.html:328
#: templates/ticket/list.html:248
msgid "Go"
msgstr "搜索"
@@ -4235,7 +4287,7 @@ msgid "Invalid username or password."
msgstr ""
#: templates/registration/login.html:53
-#: templates/registration/two_factor_auth.html:86
+#: templates/registration/two_factor_auth.html:92
msgid "Login!"
msgstr "登錄!"
@@ -4355,12 +4407,12 @@ msgid "Default language"
msgstr ""
#: templates/registration/registration_form.html:184
-#: templates/user/edit-profile.html:310
+#: templates/user/edit-profile.html:314
msgid "Affiliated organizations"
msgstr ""
#: templates/registration/registration_form.html:190
-#: templates/user/edit-profile.html:324
+#: templates/user/edit-profile.html:328
msgid "Notify me about upcoming contests"
msgstr ""
@@ -4376,57 +4428,93 @@ msgstr ""
msgid "Register!"
msgstr ""
-#: templates/registration/totp_disable.html:38
+#: templates/registration/totp_disable.html:31
msgid "To protect your account, you must first authenticate before you can disable Two Factor Authentication."
msgstr "為了保護您的帳戶,您必須先進行身份驗證才能禁用兩因素認證。"
-#: templates/registration/totp_disable.html:45
+#: templates/registration/totp_disable.html:38
msgid "Enter the 6-digit code generated by your app or one of your 16-digit scratch codes:"
msgstr "輸入您應用生成的6位數代碼或者一個16位一次性代碼:"
-#: templates/registration/totp_disable.html:48
+#: templates/registration/totp_disable.html:41
msgid "Disable Two Factor Authentication"
msgstr ""
-#: templates/registration/totp_enable.html:75
+#: templates/registration/totp_enable.html:72
msgid "Scan this code with your authenticator app:"
msgstr ""
-#: templates/registration/totp_enable.html:76
+#: templates/registration/totp_enable.html:73
msgid "QR code"
msgstr "二維碼"
-#: templates/registration/totp_enable.html:77
+#: templates/registration/totp_enable.html:74
msgid "Or enter this code manually:"
msgstr ""
-#: templates/registration/totp_enable.html:88
+#: templates/registration/totp_enable.html:85
msgid "Enter the 6-digit code generated by your app:"
msgstr ""
-#: templates/registration/totp_enable.html:91
+#: templates/registration/totp_enable.html:90
+msgid "Refresh Two Factor Authentication"
+msgstr ""
+
+#: templates/registration/totp_enable.html:92
msgid "Enable Two Factor Authentication"
msgstr ""
+#: templates/registration/totp_enable.html:98
+msgid "Below is a list of one-time use scratch codes."
+msgstr ""
+
+#: templates/registration/totp_enable.html:99
+msgid "These codes can only be used once and are for emergency use."
+msgstr ""
+
+#: templates/registration/totp_enable.html:100
+msgid "You can use these codes to login to your account or disable two-factor authentication."
+msgstr ""
+
+#: templates/registration/totp_enable.html:101
+msgid "If you ever need more scratch codes, you can regenerate them on the edit profile tab."
+msgstr ""
+
+#: templates/registration/totp_enable.html:102
+msgid "Please write these down and keep them in a secure location."
+msgstr ""
+
+#: templates/registration/totp_enable.html:103
+msgid "These codes will never be shown again after you enable two-factor authentication."
+msgstr ""
+
#: templates/registration/two_factor_auth.html:33
-#: templates/user/edit-profile.html:161
+#: templates/user/edit-profile.html:165
msgid "WebAuthn is not supported by your browser."
msgstr ""
#: templates/registration/two_factor_auth.html:54
-#: templates/user/edit-profile.html:185
+#: templates/user/edit-profile.html:189
msgid "Failed to contact server."
msgstr ""
-#: templates/registration/two_factor_auth.html:77
+#: templates/registration/two_factor_auth.html:79
msgid "Enter the 6-digit code generated by your app or one of your 16-character scratch codes:"
msgstr "輸入您應用生成的6位數代碼或者一個16位一次性代碼:"
-#: templates/registration/two_factor_auth.html:83
-msgid "Use security key"
+#: templates/registration/two_factor_auth.html:81
+msgid "Enter one of your 16-character scratch codes:"
msgstr ""
#: templates/registration/two_factor_auth.html:89
+msgid "Use security key"
+msgstr ""
+
+#: templates/registration/two_factor_auth.html:94
+msgid "Use scratch code"
+msgstr ""
+
+#: templates/registration/two_factor_auth.html:97
#, python-format
msgid "If you lost your authentication device and are unable to use your scratch codes, please contact us at %(email)s."
msgstr "如果您丟失了您的身份驗證設備且無法使用您的驗證碼,請聯繫我們 %(email)s。"
@@ -4507,15 +4595,15 @@ msgstr ""
msgid "Filter by language..."
msgstr ""
-#: templates/submission/list.html:307
+#: templates/submission/list.html:306
msgid "Filter submissions"
msgstr ""
-#: templates/submission/list.html:343
+#: templates/submission/list.html:342
msgid "Total:"
msgstr "總計:"
-#: templates/submission/list.html:353
+#: templates/submission/list.html:352
msgid "You were disconnected. Refresh to show latest updates."
msgstr ""
@@ -4730,121 +4818,125 @@ msgstr "排名"
msgid "Search by handle..."
msgstr ""
-#: templates/user/edit-profile.html:109
+#: templates/user/edit-profile.html:113
msgid "Are you sure you want to generate or regenerate your API token?"
msgstr ""
-#: templates/user/edit-profile.html:110
+#: templates/user/edit-profile.html:114
msgid "This will invalidate any previous API tokens."
msgstr ""
-#: templates/user/edit-profile.html:111
+#: templates/user/edit-profile.html:115
msgid "It also allows access to your account without Two-factor Authentication."
msgstr ""
-#: templates/user/edit-profile.html:112
+#: templates/user/edit-profile.html:116
msgid "You will not be able to view your api token after you leave this page!"
msgstr ""
-#: templates/user/edit-profile.html:113 templates/user/edit-profile.html:207
+#: templates/user/edit-profile.html:117 templates/user/edit-profile.html:211
msgid "Generating..."
msgstr ""
-#: templates/user/edit-profile.html:121 templates/user/edit-profile.html:243
-#: templates/user/edit-profile.html:371 templates/user/edit-profile.html:390
+#: templates/user/edit-profile.html:125 templates/user/edit-profile.html:247
+#: templates/user/edit-profile.html:373 templates/user/edit-profile.html:395
msgid "Regenerate"
msgstr ""
-#: templates/user/edit-profile.html:127 templates/user/edit-profile.html:392
+#: templates/user/edit-profile.html:131 templates/user/edit-profile.html:397
msgid "Remove"
msgstr "刪除"
-#: templates/user/edit-profile.html:137
+#: templates/user/edit-profile.html:141
msgid "Are you sure you want to remove your API token?"
msgstr ""
-#: templates/user/edit-profile.html:144 templates/user/edit-profile.html:375
-#: templates/user/edit-profile.html:396
+#: templates/user/edit-profile.html:148 templates/user/edit-profile.html:377
+#: templates/user/edit-profile.html:401
msgid "Generate"
msgstr ""
-#: templates/user/edit-profile.html:190
+#: templates/user/edit-profile.html:194
msgid "Are you sure you want to delete this security key?"
msgstr ""
-#: templates/user/edit-profile.html:280
+#: templates/user/edit-profile.html:284
msgid "Self-description"
msgstr ""
-#: templates/user/edit-profile.html:287
+#: templates/user/edit-profile.html:291
msgid "Select your closest major city"
msgstr ""
-#: templates/user/edit-profile.html:296
+#: templates/user/edit-profile.html:300
msgid "Editor theme"
msgstr ""
-#: templates/user/edit-profile.html:301
+#: templates/user/edit-profile.html:305
msgid "Math engine"
msgstr ""
-#: templates/user/edit-profile.html:335 templates/user/edit-profile.html:337
+#: templates/user/edit-profile.html:339 templates/user/edit-profile.html:341
msgid "Change your avatar"
msgstr ""
-#: templates/user/edit-profile.html:342
+#: templates/user/edit-profile.html:346
msgid "Change your password"
msgstr ""
-#: templates/user/edit-profile.html:356
+#: templates/user/edit-profile.html:359
msgid "Two-factor Authentication is enabled"
msgstr ""
-#: templates/user/edit-profile.html:358
-msgid "Two-factor Authentication is disabled"
-msgstr ""
-
-#: templates/user/edit-profile.html:363 templates/user/edit-profile.html:365
+#: templates/user/edit-profile.html:362 templates/user/edit-profile.html:365
msgid "Disable"
msgstr "禁用"
-#: templates/user/edit-profile.html:368
+#: templates/user/edit-profile.html:367
+msgid "Refresh"
+msgstr ""
+
+#: templates/user/edit-profile.html:370
msgid "Scratch Codes:"
msgstr ""
-#: templates/user/edit-profile.html:372 templates/user/edit-profile.html:393
+#: templates/user/edit-profile.html:374 templates/user/edit-profile.html:398
msgid "Hidden"
msgstr "隱藏"
-#: templates/user/edit-profile.html:381
+#: templates/user/edit-profile.html:384
+msgid "Two-factor Authentication is disabled"
+msgstr ""
+
+#: templates/user/edit-profile.html:385
msgid "Enable"
msgstr "啟用"
-#: templates/user/edit-profile.html:387
+#: templates/user/edit-profile.html:392
msgid "API Token"
msgstr "API令牌"
-#: templates/user/edit-profile.html:404
+#: templates/user/edit-profile.html:409
msgid "Security keys"
msgstr ""
-#: templates/user/edit-profile.html:414
+#: templates/user/edit-profile.html:419
msgid "Delete"
msgstr "刪除"
-#: templates/user/edit-profile.html:421
+#: templates/user/edit-profile.html:426
msgid "Enter a name for this key"
msgstr ""
-#: templates/user/edit-profile.html:422
+#: templates/user/edit-profile.html:427
msgid "Add"
msgstr "添加"
-#: templates/user/edit-profile.html:430
+#: templates/user/edit-profile.html:435
msgid "User-script"
msgstr ""
-#: templates/user/edit-profile.html:434
+#: templates/user/edit-profile.html:439
msgid "Update profile"
msgstr ""
diff --git a/locale/zh_Hant/LC_MESSAGES/djangojs.po b/locale/zh_Hant/LC_MESSAGES/djangojs.po
index 73ca4feb17..2af6d8aef2 100644
--- a/locale/zh_Hant/LC_MESSAGES/djangojs.po
+++ b/locale/zh_Hant/LC_MESSAGES/djangojs.po
@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: dmoj\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-10-01 23:12+0000\n"
-"PO-Revision-Date: 2021-04-25 00:08\n"
+"PO-Revision-Date: 2021-07-07 00:27\n"
"Last-Translator: \n"
"Language-Team: Chinese Traditional\n"
"Language: zh_TW\n"