From 49dc9ff10c0fe3d7e950daab8d75f444c120226c Mon Sep 17 00:00:00 2001 From: thanhluong Date: Tue, 21 Jan 2020 15:35:58 +0900 Subject: [PATCH] Cloned DMOJ --- .browserslistrc | 1 + .flake8 | 24 + .github/workflows/build.yml | 17 + .github/workflows/compilemessages.yml | 40 + .github/workflows/makemessages.yml | 53 + .github/workflows/updatemessages.yml | 67 + .gitignore | 52 +- .gitmodules | 8 + 502.html | 62 + django_2_2_pymysql_patch.py | 17 + django_ace/__init__.py | 5 + django_ace/static/django_ace/img/contract.png | Bin 0 -> 304 bytes django_ace/static/django_ace/img/expand.png | Bin 0 -> 285 bytes django_ace/static/django_ace/widget.css | 58 + django_ace/static/django_ace/widget.js | 182 + django_ace/widgets.py | 57 + dmoj/__init__.py | 1 + dmoj/celery.py | 27 + dmoj/settings.py | 497 ++ dmoj/throttle_mail.py | 29 + dmoj/urls.py | 387 ++ dmoj/wsgi.py | 12 + dmoj/wsgi_async.py | 14 + dmoj_celery.py | 15 + dmoj_install_pymysql.py | 4 + event_socket_server/__init__.py | 11 + event_socket_server/base_server.py | 169 + event_socket_server/engines/__init__.py | 17 + event_socket_server/engines/epoll_server.py | 17 + event_socket_server/engines/poll_server.py | 97 + event_socket_server/engines/select_server.py | 49 + event_socket_server/handler.py | 27 + event_socket_server/helpers.py | 125 + event_socket_server/test_client.py | 94 + event_socket_server/test_server.py | 54 + judge/__init__.py | 1 + judge/admin/__init__.py | 37 + judge/admin/comments.py | 64 + judge/admin/contest.py | 269 + judge/admin/interface.py | 151 + judge/admin/organization.py | 66 + judge/admin/problem.py | 238 + judge/admin/profile.py | 118 + judge/admin/runtime.py | 120 + judge/admin/submission.py | 251 + judge/admin/taxon.py | 52 + judge/admin/ticket.py | 39 + judge/apps.py | 39 + judge/bridge/__init__.py | 6 + judge/bridge/djangohandler.py | 67 + judge/bridge/djangoserver.py | 7 + judge/bridge/judgecallback.py | 411 ++ judge/bridge/judgehandler.py | 268 + judge/bridge/judgelist.py | 123 + judge/bridge/judgeserver.py | 68 + judge/caching.py | 10 + judge/comments.py | 122 + judge/contest_format/__init__.py | 5 + judge/contest_format/atcoder.py | 113 + judge/contest_format/base.py | 91 + judge/contest_format/default.py | 70 + judge/contest_format/ecoo.py | 122 + judge/contest_format/ioi.py | 99 + judge/contest_format/registry.py | 16 + judge/dblock.py | 23 + judge/event_poster.py | 18 + judge/event_poster_amqp.py | 55 + judge/event_poster_ws.py | 82 + judge/feed.py | 99 + judge/fixtures/demo.json | 173 + judge/fixtures/language_small.json | 122 + judge/fixtures/navbar.json | 98 + judge/forms.py | 159 + judge/fulltext.py | 55 + judge/highlight_code.py | 37 + judge/jinja2/__init__.py | 36 + judge/jinja2/camo.py | 9 + judge/jinja2/datetime.py | 27 + judge/jinja2/filesize.py | 36 + judge/jinja2/gravatar.py | 25 + judge/jinja2/language.py | 18 + judge/jinja2/markdown/__init__.py | 142 + judge/jinja2/markdown/lazy_load.py | 20 + judge/jinja2/markdown/math.py | 65 + judge/jinja2/rating.py | 35 + judge/jinja2/reference.py | 187 + judge/jinja2/registry.py | 53 + judge/jinja2/render.py | 27 + judge/jinja2/social.py | 34 + judge/jinja2/spaceless.py | 29 + judge/jinja2/submission.py | 21 + judge/jinja2/timedelta.py | 28 + judge/judgeapi.py | 117 + judge/lxml_tree.py | 59 + judge/management/__init__.py | 0 judge/management/commands/__init__.py | 0 judge/management/commands/addjudge.py | 17 + judge/management/commands/adduser.py | 32 + judge/management/commands/camo.py | 16 + judge/management/commands/copy_language.py | 27 + judge/management/commands/create_problem.py | 23 + judge/management/commands/makedmojmessages.py | 130 + judge/management/commands/render_pdf.py | 58 + judge/management/commands/runbridged.py | 33 + judge/management/commands/runmoss.py | 53 + judge/middleware.py | 63 + .../0001_squashed_0084_contest_formats.py | 761 +++ judge/migrations/0085_submission_source.py | 39 + judge/migrations/0086_rating_ceiling.py | 23 + .../0087_problem_resource_limits.py | 24 + judge/migrations/0088_private_contests.py | 37 + .../migrations/0089_submission_to_contest.py | 27 + .../migrations/0090_fix_contest_visibility.py | 19 + .../0091_compiler_message_ansi2html.py | 23 + judge/migrations/0092_contest_clone.py | 17 + judge/migrations/0093_contest_moss.py | 45 + ...0094_submissiontestcase_unique_together.py | 14 + .../0095_organization_logo_override.py | 18 + .../0096_profile_language_set_default.py | 21 + .../0097_participation_is_disqualified.py | 23 + judge/migrations/__init__.py | 0 judge/models/__init__.py | 29 + judge/models/choices.py | 66 + judge/models/comment.py | 185 + judge/models/contest.py | 412 ++ judge/models/interface.py | 94 + judge/models/message.py | 20 + judge/models/problem.py | 413 ++ judge/models/problem_data.py | 94 + judge/models/profile.py | 204 + judge/models/runtime.py | 176 + judge/models/submission.py | 217 + judge/models/ticket.py | 30 + judge/pdf_problems.py | 268 + judge/performance_points.py | 78 + judge/ratings.py | 181 + judge/signals.py | 132 + judge/sitemap.py | 102 + judge/social_auth.py | 109 + judge/tasks/__init__.py | 3 + judge/tasks/demo.py | 25 + judge/tasks/moss.py | 57 + judge/tasks/submission.py | 67 + judge/template_context.py | 121 + judge/templatetags/__init__.py | 0 judge/templatetags/code_highlight.py | 10 + judge/templatetags/counter.py | 10 + judge/templatetags/dicts.py | 8 + judge/templatetags/list_processor.py | 58 + judge/templatetags/strings.py | 18 + judge/tests.py | 1 + judge/timezone.py | 27 + judge/user_log.py | 21 + judge/user_translations.py | 40 + judge/utils/__init__.py | 0 judge/utils/cachedict.py | 8 + judge/utils/camo.py | 48 + judge/utils/caniuse.py | 148 + judge/utils/celery.py | 67 + judge/utils/diggpaginator.py | 290 ++ judge/utils/file_cache.py | 45 + judge/utils/mathoid.py | 185 + judge/utils/opengraph.py | 24 + judge/utils/problem_data.py | 198 + judge/utils/problems.py | 147 + judge/utils/pwned.py | 137 + judge/utils/ranker.py | 34 + judge/utils/raw_sql.py | 96 + judge/utils/recaptcha.py | 11 + judge/utils/stats.py | 53 + judge/utils/strings.py | 12 + judge/utils/subscription.py | 8 + judge/utils/texoid.py | 85 + judge/utils/tickets.py | 17 + judge/utils/timedelta.py | 90 + judge/utils/unicode.py | 17 + judge/utils/views.py | 115 + judge/views/__init__.py | 10 + judge/views/api/__init__.py | 2 + judge/views/api/api_v1.py | 173 + judge/views/api/api_v2.py | 122 + judge/views/blog.py | 126 + judge/views/comment.py | 170 + judge/views/contests.py | 793 +++ judge/views/error.py | 33 + judge/views/language.py | 18 + judge/views/license.py | 14 + judge/views/mailgun.py | 65 + judge/views/organization.py | 330 ++ judge/views/preview.py | 50 + judge/views/problem.py | 674 +++ judge/views/problem_data.py | 241 + judge/views/problem_manage.py | 130 + judge/views/ranked_submission.py | 89 + judge/views/register.py | 108 + judge/views/select2.py | 138 + judge/views/stats.py | 68 + judge/views/status.py | 111 + judge/views/submission.py | 525 ++ judge/views/tasks.py | 66 + judge/views/ticket.py | 326 ++ judge/views/totp.py | 122 + judge/views/user.py | 324 ++ judge/views/widgets.py | 72 + judge/widgets/__init__.py | 4 + judge/widgets/checkbox.py | 22 + judge/widgets/mixins.py | 47 + judge/widgets/pagedown.py | 96 + judge/widgets/select2.py | 272 + locale/ar/LC_MESSAGES/django.po | 4619 +++++++++++++++++ locale/ar/LC_MESSAGES/djangojs.po | 34 + locale/de/LC_MESSAGES/django.po | 4531 ++++++++++++++++ locale/de/LC_MESSAGES/djangojs.po | 30 + locale/en/LC_MESSAGES/django.po | 3905 ++++++++++++++ locale/en/LC_MESSAGES/djangojs.po | 31 + locale/es/LC_MESSAGES/django.po | 4541 ++++++++++++++++ locale/es/LC_MESSAGES/djangojs.po | 30 + locale/fr/LC_MESSAGES/django.po | 4531 ++++++++++++++++ locale/fr/LC_MESSAGES/djangojs.po | 30 + locale/hr/LC_MESSAGES/django.po | 4553 ++++++++++++++++ locale/hr/LC_MESSAGES/djangojs.po | 31 + locale/hu/LC_MESSAGES/django.po | 4531 ++++++++++++++++ locale/hu/LC_MESSAGES/djangojs.po | 30 + locale/it/LC_MESSAGES/django.po | 4531 ++++++++++++++++ locale/it/LC_MESSAGES/djangojs.po | 30 + locale/ja/LC_MESSAGES/django.po | 4518 ++++++++++++++++ locale/ja/LC_MESSAGES/djangojs.po | 29 + locale/ko/LC_MESSAGES/django.po | 4509 ++++++++++++++++ locale/ko/LC_MESSAGES/djangojs.po | 29 + locale/lt/LC_MESSAGES/django.po | 4575 ++++++++++++++++ locale/lt/LC_MESSAGES/djangojs.po | 32 + locale/nl/LC_MESSAGES/django.po | 4531 ++++++++++++++++ locale/nl/LC_MESSAGES/djangojs.po | 30 + locale/pl/LC_MESSAGES/django.po | 4575 ++++++++++++++++ locale/pl/LC_MESSAGES/djangojs.po | 32 + locale/pt/LC_MESSAGES/django.po | 4531 ++++++++++++++++ locale/pt/LC_MESSAGES/djangojs.po | 30 + locale/ro/LC_MESSAGES/django.po | 4553 ++++++++++++++++ locale/ro/LC_MESSAGES/djangojs.po | 31 + locale/ru/LC_MESSAGES/django.po | 4575 ++++++++++++++++ locale/ru/LC_MESSAGES/djangojs.po | 32 + locale/ru/LC_MESSAGES/dmoj-user.po | 90 + locale/sr/LC_MESSAGES/django.po | 3303 ++++++++++++ locale/sr/LC_MESSAGES/djangojs.po | 31 + locale/sr/LC_MESSAGES/dmoj-user.po | 90 + locale/sr_Latn/LC_MESSAGES/django.po | 4553 ++++++++++++++++ locale/sr_Latn/LC_MESSAGES/djangojs.po | 31 + locale/tr/LC_MESSAGES/django.po | 4536 ++++++++++++++++ locale/tr/LC_MESSAGES/djangojs.po | 30 + locale/vi/LC_MESSAGES/django.po | 4513 ++++++++++++++++ locale/vi/LC_MESSAGES/djangojs.po | 29 + locale/zh_Hans/LC_MESSAGES/django.po | 4517 ++++++++++++++++ locale/zh_Hans/LC_MESSAGES/djangojs.po | 29 + locale/zh_Hant/LC_MESSAGES/django.po | 4509 ++++++++++++++++ locale/zh_Hant/LC_MESSAGES/djangojs.po | 29 + logo.png | Bin 0 -> 124198 bytes make_style.sh | 23 + manage.py | 17 + manifest.json | 41 + requirements.txt | 32 + resources/admin/css/pagedown.css | 10 + resources/admin/css/select2bootstrap.css | 3 + resources/base.scss | 674 +++ resources/blank.gif | Bin 0 -> 43 bytes resources/blog.scss | 122 + resources/comments.scss | 136 + resources/common.js | 355 ++ resources/content-description.scss | 258 + resources/contest.scss | 215 + resources/django_select2.js | 58 + resources/dmmd-preview.css | 41 + resources/dmmd-preview.js | 99 + resources/event.js | 68 + resources/favicon.ico | Bin 0 -> 1150 bytes resources/icons/android-chrome-144x144.png | Bin 0 -> 2841 bytes resources/icons/android-chrome-192x192.png | Bin 0 -> 3726 bytes resources/icons/android-chrome-36x36.png | Bin 0 -> 797 bytes resources/icons/android-chrome-48x48.png | Bin 0 -> 1043 bytes resources/icons/android-chrome-72x72.png | Bin 0 -> 1453 bytes resources/icons/android-chrome-96x96.png | Bin 0 -> 1915 bytes resources/icons/apple-touch-icon-114x114.png | Bin 0 -> 2049 bytes resources/icons/apple-touch-icon-120x120.png | Bin 0 -> 2262 bytes resources/icons/apple-touch-icon-144x144.png | Bin 0 -> 2713 bytes resources/icons/apple-touch-icon-152x152.png | Bin 0 -> 2964 bytes resources/icons/apple-touch-icon-180x180.png | Bin 0 -> 3294 bytes resources/icons/apple-touch-icon-57x57.png | Bin 0 -> 1146 bytes resources/icons/apple-touch-icon-60x60.png | Bin 0 -> 1198 bytes resources/icons/apple-touch-icon-72x72.png | Bin 0 -> 1425 bytes resources/icons/apple-touch-icon-76x76.png | Bin 0 -> 1442 bytes .../icons/apple-touch-icon-precomposed.png | Bin 0 -> 3939 bytes resources/icons/apple-touch-icon.png | Bin 0 -> 3294 bytes resources/icons/browserconfig.xml | 12 + resources/icons/favicon-16x16.png | Bin 0 -> 830 bytes resources/icons/favicon-32x32.png | Bin 0 -> 1364 bytes resources/icons/favicon-96x96.png | Bin 0 -> 1915 bytes resources/icons/favicon.ico | Bin 0 -> 15086 bytes resources/icons/icon.svg | 2 + resources/icons/logo.png | Bin 0 -> 9689 bytes resources/icons/logo.svg | 16 + resources/icons/manifest.json | 41 + resources/icons/mstile-144x144.png | Bin 0 -> 2841 bytes resources/icons/mstile-150x150.png | Bin 0 -> 2802 bytes resources/icons/mstile-310x150.png | Bin 0 -> 2498 bytes resources/icons/mstile-310x310.png | Bin 0 -> 4489 bytes resources/icons/mstile-70x70.png | Bin 0 -> 1874 bytes resources/icons/safari-pinned-tab.svg | 19 + resources/math.scss | 49 + resources/mathjax_config.js | 10 + resources/misc.scss | 55 + resources/pagedown_math.js | 17 + resources/pagedown_widget.css | 138 + resources/problem.scss | 292 ++ resources/problem_edit.css | 102 + resources/pygment-github.css | 61 + resources/ranks.scss | 105 + resources/status.scss | 44 + resources/style.scss | 14 + resources/submission.scss | 325 ++ resources/table.scss | 87 + resources/task_status.css | 169 + resources/unselectable.htc | 11 + resources/users.scss | 281 + resources/vars.scss | 11 + resources/widgets.scss | 518 ++ resources/wpadmin/css/wpadmin.site.css | 68 + robots.txt | 21 + templates/admin/auth/user/change_form.html | 20 + .../admin/judge/contest/change_form.html | 23 + .../admin/judge/contest/change_list.html | 13 + templates/admin/judge/judge/change_form.html | 26 + .../admin/judge/problem/change_form.html | 20 + .../admin/judge/profile/change_form.html | 20 + .../admin/judge/submission/change_form.html | 20 + templates/base.html | 313 ++ templates/blog/content.html | 53 + templates/blog/dashboard.html | 34 + templates/blog/list.html | 268 + templates/blog/media-css.html | 30 + templates/blog/preview.html | 1 + templates/comments/content.html | 1 + templates/comments/edit-ajax.html | 17 + templates/comments/edit.html | 13 + templates/comments/list.html | 159 + templates/comments/math.html | 3 + templates/comments/media-css.html | 103 + templates/comments/media-js.html | 206 + templates/comments/preview.html | 4 + templates/comments/revision-ajax.html | 3 + templates/comments/votes.html | 17 + templates/common-content.html | 81 + templates/contest/access_code.html | 35 + templates/contest/calendar.html | 46 + templates/contest/clone.html | 42 + templates/contest/contest-list-tabs.html | 26 + templates/contest/contest-tabs.html | 88 + templates/contest/contest.html | 137 + templates/contest/list.html | 307 ++ templates/contest/media-js.html | 13 + templates/contest/moss.html | 87 + templates/contest/preview.html | 4 + templates/contest/private.html | 20 + templates/contest/ranking-table.html | 68 + templates/contest/ranking.html | 259 + templates/contest/stats.html | 58 + templates/contest/tag-ajax.html | 7 + templates/contest/tag-title.html | 11 + templates/contest/tag.html | 9 + templates/error.html | 39 + templates/extra_js.html | 0 templates/flatpages/admin_link.html | 5 + templates/flatpages/default.html | 15 + templates/flatpages/markdown.html | 14 + templates/flatpages/markdown_math.html | 9 + templates/generic-message.html | 5 + templates/home.html | 23 + templates/license-preview.html | 1 + templates/license.html | 13 + templates/list-pages.html | 31 + templates/mathjax-load.html | 12 + templates/messages.html | 7 + templates/newsletter/common.html | 16 + templates/newsletter/message/message.html | 22 + templates/newsletter/message/message.txt | 15 + .../newsletter/message/message_subject.txt | 1 + templates/newsletter/message/subscribe.html | 20 + templates/newsletter/message/subscribe.txt | 9 + .../newsletter/message/subscribe_subject.txt | 1 + templates/newsletter/message/unsubscribe.html | 20 + templates/newsletter/message/unsubscribe.txt | 9 + .../message/unsubscribe_subject.txt | 1 + templates/newsletter/message/update.html | 20 + templates/newsletter/message/update.txt | 9 + .../newsletter/message/update_subject.txt | 1 + templates/newsletter/newsletter_detail.html | 13 + templates/newsletter/newsletter_list.html | 42 + templates/newsletter/submission_archive.html | 13 + .../newsletter/subscription_activate.html | 12 + .../newsletter/subscription_subscribe.html | 19 + .../subscription_subscribe_activated.html | 7 + .../subscription_subscribe_email_sent.html | 8 + .../subscription_subscribe_user.html | 22 + .../newsletter/subscription_unsubscribe.html | 17 + .../subscription_unsubscribe_activated.html | 9 + .../subscription_unsubscribe_email_sent.html | 9 + .../subscription_unsubscribe_user.html | 25 + templates/newsletter/subscription_update.html | 17 + .../subscription_update_activated.html | 9 + .../subscription_update_email_sent.html | 9 + templates/organization/edit.html | 48 + templates/organization/home.html | 63 + templates/organization/list.html | 36 + templates/organization/new.html | 12 + templates/organization/preview.html | 4 + templates/organization/requests/detail.html | 35 + templates/organization/requests/log.html | 30 + templates/organization/requests/pending.html | 39 + templates/organization/requests/request.html | 22 + templates/organization/requests/tabs.html | 16 + templates/organization/users-table.html | 19 + templates/organization/users.html | 33 + templates/pagedown.html | 14 + templates/pagedown/widgets/default.html | 9 + templates/problem/clone.html | 42 + templates/problem/data.html | 451 ++ templates/problem/editorial.html | 40 + templates/problem/list.html | 311 ++ templates/problem/manage_submission.html | 168 + templates/problem/preview.html | 4 + templates/problem/problem-list-tabs.html | 8 + templates/problem/problem.html | 332 ++ templates/problem/raw.html | 96 + templates/problem/search-form.html | 68 + templates/problem/submission-diff.html | 100 + templates/problem/submit.html | 256 + templates/problem/yaml.html | 20 + templates/registration/activate.html | 4 + .../registration/activation_complete.html | 4 + templates/registration/activation_email.html | 23 + templates/registration/activation_email.txt | 9 + .../registration/activation_email_subject.txt | 1 + templates/registration/login.html | 85 + templates/registration/logout.html | 4 + .../registration/password_change_done.html | 4 + .../registration/password_change_form.html | 10 + templates/registration/password_reset.html | 9 + .../registration/password_reset_complete.html | 5 + .../registration/password_reset_confirm.html | 14 + .../registration/password_reset_done.html | 6 + .../registration/password_reset_email.html | 19 + .../registration/password_reset_email.txt | 11 + .../registration/password_reset_subject.txt | 1 + templates/registration/profile_creation.html | 58 + .../registration/registration_closed.html | 4 + .../registration/registration_complete.html | 4 + templates/registration/registration_form.html | 220 + templates/registration/totp_auth.html | 43 + templates/registration/totp_disable.html | 51 + templates/registration/totp_enable.html | 89 + templates/registration/username_select.html | 9 + templates/runtime-version-fragment.html | 12 + templates/site-logo-fragment.html | 8 + templates/solution-preview.html | 4 + templates/stats/base.html | 18 + templates/stats/language.html | 55 + templates/stats/media-js.html | 68 + templates/status/judge-status-table.html | 67 + templates/status/judge-status.html | 23 + templates/status/language-list.html | 60 + templates/status/media-css.html | 14 + templates/status/media-js.html | 62 + templates/status/status-tabs.html | 7 + templates/status/versions.html | 42 + templates/submission/info-base.html | 16 + .../submission/internal-error-message.html | 18 + templates/submission/list.html | 377 ++ templates/submission/row.html | 79 + templates/submission/source.html | 59 + templates/submission/status-testcases.html | 141 + templates/submission/status.html | 94 + .../submission/submission-list-tabs.html | 17 + templates/tabs-base.html | 18 + templates/task_status.html | 100 + templates/ticket/edit-notes.html | 5 + templates/ticket/list.html | 278 + templates/ticket/message.html | 18 + templates/ticket/new.html | 40 + templates/ticket/new_problem.html | 12 + templates/ticket/preview.html | 4 + templates/ticket/row.html | 7 + templates/ticket/ticket.html | 391 ++ templates/time-remaining-fragment.html | 3 + templates/timezone/media-css.html | 27 + templates/timezone/media-js.html | 45 + templates/user/base-users-table.html | 32 + templates/user/base-users.html | 83 + templates/user/edit-profile.html | 188 + templates/user/link-list.html | 3 + templates/user/link.html | 1 + templates/user/list.html | 26 + templates/user/pp-row.html | 32 + templates/user/pp-table-body.html | 3 + templates/user/preview.html | 4 + templates/user/rating.html | 17 + templates/user/user-about.html | 186 + templates/user/user-base.html | 78 + templates/user/user-list-tabs.html | 6 + templates/user/user-problems.html | 119 + templates/user/user-tabs.html | 19 + templates/user/users-table.html | 30 + templates/widgets/relative-time.html | 6 + templates/widgets/select_all.html | 34 + websocket/daemon.js | 206 + websocket/wscat.js | 223 + 513 files changed, 132349 insertions(+), 39 deletions(-) create mode 100644 .browserslistrc create mode 100644 .flake8 create mode 100644 .github/workflows/build.yml create mode 100644 .github/workflows/compilemessages.yml create mode 100644 .github/workflows/makemessages.yml create mode 100644 .github/workflows/updatemessages.yml create mode 100644 .gitmodules create mode 100644 502.html create mode 100644 django_2_2_pymysql_patch.py create mode 100644 django_ace/__init__.py create mode 100644 django_ace/static/django_ace/img/contract.png create mode 100644 django_ace/static/django_ace/img/expand.png create mode 100644 django_ace/static/django_ace/widget.css create mode 100644 django_ace/static/django_ace/widget.js create mode 100644 django_ace/widgets.py create mode 100644 dmoj/__init__.py create mode 100644 dmoj/celery.py create mode 100644 dmoj/settings.py create mode 100644 dmoj/throttle_mail.py create mode 100644 dmoj/urls.py create mode 100644 dmoj/wsgi.py create mode 100644 dmoj/wsgi_async.py create mode 100644 dmoj_celery.py create mode 100644 dmoj_install_pymysql.py create mode 100644 event_socket_server/__init__.py create mode 100644 event_socket_server/base_server.py create mode 100644 event_socket_server/engines/__init__.py create mode 100644 event_socket_server/engines/epoll_server.py create mode 100644 event_socket_server/engines/poll_server.py create mode 100644 event_socket_server/engines/select_server.py create mode 100644 event_socket_server/handler.py create mode 100644 event_socket_server/helpers.py create mode 100644 event_socket_server/test_client.py create mode 100644 event_socket_server/test_server.py create mode 100644 judge/__init__.py create mode 100644 judge/admin/__init__.py create mode 100644 judge/admin/comments.py create mode 100644 judge/admin/contest.py create mode 100644 judge/admin/interface.py create mode 100644 judge/admin/organization.py create mode 100644 judge/admin/problem.py create mode 100644 judge/admin/profile.py create mode 100644 judge/admin/runtime.py create mode 100644 judge/admin/submission.py create mode 100644 judge/admin/taxon.py create mode 100644 judge/admin/ticket.py create mode 100644 judge/apps.py create mode 100644 judge/bridge/__init__.py create mode 100644 judge/bridge/djangohandler.py create mode 100644 judge/bridge/djangoserver.py create mode 100644 judge/bridge/judgecallback.py create mode 100644 judge/bridge/judgehandler.py create mode 100644 judge/bridge/judgelist.py create mode 100644 judge/bridge/judgeserver.py create mode 100644 judge/caching.py create mode 100644 judge/comments.py create mode 100644 judge/contest_format/__init__.py create mode 100644 judge/contest_format/atcoder.py create mode 100644 judge/contest_format/base.py create mode 100644 judge/contest_format/default.py create mode 100644 judge/contest_format/ecoo.py create mode 100644 judge/contest_format/ioi.py create mode 100644 judge/contest_format/registry.py create mode 100644 judge/dblock.py create mode 100644 judge/event_poster.py create mode 100644 judge/event_poster_amqp.py create mode 100644 judge/event_poster_ws.py create mode 100644 judge/feed.py create mode 100644 judge/fixtures/demo.json create mode 100644 judge/fixtures/language_small.json create mode 100644 judge/fixtures/navbar.json create mode 100644 judge/forms.py create mode 100644 judge/fulltext.py create mode 100644 judge/highlight_code.py create mode 100644 judge/jinja2/__init__.py create mode 100644 judge/jinja2/camo.py create mode 100644 judge/jinja2/datetime.py create mode 100644 judge/jinja2/filesize.py create mode 100644 judge/jinja2/gravatar.py create mode 100644 judge/jinja2/language.py create mode 100644 judge/jinja2/markdown/__init__.py create mode 100644 judge/jinja2/markdown/lazy_load.py create mode 100644 judge/jinja2/markdown/math.py create mode 100644 judge/jinja2/rating.py create mode 100644 judge/jinja2/reference.py create mode 100644 judge/jinja2/registry.py create mode 100644 judge/jinja2/render.py create mode 100644 judge/jinja2/social.py create mode 100644 judge/jinja2/spaceless.py create mode 100644 judge/jinja2/submission.py create mode 100644 judge/jinja2/timedelta.py create mode 100644 judge/judgeapi.py create mode 100644 judge/lxml_tree.py create mode 100644 judge/management/__init__.py create mode 100644 judge/management/commands/__init__.py create mode 100644 judge/management/commands/addjudge.py create mode 100644 judge/management/commands/adduser.py create mode 100644 judge/management/commands/camo.py create mode 100644 judge/management/commands/copy_language.py create mode 100644 judge/management/commands/create_problem.py create mode 100644 judge/management/commands/makedmojmessages.py create mode 100644 judge/management/commands/render_pdf.py create mode 100644 judge/management/commands/runbridged.py create mode 100644 judge/management/commands/runmoss.py create mode 100644 judge/middleware.py create mode 100644 judge/migrations/0001_squashed_0084_contest_formats.py create mode 100644 judge/migrations/0085_submission_source.py create mode 100644 judge/migrations/0086_rating_ceiling.py create mode 100644 judge/migrations/0087_problem_resource_limits.py create mode 100644 judge/migrations/0088_private_contests.py create mode 100644 judge/migrations/0089_submission_to_contest.py create mode 100644 judge/migrations/0090_fix_contest_visibility.py create mode 100644 judge/migrations/0091_compiler_message_ansi2html.py create mode 100644 judge/migrations/0092_contest_clone.py create mode 100644 judge/migrations/0093_contest_moss.py create mode 100644 judge/migrations/0094_submissiontestcase_unique_together.py create mode 100644 judge/migrations/0095_organization_logo_override.py create mode 100644 judge/migrations/0096_profile_language_set_default.py create mode 100644 judge/migrations/0097_participation_is_disqualified.py create mode 100644 judge/migrations/__init__.py create mode 100644 judge/models/__init__.py create mode 100644 judge/models/choices.py create mode 100644 judge/models/comment.py create mode 100644 judge/models/contest.py create mode 100644 judge/models/interface.py create mode 100644 judge/models/message.py create mode 100644 judge/models/problem.py create mode 100644 judge/models/problem_data.py create mode 100644 judge/models/profile.py create mode 100644 judge/models/runtime.py create mode 100644 judge/models/submission.py create mode 100644 judge/models/ticket.py create mode 100644 judge/pdf_problems.py create mode 100644 judge/performance_points.py create mode 100644 judge/ratings.py create mode 100644 judge/signals.py create mode 100644 judge/sitemap.py create mode 100644 judge/social_auth.py create mode 100644 judge/tasks/__init__.py create mode 100644 judge/tasks/demo.py create mode 100644 judge/tasks/moss.py create mode 100644 judge/tasks/submission.py create mode 100644 judge/template_context.py create mode 100644 judge/templatetags/__init__.py create mode 100644 judge/templatetags/code_highlight.py create mode 100644 judge/templatetags/counter.py create mode 100644 judge/templatetags/dicts.py create mode 100644 judge/templatetags/list_processor.py create mode 100644 judge/templatetags/strings.py create mode 100644 judge/tests.py create mode 100644 judge/timezone.py create mode 100644 judge/user_log.py create mode 100644 judge/user_translations.py create mode 100644 judge/utils/__init__.py create mode 100644 judge/utils/cachedict.py create mode 100644 judge/utils/camo.py create mode 100644 judge/utils/caniuse.py create mode 100644 judge/utils/celery.py create mode 100644 judge/utils/diggpaginator.py create mode 100644 judge/utils/file_cache.py create mode 100644 judge/utils/mathoid.py create mode 100644 judge/utils/opengraph.py create mode 100644 judge/utils/problem_data.py create mode 100644 judge/utils/problems.py create mode 100644 judge/utils/pwned.py create mode 100644 judge/utils/ranker.py create mode 100644 judge/utils/raw_sql.py create mode 100644 judge/utils/recaptcha.py create mode 100644 judge/utils/stats.py create mode 100644 judge/utils/strings.py create mode 100644 judge/utils/subscription.py create mode 100644 judge/utils/texoid.py create mode 100644 judge/utils/tickets.py create mode 100644 judge/utils/timedelta.py create mode 100644 judge/utils/unicode.py create mode 100644 judge/utils/views.py create mode 100644 judge/views/__init__.py create mode 100644 judge/views/api/__init__.py create mode 100644 judge/views/api/api_v1.py create mode 100644 judge/views/api/api_v2.py create mode 100644 judge/views/blog.py create mode 100644 judge/views/comment.py create mode 100644 judge/views/contests.py create mode 100644 judge/views/error.py create mode 100644 judge/views/language.py create mode 100644 judge/views/license.py create mode 100644 judge/views/mailgun.py create mode 100644 judge/views/organization.py create mode 100644 judge/views/preview.py create mode 100644 judge/views/problem.py create mode 100644 judge/views/problem_data.py create mode 100644 judge/views/problem_manage.py create mode 100644 judge/views/ranked_submission.py create mode 100644 judge/views/register.py create mode 100644 judge/views/select2.py create mode 100644 judge/views/stats.py create mode 100644 judge/views/status.py create mode 100644 judge/views/submission.py create mode 100644 judge/views/tasks.py create mode 100644 judge/views/ticket.py create mode 100644 judge/views/totp.py create mode 100644 judge/views/user.py create mode 100644 judge/views/widgets.py create mode 100644 judge/widgets/__init__.py create mode 100644 judge/widgets/checkbox.py create mode 100644 judge/widgets/mixins.py create mode 100644 judge/widgets/pagedown.py create mode 100644 judge/widgets/select2.py create mode 100644 locale/ar/LC_MESSAGES/django.po create mode 100644 locale/ar/LC_MESSAGES/djangojs.po create mode 100644 locale/de/LC_MESSAGES/django.po create mode 100644 locale/de/LC_MESSAGES/djangojs.po create mode 100644 locale/en/LC_MESSAGES/django.po create mode 100644 locale/en/LC_MESSAGES/djangojs.po create mode 100644 locale/es/LC_MESSAGES/django.po create mode 100644 locale/es/LC_MESSAGES/djangojs.po create mode 100644 locale/fr/LC_MESSAGES/django.po create mode 100644 locale/fr/LC_MESSAGES/djangojs.po create mode 100644 locale/hr/LC_MESSAGES/django.po create mode 100644 locale/hr/LC_MESSAGES/djangojs.po create mode 100644 locale/hu/LC_MESSAGES/django.po create mode 100644 locale/hu/LC_MESSAGES/djangojs.po create mode 100644 locale/it/LC_MESSAGES/django.po create mode 100644 locale/it/LC_MESSAGES/djangojs.po create mode 100644 locale/ja/LC_MESSAGES/django.po create mode 100644 locale/ja/LC_MESSAGES/djangojs.po create mode 100644 locale/ko/LC_MESSAGES/django.po create mode 100644 locale/ko/LC_MESSAGES/djangojs.po create mode 100644 locale/lt/LC_MESSAGES/django.po create mode 100644 locale/lt/LC_MESSAGES/djangojs.po create mode 100644 locale/nl/LC_MESSAGES/django.po create mode 100644 locale/nl/LC_MESSAGES/djangojs.po create mode 100644 locale/pl/LC_MESSAGES/django.po create mode 100644 locale/pl/LC_MESSAGES/djangojs.po create mode 100644 locale/pt/LC_MESSAGES/django.po create mode 100644 locale/pt/LC_MESSAGES/djangojs.po create mode 100644 locale/ro/LC_MESSAGES/django.po create mode 100644 locale/ro/LC_MESSAGES/djangojs.po create mode 100644 locale/ru/LC_MESSAGES/django.po create mode 100644 locale/ru/LC_MESSAGES/djangojs.po create mode 100644 locale/ru/LC_MESSAGES/dmoj-user.po create mode 100644 locale/sr/LC_MESSAGES/django.po create mode 100644 locale/sr/LC_MESSAGES/djangojs.po create mode 100644 locale/sr/LC_MESSAGES/dmoj-user.po create mode 100644 locale/sr_Latn/LC_MESSAGES/django.po create mode 100644 locale/sr_Latn/LC_MESSAGES/djangojs.po create mode 100644 locale/tr/LC_MESSAGES/django.po create mode 100644 locale/tr/LC_MESSAGES/djangojs.po create mode 100644 locale/vi/LC_MESSAGES/django.po create mode 100644 locale/vi/LC_MESSAGES/djangojs.po create mode 100644 locale/zh_Hans/LC_MESSAGES/django.po create mode 100644 locale/zh_Hans/LC_MESSAGES/djangojs.po create mode 100644 locale/zh_Hant/LC_MESSAGES/django.po create mode 100644 locale/zh_Hant/LC_MESSAGES/djangojs.po create mode 100644 logo.png create mode 100755 make_style.sh create mode 100644 manage.py create mode 100644 manifest.json create mode 100644 requirements.txt create mode 100644 resources/admin/css/pagedown.css create mode 100644 resources/admin/css/select2bootstrap.css create mode 100644 resources/base.scss create mode 100644 resources/blank.gif create mode 100644 resources/blog.scss create mode 100644 resources/comments.scss create mode 100644 resources/common.js create mode 100644 resources/content-description.scss create mode 100644 resources/contest.scss create mode 100644 resources/django_select2.js create mode 100644 resources/dmmd-preview.css create mode 100644 resources/dmmd-preview.js create mode 100644 resources/event.js create mode 100644 resources/favicon.ico create mode 100644 resources/icons/android-chrome-144x144.png create mode 100644 resources/icons/android-chrome-192x192.png create mode 100644 resources/icons/android-chrome-36x36.png create mode 100644 resources/icons/android-chrome-48x48.png create mode 100644 resources/icons/android-chrome-72x72.png create mode 100644 resources/icons/android-chrome-96x96.png create mode 100644 resources/icons/apple-touch-icon-114x114.png create mode 100644 resources/icons/apple-touch-icon-120x120.png create mode 100644 resources/icons/apple-touch-icon-144x144.png create mode 100644 resources/icons/apple-touch-icon-152x152.png create mode 100644 resources/icons/apple-touch-icon-180x180.png create mode 100644 resources/icons/apple-touch-icon-57x57.png create mode 100644 resources/icons/apple-touch-icon-60x60.png create mode 100644 resources/icons/apple-touch-icon-72x72.png create mode 100644 resources/icons/apple-touch-icon-76x76.png create mode 100644 resources/icons/apple-touch-icon-precomposed.png create mode 100644 resources/icons/apple-touch-icon.png create mode 100644 resources/icons/browserconfig.xml create mode 100644 resources/icons/favicon-16x16.png create mode 100644 resources/icons/favicon-32x32.png create mode 100644 resources/icons/favicon-96x96.png create mode 100644 resources/icons/favicon.ico create mode 100644 resources/icons/icon.svg create mode 100644 resources/icons/logo.png create mode 100644 resources/icons/logo.svg create mode 100644 resources/icons/manifest.json create mode 100644 resources/icons/mstile-144x144.png create mode 100644 resources/icons/mstile-150x150.png create mode 100644 resources/icons/mstile-310x150.png create mode 100644 resources/icons/mstile-310x310.png create mode 100644 resources/icons/mstile-70x70.png create mode 100644 resources/icons/safari-pinned-tab.svg create mode 100644 resources/math.scss create mode 100644 resources/mathjax_config.js create mode 100644 resources/misc.scss create mode 100644 resources/pagedown_math.js create mode 100644 resources/pagedown_widget.css create mode 100644 resources/problem.scss create mode 100644 resources/problem_edit.css create mode 100644 resources/pygment-github.css create mode 100644 resources/ranks.scss create mode 100644 resources/status.scss create mode 100644 resources/style.scss create mode 100644 resources/submission.scss create mode 100644 resources/table.scss create mode 100644 resources/task_status.css create mode 100644 resources/unselectable.htc create mode 100644 resources/users.scss create mode 100644 resources/vars.scss create mode 100644 resources/widgets.scss create mode 100644 resources/wpadmin/css/wpadmin.site.css create mode 100644 robots.txt create mode 100644 templates/admin/auth/user/change_form.html create mode 100644 templates/admin/judge/contest/change_form.html create mode 100644 templates/admin/judge/contest/change_list.html create mode 100644 templates/admin/judge/judge/change_form.html create mode 100644 templates/admin/judge/problem/change_form.html create mode 100644 templates/admin/judge/profile/change_form.html create mode 100644 templates/admin/judge/submission/change_form.html create mode 100644 templates/base.html create mode 100644 templates/blog/content.html create mode 100644 templates/blog/dashboard.html create mode 100644 templates/blog/list.html create mode 100644 templates/blog/media-css.html create mode 100644 templates/blog/preview.html create mode 100644 templates/comments/content.html create mode 100644 templates/comments/edit-ajax.html create mode 100644 templates/comments/edit.html create mode 100644 templates/comments/list.html create mode 100644 templates/comments/math.html create mode 100644 templates/comments/media-css.html create mode 100644 templates/comments/media-js.html create mode 100644 templates/comments/preview.html create mode 100644 templates/comments/revision-ajax.html create mode 100644 templates/comments/votes.html create mode 100644 templates/common-content.html create mode 100644 templates/contest/access_code.html create mode 100644 templates/contest/calendar.html create mode 100644 templates/contest/clone.html create mode 100644 templates/contest/contest-list-tabs.html create mode 100644 templates/contest/contest-tabs.html create mode 100644 templates/contest/contest.html create mode 100644 templates/contest/list.html create mode 100644 templates/contest/media-js.html create mode 100644 templates/contest/moss.html create mode 100644 templates/contest/preview.html create mode 100644 templates/contest/private.html create mode 100644 templates/contest/ranking-table.html create mode 100644 templates/contest/ranking.html create mode 100644 templates/contest/stats.html create mode 100644 templates/contest/tag-ajax.html create mode 100644 templates/contest/tag-title.html create mode 100644 templates/contest/tag.html create mode 100644 templates/error.html create mode 100644 templates/extra_js.html create mode 100644 templates/flatpages/admin_link.html create mode 100644 templates/flatpages/default.html create mode 100644 templates/flatpages/markdown.html create mode 100644 templates/flatpages/markdown_math.html create mode 100644 templates/generic-message.html create mode 100644 templates/home.html create mode 100644 templates/license-preview.html create mode 100644 templates/license.html create mode 100644 templates/list-pages.html create mode 100644 templates/mathjax-load.html create mode 100644 templates/messages.html create mode 100644 templates/newsletter/common.html create mode 100644 templates/newsletter/message/message.html create mode 100644 templates/newsletter/message/message.txt create mode 100644 templates/newsletter/message/message_subject.txt create mode 100644 templates/newsletter/message/subscribe.html create mode 100644 templates/newsletter/message/subscribe.txt create mode 100644 templates/newsletter/message/subscribe_subject.txt create mode 100644 templates/newsletter/message/unsubscribe.html create mode 100644 templates/newsletter/message/unsubscribe.txt create mode 100644 templates/newsletter/message/unsubscribe_subject.txt create mode 100644 templates/newsletter/message/update.html create mode 100644 templates/newsletter/message/update.txt create mode 100644 templates/newsletter/message/update_subject.txt create mode 100644 templates/newsletter/newsletter_detail.html create mode 100644 templates/newsletter/newsletter_list.html create mode 100644 templates/newsletter/submission_archive.html create mode 100644 templates/newsletter/subscription_activate.html create mode 100644 templates/newsletter/subscription_subscribe.html create mode 100644 templates/newsletter/subscription_subscribe_activated.html create mode 100644 templates/newsletter/subscription_subscribe_email_sent.html create mode 100644 templates/newsletter/subscription_subscribe_user.html create mode 100644 templates/newsletter/subscription_unsubscribe.html create mode 100644 templates/newsletter/subscription_unsubscribe_activated.html create mode 100644 templates/newsletter/subscription_unsubscribe_email_sent.html create mode 100644 templates/newsletter/subscription_unsubscribe_user.html create mode 100644 templates/newsletter/subscription_update.html create mode 100644 templates/newsletter/subscription_update_activated.html create mode 100644 templates/newsletter/subscription_update_email_sent.html create mode 100644 templates/organization/edit.html create mode 100644 templates/organization/home.html create mode 100644 templates/organization/list.html create mode 100644 templates/organization/new.html create mode 100644 templates/organization/preview.html create mode 100644 templates/organization/requests/detail.html create mode 100644 templates/organization/requests/log.html create mode 100644 templates/organization/requests/pending.html create mode 100644 templates/organization/requests/request.html create mode 100644 templates/organization/requests/tabs.html create mode 100644 templates/organization/users-table.html create mode 100644 templates/organization/users.html create mode 100644 templates/pagedown.html create mode 100644 templates/pagedown/widgets/default.html create mode 100644 templates/problem/clone.html create mode 100644 templates/problem/data.html create mode 100644 templates/problem/editorial.html create mode 100644 templates/problem/list.html create mode 100644 templates/problem/manage_submission.html create mode 100644 templates/problem/preview.html create mode 100644 templates/problem/problem-list-tabs.html create mode 100644 templates/problem/problem.html create mode 100644 templates/problem/raw.html create mode 100644 templates/problem/search-form.html create mode 100644 templates/problem/submission-diff.html create mode 100644 templates/problem/submit.html create mode 100644 templates/problem/yaml.html create mode 100644 templates/registration/activate.html create mode 100644 templates/registration/activation_complete.html create mode 100644 templates/registration/activation_email.html create mode 100644 templates/registration/activation_email.txt create mode 100644 templates/registration/activation_email_subject.txt create mode 100644 templates/registration/login.html create mode 100644 templates/registration/logout.html create mode 100644 templates/registration/password_change_done.html create mode 100644 templates/registration/password_change_form.html create mode 100644 templates/registration/password_reset.html create mode 100644 templates/registration/password_reset_complete.html create mode 100644 templates/registration/password_reset_confirm.html create mode 100644 templates/registration/password_reset_done.html create mode 100644 templates/registration/password_reset_email.html create mode 100644 templates/registration/password_reset_email.txt create mode 100644 templates/registration/password_reset_subject.txt create mode 100644 templates/registration/profile_creation.html create mode 100644 templates/registration/registration_closed.html create mode 100644 templates/registration/registration_complete.html create mode 100644 templates/registration/registration_form.html create mode 100644 templates/registration/totp_auth.html create mode 100644 templates/registration/totp_disable.html create mode 100644 templates/registration/totp_enable.html create mode 100644 templates/registration/username_select.html create mode 100644 templates/runtime-version-fragment.html create mode 100644 templates/site-logo-fragment.html create mode 100644 templates/solution-preview.html create mode 100644 templates/stats/base.html create mode 100644 templates/stats/language.html create mode 100644 templates/stats/media-js.html create mode 100644 templates/status/judge-status-table.html create mode 100644 templates/status/judge-status.html create mode 100644 templates/status/language-list.html create mode 100644 templates/status/media-css.html create mode 100644 templates/status/media-js.html create mode 100644 templates/status/status-tabs.html create mode 100644 templates/status/versions.html create mode 100644 templates/submission/info-base.html create mode 100644 templates/submission/internal-error-message.html create mode 100644 templates/submission/list.html create mode 100644 templates/submission/row.html create mode 100644 templates/submission/source.html create mode 100644 templates/submission/status-testcases.html create mode 100644 templates/submission/status.html create mode 100644 templates/submission/submission-list-tabs.html create mode 100644 templates/tabs-base.html create mode 100644 templates/task_status.html create mode 100644 templates/ticket/edit-notes.html create mode 100644 templates/ticket/list.html create mode 100644 templates/ticket/message.html create mode 100644 templates/ticket/new.html create mode 100644 templates/ticket/new_problem.html create mode 100644 templates/ticket/preview.html create mode 100644 templates/ticket/row.html create mode 100644 templates/ticket/ticket.html create mode 100644 templates/time-remaining-fragment.html create mode 100644 templates/timezone/media-css.html create mode 100644 templates/timezone/media-js.html create mode 100644 templates/user/base-users-table.html create mode 100644 templates/user/base-users.html create mode 100644 templates/user/edit-profile.html create mode 100644 templates/user/link-list.html create mode 100644 templates/user/link.html create mode 100644 templates/user/list.html create mode 100644 templates/user/pp-row.html create mode 100644 templates/user/pp-table-body.html create mode 100644 templates/user/preview.html create mode 100644 templates/user/rating.html create mode 100644 templates/user/user-about.html create mode 100644 templates/user/user-base.html create mode 100644 templates/user/user-list-tabs.html create mode 100644 templates/user/user-problems.html create mode 100644 templates/user/user-tabs.html create mode 100644 templates/user/users-table.html create mode 100644 templates/widgets/relative-time.html create mode 100644 templates/widgets/select_all.html create mode 100644 websocket/daemon.js create mode 100644 websocket/wscat.js diff --git a/.browserslistrc b/.browserslistrc new file mode 100644 index 0000000..e4fa363 --- /dev/null +++ b/.browserslistrc @@ -0,0 +1 @@ +cover 97% diff --git a/.flake8 b/.flake8 new file mode 100644 index 0000000..75139b4 --- /dev/null +++ b/.flake8 @@ -0,0 +1,24 @@ +[flake8] +max-line-length = 120 +application-import-names = dmoj,judge,django_ace,event_socket_server +import-order-style = pycharm +enable-extensions = G +ignore = + W504, # line break occurred after a binary operator + # allow only generator_stop and annotations future imports + FI10,FI11,FI12,FI13,FI14,FI15,FI16,FI17,FI18,FI55,FI58, + C814, # missing trailing comma in Python 2 only +per-file-ignores = + # F401: unused imports, ignore in all __init__.py + # F403: import * + ./*/__init__.py:F401,F403 + # F405: name comes from import * + ./event_socket_server/__init__.py:F401,F403,F405 + ./judge/management/commands/runmoss.py:F403,F405 + # E501: line too long, ignore in migrations + ./judge/migrations/*.py:E501 + # E303: too many blank lines + # PyCharm likes to have double lines between class/def in an if statement. + ./judge/widgets/pagedown.py:E303 +exclude = + ./dmoj/local_settings.py, # belongs to the user diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..7d1a74e --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,17 @@ +name: build +on: [push, pull_request] +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v1 + - name: Set up Python 3.7 + uses: actions/setup-python@v1 + with: + python-version: 3.7 + - name: Install flake8 + run: pip install flake8 flake8-import-order flake8-future-import flake8-commas flake8-logging-format + - name: Lint with flake8 + run: | + flake8 --version + flake8 diff --git a/.github/workflows/compilemessages.yml b/.github/workflows/compilemessages.yml new file mode 100644 index 0000000..edcf2bd --- /dev/null +++ b/.github/workflows/compilemessages.yml @@ -0,0 +1,40 @@ +name: compilemessages +on: + push: + paths: + - 'locale/**' + pull_request: + paths: + - 'locale/**' +jobs: + compilemessages: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v1 + - name: Set up Python 3.7 + uses: actions/setup-python@v1 + with: + python-version: 3.7 + - name: Checkout submodules + run: | + git submodule init + git submodule update + - name: Install requirements + run: | + sudo apt-get install gettext + pip install -r requirements.txt + pip install pymysql + - name: Check .po file validity + run: | + fail=0 + while read -r file; do + if ! msgfmt --check-format "$file"; then + fail=$((fail + 1)) + fi + done < <(find locale -name '*.po') + exit "$fail" + shell: bash + - name: Compile messages + run: | + echo "STATIC_ROOT = '/tmp'" > dmoj/local_settings.py + python manage.py compilemessages diff --git a/.github/workflows/makemessages.yml b/.github/workflows/makemessages.yml new file mode 100644 index 0000000..fdf375d --- /dev/null +++ b/.github/workflows/makemessages.yml @@ -0,0 +1,53 @@ +name: makemessages +on: + push: + branches: + - master +jobs: + makemessages: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v1 + - name: Set up Python 3.7 + uses: actions/setup-python@v1 + with: + python-version: 3.7 + - name: Checkout submodules + run: | + git submodule init + git submodule update + - name: Install requirements + run: | + sudo apt-get install gettext + curl -O https://artifacts.crowdin.com/repo/deb/crowdin.deb + sudo dpkg -i crowdin.deb + pip install -r requirements.txt + pip install pymysql + - name: Collect localizable strings + run: | + echo "STATIC_ROOT = '/tmp'" > dmoj/local_settings.py + python manage.py makemessages -l en -e py,html,txt + python manage.py makemessages -l en -d djangojs + - name: Upload strings to Crowdin + env: + CROWDIN_API_TOKEN: ${{ secrets.CROWDIN_API_TOKEN }} + run: | + cat > crowdin.yaml <> crowdin.yaml + crowdin upload sources diff --git a/.github/workflows/updatemessages.yml b/.github/workflows/updatemessages.yml new file mode 100644 index 0000000..b000444 --- /dev/null +++ b/.github/workflows/updatemessages.yml @@ -0,0 +1,67 @@ +name: updatemessages +on: + schedule: + - cron: '0 * * * *' +jobs: + updatemessages: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v1 + - name: Set up Python 3.7 + uses: actions/setup-python@v1 + with: + python-version: 3.7 + - name: Checkout submodules + run: | + git submodule init + git submodule update + - name: Install requirements + run: | + sudo apt-get install gettext + curl -O https://artifacts.crowdin.com/repo/deb/crowdin.deb + sudo dpkg -i crowdin.deb + pip install -r requirements.txt + pip install pymysql + - name: Download strings from Crowdin + env: + CROWDIN_API_TOKEN: ${{ secrets.CROWDIN_API_TOKEN }} + run: | + cat > crowdin.yaml <> crowdin.yaml + crowdin download + rm crowdin.yaml + - name: Cleanup + run: | + rm -rf src/ + git add locale + git checkout . + git clean -fd + - name: Create pull request + uses: peter-evans/create-pull-request@v1.4.1-multi + env: + GITHUB_TOKEN: ${{ secrets.REPO_SCOPED_TOKEN }} + COMMIT_MESSAGE: 'i18n: update translations from Crowdin' + PULL_REQUEST_TITLE: 'Update translations from Crowdin' + PULL_REQUEST_BODY: This PR has been auto-generated to pull in latest translations from [Crowdin](https://translate.dmoj.ca). + PULL_REQUEST_LABELS: i18n, enhancement + PULL_REQUEST_REVIEWERS: Xyene, quantum5 + PULL_REQUEST_BRANCH: update-i18n + BRANCH_SUFFIX: none diff --git a/.gitignore b/.gitignore index fae8299..9380dba 100644 --- a/.gitignore +++ b/.gitignore @@ -1,39 +1,13 @@ -# History files -.Rhistory -.Rapp.history - -# Session Data files -.RData - -# User-specific files -.Ruserdata - -# Example code in package build process -*-Ex.R - -# Output files from R CMD build -/*.tar.gz - -# Output files from R CMD check -/*.Rcheck/ - -# RStudio files -.Rproj.user/ - -# produced vignettes -vignettes/*.html -vignettes/*.pdf - -# OAuth2 token, see https://github.com/hadley/httr/releases/tag/v0.3 -.httr-oauth - -# knitr and R markdown default cache directories -*_cache/ -/cache/ - -# Temporary files created by R markdown -*.utf8.md -*.knit.md - -# R Environment Variables -.Renviron +.idea +.vscode +.sass-cache +*.sqlite3 +*.py[co] +*.mo +*~ +dmoj/local_settings.py +resources/style.css +resources/content-description.css +resources/ranks.css +resources/table.css +sass_processed diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..0bea662 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,8 @@ +[submodule "resources/pagedown"] + path = resources/pagedown + url = https://github.com/DMOJ/dmoj-pagedown.git + branch = master +[submodule "resources/libs"] + path = resources/libs + url = https://github.com/DMOJ/site-assets.git + branch = master diff --git a/502.html b/502.html new file mode 100644 index 0000000..1529473 --- /dev/null +++ b/502.html @@ -0,0 +1,62 @@ + + + + 502 bad gateway - DMOJ + + + + + +
+
+
+ +
+
+
+

But don't worry, we'll be back soon.

+
+ + diff --git a/django_2_2_pymysql_patch.py b/django_2_2_pymysql_patch.py new file mode 100644 index 0000000..4470180 --- /dev/null +++ b/django_2_2_pymysql_patch.py @@ -0,0 +1,17 @@ +import django +from django.utils.encoding import force_text + +if (2, 2) <= django.VERSION < (3,): + # Django 2.2.x is incompatible with PyMySQL. + # This monkey patch backports the Django 3.0+ code. + + from django.db.backends.mysql.operations import DatabaseOperations + + def last_executed_query(self, cursor, sql, params): + # With MySQLdb, cursor objects have an (undocumented) "_executed" + # attribute where the exact query sent to the database is saved. + # See MySQLdb/cursors.py in the source distribution. + # MySQLdb returns string, PyMySQL bytes. + return force_text(getattr(cursor, '_executed', None), errors='replace') + + DatabaseOperations.last_executed_query = last_executed_query diff --git a/django_ace/__init__.py b/django_ace/__init__.py new file mode 100644 index 0000000..dac946c --- /dev/null +++ b/django_ace/__init__.py @@ -0,0 +1,5 @@ +""" +Django-ace originally from https://github.com/bradleyayers/django-ace. +""" + +from .widgets import AceWidget diff --git a/django_ace/static/django_ace/img/contract.png b/django_ace/static/django_ace/img/contract.png new file mode 100644 index 0000000000000000000000000000000000000000..6da66b4bf17c3204f3a12162927e655b43b6e2a9 GIT binary patch literal 304 zcmV-00nh%4P)A=T(7*d{do4l;Q{W8j zfCrE>W=Prt>jIA!SO8C8DIyKxDynHr@--H|QGh=vG7*t2;tjxgjyFJ&qmW;SOHWXd z$g!6S=zk-#TTkF5Medq4A}}XeD==n@Y&)j|=GH2ZB9AS>3)Z@XUh%xozX?>RcS_V8 zIt8Y34;t+tB{C#ngsx1Tg3om#Ze=BxV6q$TiFUxYX`VI~ zFcG~>ojqf9?uo4vLu0kQT_#@V3&0EX%XK~=fAs++a6b{DI`A<70000k)!L41|vgv;!$BoJHQUG1nod8&|QZxnXothGBZ0sF8Rpgij>kD zigtjb3(f}LZ44{~KqXt=3=#oPL{`vER7KYs>Y=5bd%z3M1(bvMWQ$D(VA=fZH3Nys z+p(IK0QO}AW1vAEcwddB-tjCU{+Y?vVnaYQLN3tG1uEY+PXPoo@A?aX<({E^Xd(Kh z7C1l-lIEwah8S1e*%}EsL3T;vwEcDrazuQsu5wJa33|vhRR!3%-qnf+?^FP`!<(s$ jXZ0@t&lO~r%)k##H9`l6(9|RV0000 div { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +.django-ace-widget.loading { + display: none; +} + +.django-ace-toolbar { + font-size: 12px; + text-align: left; + color: #555; + text-shadow: 0 1px 0 #fff; + border-bottom: 1px solid #d8d8d8; + background-color: #eaeaea; + background-image: -moz-linear-gradient(#fafafa, #eaeaea); + background-image: -webkit-linear-gradient(#fafafa, #eaeaea); + background-image: linear-gradient(#fafafa, #eaeaea); + background-repeat: repeat-x; + clear: both; + overflow: hidden; +} + +.django-ace-max_min { + float: right; + padding: 5px; + + background: url(img/expand.png) no-repeat 5px 5px; + display: block; + height: 16px; + width: 16px; +} + +.django-ace-editor { + position: relative; +} + +.django-ace-editor-fullscreen { + position: fixed; + top: 0; + left: 0; + bottom: 0; + right: 0; + z-index: 1000; +} + +.django-ace-editor-fullscreen .django-ace-max_min { + background-image: url(img/contract.png); +} \ No newline at end of file diff --git a/django_ace/static/django_ace/widget.js b/django_ace/static/django_ace/widget.js new file mode 100644 index 0000000..d097b06 --- /dev/null +++ b/django_ace/static/django_ace/widget.js @@ -0,0 +1,182 @@ +(function () { + function getDocHeight() { + var D = document; + return Math.max( + Math.max(D.body.scrollHeight, D.documentElement.scrollHeight), + Math.max(D.body.offsetHeight, D.documentElement.offsetHeight), + Math.max(D.body.clientHeight, D.documentElement.clientHeight) + ); + } + + function getDocWidth() { + var D = document; + return Math.max( + Math.max(D.body.scrollWidth, D.documentElement.scrollWidth), + Math.max(D.body.offsetWidth, D.documentElement.offsetWidth), + Math.max(D.body.clientWidth, D.documentElement.clientWidth) + ); + } + + function next(elem) { + // Credit to John Resig for this function + // taken from Pro JavaScript techniques + do { + elem = elem.nextSibling; + } while (elem && elem.nodeType != 1); + return elem; + } + + function prev(elem) { + // Credit to John Resig for this function + // taken from Pro JavaScript techniques + do { + elem = elem.previousSibling; + } while (elem && elem.nodeType != 1); + return elem; + } + + function redraw(element) { + element = $(element); + var n = document.createTextNode(' '); + element.appendChild(n); + (function () { + n.parentNode.removeChild(n) + }).defer(); + return element; + } + + function minimizeMaximize(widget, main_block, editor) { + if (window.fullscreen == true) { + main_block.className = 'django-ace-editor'; + + widget.style.width = window.ace_widget.width + 'px'; + widget.style.height = window.ace_widget.height + 'px'; + window.fullscreen = false; + } + else { + window.ace_widget = { + 'width': widget.offsetWidth, + 'height': widget.offsetHeight + }; + + main_block.className = 'django-ace-editor-fullscreen'; + + widget.style.height = getDocHeight() + 'px'; + widget.style.width = getDocWidth() + 'px'; + + window.scrollTo(0, 0); + window.fullscreen = true; + } + editor.resize(); + } + + function apply_widget(widget) { + var div = widget.firstChild, + textarea = next(widget), + editor = ace.edit(div), + mode = widget.getAttribute('data-mode'), + theme = widget.getAttribute('data-theme'), + wordwrap = widget.getAttribute('data-wordwrap'), + toolbar = prev(widget), + main_block = toolbar.parentNode; + + // Toolbar maximize/minimize button + var min_max = toolbar.getElementsByClassName('django-ace-max_min'); + min_max[0].onclick = function () { + minimizeMaximize(widget, main_block, editor); + return false; + }; + + editor.getSession().setValue(textarea.value); + + // the editor is initially absolute positioned + textarea.style.display = "none"; + + // options + if (mode) { + editor.getSession().setMode('ace/mode/' + mode); + } + if (theme) { + editor.setTheme("ace/theme/" + theme); + } + if (wordwrap == "true") { + editor.getSession().setUseWrapMode(true); + } + + editor.getSession().on('change', function () { + textarea.value = editor.getSession().getValue(); + }); + + editor.commands.addCommands([ + { + name: 'Full screen', + bindKey: {win: 'Ctrl-F11', mac: 'Command-F11'}, + exec: function (editor) { + minimizeMaximize(widget, main_block, editor); + }, + readOnly: true // false if this command should not apply in readOnly mode + }, + { + name: 'submit', + bindKey: "Ctrl+Enter", + exec: function (editor) { + $('form#problem_submit').submit(); + }, + readOnly: true + }, + { + name: "showKeyboardShortcuts", + bindKey: {win: "Ctrl-Shift-/", mac: "Command-Shift-/"}, + exec: function (editor) { + ace.config.loadModule("ace/ext/keybinding_menu", function (module) { + module.init(editor); + editor.showKeyboardShortcuts(); + }); + } + }, + { + name: "increaseFontSize", + bindKey: "Ctrl-+", + exec: function (editor) { + var size = parseInt(editor.getFontSize(), 10) || 12; + editor.setFontSize(size + 1); + } + }, + { + name: "decreaseFontSize", + bindKey: "Ctrl+-", + exec: function (editor) { + var size = parseInt(editor.getFontSize(), 10) || 12; + editor.setFontSize(Math.max(size - 1 || 1)); + } + }, + { + name: "resetFontSize", + bindKey: "Ctrl+0", + exec: function (editor) { + editor.setFontSize(12); + } + } + ]); + + window[widget.id] = editor; + $(widget).trigger('ace_load', [editor]); + } + + function init() { + var widgets = document.getElementsByClassName('django-ace-widget'); + + for (var i = 0; i < widgets.length; i++) { + var widget = widgets[i]; + widget.className = "django-ace-widget"; // remove `loading` class + + apply_widget(widget); + } + } + + if (window.addEventListener) { // W3C + window.addEventListener('load', init); + } else if (window.attachEvent) { // Microsoft + window.attachEvent('onload', init); + } +})(); diff --git a/django_ace/widgets.py b/django_ace/widgets.py new file mode 100644 index 0000000..91369d0 --- /dev/null +++ b/django_ace/widgets.py @@ -0,0 +1,57 @@ +""" +Django-ace originally from https://github.com/bradleyayers/django-ace. +""" + +from urllib.parse import urljoin + +from django import forms +from django.conf import settings +from django.forms.utils import flatatt +from django.utils.safestring import mark_safe + + +class AceWidget(forms.Textarea): + def __init__(self, mode=None, theme=None, wordwrap=False, width='100%', height='300px', + no_ace_media=False, *args, **kwargs): + self.mode = mode + self.theme = theme + self.wordwrap = wordwrap + self.width = width + self.height = height + self.ace_media = not no_ace_media + super(AceWidget, self).__init__(*args, **kwargs) + + @property + def media(self): + js = [urljoin(settings.ACE_URL, 'ace.js')] if self.ace_media else [] + js.append('django_ace/widget.js') + css = { + 'screen': ['django_ace/widget.css'], + } + return forms.Media(js=js, css=css) + + def render(self, name, value, attrs=None, renderer=None): + attrs = attrs or {} + + ace_attrs = { + 'class': 'django-ace-widget loading', + 'style': 'width:%s; height:%s' % (self.width, self.height), + 'id': 'ace_%s' % name, + } + if self.mode: + ace_attrs['data-mode'] = self.mode + if self.theme: + ace_attrs['data-theme'] = self.theme + if self.wordwrap: + ace_attrs['data-wordwrap'] = 'true' + + attrs.update(style='width: 100%; min-width: 100%; max-width: 100%; resize: none') + textarea = super(AceWidget, self).render(name, value, attrs) + + html = '
%s' % (flatatt(ace_attrs), textarea) + + # add toolbar + html = ('
' + '
%s
') % html + + return mark_safe(html) diff --git a/dmoj/__init__.py b/dmoj/__init__.py new file mode 100644 index 0000000..2ed8858 --- /dev/null +++ b/dmoj/__init__.py @@ -0,0 +1 @@ +from dmoj.celery import app as celery_app diff --git a/dmoj/celery.py b/dmoj/celery.py new file mode 100644 index 0000000..96718ea --- /dev/null +++ b/dmoj/celery.py @@ -0,0 +1,27 @@ +import logging +import socket + +from celery import Celery +from celery.signals import task_failure + +app = Celery('dmoj') + +from django.conf import settings # noqa: E402, I202, django must be imported here +app.config_from_object(settings, namespace='CELERY') + +if hasattr(settings, 'CELERY_BROKER_URL_SECRET'): + app.conf.broker_url = settings.CELERY_BROKER_URL_SECRET +if hasattr(settings, 'CELERY_RESULT_BACKEND_SECRET'): + app.conf.result_backend = settings.CELERY_RESULT_BACKEND_SECRET + +# Load task modules from all registered Django app configs. +app.autodiscover_tasks() + +# Logger to enable errors be reported. +logger = logging.getLogger('judge.celery') + + +@task_failure.connect() +def celery_failure_log(sender, task_id, exception, traceback, *args, **kwargs): + logger.error('Celery Task %s: %s on %s', sender.name, task_id, socket.gethostname(), # noqa: G201 + exc_info=(type(exception), exception, traceback)) diff --git a/dmoj/settings.py b/dmoj/settings.py new file mode 100644 index 0000000..2625cfa --- /dev/null +++ b/dmoj/settings.py @@ -0,0 +1,497 @@ +""" +Django settings for dmoj project. + +For more information on this file, see +https://docs.djangoproject.com/en/1.11/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/1.11/ref/settings/ +""" + +# Build paths inside the project like this: os.path.join(BASE_DIR, ...) +import os +import tempfile + +from django.utils.translation import ugettext_lazy as _ +from django_jinja.builtins import DEFAULT_EXTENSIONS +from jinja2 import select_autoescape + +BASE_DIR = os.path.dirname(os.path.dirname(__file__)) + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = '5*9f5q57mqmlz2#f$x1h76&jxy#yortjl1v+l*6hd18$d*yx#0' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = [] + +SITE_ID = 1 +SITE_NAME = 'DMOJ' +SITE_LONG_NAME = 'DMOJ: Modern Online Judge' +SITE_ADMIN_EMAIL = False + +DMOJ_REQUIRE_STAFF_2FA = True + +# Set to 1 to use HTTPS if request was made to https:// +# Set to 2 to always use HTTPS for links +# Set to 0 to always use HTTP for links +DMOJ_SSL = 0 + +# Refer to dmoj.ca/post/103-point-system-rework +DMOJ_PP_STEP = 0.95 +DMOJ_PP_ENTRIES = 100 +DMOJ_PP_BONUS_FUNCTION = lambda n: 300 * (1 - 0.997 ** n) # noqa: E731 + +NODEJS = '/usr/bin/node' +EXIFTOOL = '/usr/bin/exiftool' +ACE_URL = '//cdnjs.cloudflare.com/ajax/libs/ace/1.1.3' +SELECT2_JS_URL = '//cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/js/select2.min.js' +DEFAULT_SELECT2_CSS = '//cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/css/select2.min.css' + +DMOJ_CAMO_URL = None +DMOJ_CAMO_KEY = None +DMOJ_CAMO_HTTPS = False +DMOJ_CAMO_EXCLUDE = () +DMOJ_PROBLEM_DATA_ROOT = None +DMOJ_PROBLEM_MIN_TIME_LIMIT = 0 # seconds +DMOJ_PROBLEM_MAX_TIME_LIMIT = 60 # seconds +DMOJ_PROBLEM_MIN_MEMORY_LIMIT = 0 # kilobytes +DMOJ_PROBLEM_MAX_MEMORY_LIMIT = 1048576 # kilobytes +DMOJ_PROBLEM_MIN_PROBLEM_POINTS = 0 +DMOJ_RATING_COLORS = False +DMOJ_EMAIL_THROTTLING = (10, 60) +DMOJ_STATS_LANGUAGE_THRESHOLD = 10 +DMOJ_SUBMISSIONS_REJUDGE_LIMIT = 10 +# Maximum number of submissions a single user can queue without the `spam_submission` permission +DMOJ_SUBMISSION_LIMIT = 2 +DMOJ_BLOG_NEW_PROBLEM_COUNT = 7 +DMOJ_BLOG_RECENTLY_ATTEMPTED_PROBLEMS_COUNT = 7 +DMOJ_TOTP_TOLERANCE_HALF_MINUTES = 1 +DMOJ_USER_MAX_ORGANIZATION_COUNT = 3 +DMOJ_COMMENT_VOTE_HIDE_THRESHOLD = -5 +DMOJ_PDF_PROBLEM_CACHE = '' +DMOJ_PDF_PROBLEM_TEMP_DIR = tempfile.gettempdir() +DMOJ_STATS_SUBMISSION_RESULT_COLORS = { + 'TLE': '#a3bcbd', + 'AC': '#00a92a', + 'WA': '#ed4420', + 'CE': '#42586d', + 'ERR': '#ffa71c', +} + +MARKDOWN_STYLES = {} +MARKDOWN_DEFAULT_STYLE = {} + +MATHOID_URL = False +MATHOID_GZIP = False +MATHOID_MML_CACHE = None +MATHOID_CSS_CACHE = 'default' +MATHOID_DEFAULT_TYPE = 'auto' +MATHOID_MML_CACHE_TTL = 86400 +MATHOID_CACHE_ROOT = '' +MATHOID_CACHE_URL = False + +TEXOID_GZIP = False +TEXOID_META_CACHE = 'default' +TEXOID_META_CACHE_TTL = 86400 +DMOJ_NEWSLETTER_ID_ON_REGISTER = None + +BAD_MAIL_PROVIDERS = () +BAD_MAIL_PROVIDER_REGEX = () +NOFOLLOW_EXCLUDED = set() + +TIMEZONE_BG = None +TIMEZONE_MAP = None +TIMEZONE_DETECT_BACKEND = None + +TERMS_OF_SERVICE_URL = None +DEFAULT_USER_LANGUAGE = 'PY3' + +PHANTOMJS = '' +PHANTOMJS_PDF_ZOOM = 0.75 +PHANTOMJS_PDF_TIMEOUT = 5.0 +PHANTOMJS_PAPER_SIZE = 'Letter' + +SLIMERJS = '' +SLIMERJS_PDF_ZOOM = 0.75 +SLIMERJS_FIREFOX_PATH = '' +SLIMERJS_PAPER_SIZE = 'Letter' + +PUPPETEER_MODULE = '/usr/lib/node_modules/puppeteer' +PUPPETEER_PAPER_SIZE = 'Letter' + +PYGMENT_THEME = 'pygment-github.css' +INLINE_JQUERY = True +INLINE_FONTAWESOME = True +JQUERY_JS = '//ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js' +FONTAWESOME_CSS = '//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css' +DMOJ_CANONICAL = '' + +# Application definition + +INSTALLED_APPS = () + +try: + import wpadmin +except ImportError: + pass +else: + del wpadmin + INSTALLED_APPS += ('wpadmin',) + + WPADMIN = { + 'admin': { + 'title': 'DMOJ Admin', + 'menu': { + 'top': 'wpadmin.menu.menus.BasicTopMenu', + 'left': 'wpadmin.menu.custom.CustomModelLeftMenuWithDashboard', + }, + 'custom_menu': [ + { + 'model': 'judge.Problem', + 'icon': 'fa-question-circle', + 'children': [ + 'judge.ProblemGroup', + 'judge.ProblemType', + ], + }, + { + 'model': 'judge.Submission', + 'icon': 'fa-check-square-o', + 'children': [ + 'judge.Language', + 'judge.Judge', + ], + }, + { + 'model': 'judge.Contest', + 'icon': 'fa-bar-chart', + 'children': [ + 'judge.ContestParticipation', + 'judge.ContestTag', + ], + }, + { + 'model': 'auth.User', + 'icon': 'fa-user', + 'children': [ + 'auth.Group', + 'registration.RegistrationProfile', + ], + }, + { + 'model': 'judge.Profile', + 'icon': 'fa-user-plus', + 'children': [ + 'judge.Organization', + 'judge.OrganizationRequest', + ], + }, + { + 'model': 'judge.NavigationBar', + 'icon': 'fa-bars', + 'children': [ + 'judge.MiscConfig', + 'judge.License', + 'sites.Site', + 'redirects.Redirect', + ], + }, + ('judge.BlogPost', 'fa-rss-square'), + ('judge.Comment', 'fa-comment-o'), + ('flatpages.FlatPage', 'fa-file-text-o'), + ('judge.Solution', 'fa-pencil'), + ], + 'dashboard': { + 'breadcrumbs': True, + }, + }, + } + +INSTALLED_APPS += ( + 'django.contrib.admin', + 'judge', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.flatpages', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.redirects', + 'django.contrib.staticfiles', + 'django.contrib.sites', + 'django.contrib.sitemaps', + 'registration', + 'mptt', + 'reversion', + 'django_social_share', + 'social_django', + 'compressor', + 'django_ace', + 'pagedown', + 'sortedm2m', + 'statici18n', + 'impersonate', + 'django_jinja', +) + +MIDDLEWARE = ( + 'judge.middleware.ShortCircuitMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.locale.LocaleMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'judge.middleware.DMOJLoginMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', + 'judge.user_log.LogUserAccessMiddleware', + 'judge.timezone.TimezoneMiddleware', + 'impersonate.middleware.ImpersonateMiddleware', + 'judge.middleware.DMOJImpersonationMiddleware', + 'judge.middleware.ContestMiddleware', + 'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware', + 'judge.social_auth.SocialAuthExceptionMiddleware', + 'django.contrib.redirects.middleware.RedirectFallbackMiddleware', +) + +IMPERSONATE_REQUIRE_SUPERUSER = True +IMPERSONATE_DISABLE_LOGGING = True + +ACCOUNT_ACTIVATION_DAYS = 7 + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'judge.utils.pwned.PwnedPasswordsValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + +SILENCED_SYSTEM_CHECKS = ['urls.W002', 'fields.W342'] + +ROOT_URLCONF = 'dmoj.urls' +LOGIN_REDIRECT_URL = '/user' +WSGI_APPLICATION = 'dmoj.wsgi.application' + +TEMPLATES = [ + { + 'BACKEND': 'django_jinja.backend.Jinja2', + 'DIRS': [ + os.path.join(BASE_DIR, 'templates'), + ], + 'APP_DIRS': False, + 'OPTIONS': { + 'match_extension': ('.html', '.txt'), + 'match_regex': '^(?!admin/)', + 'context_processors': [ + 'django.template.context_processors.media', + 'django.template.context_processors.tz', + 'django.template.context_processors.i18n', + 'django.template.context_processors.request', + 'django.contrib.messages.context_processors.messages', + 'judge.template_context.comet_location', + 'judge.template_context.get_resource', + 'judge.template_context.general_info', + 'judge.template_context.site', + 'judge.template_context.site_name', + 'judge.template_context.misc_config', + 'judge.template_context.math_setting', + 'social_django.context_processors.backends', + 'social_django.context_processors.login_redirect', + ], + 'autoescape': select_autoescape(['html', 'xml']), + 'trim_blocks': True, + 'lstrip_blocks': True, + 'extensions': DEFAULT_EXTENSIONS + [ + 'compressor.contrib.jinja2ext.CompressorExtension', + 'judge.jinja2.DMOJExtension', + 'judge.jinja2.spaceless.SpacelessExtension', + ], + }, + }, + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'APP_DIRS': True, + 'DIRS': [ + os.path.join(BASE_DIR, 'templates'), + ], + 'OPTIONS': { + 'context_processors': [ + 'django.contrib.auth.context_processors.auth', + 'django.template.context_processors.media', + 'django.template.context_processors.tz', + 'django.template.context_processors.i18n', + 'django.template.context_processors.request', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +LOCALE_PATHS = [ + os.path.join(BASE_DIR, 'locale'), +] + +LANGUAGES = [ + ('de', _('German')), + ('en', _('English')), + ('es', _('Spanish')), + ('fr', _('French')), + ('hr', _('Croatian')), + ('hu', _('Hungarian')), + ('ja', _('Japanese')), + ('ko', _('Korean')), + ('pt', _('Brazilian Portuguese')), + ('ro', _('Romanian')), + ('ru', _('Russian')), + ('sr-latn', _('Serbian (Latin)')), + ('tr', _('Turkish')), + ('vi', _('Vietnamese')), + ('zh-hans', _('Simplified Chinese')), + ('zh-hant', _('Traditional Chinese')), +] + +MARKDOWN_ADMIN_EDITABLE_STYLE = { + 'safe_mode': False, + 'use_camo': True, + 'texoid': True, + 'math': True, +} + +MARKDOWN_DEFAULT_STYLE = { + 'safe_mode': True, + 'nofollow': True, + 'use_camo': True, + 'math': True, +} + +MARKDOWN_USER_LARGE_STYLE = { + 'safe_mode': True, + 'nofollow': True, + 'use_camo': True, + 'math': True, +} + +MARKDOWN_STYLES = { + 'comment': MARKDOWN_DEFAULT_STYLE, + 'self-description': MARKDOWN_USER_LARGE_STYLE, + 'problem': MARKDOWN_ADMIN_EDITABLE_STYLE, + 'contest': MARKDOWN_ADMIN_EDITABLE_STYLE, + 'language': MARKDOWN_ADMIN_EDITABLE_STYLE, + 'license': MARKDOWN_ADMIN_EDITABLE_STYLE, + 'judge': MARKDOWN_ADMIN_EDITABLE_STYLE, + 'blog': MARKDOWN_ADMIN_EDITABLE_STYLE, + 'solution': MARKDOWN_ADMIN_EDITABLE_STYLE, + 'contest_tag': MARKDOWN_ADMIN_EDITABLE_STYLE, + 'organization-about': MARKDOWN_USER_LARGE_STYLE, + 'ticket': MARKDOWN_USER_LARGE_STYLE, +} + +# Database +# https://docs.djangoproject.com/en/1.11/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), + }, +} + +ENABLE_FTS = False + +# Bridged configuration +BRIDGED_JUDGE_ADDRESS = [('localhost', 9999)] +BRIDGED_JUDGE_PROXIES = None +BRIDGED_DJANGO_ADDRESS = [('localhost', 9998)] +BRIDGED_DJANGO_CONNECT = None + +# Event Server configuration +EVENT_DAEMON_USE = False +EVENT_DAEMON_POST = 'ws://localhost:9997/' +EVENT_DAEMON_GET = 'ws://localhost:9996/' +EVENT_DAEMON_POLL = '/channels/' +EVENT_DAEMON_KEY = None +EVENT_DAEMON_AMQP_EXCHANGE = 'dmoj-events' +EVENT_DAEMON_SUBMISSION_KEY = '6Sdmkx^%pk@GsifDfXcwX*Y7LRF%RGT8vmFpSxFBT$fwS7trc8raWfN#CSfQuKApx&$B#Gh2L7p%W!Ww' + +# Internationalization +# https://docs.djangoproject.com/en/1.11/topics/i18n/ + +# Whatever you do, this better be one of the entries in `LANGUAGES`. +LANGUAGE_CODE = 'en' +TIME_ZONE = 'UTC' +DEFAULT_USER_TIME_ZONE = 'America/Toronto' +USE_I18N = True +USE_L10N = True +USE_TZ = True + +# Cookies +SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/1.11/howto/static-files/ + +DMOJ_RESOURCES = os.path.join(BASE_DIR, 'resources') +STATICFILES_FINDERS = ( + 'django.contrib.staticfiles.finders.FileSystemFinder', + 'django.contrib.staticfiles.finders.AppDirectoriesFinder', +) +STATICFILES_DIRS = [ + os.path.join(BASE_DIR, 'resources'), +] +STATIC_URL = '/static/' + +# Define a cache +CACHES = {} + +# Authentication +AUTHENTICATION_BACKENDS = ( + 'social_core.backends.google.GoogleOAuth2', + 'social_core.backends.facebook.FacebookOAuth2', + 'judge.social_auth.GitHubSecureEmailOAuth2', + 'django.contrib.auth.backends.ModelBackend', +) + +SOCIAL_AUTH_PIPELINE = ( + 'social_core.pipeline.social_auth.social_details', + 'social_core.pipeline.social_auth.social_uid', + 'social_core.pipeline.social_auth.auth_allowed', + 'judge.social_auth.verify_email', + 'social_core.pipeline.social_auth.social_user', + 'social_core.pipeline.user.get_username', + 'social_core.pipeline.social_auth.associate_by_email', + 'judge.social_auth.choose_username', + 'social_core.pipeline.user.create_user', + 'judge.social_auth.make_profile', + 'social_core.pipeline.social_auth.associate_user', + 'social_core.pipeline.social_auth.load_extra_data', + 'social_core.pipeline.user.user_details', +) + +SOCIAL_AUTH_GITHUB_SECURE_SCOPE = ['user:email'] +SOCIAL_AUTH_FACEBOOK_SCOPE = ['email'] +SOCIAL_AUTH_SLUGIFY_USERNAMES = True +SOCIAL_AUTH_SLUGIFY_FUNCTION = 'judge.social_auth.slugify_username' + +JUDGE_AMQP_PATH = None + +MOSS_API_KEY = None + +CELERY_WORKER_HIJACK_ROOT_LOGGER = False + +try: + with open(os.path.join(os.path.dirname(__file__), 'local_settings.py')) as f: + exec(f.read(), globals()) +except IOError: + pass diff --git a/dmoj/throttle_mail.py b/dmoj/throttle_mail.py new file mode 100644 index 0000000..7346a21 --- /dev/null +++ b/dmoj/throttle_mail.py @@ -0,0 +1,29 @@ +import traceback + +from django.conf import settings +from django.core.cache import cache +from django.utils.log import AdminEmailHandler + +DEFAULT_THROTTLE = (10, 60) + + +def new_email(): + cache.add('error_email_throttle', 0, settings.DMOJ_EMAIL_THROTTLING[1]) + return cache.incr('error_email_throttle') + + +class ThrottledEmailHandler(AdminEmailHandler): + def __init__(self, *args, **kwargs): + super(ThrottledEmailHandler, self).__init__(*args, **kwargs) + + self.throttle = settings.DMOJ_EMAIL_THROTTLING[0] + + def emit(self, record): + try: + count = new_email() + except Exception: + traceback.print_exc() + else: + if count >= self.throttle: + return + AdminEmailHandler.emit(self, record) diff --git a/dmoj/urls.py b/dmoj/urls.py new file mode 100644 index 0000000..c56ed27 --- /dev/null +++ b/dmoj/urls.py @@ -0,0 +1,387 @@ +from django.conf import settings +from django.conf.urls import include, url +from django.contrib import admin +from django.contrib.auth import views as auth_views +from django.contrib.sitemaps.views import sitemap +from django.http import Http404, HttpResponsePermanentRedirect +from django.templatetags.static import static +from django.urls import reverse +from django.utils.functional import lazystr +from django.utils.translation import ugettext_lazy as _ +from django.views.generic import RedirectView + +from judge.feed import AtomBlogFeed, AtomCommentFeed, AtomProblemFeed, BlogFeed, CommentFeed, ProblemFeed +from judge.forms import CustomAuthenticationForm +from judge.sitemap import BlogPostSitemap, ContestSitemap, HomePageSitemap, OrganizationSitemap, ProblemSitemap, \ + SolutionSitemap, UrlSitemap, UserSitemap +from judge.views import TitledTemplateView, api, blog, comment, contests, language, license, mailgun, organization, \ + preview, problem, problem_manage, ranked_submission, register, stats, status, submission, tasks, ticket, totp, \ + user, widgets +from judge.views.problem_data import ProblemDataView, ProblemSubmissionDiff, \ + problem_data_file, problem_init_view +from judge.views.register import ActivationView, RegistrationView +from judge.views.select2 import AssigneeSelect2View, CommentSelect2View, ContestSelect2View, \ + ContestUserSearchSelect2View, OrganizationSelect2View, ProblemSelect2View, TicketUserSelect2View, \ + UserSearchSelect2View, UserSelect2View + +admin.autodiscover() + +register_patterns = [ + url(r'^activate/complete/$', + TitledTemplateView.as_view(template_name='registration/activation_complete.html', + title='Activation Successful!'), + name='registration_activation_complete'), + # Activation keys get matched by \w+ instead of the more specific + # [a-fA-F0-9]{40} because a bad activation key should still get to the view; + # that way it can return a sensible "invalid key" message instead of a + # confusing 404. + url(r'^activate/(?P\w+)/$', + ActivationView.as_view(title='Activation key invalid'), + name='registration_activate'), + url(r'^register/$', + RegistrationView.as_view(title='Register'), + name='registration_register'), + url(r'^register/complete/$', + TitledTemplateView.as_view(template_name='registration/registration_complete.html', + title='Registration Completed'), + name='registration_complete'), + url(r'^register/closed/$', + TitledTemplateView.as_view(template_name='registration/registration_closed.html', + title='Registration not allowed'), + name='registration_disallowed'), + url(r'^login/$', auth_views.LoginView.as_view( + template_name='registration/login.html', + extra_context={'title': _('Login')}, + authentication_form=CustomAuthenticationForm, + redirect_authenticated_user=True, + ), name='auth_login'), + url(r'^logout/$', user.UserLogoutView.as_view(), name='auth_logout'), + url(r'^password/change/$', auth_views.PasswordChangeView.as_view( + template_name='registration/password_change_form.html', + ), name='password_change'), + url(r'^password/change/done/$', auth_views.PasswordChangeDoneView.as_view( + template_name='registration/password_change_done.html', + ), name='password_change_done'), + url(r'^password/reset/$', auth_views.PasswordResetView.as_view( + template_name='registration/password_reset.html', + html_email_template_name='registration/password_reset_email.html', + email_template_name='registration/password_reset_email.txt', + ), name='password_reset'), + url(r'^password/reset/confirm/(?P[0-9A-Za-z]+)-(?P.+)/$', + auth_views.PasswordResetConfirmView.as_view( + template_name='registration/password_reset_confirm.html', + ), name='password_reset_confirm'), + url(r'^password/reset/complete/$', auth_views.PasswordResetCompleteView.as_view( + template_name='registration/password_reset_complete.html', + ), name='password_reset_complete'), + url(r'^password/reset/done/$', auth_views.PasswordResetDoneView.as_view( + template_name='registration/password_reset_done.html', + ), name='password_reset_done'), + url(r'^social/error/$', register.social_auth_error, name='social_auth_error'), + + url(r'^2fa/$', totp.TOTPLoginView.as_view(), name='login_2fa'), + url(r'^2fa/enable/$', totp.TOTPEnableView.as_view(), name='enable_2fa'), + url(r'^2fa/disable/$', totp.TOTPDisableView.as_view(), name='disable_2fa'), +] + + +def exception(request): + if not request.user.is_superuser: + raise Http404() + raise RuntimeError('@Xyene asked me to cause this') + + +def paged_list_view(view, name): + return include([ + url(r'^$', view.as_view(), name=name), + url(r'^(?P\d+)$', view.as_view(), name=name), + ]) + + +urlpatterns = [ + url(r'^$', blog.PostList.as_view(template_name='home.html', title=_('Home')), kwargs={'page': 1}, name='home'), + url(r'^500/$', exception), + url(r'^admin/', admin.site.urls), + url(r'^i18n/', include('django.conf.urls.i18n')), + url(r'^accounts/', include(register_patterns)), + url(r'^', include('social_django.urls')), + + url(r'^problems/$', problem.ProblemList.as_view(), name='problem_list'), + url(r'^problems/random/$', problem.RandomProblem.as_view(), name='problem_random'), + + url(r'^problem/(?P[^/]+)', include([ + url(r'^$', problem.ProblemDetail.as_view(), name='problem_detail'), + url(r'^/editorial$', problem.ProblemSolution.as_view(), name='problem_editorial'), + url(r'^/raw$', problem.ProblemRaw.as_view(), name='problem_raw'), + url(r'^/pdf$', problem.ProblemPdfView.as_view(), name='problem_pdf'), + url(r'^/pdf/(?P[a-z-]+)$', problem.ProblemPdfView.as_view(), name='problem_pdf'), + url(r'^/clone', problem.ProblemClone.as_view(), name='problem_clone'), + url(r'^/submit$', problem.problem_submit, name='problem_submit'), + url(r'^/resubmit/(?P\d+)$', problem.problem_submit, name='problem_submit'), + + url(r'^/rank/', paged_list_view(ranked_submission.RankedSubmissions, 'ranked_submissions')), + url(r'^/submissions/', paged_list_view(submission.ProblemSubmissions, 'chronological_submissions')), + url(r'^/submissions/(?P\w+)/', paged_list_view(submission.UserProblemSubmissions, 'user_submissions')), + + url(r'^/$', lambda _, problem: HttpResponsePermanentRedirect(reverse('problem_detail', args=[problem]))), + + url(r'^/test_data$', ProblemDataView.as_view(), name='problem_data'), + url(r'^/test_data/init$', problem_init_view, name='problem_data_init'), + url(r'^/test_data/diff$', ProblemSubmissionDiff.as_view(), name='problem_submission_diff'), + url(r'^/data/(?P.+)$', problem_data_file, name='problem_data_file'), + + url(r'^/tickets$', ticket.ProblemTicketListView.as_view(), name='problem_ticket_list'), + url(r'^/tickets/new$', ticket.NewProblemTicketView.as_view(), name='new_problem_ticket'), + + url(r'^/manage/submission', include([ + url('^$', problem_manage.ManageProblemSubmissionView.as_view(), name='problem_manage_submissions'), + url('^/rejudge$', problem_manage.RejudgeSubmissionsView.as_view(), name='problem_submissions_rejudge'), + url('^/rejudge/preview$', problem_manage.PreviewRejudgeSubmissionsView.as_view(), + name='problem_submissions_rejudge_preview'), + url('^/rejudge/success/(?P[A-Za-z0-9-]*)$', problem_manage.rejudge_success, + name='problem_submissions_rejudge_success'), + url('^/rescore/all$', problem_manage.RescoreAllSubmissionsView.as_view(), + name='problem_submissions_rescore_all'), + url('^/rescore/success/(?P[A-Za-z0-9-]*)$', problem_manage.rescore_success, + name='problem_submissions_rescore_success'), + ])), + ])), + + url(r'^submissions/', paged_list_view(submission.AllSubmissions, 'all_submissions')), + url(r'^submissions/user/(?P\w+)/', paged_list_view(submission.AllUserSubmissions, 'all_user_submissions')), + + url(r'^src/(?P\d+)$', submission.SubmissionSource.as_view(), name='submission_source'), + url(r'^src/(?P\d+)/raw$', submission.SubmissionSourceRaw.as_view(), name='submission_source_raw'), + + url(r'^submission/(?P\d+)', include([ + url(r'^$', submission.SubmissionStatus.as_view(), name='submission_status'), + url(r'^/abort$', submission.abort_submission, name='submission_abort'), + url(r'^/html$', submission.single_submission), + ])), + + url(r'^users/', include([ + url(r'^$', user.users, name='user_list'), + url(r'^(?P\d+)$', lambda request, page: + HttpResponsePermanentRedirect('%s?page=%s' % (reverse('user_list'), page))), + url(r'^find$', user.user_ranking_redirect, name='user_ranking_redirect'), + ])), + + url(r'^user$', user.UserAboutPage.as_view(), name='user_page'), + url(r'^edit/profile/$', user.edit_profile, name='user_edit_profile'), + url(r'^user/(?P\w+)', include([ + url(r'^$', user.UserAboutPage.as_view(), name='user_page'), + url(r'^/solved', include([ + url(r'^$', user.UserProblemsPage.as_view(), name='user_problems'), + url(r'/ajax$', user.UserPerformancePointsAjax.as_view(), name='user_pp_ajax'), + ])), + url(r'^/submissions/', paged_list_view(submission.AllUserSubmissions, 'all_user_submissions_old')), + url(r'^/submissions/', lambda _, user: + HttpResponsePermanentRedirect(reverse('all_user_submissions', args=[user]))), + + url(r'^/$', lambda _, user: HttpResponsePermanentRedirect(reverse('user_page', args=[user]))), + ])), + + url(r'^comments/upvote/$', comment.upvote_comment, name='comment_upvote'), + url(r'^comments/downvote/$', comment.downvote_comment, name='comment_downvote'), + url(r'^comments/hide/$', comment.comment_hide, name='comment_hide'), + url(r'^comments/(?P\d+)/', include([ + url(r'^edit$', comment.CommentEdit.as_view(), name='comment_edit'), + url(r'^history/ajax$', comment.CommentRevisionAjax.as_view(), name='comment_revision_ajax'), + url(r'^edit/ajax$', comment.CommentEditAjax.as_view(), name='comment_edit_ajax'), + url(r'^votes/ajax$', comment.CommentVotesAjax.as_view(), name='comment_votes_ajax'), + url(r'^render$', comment.CommentContent.as_view(), name='comment_content'), + ])), + + url(r'^contests/', paged_list_view(contests.ContestList, 'contest_list')), + url(r'^contests/(?P\d+)/(?P\d+)/$', contests.ContestCalendar.as_view(), name='contest_calendar'), + url(r'^contests/tag/(?P[a-z-]+)', include([ + url(r'^$', contests.ContestTagDetail.as_view(), name='contest_tag'), + url(r'^/ajax$', contests.ContestTagDetailAjax.as_view(), name='contest_tag_ajax'), + ])), + + url(r'^contest/(?P\w+)', include([ + url(r'^$', contests.ContestDetail.as_view(), name='contest_view'), + url(r'^/moss$', contests.ContestMossView.as_view(), name='contest_moss'), + url(r'^/moss/delete$', contests.ContestMossDelete.as_view(), name='contest_moss_delete'), + url(r'^/clone$', contests.ContestClone.as_view(), name='contest_clone'), + url(r'^/ranking/$', contests.ContestRanking.as_view(), name='contest_ranking'), + url(r'^/ranking/ajax$', contests.contest_ranking_ajax, name='contest_ranking_ajax'), + url(r'^/join$', contests.ContestJoin.as_view(), name='contest_join'), + url(r'^/leave$', contests.ContestLeave.as_view(), name='contest_leave'), + url(r'^/stats$', contests.ContestStats.as_view(), name='contest_stats'), + + url(r'^/rank/(?P\w+)/', + paged_list_view(ranked_submission.ContestRankedSubmission, 'contest_ranked_submissions')), + + url(r'^/submissions/(?P\w+)/(?P\w+)/', + paged_list_view(submission.UserContestSubmissions, 'contest_user_submissions')), + + url(r'^/participations$', contests.ContestParticipationList.as_view(), name='contest_participation_own'), + url(r'^/participations/(?P\w+)$', + contests.ContestParticipationList.as_view(), name='contest_participation'), + url(r'^/participation/disqualify$', contests.ContestParticipationDisqualify.as_view(), + name='contest_participation_disqualify'), + + url(r'^/$', lambda _, contest: HttpResponsePermanentRedirect(reverse('contest_view', args=[contest]))), + ])), + + url(r'^organizations/$', organization.OrganizationList.as_view(), name='organization_list'), + url(r'^organization/(?P\d+)-(?P[\w-]*)', include([ + url(r'^$', organization.OrganizationHome.as_view(), name='organization_home'), + url(r'^/users$', organization.OrganizationUsers.as_view(), name='organization_users'), + url(r'^/join$', organization.JoinOrganization.as_view(), name='join_organization'), + url(r'^/leave$', organization.LeaveOrganization.as_view(), name='leave_organization'), + url(r'^/edit$', organization.EditOrganization.as_view(), name='edit_organization'), + url(r'^/kick$', organization.KickUserWidgetView.as_view(), name='organization_user_kick'), + + url(r'^/request$', organization.RequestJoinOrganization.as_view(), name='request_organization'), + url(r'^/request/(?P\d+)$', organization.OrganizationRequestDetail.as_view(), + name='request_organization_detail'), + url(r'^/requests/', include([ + url(r'^pending$', organization.OrganizationRequestView.as_view(), name='organization_requests_pending'), + url(r'^log$', organization.OrganizationRequestLog.as_view(), name='organization_requests_log'), + url(r'^approved$', organization.OrganizationRequestLog.as_view(states=('A',), tab='approved'), + name='organization_requests_approved'), + url(r'^rejected$', organization.OrganizationRequestLog.as_view(states=('R',), tab='rejected'), + name='organization_requests_rejected'), + ])), + + url(r'^/$', lambda _, pk, slug: HttpResponsePermanentRedirect(reverse('organization_home', args=[pk, slug]))), + ])), + + url(r'^runtimes/$', language.LanguageList.as_view(), name='runtime_list'), + url(r'^runtimes/matrix/$', status.version_matrix, name='version_matrix'), + url(r'^status/$', status.status_all, name='status_all'), + + url(r'^api/', include([ + url(r'^contest/list$', api.api_v1_contest_list), + url(r'^contest/info/(\w+)$', api.api_v1_contest_detail), + url(r'^problem/list$', api.api_v1_problem_list), + url(r'^problem/info/(\w+)$', api.api_v1_problem_info), + url(r'^user/list$', api.api_v1_user_list), + url(r'^user/info/(\w+)$', api.api_v1_user_info), + url(r'^user/submissions/(\w+)$', api.api_v1_user_submissions), + ])), + + url(r'^blog/', paged_list_view(blog.PostList, 'blog_post_list')), + url(r'^post/(?P\d+)-(?P.*)$', blog.PostView.as_view(), name='blog_post'), + + url(r'^license/(?P[-\w.]+)$', license.LicenseDetail.as_view(), name='license'), + + url(r'^mailgun/mail_activate/$', mailgun.MailgunActivationView.as_view(), name='mailgun_activate'), + + url(r'^widgets/', include([ + url(r'^rejudge$', widgets.rejudge_submission, name='submission_rejudge'), + url(r'^single_submission$', submission.single_submission_query, name='submission_single_query'), + url(r'^submission_testcases$', submission.SubmissionTestCaseQuery.as_view(), name='submission_testcases_query'), + url(r'^detect_timezone$', widgets.DetectTimezone.as_view(), name='detect_timezone'), + url(r'^status-table$', status.status_table, name='status_table'), + + url(r'^template$', problem.LanguageTemplateAjax.as_view(), name='language_template_ajax'), + + url(r'^select2/', include([ + url(r'^user_search$', UserSearchSelect2View.as_view(), name='user_search_select2_ajax'), + url(r'^contest_users/(?P\w+)$', ContestUserSearchSelect2View.as_view(), + name='contest_user_search_select2_ajax'), + url(r'^ticket_user$', TicketUserSelect2View.as_view(), name='ticket_user_select2_ajax'), + url(r'^ticket_assignee$', AssigneeSelect2View.as_view(), name='ticket_assignee_select2_ajax'), + ])), + + url(r'^preview/', include([ + url(r'^problem$', preview.ProblemMarkdownPreviewView.as_view(), name='problem_preview'), + url(r'^blog$', preview.BlogMarkdownPreviewView.as_view(), name='blog_preview'), + url(r'^contest$', preview.ContestMarkdownPreviewView.as_view(), name='contest_preview'), + url(r'^comment$', preview.CommentMarkdownPreviewView.as_view(), name='comment_preview'), + url(r'^profile$', preview.ProfileMarkdownPreviewView.as_view(), name='profile_preview'), + url(r'^organization$', preview.OrganizationMarkdownPreviewView.as_view(), name='organization_preview'), + url(r'^solution$', preview.SolutionMarkdownPreviewView.as_view(), name='solution_preview'), + url(r'^license$', preview.LicenseMarkdownPreviewView.as_view(), name='license_preview'), + url(r'^ticket$', preview.TicketMarkdownPreviewView.as_view(), name='ticket_preview'), + ])), + ])), + + url(r'^feed/', include([ + url(r'^problems/rss/$', ProblemFeed(), name='problem_rss'), + url(r'^problems/atom/$', AtomProblemFeed(), name='problem_atom'), + url(r'^comment/rss/$', CommentFeed(), name='comment_rss'), + url(r'^comment/atom/$', AtomCommentFeed(), name='comment_atom'), + url(r'^blog/rss/$', BlogFeed(), name='blog_rss'), + url(r'^blog/atom/$', AtomBlogFeed(), name='blog_atom'), + ])), + + url(r'^stats/', include([ + url('^language/', include([ + url('^$', stats.language, name='language_stats'), + url('^data/all/$', stats.language_data, name='language_stats_data_all'), + url('^data/ac/$', stats.ac_language_data, name='language_stats_data_ac'), + url('^data/status/$', stats.status_data, name='stats_data_status'), + url('^data/ac_rate/$', stats.ac_rate, name='language_stats_data_ac_rate'), + ])), + ])), + + url(r'^tickets/', include([ + url(r'^$', ticket.TicketList.as_view(), name='ticket_list'), + url(r'^ajax$', ticket.TicketListDataAjax.as_view(), name='ticket_ajax'), + ])), + + url(r'^ticket/(?P\d+)', include([ + url(r'^$', ticket.TicketView.as_view(), name='ticket'), + url(r'^/ajax$', ticket.TicketMessageDataAjax.as_view(), name='ticket_message_ajax'), + url(r'^/open$', ticket.TicketStatusChangeView.as_view(open=True), name='ticket_open'), + url(r'^/close$', ticket.TicketStatusChangeView.as_view(open=False), name='ticket_close'), + url(r'^/notes$', ticket.TicketNotesEditView.as_view(), name='ticket_notes'), + ])), + + url(r'^sitemap\.xml$', sitemap, {'sitemaps': { + 'problem': ProblemSitemap, + 'user': UserSitemap, + 'home': HomePageSitemap, + 'contest': ContestSitemap, + 'organization': OrganizationSitemap, + 'blog': BlogPostSitemap, + 'solutions': SolutionSitemap, + 'pages': UrlSitemap([ + {'location': '/about/', 'priority': 0.9}, + ]), + }}), + + url(r'^judge-select2/', include([ + url(r'^profile/$', UserSelect2View.as_view(), name='profile_select2'), + url(r'^organization/$', OrganizationSelect2View.as_view(), name='organization_select2'), + url(r'^problem/$', ProblemSelect2View.as_view(), name='problem_select2'), + url(r'^contest/$', ContestSelect2View.as_view(), name='contest_select2'), + url(r'^comment/$', CommentSelect2View.as_view(), name='comment_select2'), + ])), + + url(r'^tasks/', include([ + url(r'^status/(?P[A-Za-z0-9-]*)$', tasks.task_status, name='task_status'), + url(r'^ajax_status$', tasks.task_status_ajax, name='task_status_ajax'), + url(r'^success$', tasks.demo_success), + url(r'^failure$', tasks.demo_failure), + url(r'^progress$', tasks.demo_progress), + ])), +] + +favicon_paths = ['apple-touch-icon-180x180.png', 'apple-touch-icon-114x114.png', 'android-chrome-72x72.png', + 'apple-touch-icon-57x57.png', 'apple-touch-icon-72x72.png', 'apple-touch-icon.png', 'mstile-70x70.png', + 'android-chrome-36x36.png', 'apple-touch-icon-precomposed.png', 'apple-touch-icon-76x76.png', + 'apple-touch-icon-60x60.png', 'android-chrome-96x96.png', 'mstile-144x144.png', 'mstile-150x150.png', + 'safari-pinned-tab.svg', 'android-chrome-144x144.png', 'apple-touch-icon-152x152.png', + 'favicon-96x96.png', + 'favicon-32x32.png', 'favicon-16x16.png', 'android-chrome-192x192.png', 'android-chrome-48x48.png', + 'mstile-310x150.png', 'apple-touch-icon-144x144.png', 'browserconfig.xml', 'manifest.json', + 'apple-touch-icon-120x120.png', 'mstile-310x310.png'] + +for favicon in favicon_paths: + urlpatterns.append(url(r'^%s$' % favicon, RedirectView.as_view( + url=lazystr(lambda: static('icons/' + favicon)), + ))) + +handler404 = 'judge.views.error.error404' +handler403 = 'judge.views.error.error403' +handler500 = 'judge.views.error.error500' + +if 'newsletter' in settings.INSTALLED_APPS: + urlpatterns.append(url(r'^newsletter/', include('newsletter.urls'))) +if 'impersonate' in settings.INSTALLED_APPS: + urlpatterns.append(url(r'^impersonate/', include('impersonate.urls'))) diff --git a/dmoj/wsgi.py b/dmoj/wsgi.py new file mode 100644 index 0000000..6bec753 --- /dev/null +++ b/dmoj/wsgi.py @@ -0,0 +1,12 @@ +import os +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'dmoj.settings') + +try: + import MySQLdb # noqa: F401, imported for side effect +except ImportError: + import pymysql + + pymysql.install_as_MySQLdb() + +from django.core.wsgi import get_wsgi_application # noqa: E402, django must be imported here +application = get_wsgi_application() diff --git a/dmoj/wsgi_async.py b/dmoj/wsgi_async.py new file mode 100644 index 0000000..69e105f --- /dev/null +++ b/dmoj/wsgi_async.py @@ -0,0 +1,14 @@ +import os + +import gevent.monkey # noqa: I100, gevent must be imported here + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'dmoj.settings') +gevent.monkey.patch_all() + +# noinspection PyUnresolvedReferences +import dmoj_install_pymysql # noqa: F401, I100, I202, imported for side effect + +from django.core.wsgi import get_wsgi_application # noqa: E402, I100, I202, django must be imported here +# noinspection PyUnresolvedReferences +import django_2_2_pymysql_patch # noqa: I100, F401, I202, imported for side effect +application = get_wsgi_application() diff --git a/dmoj_celery.py b/dmoj_celery.py new file mode 100644 index 0000000..58ea344 --- /dev/null +++ b/dmoj_celery.py @@ -0,0 +1,15 @@ +import os + +try: + import MySQLdb # noqa: F401, imported for side effect +except ImportError: + import dmoj_install_pymysql # noqa: F401, imported for side effect + +# set the default Django settings module for the 'celery' program. +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'dmoj.settings') + +# noinspection PyUnresolvedReferences +import django_2_2_pymysql_patch # noqa: I100, F401, I202, imported for side effect + +# noinspection PyUnresolvedReferences +from dmoj.celery import app # noqa: F401, imported for side effect diff --git a/dmoj_install_pymysql.py b/dmoj_install_pymysql.py new file mode 100644 index 0000000..7adabd5 --- /dev/null +++ b/dmoj_install_pymysql.py @@ -0,0 +1,4 @@ +import pymysql + +pymysql.install_as_MySQLdb() +pymysql.version_info = (1, 3, 13, "final", 0) diff --git a/event_socket_server/__init__.py b/event_socket_server/__init__.py new file mode 100644 index 0000000..88f7683 --- /dev/null +++ b/event_socket_server/__init__.py @@ -0,0 +1,11 @@ +from .base_server import BaseServer +from .engines import * +from .handler import Handler +from .helpers import ProxyProtocolMixin, SizedPacketHandler, ZlibPacketHandler + + +def get_preferred_engine(choices=('epoll', 'poll', 'select')): + for choice in choices: + if choice in engines: + return engines[choice] + return engines['select'] diff --git a/event_socket_server/base_server.py b/event_socket_server/base_server.py new file mode 100644 index 0000000..667c627 --- /dev/null +++ b/event_socket_server/base_server.py @@ -0,0 +1,169 @@ +import logging +import socket +import threading +import time +from collections import defaultdict, deque +from functools import total_ordering +from heapq import heappop, heappush + +logger = logging.getLogger('event_socket_server') + + +class SendMessage(object): + __slots__ = ('data', 'callback') + + def __init__(self, data, callback): + self.data = data + self.callback = callback + + +@total_ordering +class ScheduledJob(object): + __slots__ = ('time', 'func', 'args', 'kwargs', 'cancel', 'dispatched') + + def __init__(self, time, func, args, kwargs): + self.time = time + self.func = func + self.args = args + self.kwargs = kwargs + self.cancel = False + self.dispatched = False + + def __eq__(self, other): + return self.time == other.time + + def __lt__(self, other): + return self.time < other.time + + +class BaseServer(object): + def __init__(self, addresses, client): + self._servers = set() + for address, port in addresses: + info = socket.getaddrinfo(address, port, socket.AF_UNSPEC, socket.SOCK_STREAM) + for af, socktype, proto, canonname, sa in info: + sock = socket.socket(af, socktype, proto) + sock.setblocking(0) + sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + sock.bind(sa) + self._servers.add(sock) + + self._stop = threading.Event() + self._clients = set() + self._ClientClass = client + self._send_queue = defaultdict(deque) + self._job_queue = [] + self._job_queue_lock = threading.Lock() + + def _serve(self): + raise NotImplementedError() + + def _accept(self, sock): + conn, address = sock.accept() + conn.setblocking(0) + client = self._ClientClass(self, conn) + self._clients.add(client) + return client + + def schedule(self, delay, func, *args, **kwargs): + with self._job_queue_lock: + job = ScheduledJob(time.time() + delay, func, args, kwargs) + heappush(self._job_queue, job) + return job + + def unschedule(self, job): + with self._job_queue_lock: + if job.dispatched or job.cancel: + return False + job.cancel = True + return True + + def _register_write(self, client): + raise NotImplementedError() + + def _register_read(self, client): + raise NotImplementedError() + + def _clean_up_client(self, client, finalize=False): + try: + del self._send_queue[client.fileno()] + except KeyError: + pass + client.on_close() + client._socket.close() + if not finalize: + self._clients.remove(client) + + def _dispatch_event(self): + t = time.time() + tasks = [] + with self._job_queue_lock: + while True: + dt = self._job_queue[0].time - t if self._job_queue else 1 + if dt > 0: + break + task = heappop(self._job_queue) + task.dispatched = True + if not task.cancel: + tasks.append(task) + for task in tasks: + logger.debug('Dispatching event: %r(*%r, **%r)', task.func, task.args, task.kwargs) + task.func(*task.args, **task.kwargs) + if not self._job_queue or dt > 1: + dt = 1 + return dt + + def _nonblock_read(self, client): + try: + data = client._socket.recv(1024) + except socket.error: + self._clean_up_client(client) + else: + logger.debug('Read from %s: %d bytes', client.client_address, len(data)) + if not data: + self._clean_up_client(client) + else: + try: + client._recv_data(data) + except Exception: + logger.exception('Client recv_data failure') + self._clean_up_client(client) + + def _nonblock_write(self, client): + fd = client.fileno() + queue = self._send_queue[fd] + try: + top = queue[0] + cb = client._socket.send(top.data) + top.data = top.data[cb:] + logger.debug('Send to %s: %d bytes', client.client_address, cb) + if not top.data: + logger.debug('Finished sending: %s', client.client_address) + if top.callback is not None: + logger.debug('Calling callback: %s: %r', client.client_address, top.callback) + try: + top.callback() + except Exception: + logger.exception('Client write callback failure') + self._clean_up_client(client) + return + queue.popleft() + if not queue: + self._register_read(client) + del self._send_queue[fd] + except socket.error: + self._clean_up_client(client) + + def send(self, client, data, callback=None): + logger.debug('Writing %d bytes to client %s, callback: %s', len(data), client.client_address, callback) + self._send_queue[client.fileno()].append(SendMessage(data, callback)) + self._register_write(client) + + def stop(self): + self._stop.set() + + def serve_forever(self): + self._serve() + + def on_shutdown(self): + pass diff --git a/event_socket_server/engines/__init__.py b/event_socket_server/engines/__init__.py new file mode 100644 index 0000000..5737684 --- /dev/null +++ b/event_socket_server/engines/__init__.py @@ -0,0 +1,17 @@ +import select + +__author__ = 'Quantum' +engines = {} + +from .select_server import SelectServer # noqa: E402, import not at top for consistency +engines['select'] = SelectServer + +if hasattr(select, 'poll'): + from .poll_server import PollServer + engines['poll'] = PollServer + +if hasattr(select, 'epoll'): + from .epoll_server import EpollServer + engines['epoll'] = EpollServer + +del select diff --git a/event_socket_server/engines/epoll_server.py b/event_socket_server/engines/epoll_server.py new file mode 100644 index 0000000..a59755a --- /dev/null +++ b/event_socket_server/engines/epoll_server.py @@ -0,0 +1,17 @@ +import select +__author__ = 'Quantum' + +if not hasattr(select, 'epoll'): + raise ImportError('System does not support epoll') + +from .poll_server import PollServer # noqa: E402, must be imported here + + +class EpollServer(PollServer): + poll = select.epoll + WRITE = select.EPOLLIN | select.EPOLLOUT | select.EPOLLERR | select.EPOLLHUP + READ = select.EPOLLIN | select.EPOLLERR | select.EPOLLHUP + POLLIN = select.EPOLLIN + POLLOUT = select.EPOLLOUT + POLL_CLOSE = select.EPOLLHUP | select.EPOLLERR + NEED_CLOSE = True diff --git a/event_socket_server/engines/poll_server.py b/event_socket_server/engines/poll_server.py new file mode 100644 index 0000000..aa4124b --- /dev/null +++ b/event_socket_server/engines/poll_server.py @@ -0,0 +1,97 @@ +import errno +import logging +import select +import threading + +from ..base_server import BaseServer + +logger = logging.getLogger('event_socket_server') + +if not hasattr(select, 'poll'): + raise ImportError('System does not support poll') + + +class PollServer(BaseServer): + poll = select.poll + WRITE = select.POLLIN | select.POLLOUT | select.POLLERR | select.POLLHUP + READ = select.POLLIN | select.POLLERR | select.POLLHUP + POLLIN = select.POLLIN + POLLOUT = select.POLLOUT + POLL_CLOSE = select.POLLERR | select.POLLHUP + NEED_CLOSE = False + + def __init__(self, *args, **kwargs): + super(PollServer, self).__init__(*args, **kwargs) + self._poll = self.poll() + self._fdmap = {} + self._server_fds = {sock.fileno(): sock for sock in self._servers} + self._close_lock = threading.RLock() + + def _register_write(self, client): + logger.debug('On write mode: %s', client.client_address) + self._poll.modify(client.fileno(), self.WRITE) + + def _register_read(self, client): + logger.debug('On read mode: %s', client.client_address) + self._poll.modify(client.fileno(), self.READ) + + def _clean_up_client(self, client, finalize=False): + logger.debug('Taking close lock: cleanup') + with self._close_lock: + logger.debug('Cleaning up client: %s, finalize: %d', client.client_address, finalize) + fd = client.fileno() + try: + self._poll.unregister(fd) + except IOError as e: + if e.errno != errno.ENOENT: + raise + except KeyError: + pass + del self._fdmap[fd] + super(PollServer, self)._clean_up_client(client, finalize) + + def _serve(self): + for fd, sock in self._server_fds.items(): + self._poll.register(fd, self.POLLIN) + sock.listen(16) + try: + while not self._stop.is_set(): + for fd, event in self._poll.poll(self._dispatch_event()): + if fd in self._server_fds: + client = self._accept(self._server_fds[fd]) + logger.debug('Accepting: %s', client.client_address) + fd = client.fileno() + self._poll.register(fd, self.READ) + self._fdmap[fd] = client + elif event & self.POLL_CLOSE: + logger.debug('Client closed: %s', self._fdmap[fd].client_address) + self._clean_up_client(self._fdmap[fd]) + else: + logger.debug('Taking close lock: event loop') + with self._close_lock: + try: + client = self._fdmap[fd] + except KeyError: + pass + else: + logger.debug('Client active: %s, read: %d, write: %d', + client.client_address, + event & self.POLLIN, + event & self.POLLOUT) + if event & self.POLLIN: + logger.debug('Non-blocking read on client: %s', client.client_address) + self._nonblock_read(client) + # Might be closed in the read handler. + if event & self.POLLOUT and fd in self._fdmap: + logger.debug('Non-blocking write on client: %s', client.client_address) + self._nonblock_write(client) + finally: + logger.info('Shutting down server') + self.on_shutdown() + for client in self._clients: + self._clean_up_client(client, True) + for fd, sock in self._server_fds.items(): + self._poll.unregister(fd) + sock.close() + if self.NEED_CLOSE: + self._poll.close() diff --git a/event_socket_server/engines/select_server.py b/event_socket_server/engines/select_server.py new file mode 100644 index 0000000..3ae9a4d --- /dev/null +++ b/event_socket_server/engines/select_server.py @@ -0,0 +1,49 @@ +import select + +from ..base_server import BaseServer + + +class SelectServer(BaseServer): + def __init__(self, *args, **kwargs): + super(SelectServer, self).__init__(*args, **kwargs) + self._reads = set(self._servers) + self._writes = set() + + def _register_write(self, client): + self._writes.add(client) + + def _register_read(self, client): + self._writes.remove(client) + + def _clean_up_client(self, client, finalize=False): + self._writes.discard(client) + self._reads.remove(client) + super(SelectServer, self)._clean_up_client(client, finalize) + + def _serve(self, select=select.select): + for server in self._servers: + server.listen(16) + try: + while not self._stop.is_set(): + r, w, x = select(self._reads, self._writes, self._reads, self._dispatch_event()) + for s in r: + if s in self._servers: + self._reads.add(self._accept(s)) + else: + self._nonblock_read(s) + + for client in w: + self._nonblock_write(client) + + for s in x: + s.close() + if s in self._servers: + raise RuntimeError('Server is in exceptional condition') + else: + self._clean_up_client(s) + finally: + self.on_shutdown() + for client in self._clients: + self._clean_up_client(client, True) + for server in self._servers: + server.close() diff --git a/event_socket_server/handler.py b/event_socket_server/handler.py new file mode 100644 index 0000000..ecc3314 --- /dev/null +++ b/event_socket_server/handler.py @@ -0,0 +1,27 @@ +__author__ = 'Quantum' + + +class Handler(object): + def __init__(self, server, socket): + self._socket = socket + self.server = server + self.client_address = socket.getpeername() + + def fileno(self): + return self._socket.fileno() + + def _recv_data(self, data): + raise NotImplementedError + + def _send(self, data, callback=None): + return self.server.send(self, data, callback) + + def close(self): + self.server._clean_up_client(self) + + def on_close(self): + pass + + @property + def socket(self): + return self._socket diff --git a/event_socket_server/helpers.py b/event_socket_server/helpers.py new file mode 100644 index 0000000..e8c3672 --- /dev/null +++ b/event_socket_server/helpers.py @@ -0,0 +1,125 @@ +import struct +import zlib + +from judge.utils.unicode import utf8text +from .handler import Handler + +size_pack = struct.Struct('!I') + + +class SizedPacketHandler(Handler): + def __init__(self, server, socket): + super(SizedPacketHandler, self).__init__(server, socket) + self._buffer = b'' + self._packetlen = 0 + + def _packet(self, data): + raise NotImplementedError() + + def _format_send(self, data): + return data + + def _recv_data(self, data): + self._buffer += data + while len(self._buffer) >= self._packetlen if self._packetlen else len(self._buffer) >= size_pack.size: + if self._packetlen: + data = self._buffer[:self._packetlen] + self._buffer = self._buffer[self._packetlen:] + self._packetlen = 0 + self._packet(data) + else: + data = self._buffer[:size_pack.size] + self._buffer = self._buffer[size_pack.size:] + self._packetlen = size_pack.unpack(data)[0] + + def send(self, data, callback=None): + data = self._format_send(data) + self._send(size_pack.pack(len(data)) + data, callback) + + +class ZlibPacketHandler(SizedPacketHandler): + def _format_send(self, data): + return zlib.compress(data.encode('utf-8')) + + def packet(self, data): + raise NotImplementedError() + + def _packet(self, data): + try: + self.packet(zlib.decompress(data).decode('utf-8')) + except zlib.error as e: + self.malformed_packet(e) + + def malformed_packet(self, exception): + self.close() + + +class ProxyProtocolMixin(object): + __UNKNOWN_TYPE = 0 + __PROXY1 = 1 + __PROXY2 = 2 + __DATA = 3 + + __HEADER2 = b'\x0D\x0A\x0D\x0A\x00\x0D\x0A\x51\x55\x49\x54\x0A' + __HEADER2_LEN = len(__HEADER2) + + _REAL_IP_SET = None + + @classmethod + def with_proxy_set(cls, ranges): + from netaddr import IPSet, IPGlob + from itertools import chain + + globs = [] + addrs = [] + for item in ranges: + if '*' in item or '-' in item: + globs.append(IPGlob(item)) + else: + addrs.append(item) + ipset = IPSet(chain(chain.from_iterable(globs), addrs)) + return type(cls.__name__, (cls,), {'_REAL_IP_SET': ipset}) + + def __init__(self, server, socket): + super(ProxyProtocolMixin, self).__init__(server, socket) + self.__buffer = b'' + self.__type = (self.__UNKNOWN_TYPE if self._REAL_IP_SET and + self.client_address[0] in self._REAL_IP_SET else self.__DATA) + + def __parse_proxy1(self, data): + self.__buffer += data + index = self.__buffer.find(b'\r\n') + if 0 <= index < 106: + proxy = data[:index].split() + if len(proxy) < 2: + return self.close() + if proxy[1] == b'TCP4': + if len(proxy) != 6: + return self.close() + self.client_address = (utf8text(proxy[2]), utf8text(proxy[4])) + self.server_address = (utf8text(proxy[3]), utf8text(proxy[5])) + elif proxy[1] == b'TCP6': + self.client_address = (utf8text(proxy[2]), utf8text(proxy[4]), 0, 0) + self.server_address = (utf8text(proxy[3]), utf8text(proxy[5]), 0, 0) + elif proxy[1] != b'UNKNOWN': + return self.close() + + self.__type = self.__DATA + super(ProxyProtocolMixin, self)._recv_data(data[index + 2:]) + elif len(self.__buffer) > 107 or index > 105: + self.close() + + def _recv_data(self, data): + if self.__type == self.__DATA: + super(ProxyProtocolMixin, self)._recv_data(data) + elif self.__type == self.__UNKNOWN_TYPE: + if len(data) >= 16 and data[:self.__HEADER2_LEN] == self.__HEADER2: + self.close() + elif len(data) >= 8 and data[:5] == b'PROXY': + self.__type = self.__PROXY1 + self.__parse_proxy1(data) + else: + self.__type = self.__DATA + super(ProxyProtocolMixin, self)._recv_data(data) + else: + self.__parse_proxy1(data) diff --git a/event_socket_server/test_client.py b/event_socket_server/test_client.py new file mode 100644 index 0000000..4f696e8 --- /dev/null +++ b/event_socket_server/test_client.py @@ -0,0 +1,94 @@ +import ctypes +import socket +import struct +import time +import zlib + +size_pack = struct.Struct('!I') +try: + RtlGenRandom = ctypes.windll.advapi32.SystemFunction036 +except AttributeError: + RtlGenRandom = None + + +def open_connection(): + sock = socket.create_connection((host, port)) + return sock + + +def zlibify(data): + data = zlib.compress(data.encode('utf-8')) + return size_pack.pack(len(data)) + data + + +def dezlibify(data, skip_head=True): + if skip_head: + data = data[size_pack.size:] + return zlib.decompress(data).decode('utf-8') + + +def random(length): + if RtlGenRandom is None: + with open('/dev/urandom') as f: + return f.read(length) + buf = ctypes.create_string_buffer(length) + RtlGenRandom(buf, length) + return buf.raw + + +def main(): + global host, port + import argparse + parser = argparse.ArgumentParser() + parser.add_argument('-l', '--host', default='localhost') + parser.add_argument('-p', '--port', default=9999, type=int) + args = parser.parse_args() + host, port = args.host, args.port + + print('Opening idle connection:', end=' ') + s1 = open_connection() + print('Success') + print('Opening hello world connection:', end=' ') + s2 = open_connection() + print('Success') + print('Sending Hello, World!', end=' ') + s2.sendall(zlibify('Hello, World!')) + print('Success') + print('Testing blank connection:', end=' ') + s3 = open_connection() + s3.close() + print('Success') + result = dezlibify(s2.recv(1024)) + assert result == 'Hello, World!' + print(result) + s2.close() + print('Large random data test:', end=' ') + s4 = open_connection() + data = random(1000000) + print('Generated', end=' ') + s4.sendall(zlibify(data)) + print('Sent', end=' ') + result = '' + while len(result) < size_pack.size: + result += s4.recv(1024) + size = size_pack.unpack(result[:size_pack.size])[0] + result = result[size_pack.size:] + while len(result) < size: + result += s4.recv(1024) + print('Received', end=' ') + assert dezlibify(result, False) == data + print('Success') + s4.close() + print('Test malformed connection:', end=' ') + s5 = open_connection() + s5.sendall(data[:100000]) + s5.close() + print('Success') + print('Waiting for timeout to close idle connection:', end=' ') + time.sleep(6) + print('Done') + s1.close() + + +if __name__ == '__main__': + main() diff --git a/event_socket_server/test_server.py b/event_socket_server/test_server.py new file mode 100644 index 0000000..7dec107 --- /dev/null +++ b/event_socket_server/test_server.py @@ -0,0 +1,54 @@ +from .engines import engines +from .helpers import ProxyProtocolMixin, ZlibPacketHandler + + +class EchoPacketHandler(ProxyProtocolMixin, ZlibPacketHandler): + def __init__(self, server, socket): + super(EchoPacketHandler, self).__init__(server, socket) + self._gotdata = False + self.server.schedule(5, self._kill_if_no_data) + + def _kill_if_no_data(self): + if not self._gotdata: + print('Inactive client:', self._socket.getpeername()) + self.close() + + def packet(self, data): + self._gotdata = True + print('Data from %s: %r' % (self._socket.getpeername(), data[:30] if len(data) > 30 else data)) + self.send(data) + + def on_close(self): + self._gotdata = True + print('Closed client:', self._socket.getpeername()) + + +def main(): + import argparse + parser = argparse.ArgumentParser() + parser.add_argument('-l', '--host', action='append') + parser.add_argument('-p', '--port', type=int, action='append') + parser.add_argument('-e', '--engine', default='select', choices=sorted(engines.keys())) + try: + import netaddr + except ImportError: + netaddr = None + else: + parser.add_argument('-P', '--proxy', action='append') + args = parser.parse_args() + + class TestServer(engines[args.engine]): + def _accept(self, sock): + client = super(TestServer, self)._accept(sock) + print('New connection:', client.socket.getpeername()) + return client + + handler = EchoPacketHandler + if netaddr is not None and args.proxy: + handler = handler.with_proxy_set(args.proxy) + server = TestServer(list(zip(args.host, args.port)), handler) + server.serve_forever() + + +if __name__ == '__main__': + main() diff --git a/judge/__init__.py b/judge/__init__.py new file mode 100644 index 0000000..5c386cd --- /dev/null +++ b/judge/__init__.py @@ -0,0 +1 @@ +default_app_config = 'judge.apps.JudgeAppConfig' diff --git a/judge/admin/__init__.py b/judge/admin/__init__.py new file mode 100644 index 0000000..51a7173 --- /dev/null +++ b/judge/admin/__init__.py @@ -0,0 +1,37 @@ +from django.contrib import admin +from django.contrib.admin.models import LogEntry + +from judge.admin.comments import CommentAdmin +from judge.admin.contest import ContestAdmin, ContestParticipationAdmin, ContestTagAdmin +from judge.admin.interface import BlogPostAdmin, LicenseAdmin, LogEntryAdmin, NavigationBarAdmin +from judge.admin.organization import OrganizationAdmin, OrganizationRequestAdmin +from judge.admin.problem import ProblemAdmin +from judge.admin.profile import ProfileAdmin +from judge.admin.runtime import JudgeAdmin, LanguageAdmin +from judge.admin.submission import SubmissionAdmin +from judge.admin.taxon import ProblemGroupAdmin, ProblemTypeAdmin +from judge.admin.ticket import TicketAdmin +from judge.models import BlogPost, Comment, CommentLock, Contest, ContestParticipation, \ + ContestTag, Judge, Language, License, MiscConfig, NavigationBar, Organization, \ + OrganizationRequest, Problem, ProblemGroup, ProblemType, Profile, Submission, Ticket + +admin.site.register(BlogPost, BlogPostAdmin) +admin.site.register(Comment, CommentAdmin) +admin.site.register(CommentLock) +admin.site.register(Contest, ContestAdmin) +admin.site.register(ContestParticipation, ContestParticipationAdmin) +admin.site.register(ContestTag, ContestTagAdmin) +admin.site.register(Judge, JudgeAdmin) +admin.site.register(Language, LanguageAdmin) +admin.site.register(License, LicenseAdmin) +admin.site.register(LogEntry, LogEntryAdmin) +admin.site.register(MiscConfig) +admin.site.register(NavigationBar, NavigationBarAdmin) +admin.site.register(Organization, OrganizationAdmin) +admin.site.register(OrganizationRequest, OrganizationRequestAdmin) +admin.site.register(Problem, ProblemAdmin) +admin.site.register(ProblemGroup, ProblemGroupAdmin) +admin.site.register(ProblemType, ProblemTypeAdmin) +admin.site.register(Profile, ProfileAdmin) +admin.site.register(Submission, SubmissionAdmin) +admin.site.register(Ticket, TicketAdmin) diff --git a/judge/admin/comments.py b/judge/admin/comments.py new file mode 100644 index 0000000..be6780c --- /dev/null +++ b/judge/admin/comments.py @@ -0,0 +1,64 @@ +from django.forms import ModelForm +from django.urls import reverse_lazy +from django.utils.html import format_html +from django.utils.translation import gettext_lazy as _, ungettext +from reversion.admin import VersionAdmin + +from judge.models import Comment +from judge.widgets import AdminHeavySelect2Widget, HeavyPreviewAdminPageDownWidget + + +class CommentForm(ModelForm): + class Meta: + widgets = { + 'author': AdminHeavySelect2Widget(data_view='profile_select2'), + 'parent': AdminHeavySelect2Widget(data_view='comment_select2'), + } + if HeavyPreviewAdminPageDownWidget is not None: + widgets['body'] = HeavyPreviewAdminPageDownWidget(preview=reverse_lazy('comment_preview')) + + +class CommentAdmin(VersionAdmin): + fieldsets = ( + (None, {'fields': ('author', 'page', 'parent', 'score', 'hidden')}), + ('Content', {'fields': ('body',)}), + ) + list_display = ['author', 'linked_page', 'time'] + search_fields = ['author__user__username', 'page', 'body'] + actions = ['hide_comment', 'unhide_comment'] + list_filter = ['hidden'] + actions_on_top = True + actions_on_bottom = True + form = CommentForm + date_hierarchy = 'time' + + def get_queryset(self, request): + return Comment.objects.order_by('-time') + + def hide_comment(self, request, queryset): + count = queryset.update(hidden=True) + self.message_user(request, ungettext('%d comment successfully hidden.', + '%d comments successfully hidden.', + count) % count) + hide_comment.short_description = _('Hide comments') + + def unhide_comment(self, request, queryset): + count = queryset.update(hidden=False) + self.message_user(request, ungettext('%d comment successfully unhidden.', + '%d comments successfully unhidden.', + count) % count) + unhide_comment.short_description = _('Unhide comments') + + def linked_page(self, obj): + link = obj.link + if link is not None: + return format_html('{1}', link, obj.page) + else: + return format_html('{0}', obj.page) + linked_page.short_description = _('Associated page') + linked_page.admin_order_field = 'page' + + def save_model(self, request, obj, form, change): + super(CommentAdmin, self).save_model(request, obj, form, change) + if obj.hidden: + obj.get_descendants().update(hidden=obj.hidden) diff --git a/judge/admin/contest.py b/judge/admin/contest.py new file mode 100644 index 0000000..1fc2201 --- /dev/null +++ b/judge/admin/contest.py @@ -0,0 +1,269 @@ +from django.conf.urls import url +from django.contrib import admin +from django.core.exceptions import PermissionDenied +from django.db import connection, transaction +from django.db.models import Q, TextField +from django.forms import ModelForm, ModelMultipleChoiceField +from django.http import Http404, HttpResponseRedirect +from django.shortcuts import get_object_or_404 +from django.urls import reverse, reverse_lazy +from django.utils.html import format_html +from django.utils.translation import gettext_lazy as _, ungettext +from reversion.admin import VersionAdmin + +from judge.models import Contest, ContestProblem, ContestSubmission, Profile, Rating +from judge.ratings import rate_contest +from judge.widgets import AdminHeavySelect2MultipleWidget, AdminHeavySelect2Widget, AdminPagedownWidget, \ + AdminSelect2MultipleWidget, AdminSelect2Widget, HeavyPreviewAdminPageDownWidget + + +class AdminHeavySelect2Widget(AdminHeavySelect2Widget): + @property + def is_hidden(self): + return False + + +class ContestTagForm(ModelForm): + contests = ModelMultipleChoiceField( + label=_('Included contests'), + queryset=Contest.objects.all(), + required=False, + widget=AdminHeavySelect2MultipleWidget(data_view='contest_select2')) + + +class ContestTagAdmin(admin.ModelAdmin): + fields = ('name', 'color', 'description', 'contests') + list_display = ('name', 'color') + actions_on_top = True + actions_on_bottom = True + form = ContestTagForm + + if AdminPagedownWidget is not None: + formfield_overrides = { + TextField: {'widget': AdminPagedownWidget}, + } + + def save_model(self, request, obj, form, change): + super(ContestTagAdmin, self).save_model(request, obj, form, change) + obj.contests.set(form.cleaned_data['contests']) + + def get_form(self, request, obj=None, **kwargs): + form = super(ContestTagAdmin, self).get_form(request, obj, **kwargs) + if obj is not None: + form.base_fields['contests'].initial = obj.contests.all() + return form + + +class ContestProblemInlineForm(ModelForm): + class Meta: + widgets = {'problem': AdminHeavySelect2Widget(data_view='problem_select2')} + + +class ContestProblemInline(admin.TabularInline): + model = ContestProblem + verbose_name = _('Problem') + verbose_name_plural = 'Problems' + fields = ('problem', 'points', 'partial', 'is_pretested', 'max_submissions', 'output_prefix_override', 'order', + 'rejudge_column') + readonly_fields = ('rejudge_column',) + form = ContestProblemInlineForm + + def rejudge_column(self, obj): + if obj.id is None: + return '' + return format_html('Rejudge', + reverse('admin:judge_contest_rejudge', args=(obj.contest.id, obj.id))) + rejudge_column.short_description = '' + + +class ContestForm(ModelForm): + def __init__(self, *args, **kwargs): + super(ContestForm, self).__init__(*args, **kwargs) + if 'rate_exclude' in self.fields: + if self.instance and self.instance.id: + self.fields['rate_exclude'].queryset = \ + Profile.objects.filter(contest_history__contest=self.instance).distinct() + else: + self.fields['rate_exclude'].queryset = Profile.objects.none() + self.fields['banned_users'].widget.can_add_related = False + + def clean(self): + cleaned_data = super(ContestForm, self).clean() + cleaned_data['banned_users'].filter(current_contest__contest=self.instance).update(current_contest=None) + + class Meta: + widgets = { + 'organizers': AdminHeavySelect2MultipleWidget(data_view='profile_select2'), + 'private_contestants': AdminHeavySelect2MultipleWidget(data_view='profile_select2', + attrs={'style': 'width: 100%'}), + 'organizations': AdminHeavySelect2MultipleWidget(data_view='organization_select2'), + 'tags': AdminSelect2MultipleWidget, + 'banned_users': AdminHeavySelect2MultipleWidget(data_view='profile_select2', + attrs={'style': 'width: 100%'}), + } + + if HeavyPreviewAdminPageDownWidget is not None: + widgets['description'] = HeavyPreviewAdminPageDownWidget(preview=reverse_lazy('contest_preview')) + + +class ContestAdmin(VersionAdmin): + fieldsets = ( + (None, {'fields': ('key', 'name', 'organizers')}), + (_('Settings'), {'fields': ('is_visible', 'use_clarifications', 'hide_problem_tags', 'hide_scoreboard', + 'run_pretests_only')}), + (_('Scheduling'), {'fields': ('start_time', 'end_time', 'time_limit')}), + (_('Details'), {'fields': ('description', 'og_image', 'logo_override_image', 'tags', 'summary')}), + (_('Format'), {'fields': ('format_name', 'format_config')}), + (_('Rating'), {'fields': ('is_rated', 'rate_all', 'rating_floor', 'rating_ceiling', 'rate_exclude')}), + (_('Access'), {'fields': ('access_code', 'is_private', 'private_contestants', 'is_organization_private', + 'organizations')}), + (_('Justice'), {'fields': ('banned_users',)}), + ) + list_display = ('key', 'name', 'is_visible', 'is_rated', 'start_time', 'end_time', 'time_limit', 'user_count') + actions = ['make_visible', 'make_hidden'] + inlines = [ContestProblemInline] + actions_on_top = True + actions_on_bottom = True + form = ContestForm + change_list_template = 'admin/judge/contest/change_list.html' + filter_horizontal = ['rate_exclude'] + date_hierarchy = 'start_time' + + def get_queryset(self, request): + queryset = Contest.objects.all() + if request.user.has_perm('judge.edit_all_contest'): + return queryset + else: + return queryset.filter(organizers__id=request.profile.id) + + def get_readonly_fields(self, request, obj=None): + readonly = [] + if not request.user.has_perm('judge.contest_rating'): + readonly += ['is_rated', 'rate_all', 'rate_exclude'] + if not request.user.has_perm('judge.contest_access_code'): + readonly += ['access_code'] + if not request.user.has_perm('judge.create_private_contest'): + readonly += ['is_private', 'private_contestants', 'is_organization_private', 'organizations'] + return readonly + + def has_change_permission(self, request, obj=None): + if not request.user.has_perm('judge.edit_own_contest'): + return False + if request.user.has_perm('judge.edit_all_contest') or obj is None: + return True + return obj.organizers.filter(id=request.profile.id).exists() + + def make_visible(self, request, queryset): + count = queryset.update(is_visible=True) + self.message_user(request, ungettext('%d contest successfully marked as visible.', + '%d contests successfully marked as visible.', + count) % count) + make_visible.short_description = _('Mark contests as visible') + + def make_hidden(self, request, queryset): + count = queryset.update(is_visible=False) + self.message_user(request, ungettext('%d contest successfully marked as hidden.', + '%d contests successfully marked as hidden.', + count) % count) + make_hidden.short_description = _('Mark contests as hidden') + + def get_urls(self): + return [ + url(r'^rate/all/$', self.rate_all_view, name='judge_contest_rate_all'), + url(r'^(\d+)/rate/$', self.rate_view, name='judge_contest_rate'), + url(r'^(\d+)/judge/(\d+)/$', self.rejudge_view, name='judge_contest_rejudge'), + ] + super(ContestAdmin, self).get_urls() + + def rejudge_view(self, request, contest_id, problem_id): + queryset = ContestSubmission.objects.filter(problem_id=problem_id).select_related('submission') + for model in queryset: + model.submission.judge(rejudge=True) + + self.message_user(request, ungettext('%d submission was successfully scheduled for rejudging.', + '%d submissions were successfully scheduled for rejudging.', + len(queryset)) % len(queryset)) + return HttpResponseRedirect(reverse('admin:judge_contest_change', args=(contest_id,))) + + def rate_all_view(self, request): + if not request.user.has_perm('judge.contest_rating'): + raise PermissionDenied() + with transaction.atomic(): + if connection.vendor == 'sqlite': + Rating.objects.all().delete() + else: + cursor = connection.cursor() + cursor.execute('TRUNCATE TABLE `%s`' % Rating._meta.db_table) + cursor.close() + Profile.objects.update(rating=None) + for contest in Contest.objects.filter(is_rated=True).order_by('end_time'): + rate_contest(contest) + return HttpResponseRedirect(reverse('admin:judge_contest_changelist')) + + def rate_view(self, request, id): + if not request.user.has_perm('judge.contest_rating'): + raise PermissionDenied() + contest = get_object_or_404(Contest, id=id) + if not contest.is_rated: + raise Http404() + with transaction.atomic(): + contest.rate() + return HttpResponseRedirect(request.META.get('HTTP_REFERER', reverse('admin:judge_contest_changelist'))) + + def get_form(self, *args, **kwargs): + form = super(ContestAdmin, self).get_form(*args, **kwargs) + perms = ('edit_own_contest', 'edit_all_contest') + form.base_fields['organizers'].queryset = Profile.objects.filter( + Q(user__is_superuser=True) | + Q(user__groups__permissions__codename__in=perms) | + Q(user__user_permissions__codename__in=perms), + ).distinct() + return form + + +class ContestParticipationForm(ModelForm): + class Meta: + widgets = { + 'contest': AdminSelect2Widget(), + 'user': AdminHeavySelect2Widget(data_view='profile_select2'), + } + + +class ContestParticipationAdmin(admin.ModelAdmin): + fields = ('contest', 'user', 'real_start', 'virtual', 'is_disqualified') + list_display = ('contest', 'username', 'show_virtual', 'real_start', 'score', 'cumtime') + actions = ['recalculate_results'] + actions_on_bottom = actions_on_top = True + search_fields = ('contest__key', 'contest__name', 'user__user__username') + form = ContestParticipationForm + date_hierarchy = 'real_start' + + def get_queryset(self, request): + return super(ContestParticipationAdmin, self).get_queryset(request).only( + 'contest__name', 'contest__format_name', 'contest__format_config', + 'user__user__username', 'real_start', 'score', 'cumtime', 'virtual', + ) + + def save_model(self, request, obj, form, change): + super().save_model(request, obj, form, change) + if form.changed_data and 'is_disqualified' in form.changed_data: + obj.set_disqualified(obj.is_disqualified) + + def recalculate_results(self, request, queryset): + count = 0 + for participation in queryset: + participation.recompute_results() + count += 1 + self.message_user(request, ungettext('%d participation recalculated.', + '%d participations recalculated.', + count) % count) + recalculate_results.short_description = _('Recalculate results') + + def username(self, obj): + return obj.user.username + username.short_description = _('username') + username.admin_order_field = 'user__user__username' + + def show_virtual(self, obj): + return obj.virtual or '-' + show_virtual.short_description = _('virtual') + show_virtual.admin_order_field = 'virtual' diff --git a/judge/admin/interface.py b/judge/admin/interface.py new file mode 100644 index 0000000..0bfec14 --- /dev/null +++ b/judge/admin/interface.py @@ -0,0 +1,151 @@ +from django.contrib import admin +from django.contrib.auth.models import User +from django.forms import ModelForm +from django.urls import NoReverseMatch, reverse, reverse_lazy +from django.utils.html import format_html +from django.utils.translation import gettext_lazy as _ +from mptt.admin import DraggableMPTTAdmin +from reversion.admin import VersionAdmin + +from judge.dblock import LockModel +from judge.models import NavigationBar +from judge.widgets import AdminHeavySelect2MultipleWidget, AdminHeavySelect2Widget, HeavyPreviewAdminPageDownWidget + + +class NavigationBarAdmin(DraggableMPTTAdmin): + list_display = DraggableMPTTAdmin.list_display + ('key', 'linked_path') + fields = ('key', 'label', 'path', 'order', 'regex', 'parent') + list_editable = () # Bug in SortableModelAdmin: 500 without list_editable being set + mptt_level_indent = 20 + sortable = 'order' + + def __init__(self, *args, **kwargs): + super(NavigationBarAdmin, self).__init__(*args, **kwargs) + self.__save_model_calls = 0 + + def linked_path(self, obj): + return format_html(u'{0}', obj.path) + linked_path.short_description = _('link path') + + def save_model(self, request, obj, form, change): + self.__save_model_calls += 1 + return super(NavigationBarAdmin, self).save_model(request, obj, form, change) + + def changelist_view(self, request, extra_context=None): + self.__save_model_calls = 0 + with NavigationBar.objects.disable_mptt_updates(): + result = super(NavigationBarAdmin, self).changelist_view(request, extra_context) + if self.__save_model_calls: + with LockModel(write=(NavigationBar,)): + NavigationBar.objects.rebuild() + return result + + +class BlogPostForm(ModelForm): + def __init__(self, *args, **kwargs): + super(BlogPostForm, self).__init__(*args, **kwargs) + self.fields['authors'].widget.can_add_related = False + + class Meta: + widgets = { + 'authors': AdminHeavySelect2MultipleWidget(data_view='profile_select2', attrs={'style': 'width: 100%'}), + } + + if HeavyPreviewAdminPageDownWidget is not None: + widgets['content'] = HeavyPreviewAdminPageDownWidget(preview=reverse_lazy('blog_preview')) + widgets['summary'] = HeavyPreviewAdminPageDownWidget(preview=reverse_lazy('blog_preview')) + + +class BlogPostAdmin(VersionAdmin): + fieldsets = ( + (None, {'fields': ('title', 'slug', 'authors', 'visible', 'sticky', 'publish_on')}), + (_('Content'), {'fields': ('content', 'og_image')}), + (_('Summary'), {'classes': ('collapse',), 'fields': ('summary',)}), + ) + prepopulated_fields = {'slug': ('title',)} + list_display = ('id', 'title', 'visible', 'sticky', 'publish_on') + list_display_links = ('id', 'title') + ordering = ('-publish_on',) + form = BlogPostForm + date_hierarchy = 'publish_on' + + def has_change_permission(self, request, obj=None): + return (request.user.has_perm('judge.edit_all_post') or + request.user.has_perm('judge.change_blogpost') and ( + obj is None or + obj.authors.filter(id=request.profile.id).exists())) + + +class SolutionForm(ModelForm): + def __init__(self, *args, **kwargs): + super(SolutionForm, self).__init__(*args, **kwargs) + self.fields['authors'].widget.can_add_related = False + + class Meta: + widgets = { + 'authors': AdminHeavySelect2MultipleWidget(data_view='profile_select2', attrs={'style': 'width: 100%'}), + 'problem': AdminHeavySelect2Widget(data_view='problem_select2', attrs={'style': 'width: 250px'}), + } + + if HeavyPreviewAdminPageDownWidget is not None: + widgets['content'] = HeavyPreviewAdminPageDownWidget(preview=reverse_lazy('solution_preview')) + + +class LicenseForm(ModelForm): + class Meta: + if HeavyPreviewAdminPageDownWidget is not None: + widgets = {'text': HeavyPreviewAdminPageDownWidget(preview=reverse_lazy('license_preview'))} + + +class LicenseAdmin(admin.ModelAdmin): + fields = ('key', 'link', 'name', 'display', 'icon', 'text') + list_display = ('name', 'key') + form = LicenseForm + + +class UserListFilter(admin.SimpleListFilter): + title = _('user') + parameter_name = 'user' + + def lookups(self, request, model_admin): + return User.objects.filter(is_staff=True).values_list('id', 'username') + + def queryset(self, request, queryset): + if self.value(): + return queryset.filter(user_id=self.value(), user__is_staff=True) + return queryset + + +class LogEntryAdmin(admin.ModelAdmin): + readonly_fields = ('user', 'content_type', 'object_id', 'object_repr', 'action_flag', 'change_message') + list_display = ('__str__', 'action_time', 'user', 'content_type', 'object_link') + search_fields = ('object_repr', 'change_message') + list_filter = (UserListFilter, 'content_type') + list_display_links = None + actions = None + + def has_add_permission(self, request): + return False + + def has_change_permission(self, request, obj=None): + return obj is None and request.user.is_superuser + + def has_delete_permission(self, request, obj=None): + return False + + def object_link(self, obj): + if obj.is_deletion(): + link = obj.object_repr + else: + ct = obj.content_type + try: + link = format_html('{0}', obj.object_repr, + reverse('admin:%s_%s_change' % (ct.app_label, ct.model), args=(obj.object_id,))) + except NoReverseMatch: + link = obj.object_repr + return link + object_link.admin_order_field = 'object_repr' + object_link.short_description = _('object') + + def queryset(self, request): + return super().queryset(request).prefetch_related('content_type') diff --git a/judge/admin/organization.py b/judge/admin/organization.py new file mode 100644 index 0000000..f9d78d4 --- /dev/null +++ b/judge/admin/organization.py @@ -0,0 +1,66 @@ +from django.contrib import admin +from django.forms import ModelForm +from django.urls import reverse_lazy +from django.utils.html import format_html +from django.utils.translation import gettext, gettext_lazy as _ +from reversion.admin import VersionAdmin + +from judge.models import Organization +from judge.widgets import AdminHeavySelect2MultipleWidget, AdminHeavySelect2Widget, HeavyPreviewAdminPageDownWidget + + +class OrganizationForm(ModelForm): + class Meta: + widgets = { + 'admins': AdminHeavySelect2MultipleWidget(data_view='profile_select2'), + 'registrant': AdminHeavySelect2Widget(data_view='profile_select2'), + } + if HeavyPreviewAdminPageDownWidget is not None: + widgets['about'] = HeavyPreviewAdminPageDownWidget(preview=reverse_lazy('organization_preview')) + + +class OrganizationAdmin(VersionAdmin): + readonly_fields = ('creation_date',) + fields = ('name', 'slug', 'short_name', 'is_open', 'about', 'logo_override_image', 'slots', 'registrant', + 'creation_date', 'admins') + list_display = ('name', 'short_name', 'is_open', 'slots', 'registrant', 'show_public') + prepopulated_fields = {'slug': ('name',)} + actions_on_top = True + actions_on_bottom = True + form = OrganizationForm + + def show_public(self, obj): + return format_html('{1}', + obj.get_absolute_url(), gettext('View on site')) + + show_public.short_description = '' + + def get_readonly_fields(self, request, obj=None): + fields = self.readonly_fields + if not request.user.has_perm('judge.organization_admin'): + return fields + ('registrant', 'admins', 'is_open', 'slots') + return fields + + def get_queryset(self, request): + queryset = Organization.objects.all() + if request.user.has_perm('judge.edit_all_organization'): + return queryset + else: + return queryset.filter(admins=request.profile.id) + + def has_change_permission(self, request, obj=None): + if not request.user.has_perm('judge.change_organization'): + return False + if request.user.has_perm('judge.edit_all_organization') or obj is None: + return True + return obj.admins.filter(id=request.profile.id).exists() + + +class OrganizationRequestAdmin(admin.ModelAdmin): + list_display = ('username', 'organization', 'state', 'time') + readonly_fields = ('user', 'organization') + + def username(self, obj): + return obj.user.user.username + username.short_description = _('username') + username.admin_order_field = 'user__user__username' diff --git a/judge/admin/problem.py b/judge/admin/problem.py new file mode 100644 index 0000000..4d29b6a --- /dev/null +++ b/judge/admin/problem.py @@ -0,0 +1,238 @@ +from operator import attrgetter + +from django import forms +from django.contrib import admin +from django.db import transaction +from django.db.models import Q +from django.forms import ModelForm +from django.urls import reverse_lazy +from django.utils.html import format_html +from django.utils.translation import gettext, gettext_lazy as _, ungettext +from reversion.admin import VersionAdmin + +from judge.models import LanguageLimit, Problem, ProblemClarification, ProblemTranslation, Profile, Solution +from judge.widgets import AdminHeavySelect2MultipleWidget, AdminSelect2MultipleWidget, AdminSelect2Widget, \ + CheckboxSelectMultipleWithSelectAll, HeavyPreviewAdminPageDownWidget, HeavyPreviewPageDownWidget + + +class ProblemForm(ModelForm): + change_message = forms.CharField(max_length=256, label='Edit reason', required=False) + + def __init__(self, *args, **kwargs): + super(ProblemForm, self).__init__(*args, **kwargs) + self.fields['authors'].widget.can_add_related = False + self.fields['curators'].widget.can_add_related = False + self.fields['testers'].widget.can_add_related = False + self.fields['banned_users'].widget.can_add_related = False + self.fields['change_message'].widget.attrs.update({ + 'placeholder': gettext('Describe the changes you made (optional)'), + }) + + class Meta: + widgets = { + 'authors': AdminHeavySelect2MultipleWidget(data_view='profile_select2', attrs={'style': 'width: 100%'}), + 'curators': AdminHeavySelect2MultipleWidget(data_view='profile_select2', attrs={'style': 'width: 100%'}), + 'testers': AdminHeavySelect2MultipleWidget(data_view='profile_select2', attrs={'style': 'width: 100%'}), + 'banned_users': AdminHeavySelect2MultipleWidget(data_view='profile_select2', + attrs={'style': 'width: 100%'}), + 'organizations': AdminHeavySelect2MultipleWidget(data_view='organization_select2', + attrs={'style': 'width: 100%'}), + 'types': AdminSelect2MultipleWidget, + 'group': AdminSelect2Widget, + } + if HeavyPreviewAdminPageDownWidget is not None: + widgets['description'] = HeavyPreviewAdminPageDownWidget(preview=reverse_lazy('problem_preview')) + + +class ProblemCreatorListFilter(admin.SimpleListFilter): + title = parameter_name = 'creator' + + def lookups(self, request, model_admin): + queryset = Profile.objects.exclude(authored_problems=None).values_list('user__username', flat=True) + return [(name, name) for name in queryset] + + def queryset(self, request, queryset): + if self.value() is None: + return queryset + return queryset.filter(authors__user__username=self.value()) + + +class LanguageLimitInlineForm(ModelForm): + class Meta: + widgets = {'language': AdminSelect2Widget} + + +class LanguageLimitInline(admin.TabularInline): + model = LanguageLimit + fields = ('language', 'time_limit', 'memory_limit') + form = LanguageLimitInlineForm + + +class ProblemClarificationForm(ModelForm): + class Meta: + if HeavyPreviewPageDownWidget is not None: + widgets = {'description': HeavyPreviewPageDownWidget(preview=reverse_lazy('comment_preview'))} + + +class ProblemClarificationInline(admin.StackedInline): + model = ProblemClarification + fields = ('description',) + form = ProblemClarificationForm + extra = 0 + + +class ProblemSolutionForm(ModelForm): + def __init__(self, *args, **kwargs): + super(ProblemSolutionForm, self).__init__(*args, **kwargs) + self.fields['authors'].widget.can_add_related = False + + class Meta: + widgets = { + 'authors': AdminHeavySelect2MultipleWidget(data_view='profile_select2', attrs={'style': 'width: 100%'}), + } + + if HeavyPreviewAdminPageDownWidget is not None: + widgets['content'] = HeavyPreviewAdminPageDownWidget(preview=reverse_lazy('solution_preview')) + + +class ProblemSolutionInline(admin.StackedInline): + model = Solution + fields = ('is_public', 'publish_on', 'authors', 'content') + form = ProblemSolutionForm + extra = 0 + + +class ProblemTranslationForm(ModelForm): + class Meta: + if HeavyPreviewAdminPageDownWidget is not None: + widgets = {'description': HeavyPreviewAdminPageDownWidget(preview=reverse_lazy('problem_preview'))} + + +class ProblemTranslationInline(admin.StackedInline): + model = ProblemTranslation + fields = ('language', 'name', 'description') + form = ProblemTranslationForm + extra = 0 + + +class ProblemAdmin(VersionAdmin): + fieldsets = ( + (None, { + 'fields': ( + 'code', 'name', 'is_public', 'is_manually_managed', 'date', 'authors', 'curators', 'testers', + 'is_organization_private', 'organizations', 'description', 'license', + ), + }), + (_('Social Media'), {'classes': ('collapse',), 'fields': ('og_image', 'summary')}), + (_('Taxonomy'), {'fields': ('types', 'group')}), + (_('Points'), {'fields': (('points', 'partial'), 'short_circuit')}), + (_('Limits'), {'fields': ('time_limit', 'memory_limit')}), + (_('Language'), {'fields': ('allowed_languages',)}), + (_('Justice'), {'fields': ('banned_users',)}), + (_('History'), {'fields': ('change_message',)}), + ) + list_display = ['code', 'name', 'show_authors', 'points', 'is_public', 'show_public'] + ordering = ['code'] + search_fields = ('code', 'name', 'authors__user__username', 'curators__user__username') + inlines = [LanguageLimitInline, ProblemClarificationInline, ProblemSolutionInline, ProblemTranslationInline] + list_max_show_all = 1000 + actions_on_top = True + actions_on_bottom = True + list_filter = ('is_public', ProblemCreatorListFilter) + form = ProblemForm + date_hierarchy = 'date' + + def get_actions(self, request): + actions = super(ProblemAdmin, self).get_actions(request) + + if request.user.has_perm('judge.change_public_visibility'): + func, name, desc = self.get_action('make_public') + actions[name] = (func, name, desc) + + func, name, desc = self.get_action('make_private') + actions[name] = (func, name, desc) + + return actions + + def get_readonly_fields(self, request, obj=None): + fields = self.readonly_fields + if not request.user.has_perm('judge.change_public_visibility'): + fields += ('is_public',) + if not request.user.has_perm('judge.change_manually_managed'): + fields += ('is_manually_managed',) + return fields + + def show_authors(self, obj): + return ', '.join(map(attrgetter('user.username'), obj.authors.all())) + + show_authors.short_description = _('Authors') + + def show_public(self, obj): + return format_html('{0}', gettext('View on site'), obj.get_absolute_url()) + + show_public.short_description = '' + + def _rescore(self, request, problem_id): + from judge.tasks import rescore_problem + transaction.on_commit(rescore_problem.s(problem_id).delay) + + def make_public(self, request, queryset): + count = queryset.update(is_public=True) + for problem_id in queryset.values_list('id', flat=True): + self._rescore(request, problem_id) + self.message_user(request, ungettext('%d problem successfully marked as public.', + '%d problems successfully marked as public.', + count) % count) + + make_public.short_description = _('Mark problems as public') + + def make_private(self, request, queryset): + count = queryset.update(is_public=False) + for problem_id in queryset.values_list('id', flat=True): + self._rescore(request, problem_id) + self.message_user(request, ungettext('%d problem successfully marked as private.', + '%d problems successfully marked as private.', + count) % count) + + make_private.short_description = _('Mark problems as private') + + def get_queryset(self, request): + queryset = Problem.objects.prefetch_related('authors__user') + if request.user.has_perm('judge.edit_all_problem'): + return queryset + + access = Q() + if request.user.has_perm('judge.edit_public_problem'): + access |= Q(is_public=True) + if request.user.has_perm('judge.edit_own_problem'): + access |= Q(authors__id=request.profile.id) | Q(curators__id=request.profile.id) + return queryset.filter(access).distinct() if access else queryset.none() + + def has_change_permission(self, request, obj=None): + if request.user.has_perm('judge.edit_all_problem') or obj is None: + return True + if request.user.has_perm('judge.edit_public_problem') and obj.is_public: + return True + if not request.user.has_perm('judge.edit_own_problem'): + return False + return obj.is_editor(request.profile) + + def formfield_for_manytomany(self, db_field, request=None, **kwargs): + if db_field.name == 'allowed_languages': + kwargs['widget'] = CheckboxSelectMultipleWithSelectAll() + return super(ProblemAdmin, self).formfield_for_manytomany(db_field, request, **kwargs) + + def get_form(self, *args, **kwargs): + form = super(ProblemAdmin, self).get_form(*args, **kwargs) + form.base_fields['authors'].queryset = Profile.objects.all() + return form + + def save_model(self, request, obj, form, change): + super(ProblemAdmin, self).save_model(request, obj, form, change) + if form.changed_data and any(f in form.changed_data for f in ('is_public', 'points', 'partial')): + self._rescore(request, obj.id) + + def construct_change_message(self, request, form, *args, **kwargs): + if form.cleaned_data.get('change_message'): + return form.cleaned_data['change_message'] + return super(ProblemAdmin, self).construct_change_message(request, form, *args, **kwargs) diff --git a/judge/admin/profile.py b/judge/admin/profile.py new file mode 100644 index 0000000..e5fbf46 --- /dev/null +++ b/judge/admin/profile.py @@ -0,0 +1,118 @@ +from django.contrib import admin +from django.forms import ModelForm +from django.utils.html import format_html +from django.utils.translation import gettext, gettext_lazy as _, ungettext +from reversion.admin import VersionAdmin + +from django_ace import AceWidget +from judge.models import Profile +from judge.widgets import AdminPagedownWidget, AdminSelect2Widget + + +class ProfileForm(ModelForm): + def __init__(self, *args, **kwargs): + super(ProfileForm, self).__init__(*args, **kwargs) + if 'current_contest' in self.base_fields: + # form.fields['current_contest'] does not exist when the user has only view permission on the model. + self.fields['current_contest'].queryset = self.instance.contest_history.select_related('contest') \ + .only('contest__name', 'user_id', 'virtual') + self.fields['current_contest'].label_from_instance = \ + lambda obj: '%s v%d' % (obj.contest.name, obj.virtual) if obj.virtual else obj.contest.name + + class Meta: + widgets = { + 'timezone': AdminSelect2Widget, + 'language': AdminSelect2Widget, + 'ace_theme': AdminSelect2Widget, + 'current_contest': AdminSelect2Widget, + } + if AdminPagedownWidget is not None: + widgets['about'] = AdminPagedownWidget + + +class TimezoneFilter(admin.SimpleListFilter): + title = _('timezone') + parameter_name = 'timezone' + + def lookups(self, request, model_admin): + return Profile.objects.values_list('timezone', 'timezone').distinct().order_by('timezone') + + def queryset(self, request, queryset): + if self.value() is None: + return queryset + return queryset.filter(timezone=self.value()) + + +class ProfileAdmin(VersionAdmin): + fields = ('user', 'display_rank', 'about', 'organizations', 'timezone', 'language', 'ace_theme', + 'math_engine', 'last_access', 'ip', 'mute', 'is_unlisted', 'notes', 'is_totp_enabled', 'user_script', + 'current_contest') + readonly_fields = ('user',) + list_display = ('admin_user_admin', 'email', 'is_totp_enabled', 'timezone_full', + 'date_joined', 'last_access', 'ip', 'show_public') + ordering = ('user__username',) + search_fields = ('user__username', 'ip', 'user__email') + list_filter = ('language', TimezoneFilter) + actions = ('recalculate_points',) + actions_on_top = True + actions_on_bottom = True + form = ProfileForm + + def get_queryset(self, request): + return super(ProfileAdmin, self).get_queryset(request).select_related('user') + + def get_fields(self, request, obj=None): + if request.user.has_perm('judge.totp'): + fields = list(self.fields) + fields.insert(fields.index('is_totp_enabled') + 1, 'totp_key') + return tuple(fields) + else: + return self.fields + + def get_readonly_fields(self, request, obj=None): + fields = self.readonly_fields + if not request.user.has_perm('judge.totp'): + fields += ('is_totp_enabled',) + return fields + + def show_public(self, obj): + return format_html('{1}', + obj.get_absolute_url(), gettext('View on site')) + show_public.short_description = '' + + def admin_user_admin(self, obj): + return obj.username + admin_user_admin.admin_order_field = 'user__username' + admin_user_admin.short_description = _('User') + + def email(self, obj): + return obj.user.email + email.admin_order_field = 'user__email' + email.short_description = _('Email') + + def timezone_full(self, obj): + return obj.timezone + timezone_full.admin_order_field = 'timezone' + timezone_full.short_description = _('Timezone') + + def date_joined(self, obj): + return obj.user.date_joined + date_joined.admin_order_field = 'user__date_joined' + date_joined.short_description = _('date joined') + + def recalculate_points(self, request, queryset): + count = 0 + for profile in queryset: + profile.calculate_points() + count += 1 + self.message_user(request, ungettext('%d user have scores recalculated.', + '%d users have scores recalculated.', + count) % count) + recalculate_points.short_description = _('Recalculate scores') + + def get_form(self, request, obj=None, **kwargs): + form = super(ProfileAdmin, self).get_form(request, obj, **kwargs) + if 'user_script' in form.base_fields: + # form.base_fields['user_script'] does not exist when the user has only view permission on the model. + form.base_fields['user_script'].widget = AceWidget('javascript', request.profile.ace_theme) + return form diff --git a/judge/admin/runtime.py b/judge/admin/runtime.py new file mode 100644 index 0000000..e9f44ec --- /dev/null +++ b/judge/admin/runtime.py @@ -0,0 +1,120 @@ +from django.conf.urls import url +from django.db.models import TextField +from django.forms import ModelForm, ModelMultipleChoiceField, TextInput +from django.http import HttpResponseRedirect +from django.shortcuts import get_object_or_404 +from django.urls import reverse +from django.utils.html import format_html +from django.utils.safestring import mark_safe +from django.utils.translation import gettext_lazy as _ +from reversion.admin import VersionAdmin + +from django_ace import AceWidget +from judge.models import Judge, Problem +from judge.widgets import AdminHeavySelect2MultipleWidget, AdminPagedownWidget + + +class LanguageForm(ModelForm): + problems = ModelMultipleChoiceField( + label=_('Disallowed problems'), + queryset=Problem.objects.all(), + required=False, + help_text=_('These problems are NOT allowed to be submitted in this language'), + widget=AdminHeavySelect2MultipleWidget(data_view='problem_select2')) + + class Meta: + if AdminPagedownWidget is not None: + widgets = {'description': AdminPagedownWidget} + + +class LanguageAdmin(VersionAdmin): + fields = ('key', 'name', 'short_name', 'common_name', 'ace', 'pygments', 'info', 'description', + 'template', 'problems') + list_display = ('key', 'name', 'common_name', 'info') + form = LanguageForm + + def save_model(self, request, obj, form, change): + super(LanguageAdmin, self).save_model(request, obj, form, change) + obj.problem_set.set(Problem.objects.exclude(id__in=form.cleaned_data['problems'].values('id'))) + + def get_form(self, request, obj=None, **kwargs): + self.form.base_fields['problems'].initial = \ + Problem.objects.exclude(id__in=obj.problem_set.values('id')).values_list('pk', flat=True) if obj else [] + form = super(LanguageAdmin, self).get_form(request, obj, **kwargs) + if obj is not None: + form.base_fields['template'].widget = AceWidget(obj.ace, request.profile.ace_theme) + return form + + +class GenerateKeyTextInput(TextInput): + def render(self, name, value, attrs=None, renderer=None): + text = super(TextInput, self).render(name, value, attrs) + return mark_safe(text + format_html( + '''\ +Regenerate + +''', name)) + + +class JudgeAdminForm(ModelForm): + class Meta: + widgets = {'auth_key': GenerateKeyTextInput} + if AdminPagedownWidget is not None: + widgets['description'] = AdminPagedownWidget + + +class JudgeAdmin(VersionAdmin): + form = JudgeAdminForm + readonly_fields = ('created', 'online', 'start_time', 'ping', 'load', 'last_ip', 'runtimes', 'problems') + fieldsets = ( + (None, {'fields': ('name', 'auth_key', 'is_blocked')}), + (_('Description'), {'fields': ('description',)}), + (_('Information'), {'fields': ('created', 'online', 'last_ip', 'start_time', 'ping', 'load')}), + (_('Capabilities'), {'fields': ('runtimes', 'problems')}), + ) + list_display = ('name', 'online', 'start_time', 'ping', 'load', 'last_ip') + ordering = ['-online', 'name'] + + def get_urls(self): + return ([url(r'^(\d+)/disconnect/$', self.disconnect_view, name='judge_judge_disconnect'), + url(r'^(\d+)/terminate/$', self.terminate_view, name='judge_judge_terminate')] + + super(JudgeAdmin, self).get_urls()) + + def disconnect_judge(self, id, force=False): + judge = get_object_or_404(Judge, id=id) + judge.disconnect(force=force) + return HttpResponseRedirect(reverse('admin:judge_judge_changelist')) + + def disconnect_view(self, request, id): + return self.disconnect_judge(id) + + def terminate_view(self, request, id): + return self.disconnect_judge(id, force=True) + + def get_readonly_fields(self, request, obj=None): + if obj is not None and obj.online: + return self.readonly_fields + ('name',) + return self.readonly_fields + + def has_delete_permission(self, request, obj=None): + result = super(JudgeAdmin, self).has_delete_permission(request, obj) + if result and obj is not None: + return not obj.online + return result + + if AdminPagedownWidget is not None: + formfield_overrides = { + TextField: {'widget': AdminPagedownWidget}, + } diff --git a/judge/admin/submission.py b/judge/admin/submission.py new file mode 100644 index 0000000..d774658 --- /dev/null +++ b/judge/admin/submission.py @@ -0,0 +1,251 @@ +from functools import partial +from operator import itemgetter + +from django.conf import settings +from django.conf.urls import url +from django.contrib import admin, messages +from django.core.cache import cache +from django.core.exceptions import PermissionDenied +from django.db.models import Q +from django.http import HttpResponseRedirect +from django.shortcuts import get_object_or_404 +from django.utils.html import format_html +from django.utils.translation import gettext, gettext_lazy as _, pgettext, ungettext + +from django_ace import AceWidget +from judge.models import ContestParticipation, ContestProblem, ContestSubmission, Profile, Submission, \ + SubmissionSource, SubmissionTestCase +from judge.utils.raw_sql import use_straight_join + + +class SubmissionStatusFilter(admin.SimpleListFilter): + parameter_name = title = 'status' + __lookups = (('None', _('None')), ('NotDone', _('Not done')), ('EX', _('Exceptional'))) + Submission.STATUS + __handles = set(map(itemgetter(0), Submission.STATUS)) + + def lookups(self, request, model_admin): + return self.__lookups + + def queryset(self, request, queryset): + if self.value() == 'None': + return queryset.filter(status=None) + elif self.value() == 'NotDone': + return queryset.exclude(status__in=['D', 'IE', 'CE', 'AB']) + elif self.value() == 'EX': + return queryset.exclude(status__in=['D', 'CE', 'G', 'AB']) + elif self.value() in self.__handles: + return queryset.filter(status=self.value()) + + +class SubmissionResultFilter(admin.SimpleListFilter): + parameter_name = title = 'result' + __lookups = (('None', _('None')), ('BAD', _('Unaccepted'))) + Submission.RESULT + __handles = set(map(itemgetter(0), Submission.RESULT)) + + def lookups(self, request, model_admin): + return self.__lookups + + def queryset(self, request, queryset): + if self.value() == 'None': + return queryset.filter(result=None) + elif self.value() == 'BAD': + return queryset.exclude(result='AC') + elif self.value() in self.__handles: + return queryset.filter(result=self.value()) + + +class SubmissionTestCaseInline(admin.TabularInline): + fields = ('case', 'batch', 'status', 'time', 'memory', 'points', 'total') + readonly_fields = ('case', 'batch', 'total') + model = SubmissionTestCase + can_delete = False + max_num = 0 + + +class ContestSubmissionInline(admin.StackedInline): + fields = ('problem', 'participation', 'points') + model = ContestSubmission + + def get_formset(self, request, obj=None, **kwargs): + kwargs['formfield_callback'] = partial(self.formfield_for_dbfield, request=request, obj=obj) + return super(ContestSubmissionInline, self).get_formset(request, obj, **kwargs) + + def formfield_for_dbfield(self, db_field, **kwargs): + submission = kwargs.pop('obj', None) + label = None + if submission: + if db_field.name == 'participation': + kwargs['queryset'] = ContestParticipation.objects.filter(user=submission.user, + contest__problems=submission.problem) \ + .only('id', 'contest__name') + + def label(obj): + return obj.contest.name + elif db_field.name == 'problem': + kwargs['queryset'] = ContestProblem.objects.filter(problem=submission.problem) \ + .only('id', 'problem__name', 'contest__name') + + def label(obj): + return pgettext('contest problem', '%(problem)s in %(contest)s') % { + 'problem': obj.problem.name, 'contest': obj.contest.name, + } + field = super(ContestSubmissionInline, self).formfield_for_dbfield(db_field, **kwargs) + if label is not None: + field.label_from_instance = label + return field + + +class SubmissionSourceInline(admin.StackedInline): + fields = ('source',) + model = SubmissionSource + can_delete = False + extra = 0 + + def get_formset(self, request, obj=None, **kwargs): + kwargs.setdefault('widgets', {})['source'] = AceWidget(mode=obj and obj.language.ace, + theme=request.profile.ace_theme) + return super().get_formset(request, obj, **kwargs) + + +class SubmissionAdmin(admin.ModelAdmin): + readonly_fields = ('user', 'problem', 'date') + fields = ('user', 'problem', 'date', 'time', 'memory', 'points', 'language', 'status', 'result', + 'case_points', 'case_total', 'judged_on', 'error') + actions = ('judge', 'recalculate_score') + list_display = ('id', 'problem_code', 'problem_name', 'user_column', 'execution_time', 'pretty_memory', + 'points', 'language_column', 'status', 'result', 'judge_column') + list_filter = ('language', SubmissionStatusFilter, SubmissionResultFilter) + search_fields = ('problem__code', 'problem__name', 'user__user__username') + actions_on_top = True + actions_on_bottom = True + inlines = [SubmissionSourceInline, SubmissionTestCaseInline, ContestSubmissionInline] + + def get_queryset(self, request): + queryset = Submission.objects.select_related('problem', 'user__user', 'language').only( + 'problem__code', 'problem__name', 'user__user__username', 'language__name', + 'time', 'memory', 'points', 'status', 'result', + ) + use_straight_join(queryset) + if not request.user.has_perm('judge.edit_all_problem'): + id = request.profile.id + queryset = queryset.filter(Q(problem__authors__id=id) | Q(problem__curators__id=id)).distinct() + return queryset + + def has_add_permission(self, request): + return False + + def has_change_permission(self, request, obj=None): + if not request.user.has_perm('judge.edit_own_problem'): + return False + if request.user.has_perm('judge.edit_all_problem') or obj is None: + return True + return obj.problem.is_editor(request.profile) + + def lookup_allowed(self, key, value): + return super(SubmissionAdmin, self).lookup_allowed(key, value) or key in ('problem__code',) + + def judge(self, request, queryset): + if not request.user.has_perm('judge.rejudge_submission') or not request.user.has_perm('judge.edit_own_problem'): + self.message_user(request, gettext('You do not have the permission to rejudge submissions.'), + level=messages.ERROR) + return + queryset = queryset.order_by('id') + if not request.user.has_perm('judge.rejudge_submission_lot') and \ + queryset.count() > settings.DMOJ_SUBMISSIONS_REJUDGE_LIMIT: + self.message_user(request, gettext('You do not have the permission to rejudge THAT many submissions.'), + level=messages.ERROR) + return + if not request.user.has_perm('judge.edit_all_problem'): + id = request.profile.id + queryset = queryset.filter(Q(problem__authors__id=id) | Q(problem__curators__id=id)) + judged = len(queryset) + for model in queryset: + model.judge(rejudge=True, batch_rejudge=True) + self.message_user(request, ungettext('%d submission was successfully scheduled for rejudging.', + '%d submissions were successfully scheduled for rejudging.', + judged) % judged) + judge.short_description = _('Rejudge the selected submissions') + + def recalculate_score(self, request, queryset): + if not request.user.has_perm('judge.rejudge_submission'): + self.message_user(request, gettext('You do not have the permission to rejudge submissions.'), + level=messages.ERROR) + return + submissions = list(queryset.defer(None).select_related(None).select_related('problem') + .only('points', 'case_points', 'case_total', 'problem__partial', 'problem__points')) + for submission in submissions: + submission.points = round(submission.case_points / submission.case_total * submission.problem.points + if submission.case_total else 0, 1) + if not submission.problem.partial and submission.points < submission.problem.points: + submission.points = 0 + submission.save() + submission.update_contest() + + for profile in Profile.objects.filter(id__in=queryset.values_list('user_id', flat=True).distinct()): + profile.calculate_points() + cache.delete('user_complete:%d' % profile.id) + cache.delete('user_attempted:%d' % profile.id) + + for participation in ContestParticipation.objects.filter( + id__in=queryset.values_list('contest__participation_id')).prefetch_related('contest'): + participation.recompute_results() + + self.message_user(request, ungettext('%d submission were successfully rescored.', + '%d submissions were successfully rescored.', + len(submissions)) % len(submissions)) + recalculate_score.short_description = _('Rescore the selected submissions') + + def problem_code(self, obj): + return obj.problem.code + problem_code.short_description = _('Problem code') + problem_code.admin_order_field = 'problem__code' + + def problem_name(self, obj): + return obj.problem.name + problem_name.short_description = _('Problem name') + problem_name.admin_order_field = 'problem__name' + + def user_column(self, obj): + return obj.user.user.username + user_column.admin_order_field = 'user__user__username' + user_column.short_description = _('User') + + def execution_time(self, obj): + return round(obj.time, 2) if obj.time is not None else 'None' + execution_time.short_description = _('Time') + execution_time.admin_order_field = 'time' + + def pretty_memory(self, obj): + memory = obj.memory + if memory is None: + return gettext('None') + if memory < 1000: + return gettext('%d KB') % memory + else: + return gettext('%.2f MB') % (memory / 1024) + pretty_memory.admin_order_field = 'memory' + pretty_memory.short_description = _('Memory') + + def language_column(self, obj): + return obj.language.name + language_column.admin_order_field = 'language__name' + language_column.short_description = _('Language') + + def judge_column(self, obj): + return format_html('', obj.id) + judge_column.short_description = '' + + def get_urls(self): + return [ + url(r'^(\d+)/judge/$', self.judge_view, name='judge_submission_rejudge'), + ] + super(SubmissionAdmin, self).get_urls() + + def judge_view(self, request, id): + if not request.user.has_perm('judge.rejudge_submission') or not request.user.has_perm('judge.edit_own_problem'): + raise PermissionDenied() + submission = get_object_or_404(Submission, id=id) + if not request.user.has_perm('judge.edit_all_problem') and \ + not submission.problem.is_editor(request.profile): + raise PermissionDenied() + submission.judge(rejudge=True) + return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/')) diff --git a/judge/admin/taxon.py b/judge/admin/taxon.py new file mode 100644 index 0000000..c707144 --- /dev/null +++ b/judge/admin/taxon.py @@ -0,0 +1,52 @@ +from django.contrib import admin +from django.forms import ModelForm, ModelMultipleChoiceField +from django.utils.translation import gettext_lazy as _ + +from judge.models import Problem +from judge.widgets import AdminHeavySelect2MultipleWidget + + +class ProblemGroupForm(ModelForm): + problems = ModelMultipleChoiceField( + label=_('Included problems'), + queryset=Problem.objects.all(), + required=False, + help_text=_('These problems are included in this group of problems'), + widget=AdminHeavySelect2MultipleWidget(data_view='problem_select2')) + + +class ProblemGroupAdmin(admin.ModelAdmin): + fields = ('name', 'full_name', 'problems') + form = ProblemGroupForm + + def save_model(self, request, obj, form, change): + super(ProblemGroupAdmin, self).save_model(request, obj, form, change) + obj.problem_set.set(form.cleaned_data['problems']) + obj.save() + + def get_form(self, request, obj=None, **kwargs): + self.form.base_fields['problems'].initial = [o.pk for o in obj.problem_set.all()] if obj else [] + return super(ProblemGroupAdmin, self).get_form(request, obj, **kwargs) + + +class ProblemTypeForm(ModelForm): + problems = ModelMultipleChoiceField( + label=_('Included problems'), + queryset=Problem.objects.all(), + required=False, + help_text=_('These problems are included in this type of problems'), + widget=AdminHeavySelect2MultipleWidget(data_view='problem_select2')) + + +class ProblemTypeAdmin(admin.ModelAdmin): + fields = ('name', 'full_name', 'problems') + form = ProblemTypeForm + + def save_model(self, request, obj, form, change): + super(ProblemTypeAdmin, self).save_model(request, obj, form, change) + obj.problem_set.set(form.cleaned_data['problems']) + obj.save() + + def get_form(self, request, obj=None, **kwargs): + self.form.base_fields['problems'].initial = [o.pk for o in obj.problem_set.all()] if obj else [] + return super(ProblemTypeAdmin, self).get_form(request, obj, **kwargs) diff --git a/judge/admin/ticket.py b/judge/admin/ticket.py new file mode 100644 index 0000000..a5c5a5e --- /dev/null +++ b/judge/admin/ticket.py @@ -0,0 +1,39 @@ +from django.contrib.admin import ModelAdmin +from django.contrib.admin.options import StackedInline +from django.forms import ModelForm +from django.urls import reverse_lazy + +from judge.models import TicketMessage +from judge.widgets import AdminHeavySelect2MultipleWidget, AdminHeavySelect2Widget, HeavyPreviewAdminPageDownWidget + + +class TicketMessageForm(ModelForm): + class Meta: + widgets = { + 'user': AdminHeavySelect2Widget(data_view='profile_select2', attrs={'style': 'width: 100%'}), + } + if HeavyPreviewAdminPageDownWidget is not None: + widgets['body'] = HeavyPreviewAdminPageDownWidget(preview=reverse_lazy('ticket_preview')) + + +class TicketMessageInline(StackedInline): + model = TicketMessage + form = TicketMessageForm + fields = ('user', 'body') + + +class TicketForm(ModelForm): + class Meta: + widgets = { + 'user': AdminHeavySelect2Widget(data_view='profile_select2', attrs={'style': 'width: 100%'}), + 'assignees': AdminHeavySelect2MultipleWidget(data_view='profile_select2', attrs={'style': 'width: 100%'}), + } + + +class TicketAdmin(ModelAdmin): + fields = ('title', 'time', 'user', 'assignees', 'content_type', 'object_id', 'notes') + readonly_fields = ('time',) + list_display = ('title', 'user', 'time', 'linked_item') + inlines = [TicketMessageInline] + form = TicketForm + date_hierarchy = 'time' diff --git a/judge/apps.py b/judge/apps.py new file mode 100644 index 0000000..068889e --- /dev/null +++ b/judge/apps.py @@ -0,0 +1,39 @@ +from django.apps import AppConfig +from django.db import DatabaseError +from django.utils.translation import gettext_lazy + + +class JudgeAppConfig(AppConfig): + name = 'judge' + verbose_name = gettext_lazy('Online Judge') + + def ready(self): + # WARNING: AS THIS IS NOT A FUNCTIONAL PROGRAMMING LANGUAGE, + # OPERATIONS MAY HAVE SIDE EFFECTS. + # DO NOT REMOVE THINKING THE IMPORT IS UNUSED. + # noinspection PyUnresolvedReferences + from . import signals, jinja2 # noqa: F401, imported for side effects + + from django.contrib.flatpages.models import FlatPage + from django.contrib.flatpages.admin import FlatPageAdmin + from django.contrib import admin + + from reversion.admin import VersionAdmin + + class FlatPageVersionAdmin(VersionAdmin, FlatPageAdmin): + pass + + admin.site.unregister(FlatPage) + admin.site.register(FlatPage, FlatPageVersionAdmin) + + from judge.models import Language, Profile + from django.contrib.auth.models import User + + try: + lang = Language.get_python3() + for user in User.objects.filter(profile=None): + # These poor profileless users + profile = Profile(user=user, language=lang) + profile.save() + except DatabaseError: + pass diff --git a/judge/bridge/__init__.py b/judge/bridge/__init__.py new file mode 100644 index 0000000..f1f1bfb --- /dev/null +++ b/judge/bridge/__init__.py @@ -0,0 +1,6 @@ +from .djangohandler import DjangoHandler +from .djangoserver import DjangoServer +from .judgecallback import DjangoJudgeHandler +from .judgehandler import JudgeHandler +from .judgelist import JudgeList +from .judgeserver import JudgeServer diff --git a/judge/bridge/djangohandler.py b/judge/bridge/djangohandler.py new file mode 100644 index 0000000..8b18a53 --- /dev/null +++ b/judge/bridge/djangohandler.py @@ -0,0 +1,67 @@ +import json +import logging +import struct + +from event_socket_server import ZlibPacketHandler + +logger = logging.getLogger('judge.bridge') +size_pack = struct.Struct('!I') + + +class DjangoHandler(ZlibPacketHandler): + def __init__(self, server, socket): + super(DjangoHandler, self).__init__(server, socket) + + self.handlers = { + 'submission-request': self.on_submission, + 'terminate-submission': self.on_termination, + 'disconnect-judge': self.on_disconnect, + } + self._to_kill = True + # self.server.schedule(5, self._kill_if_no_request) + + def _kill_if_no_request(self): + if self._to_kill: + logger.info('Killed inactive connection: %s', self._socket.getpeername()) + self.close() + + def _format_send(self, data): + return super(DjangoHandler, self)._format_send(json.dumps(data, separators=(',', ':'))) + + def packet(self, packet): + self._to_kill = False + packet = json.loads(packet) + try: + result = self.handlers.get(packet.get('name', None), self.on_malformed)(packet) + except Exception: + logger.exception('Error in packet handling (Django-facing)') + result = {'name': 'bad-request'} + self.send(result, self._schedule_close) + + def _schedule_close(self): + self.server.schedule(0, self.close) + + def on_submission(self, data): + id = data['submission-id'] + problem = data['problem-id'] + language = data['language'] + source = data['source'] + priority = data['priority'] + if not self.server.judges.check_priority(priority): + return {'name': 'bad-request'} + self.server.judges.judge(id, problem, language, source, priority) + return {'name': 'submission-received', 'submission-id': id} + + def on_termination(self, data): + return {'name': 'submission-received', 'judge-aborted': self.server.judges.abort(data['submission-id'])} + + def on_disconnect(self, data): + judge_id = data['judge-id'] + force = data['force'] + self.server.judges.disconnect(judge_id, force=force) + + def on_malformed(self, packet): + logger.error('Malformed packet: %s', packet) + + def on_close(self): + self._to_kill = False diff --git a/judge/bridge/djangoserver.py b/judge/bridge/djangoserver.py new file mode 100644 index 0000000..39f5787 --- /dev/null +++ b/judge/bridge/djangoserver.py @@ -0,0 +1,7 @@ +from event_socket_server import get_preferred_engine + + +class DjangoServer(get_preferred_engine()): + def __init__(self, judges, *args, **kwargs): + super(DjangoServer, self).__init__(*args, **kwargs) + self.judges = judges diff --git a/judge/bridge/judgecallback.py b/judge/bridge/judgecallback.py new file mode 100644 index 0000000..cba26a4 --- /dev/null +++ b/judge/bridge/judgecallback.py @@ -0,0 +1,411 @@ +import json +import logging +import time +from operator import itemgetter + +from django import db +from django.utils import timezone + +from judge import event_poster as event +from judge.caching import finished_submission +from judge.models import Judge, Language, LanguageLimit, Problem, RuntimeVersion, Submission, SubmissionTestCase +from .judgehandler import JudgeHandler, SubmissionData + +logger = logging.getLogger('judge.bridge') +json_log = logging.getLogger('judge.json.bridge') + +UPDATE_RATE_LIMIT = 5 +UPDATE_RATE_TIME = 0.5 + + +def _ensure_connection(): + try: + db.connection.cursor().execute('SELECT 1').fetchall() + except Exception: + db.connection.close() + + +class DjangoJudgeHandler(JudgeHandler): + def __init__(self, server, socket): + super(DjangoJudgeHandler, self).__init__(server, socket) + + # each value is (updates, last reset) + self.update_counter = {} + self.judge = None + self.judge_address = None + + self._submission_cache_id = None + self._submission_cache = {} + + json_log.info(self._make_json_log(action='connect')) + + def on_close(self): + super(DjangoJudgeHandler, self).on_close() + json_log.info(self._make_json_log(action='disconnect', info='judge disconnected')) + if self._working: + Submission.objects.filter(id=self._working).update(status='IE', result='IE') + json_log.error(self._make_json_log(sub=self._working, action='close', info='IE due to shutdown on grading')) + + def on_malformed(self, packet): + super(DjangoJudgeHandler, self).on_malformed(packet) + json_log.exception(self._make_json_log(sub=self._working, info='malformed zlib packet')) + + def _packet_exception(self): + json_log.exception(self._make_json_log(sub=self._working, info='packet processing exception')) + + def get_related_submission_data(self, submission): + _ensure_connection() # We are called from the django-facing daemon thread. Guess what happens. + + try: + pid, time, memory, short_circuit, lid, is_pretested, sub_date, uid, part_virtual, part_id = ( + Submission.objects.filter(id=submission) + .values_list('problem__id', 'problem__time_limit', 'problem__memory_limit', + 'problem__short_circuit', 'language__id', 'is_pretested', 'date', 'user__id', + 'contest__participation__virtual', 'contest__participation__id')).get() + except Submission.DoesNotExist: + logger.error('Submission vanished: %s', submission) + json_log.error(self._make_json_log( + sub=self._working, action='request', + info='submission vanished when fetching info', + )) + return + + attempt_no = Submission.objects.filter(problem__id=pid, contest__participation__id=part_id, user__id=uid, + date__lt=sub_date).exclude(status__in=('CE', 'IE')).count() + 1 + + try: + time, memory = (LanguageLimit.objects.filter(problem__id=pid, language__id=lid) + .values_list('time_limit', 'memory_limit').get()) + except LanguageLimit.DoesNotExist: + pass + + return SubmissionData( + time=time, + memory=memory, + short_circuit=short_circuit, + pretests_only=is_pretested, + contest_no=part_virtual, + attempt_no=attempt_no, + user_id=uid, + ) + + def _authenticate(self, id, key): + result = Judge.objects.filter(name=id, auth_key=key, is_blocked=False).exists() + if not result: + json_log.warning(self._make_json_log(action='auth', judge=id, info='judge failed authentication')) + return result + + def _connected(self): + judge = self.judge = Judge.objects.get(name=self.name) + judge.start_time = timezone.now() + judge.online = True + judge.problems.set(Problem.objects.filter(code__in=list(self.problems.keys()))) + judge.runtimes.set(Language.objects.filter(key__in=list(self.executors.keys()))) + + # Delete now in case we somehow crashed and left some over from the last connection + RuntimeVersion.objects.filter(judge=judge).delete() + versions = [] + for lang in judge.runtimes.all(): + versions += [ + RuntimeVersion(language=lang, name=name, version='.'.join(map(str, version)), priority=idx, judge=judge) + for idx, (name, version) in enumerate(self.executors[lang.key]) + ] + RuntimeVersion.objects.bulk_create(versions) + judge.last_ip = self.client_address[0] + judge.save() + self.judge_address = '[%s]:%s' % (self.client_address[0], self.client_address[1]) + json_log.info(self._make_json_log(action='auth', info='judge successfully authenticated', + executors=list(self.executors.keys()))) + + def _disconnected(self): + Judge.objects.filter(id=self.judge.id).update(online=False) + RuntimeVersion.objects.filter(judge=self.judge).delete() + + def _update_ping(self): + try: + Judge.objects.filter(name=self.name).update(ping=self.latency, load=self.load) + except Exception as e: + # What can I do? I don't want to tie this to MySQL. + if e.__class__.__name__ == 'OperationalError' and e.__module__ == '_mysql_exceptions' and e.args[0] == 2006: + db.connection.close() + + def _post_update_submission(self, id, state, done=False): + if self._submission_cache_id == id: + data = self._submission_cache + else: + self._submission_cache = data = Submission.objects.filter(id=id).values( + 'problem__is_public', 'contest__participation__contest__key', + 'user_id', 'problem_id', 'status', 'language__key', + ).get() + self._submission_cache_id = id + + if data['problem__is_public']: + event.post('submissions', { + 'type': 'done-submission' if done else 'update-submission', + 'state': state, 'id': id, + 'contest': data['contest__participation__contest__key'], + 'user': data['user_id'], 'problem': data['problem_id'], + 'status': data['status'], 'language': data['language__key'], + }) + + def on_submission_processing(self, packet): + id = packet['submission-id'] + if Submission.objects.filter(id=id).update(status='P', judged_on=self.judge): + event.post('sub_%s' % Submission.get_id_secret(id), {'type': 'processing'}) + self._post_update_submission(id, 'processing') + json_log.info(self._make_json_log(packet, action='processing')) + else: + logger.warning('Unknown submission: %s', id) + json_log.error(self._make_json_log(packet, action='processing', info='unknown submission')) + + def on_submission_wrong_acknowledge(self, packet, expected, got): + json_log.error(self._make_json_log(packet, action='processing', info='wrong-acknowledge', expected=expected)) + + def on_grading_begin(self, packet): + super(DjangoJudgeHandler, self).on_grading_begin(packet) + if Submission.objects.filter(id=packet['submission-id']).update( + status='G', is_pretested=packet['pretested'], + current_testcase=1, batch=False): + SubmissionTestCase.objects.filter(submission_id=packet['submission-id']).delete() + event.post('sub_%s' % Submission.get_id_secret(packet['submission-id']), {'type': 'grading-begin'}) + self._post_update_submission(packet['submission-id'], 'grading-begin') + json_log.info(self._make_json_log(packet, action='grading-begin')) + else: + logger.warning('Unknown submission: %s', packet['submission-id']) + json_log.error(self._make_json_log(packet, action='grading-begin', info='unknown submission')) + + def _submission_is_batch(self, id): + if not Submission.objects.filter(id=id).update(batch=True): + logger.warning('Unknown submission: %s', id) + + def on_grading_end(self, packet): + super(DjangoJudgeHandler, self).on_grading_end(packet) + + try: + submission = Submission.objects.get(id=packet['submission-id']) + except Submission.DoesNotExist: + logger.warning('Unknown submission: %s', packet['submission-id']) + json_log.error(self._make_json_log(packet, action='grading-end', info='unknown submission')) + return + + time = 0 + memory = 0 + points = 0.0 + total = 0 + status = 0 + status_codes = ['SC', 'AC', 'WA', 'MLE', 'TLE', 'IR', 'RTE', 'OLE'] + batches = {} # batch number: (points, total) + + for case in SubmissionTestCase.objects.filter(submission=submission): + time += case.time + if not case.batch: + points += case.points + total += case.total + else: + if case.batch in batches: + batches[case.batch][0] = min(batches[case.batch][0], case.points) + batches[case.batch][1] = max(batches[case.batch][1], case.total) + else: + batches[case.batch] = [case.points, case.total] + memory = max(memory, case.memory) + i = status_codes.index(case.status) + if i > status: + status = i + + for i in batches: + points += batches[i][0] + total += batches[i][1] + + points = round(points, 1) + total = round(total, 1) + submission.case_points = points + submission.case_total = total + + problem = submission.problem + sub_points = round(points / total * problem.points if total > 0 else 0, 3) + if not problem.partial and sub_points != problem.points: + sub_points = 0 + + submission.status = 'D' + submission.time = time + submission.memory = memory + submission.points = sub_points + submission.result = status_codes[status] + submission.save() + + json_log.info(self._make_json_log( + packet, action='grading-end', time=time, memory=memory, + points=sub_points, total=problem.points, result=submission.result, + case_points=points, case_total=total, user=submission.user_id, + problem=problem.code, finish=True, + )) + + submission.user._updating_stats_only = True + submission.user.calculate_points() + problem._updating_stats_only = True + problem.update_stats() + submission.update_contest() + + finished_submission(submission) + + event.post('sub_%s' % submission.id_secret, { + 'type': 'grading-end', + 'time': time, + 'memory': memory, + 'points': float(points), + 'total': float(problem.points), + 'result': submission.result, + }) + if hasattr(submission, 'contest'): + participation = submission.contest.participation + event.post('contest_%d' % participation.contest_id, {'type': 'update'}) + self._post_update_submission(submission.id, 'grading-end', done=True) + + def on_compile_error(self, packet): + super(DjangoJudgeHandler, self).on_compile_error(packet) + + if Submission.objects.filter(id=packet['submission-id']).update(status='CE', result='CE', error=packet['log']): + event.post('sub_%s' % Submission.get_id_secret(packet['submission-id']), { + 'type': 'compile-error', + 'log': packet['log'], + }) + self._post_update_submission(packet['submission-id'], 'compile-error', done=True) + json_log.info(self._make_json_log(packet, action='compile-error', log=packet['log'], + finish=True, result='CE')) + else: + logger.warning('Unknown submission: %s', packet['submission-id']) + json_log.error(self._make_json_log(packet, action='compile-error', info='unknown submission', + log=packet['log'], finish=True, result='CE')) + + def on_compile_message(self, packet): + super(DjangoJudgeHandler, self).on_compile_message(packet) + + if Submission.objects.filter(id=packet['submission-id']).update(error=packet['log']): + event.post('sub_%s' % Submission.get_id_secret(packet['submission-id']), {'type': 'compile-message'}) + json_log.info(self._make_json_log(packet, action='compile-message', log=packet['log'])) + else: + logger.warning('Unknown submission: %s', packet['submission-id']) + json_log.error(self._make_json_log(packet, action='compile-message', info='unknown submission', + log=packet['log'])) + + def on_internal_error(self, packet): + super(DjangoJudgeHandler, self).on_internal_error(packet) + + id = packet['submission-id'] + if Submission.objects.filter(id=id).update(status='IE', result='IE', error=packet['message']): + event.post('sub_%s' % Submission.get_id_secret(id), {'type': 'internal-error'}) + self._post_update_submission(id, 'internal-error', done=True) + json_log.info(self._make_json_log(packet, action='internal-error', message=packet['message'], + finish=True, result='IE')) + else: + logger.warning('Unknown submission: %s', id) + json_log.error(self._make_json_log(packet, action='internal-error', info='unknown submission', + message=packet['message'], finish=True, result='IE')) + + def on_submission_terminated(self, packet): + super(DjangoJudgeHandler, self).on_submission_terminated(packet) + + if Submission.objects.filter(id=packet['submission-id']).update(status='AB', result='AB'): + event.post('sub_%s' % Submission.get_id_secret(packet['submission-id']), {'type': 'aborted-submission'}) + self._post_update_submission(packet['submission-id'], 'terminated', done=True) + json_log.info(self._make_json_log(packet, action='aborted', finish=True, result='AB')) + else: + logger.warning('Unknown submission: %s', packet['submission-id']) + json_log.error(self._make_json_log(packet, action='aborted', info='unknown submission', + finish=True, result='AB')) + + def on_batch_begin(self, packet): + super(DjangoJudgeHandler, self).on_batch_begin(packet) + json_log.info(self._make_json_log(packet, action='batch-begin', batch=self.batch_id)) + + def on_batch_end(self, packet): + super(DjangoJudgeHandler, self).on_batch_end(packet) + json_log.info(self._make_json_log(packet, action='batch-end', batch=self.batch_id)) + + def on_test_case(self, packet, max_feedback=SubmissionTestCase._meta.get_field('feedback').max_length): + super(DjangoJudgeHandler, self).on_test_case(packet) + id = packet['submission-id'] + updates = packet['cases'] + max_position = max(map(itemgetter('position'), updates)) + + if not Submission.objects.filter(id=id).update(current_testcase=max_position + 1): + logger.warning('Unknown submission: %s', id) + json_log.error(self._make_json_log(packet, action='test-case', info='unknown submission')) + return + + bulk_test_case_updates = [] + for result in updates: + test_case = SubmissionTestCase(submission_id=id, case=result['position']) + status = result['status'] + if status & 4: + test_case.status = 'TLE' + elif status & 8: + test_case.status = 'MLE' + elif status & 64: + test_case.status = 'OLE' + elif status & 2: + test_case.status = 'RTE' + elif status & 16: + test_case.status = 'IR' + elif status & 1: + test_case.status = 'WA' + elif status & 32: + test_case.status = 'SC' + else: + test_case.status = 'AC' + test_case.time = result['time'] + test_case.memory = result['memory'] + test_case.points = result['points'] + test_case.total = result['total-points'] + test_case.batch = self.batch_id if self.in_batch else None + test_case.feedback = (result.get('feedback') or '')[:max_feedback] + test_case.extended_feedback = result.get('extended-feedback') or '' + test_case.output = result['output'] + bulk_test_case_updates.append(test_case) + + json_log.info(self._make_json_log( + packet, action='test-case', case=test_case.case, batch=test_case.batch, + time=test_case.time, memory=test_case.memory, feedback=test_case.feedback, + extended_feedback=test_case.extended_feedback, output=test_case.output, + points=test_case.points, total=test_case.total, status=test_case.status, + )) + + do_post = True + + if id in self.update_counter: + cnt, reset = self.update_counter[id] + cnt += 1 + if time.monotonic() - reset > UPDATE_RATE_TIME: + del self.update_counter[id] + else: + self.update_counter[id] = (cnt, reset) + if cnt > UPDATE_RATE_LIMIT: + do_post = False + if id not in self.update_counter: + self.update_counter[id] = (1, time.monotonic()) + + if do_post: + event.post('sub_%s' % Submission.get_id_secret(id), { + 'type': 'test-case', + 'id': max_position, + }) + self._post_update_submission(id, state='test-case') + + SubmissionTestCase.objects.bulk_create(bulk_test_case_updates) + + def on_supported_problems(self, packet): + super(DjangoJudgeHandler, self).on_supported_problems(packet) + self.judge.problems.set(Problem.objects.filter(code__in=list(self.problems.keys()))) + json_log.info(self._make_json_log(action='update-problems', count=len(self.problems))) + + def _make_json_log(self, packet=None, sub=None, **kwargs): + data = { + 'judge': self.name, + 'address': self.judge_address, + } + if sub is None and packet is not None: + sub = packet.get('submission-id') + if sub is not None: + data['submission'] = sub + data.update(kwargs) + return json.dumps(data) diff --git a/judge/bridge/judgehandler.py b/judge/bridge/judgehandler.py new file mode 100644 index 0000000..2a09218 --- /dev/null +++ b/judge/bridge/judgehandler.py @@ -0,0 +1,268 @@ +import json +import logging +import time +from collections import deque, namedtuple + +from event_socket_server import ProxyProtocolMixin, ZlibPacketHandler + +logger = logging.getLogger('judge.bridge') + +SubmissionData = namedtuple('SubmissionData', 'time memory short_circuit pretests_only contest_no attempt_no user_id') + + +class JudgeHandler(ProxyProtocolMixin, ZlibPacketHandler): + def __init__(self, server, socket): + super(JudgeHandler, self).__init__(server, socket) + + self.handlers = { + 'grading-begin': self.on_grading_begin, + 'grading-end': self.on_grading_end, + 'compile-error': self.on_compile_error, + 'compile-message': self.on_compile_message, + 'batch-begin': self.on_batch_begin, + 'batch-end': self.on_batch_end, + 'test-case-status': self.on_test_case, + 'internal-error': self.on_internal_error, + 'submission-terminated': self.on_submission_terminated, + 'submission-acknowledged': self.on_submission_acknowledged, + 'ping-response': self.on_ping_response, + 'supported-problems': self.on_supported_problems, + 'handshake': self.on_handshake, + } + self._to_kill = True + self._working = False + self._no_response_job = None + self._problems = [] + self.executors = [] + self.problems = {} + self.latency = None + self.time_delta = None + self.load = 1e100 + self.name = None + self.batch_id = None + self.in_batch = False + self._ping_average = deque(maxlen=6) # 1 minute average, just like load + self._time_delta = deque(maxlen=6) + + self.server.schedule(15, self._kill_if_no_auth) + logger.info('Judge connected from: %s', self.client_address) + + def _kill_if_no_auth(self): + if self._to_kill: + logger.info('Judge not authenticated: %s', self.client_address) + self.close() + + def on_close(self): + self._to_kill = False + if self._no_response_job: + self.server.unschedule(self._no_response_job) + self.server.judges.remove(self) + if self.name is not None: + self._disconnected() + logger.info('Judge disconnected from: %s', self.client_address) + + def _authenticate(self, id, key): + return False + + def _connected(self): + pass + + def _disconnected(self): + pass + + def _update_ping(self): + pass + + def _format_send(self, data): + return super(JudgeHandler, self)._format_send(json.dumps(data, separators=(',', ':'))) + + def on_handshake(self, packet): + if 'id' not in packet or 'key' not in packet: + logger.warning('Malformed handshake: %s', self.client_address) + self.close() + return + + if not self._authenticate(packet['id'], packet['key']): + logger.warning('Authentication failure: %s', self.client_address) + self.close() + return + + self._to_kill = False + self._problems = packet['problems'] + self.problems = dict(self._problems) + self.executors = packet['executors'] + self.name = packet['id'] + + self.send({'name': 'handshake-success'}) + logger.info('Judge authenticated: %s (%s)', self.client_address, packet['id']) + self.server.judges.register(self) + self._connected() + + def can_judge(self, problem, executor): + return problem in self.problems and executor in self.executors + + @property + def working(self): + return bool(self._working) + + def get_related_submission_data(self, submission): + return SubmissionData( + time=2, + memory=16384, + short_circuit=False, + pretests_only=False, + contest_no=None, + attempt_no=1, + user_id=None, + ) + + def disconnect(self, force=False): + if force: + # Yank the power out. + self.close() + else: + self.send({'name': 'disconnect'}) + + def submit(self, id, problem, language, source): + data = self.get_related_submission_data(id) + self._working = id + self._no_response_job = self.server.schedule(20, self._kill_if_no_response) + self.send({ + 'name': 'submission-request', + 'submission-id': id, + 'problem-id': problem, + 'language': language, + 'source': source, + 'time-limit': data.time, + 'memory-limit': data.memory, + 'short-circuit': data.short_circuit, + 'meta': { + 'pretests-only': data.pretests_only, + 'in-contest': data.contest_no, + 'attempt-no': data.attempt_no, + 'user': data.user_id, + }, + }) + + def _kill_if_no_response(self): + logger.error('Judge seems dead: %s: %s', self.name, self._working) + self.close() + + def malformed_packet(self, exception): + logger.exception('Judge sent malformed packet: %s', self.name) + super(JudgeHandler, self).malformed_packet(exception) + + def on_submission_processing(self, packet): + pass + + def on_submission_wrong_acknowledge(self, packet, expected, got): + pass + + def on_submission_acknowledged(self, packet): + if not packet.get('submission-id', None) == self._working: + logger.error('Wrong acknowledgement: %s: %s, expected: %s', self.name, packet.get('submission-id', None), + self._working) + self.on_submission_wrong_acknowledge(packet, self._working, packet.get('submission-id', None)) + self.close() + logger.info('Submission acknowledged: %d', self._working) + if self._no_response_job: + self.server.unschedule(self._no_response_job) + self._no_response_job = None + self.on_submission_processing(packet) + + def abort(self): + self.send({'name': 'terminate-submission'}) + + def get_current_submission(self): + return self._working or None + + def ping(self): + self.send({'name': 'ping', 'when': time.time()}) + + def packet(self, data): + try: + try: + data = json.loads(data) + if 'name' not in data: + raise ValueError + except ValueError: + self.on_malformed(data) + else: + handler = self.handlers.get(data['name'], self.on_malformed) + handler(data) + except Exception: + logger.exception('Error in packet handling (Judge-side): %s', self.name) + self._packet_exception() + # You can't crash here because you aren't so sure about the judges + # not being malicious or simply malforms. THIS IS A SERVER! + + def _packet_exception(self): + pass + + def _submission_is_batch(self, id): + pass + + def on_supported_problems(self, packet): + logger.info('%s: Updated problem list', self.name) + self._problems = packet['problems'] + self.problems = dict(self._problems) + if not self.working: + self.server.judges.update_problems(self) + + def on_grading_begin(self, packet): + logger.info('%s: Grading has begun on: %s', self.name, packet['submission-id']) + self.batch_id = None + + def on_grading_end(self, packet): + logger.info('%s: Grading has ended on: %s', self.name, packet['submission-id']) + self._free_self(packet) + self.batch_id = None + + def on_compile_error(self, packet): + logger.info('%s: Submission failed to compile: %s', self.name, packet['submission-id']) + self._free_self(packet) + + def on_compile_message(self, packet): + logger.info('%s: Submission generated compiler messages: %s', self.name, packet['submission-id']) + + def on_internal_error(self, packet): + try: + raise ValueError('\n\n' + packet['message']) + except ValueError: + logger.exception('Judge %s failed while handling submission %s', self.name, packet['submission-id']) + self._free_self(packet) + + def on_submission_terminated(self, packet): + logger.info('%s: Submission aborted: %s', self.name, packet['submission-id']) + self._free_self(packet) + + def on_batch_begin(self, packet): + logger.info('%s: Batch began on: %s', self.name, packet['submission-id']) + self.in_batch = True + if self.batch_id is None: + self.batch_id = 0 + self._submission_is_batch(packet['submission-id']) + self.batch_id += 1 + + def on_batch_end(self, packet): + self.in_batch = False + logger.info('%s: Batch ended on: %s', self.name, packet['submission-id']) + + def on_test_case(self, packet): + logger.info('%s: %d test case(s) completed on: %s', self.name, len(packet['cases']), packet['submission-id']) + + def on_malformed(self, packet): + logger.error('%s: Malformed packet: %s', self.name, packet) + + def on_ping_response(self, packet): + end = time.time() + self._ping_average.append(end - packet['when']) + self._time_delta.append((end + packet['when']) / 2 - packet['time']) + self.latency = sum(self._ping_average) / len(self._ping_average) + self.time_delta = sum(self._time_delta) / len(self._time_delta) + self.load = packet['load'] + self._update_ping() + + def _free_self(self, packet): + self._working = False + self.server.judges.on_judge_free(self, packet['submission-id']) diff --git a/judge/bridge/judgelist.py b/judge/bridge/judgelist.py new file mode 100644 index 0000000..ec3cebd --- /dev/null +++ b/judge/bridge/judgelist.py @@ -0,0 +1,123 @@ +import logging +from collections import namedtuple +from operator import attrgetter +from threading import RLock + +try: + from llist import dllist +except ImportError: + from pyllist import dllist + +logger = logging.getLogger('judge.bridge') + +PriorityMarker = namedtuple('PriorityMarker', 'priority') + + +class JudgeList(object): + priorities = 4 + + def __init__(self): + self.queue = dllist() + self.priority = [self.queue.append(PriorityMarker(i)) for i in range(self.priorities)] + self.judges = set() + self.node_map = {} + self.submission_map = {} + self.lock = RLock() + + def _handle_free_judge(self, judge): + with self.lock: + node = self.queue.first + while node: + if not isinstance(node.value, PriorityMarker): + id, problem, language, source = node.value + if judge.can_judge(problem, language): + self.submission_map[id] = judge + logger.info('Dispatched queued submission %d: %s', id, judge.name) + try: + judge.submit(id, problem, language, source) + except Exception: + logger.exception('Failed to dispatch %d (%s, %s) to %s', id, problem, language, judge.name) + self.judges.remove(judge) + return + self.queue.remove(node) + del self.node_map[id] + break + node = node.next + + def register(self, judge): + with self.lock: + # Disconnect all judges with the same name, see + self.disconnect(judge, force=True) + self.judges.add(judge) + self._handle_free_judge(judge) + + def disconnect(self, judge_id, force=False): + for judge in self.judges: + if judge.name == judge_id: + judge.disconnect(force=force) + + def update_problems(self, judge): + with self.lock: + self._handle_free_judge(judge) + + def remove(self, judge): + with self.lock: + sub = judge.get_current_submission() + if sub is not None: + try: + del self.submission_map[sub] + except KeyError: + pass + self.judges.discard(judge) + + def __iter__(self): + return iter(self.judges) + + def on_judge_free(self, judge, submission): + with self.lock: + logger.info('Judge available after grading %d: %s', submission, judge.name) + del self.submission_map[submission] + self._handle_free_judge(judge) + + def abort(self, submission): + with self.lock: + logger.info('Abort request: %d', submission) + try: + self.submission_map[submission].abort() + return True + except KeyError: + try: + node = self.node_map[submission] + except KeyError: + pass + else: + self.queue.remove(node) + del self.node_map[submission] + return False + + def check_priority(self, priority): + return 0 <= priority < self.priorities + + def judge(self, id, problem, language, source, priority): + with self.lock: + if id in self.submission_map or id in self.node_map: + # Already judging, don't queue again. This can happen during batch rejudges, rejudges should be + # idempotent. + return + + candidates = [judge for judge in self.judges if not judge.working and judge.can_judge(problem, language)] + logger.info('Free judges: %d', len(candidates)) + if candidates: + # Schedule the submission on the judge reporting least load. + judge = min(candidates, key=attrgetter('load')) + logger.info('Dispatched submission %d to: %s', id, judge.name) + self.submission_map[id] = judge + try: + judge.submit(id, problem, language, source) + except Exception: + logger.exception('Failed to dispatch %d (%s, %s) to %s', id, problem, language, judge.name) + self.judges.discard(judge) + return self.judge(id, problem, language, source, priority) + else: + self.node_map[id] = self.queue.insert((id, problem, language, source), self.priority[priority]) + logger.info('Queued submission: %d', id) diff --git a/judge/bridge/judgeserver.py b/judge/bridge/judgeserver.py new file mode 100644 index 0000000..251a431 --- /dev/null +++ b/judge/bridge/judgeserver.py @@ -0,0 +1,68 @@ +import logging +import os +import threading +import time + +from event_socket_server import get_preferred_engine +from judge.models import Judge +from .judgelist import JudgeList + +logger = logging.getLogger('judge.bridge') + + +def reset_judges(): + Judge.objects.update(online=False, ping=None, load=None) + + +class JudgeServer(get_preferred_engine()): + def __init__(self, *args, **kwargs): + super(JudgeServer, self).__init__(*args, **kwargs) + reset_judges() + self.judges = JudgeList() + self.ping_judge_thread = threading.Thread(target=self.ping_judge, args=()) + self.ping_judge_thread.daemon = True + self.ping_judge_thread.start() + + def on_shutdown(self): + super(JudgeServer, self).on_shutdown() + reset_judges() + + def ping_judge(self): + try: + while True: + for judge in self.judges: + judge.ping() + time.sleep(10) + except Exception: + logger.exception('Ping error') + raise + + +def main(): + import argparse + import logging + from .judgehandler import JudgeHandler + + format = '%(asctime)s:%(levelname)s:%(name)s:%(message)s' + logging.basicConfig(format=format) + logging.getLogger().setLevel(logging.INFO) + handler = logging.FileHandler(os.path.join(os.path.dirname(__file__), 'judgeserver.log'), encoding='utf-8') + handler.setFormatter(logging.Formatter(format)) + handler.setLevel(logging.INFO) + logging.getLogger().addHandler(handler) + + parser = argparse.ArgumentParser(description=''' + Runs the bridge between DMOJ website and judges. + ''') + parser.add_argument('judge_host', nargs='+', action='append', + help='host to listen for the judge') + parser.add_argument('-p', '--judge-port', type=int, action='append', + help='port to listen for the judge') + + args = parser.parse_args() + server = JudgeServer(list(zip(args.judge_host, args.judge_port)), JudgeHandler) + server.serve_forever() + + +if __name__ == '__main__': + main() diff --git a/judge/caching.py b/judge/caching.py new file mode 100644 index 0000000..7f0a687 --- /dev/null +++ b/judge/caching.py @@ -0,0 +1,10 @@ +from django.core.cache import cache + + +def finished_submission(sub): + keys = ['user_complete:%d' % sub.user_id, 'user_attempted:%s' % sub.user_id] + if hasattr(sub, 'contest'): + participation = sub.contest.participation + keys += ['contest_complete:%d' % participation.id] + keys += ['contest_attempted:%d' % participation.id] + cache.delete_many(keys) diff --git a/judge/comments.py b/judge/comments.py new file mode 100644 index 0000000..4444755 --- /dev/null +++ b/judge/comments.py @@ -0,0 +1,122 @@ +from django import forms +from django.conf import settings +from django.contrib.auth.decorators import login_required +from django.contrib.contenttypes.models import ContentType +from django.core.exceptions import ValidationError +from django.db.models import Count +from django.db.models.expressions import F, Value +from django.db.models.functions import Coalesce +from django.forms import ModelForm +from django.http import HttpResponseForbidden, HttpResponseNotFound, HttpResponseRedirect +from django.urls import reverse_lazy +from django.utils.decorators import method_decorator +from django.utils.translation import gettext as _ +from django.views.generic import View +from django.views.generic.base import TemplateResponseMixin +from django.views.generic.detail import SingleObjectMixin +from reversion import revisions +from reversion.models import Revision, Version + +from judge.dblock import LockModel +from judge.models import Comment, CommentLock, CommentVote +from judge.utils.raw_sql import RawSQLColumn, unique_together_left_join +from judge.widgets import HeavyPreviewPageDownWidget + + +class CommentForm(ModelForm): + class Meta: + model = Comment + fields = ['body', 'parent'] + widgets = { + 'parent': forms.HiddenInput(), + } + + if HeavyPreviewPageDownWidget is not None: + widgets['body'] = HeavyPreviewPageDownWidget(preview=reverse_lazy('comment_preview'), + preview_timeout=1000, hide_preview_button=True) + + def __init__(self, request, *args, **kwargs): + self.request = request + super(CommentForm, self).__init__(*args, **kwargs) + self.fields['body'].widget.attrs.update({'placeholder': _('Comment body')}) + + def clean(self): + if self.request is not None and self.request.user.is_authenticated: + profile = self.request.profile + if profile.mute: + raise ValidationError(_('Your part is silent, little toad.')) + elif (not self.request.user.is_staff and + not profile.submission_set.filter(points=F('problem__points')).exists()): + raise ValidationError(_('You need to have solved at least one problem ' + 'before your voice can be heard.')) + return super(CommentForm, self).clean() + + +class CommentedDetailView(TemplateResponseMixin, SingleObjectMixin, View): + comment_page = None + + def get_comment_page(self): + if self.comment_page is None: + raise NotImplementedError() + return self.comment_page + + def is_comment_locked(self): + return (CommentLock.objects.filter(page=self.get_comment_page()).exists() and + not self.request.user.has_perm('judge.override_comment_lock')) + + @method_decorator(login_required) + def post(self, request, *args, **kwargs): + self.object = self.get_object() + page = self.get_comment_page() + + if self.is_comment_locked(): + return HttpResponseForbidden() + + parent = request.POST.get('parent') + if parent: + try: + parent = int(parent) + except ValueError: + return HttpResponseNotFound() + else: + if not Comment.objects.filter(hidden=False, id=parent, page=page).exists(): + return HttpResponseNotFound() + + form = CommentForm(request, request.POST) + if form.is_valid(): + comment = form.save(commit=False) + comment.author = request.profile + comment.page = page + with LockModel(write=(Comment, Revision, Version), read=(ContentType,)), revisions.create_revision(): + revisions.set_user(request.user) + revisions.set_comment(_('Posted comment')) + comment.save() + return HttpResponseRedirect(request.path) + + context = self.get_context_data(object=self.object, comment_form=form) + return self.render_to_response(context) + + def get(self, request, *args, **kwargs): + self.object = self.get_object() + return self.render_to_response(self.get_context_data( + object=self.object, + comment_form=CommentForm(request, initial={'page': self.get_comment_page(), 'parent': None}), + )) + + def get_context_data(self, **kwargs): + context = super(CommentedDetailView, self).get_context_data(**kwargs) + queryset = Comment.objects.filter(hidden=False, page=self.get_comment_page()) + context['has_comments'] = queryset.exists() + context['comment_lock'] = self.is_comment_locked() + queryset = queryset.select_related('author__user').defer('author__about').annotate(revisions=Count('versions')) + + if self.request.user.is_authenticated: + queryset = queryset.annotate(vote_score=Coalesce(RawSQLColumn(CommentVote, 'score'), Value(0))) + profile = self.request.profile + unique_together_left_join(queryset, CommentVote, 'comment', 'voter', profile.id) + context['is_new_user'] = (not self.request.user.is_staff and + not profile.submission_set.filter(points=F('problem__points')).exists()) + context['comment_list'] = queryset + context['vote_hide_threshold'] = settings.DMOJ_COMMENT_VOTE_HIDE_THRESHOLD + + return context diff --git a/judge/contest_format/__init__.py b/judge/contest_format/__init__.py new file mode 100644 index 0000000..c602e4d --- /dev/null +++ b/judge/contest_format/__init__.py @@ -0,0 +1,5 @@ +from judge.contest_format.atcoder import AtCoderContestFormat +from judge.contest_format.default import DefaultContestFormat +from judge.contest_format.ecoo import ECOOContestFormat +from judge.contest_format.ioi import IOIContestFormat +from judge.contest_format.registry import choices, formats diff --git a/judge/contest_format/atcoder.py b/judge/contest_format/atcoder.py new file mode 100644 index 0000000..7a1ae8c --- /dev/null +++ b/judge/contest_format/atcoder.py @@ -0,0 +1,113 @@ +from datetime import timedelta + +from django.core.exceptions import ValidationError +from django.db import connection +from django.template.defaultfilters import floatformat +from django.urls import reverse +from django.utils.html import format_html +from django.utils.safestring import mark_safe +from django.utils.translation import gettext_lazy + +from judge.contest_format.default import DefaultContestFormat +from judge.contest_format.registry import register_contest_format +from judge.timezone import from_database_time +from judge.utils.timedelta import nice_repr + + +@register_contest_format('atcoder') +class AtCoderContestFormat(DefaultContestFormat): + name = gettext_lazy('AtCoder') + config_defaults = {'penalty': 5} + config_validators = {'penalty': lambda x: x >= 0} + ''' + penalty: Number of penalty minutes each incorrect submission adds. Defaults to 5. + ''' + + @classmethod + def validate(cls, config): + if config is None: + return + + if not isinstance(config, dict): + raise ValidationError('AtCoder-styled contest expects no config or dict as config') + + for key, value in config.items(): + if key not in cls.config_defaults: + raise ValidationError('unknown config key "%s"' % key) + if not isinstance(value, type(cls.config_defaults[key])): + raise ValidationError('invalid type for config key "%s"' % key) + if not cls.config_validators[key](value): + raise ValidationError('invalid value "%s" for config key "%s"' % (value, key)) + + def __init__(self, contest, config): + self.config = self.config_defaults.copy() + self.config.update(config or {}) + self.contest = contest + + def update_participation(self, participation): + cumtime = 0 + penalty = 0 + points = 0 + format_data = {} + + with connection.cursor() as cursor: + cursor.execute(''' + SELECT MAX(cs.points) as `score`, ( + SELECT MIN(csub.date) + FROM judge_contestsubmission ccs LEFT OUTER JOIN + judge_submission csub ON (csub.id = ccs.submission_id) + WHERE ccs.problem_id = cp.id AND ccs.participation_id = %s AND ccs.points = MAX(cs.points) + ) AS `time`, cp.id AS `prob` + FROM judge_contestproblem cp INNER JOIN + judge_contestsubmission cs ON (cs.problem_id = cp.id AND cs.participation_id = %s) LEFT OUTER JOIN + judge_submission sub ON (sub.id = cs.submission_id) + GROUP BY cp.id + ''', (participation.id, participation.id)) + + for score, time, prob in cursor.fetchall(): + time = from_database_time(time) + dt = (time - participation.start).total_seconds() + + # Compute penalty + if self.config['penalty']: + # An IE can have a submission result of `None` + subs = participation.submissions.exclude(submission__result__isnull=True) \ + .exclude(submission__result__in=['IE', 'CE']) \ + .filter(problem_id=prob) + if score: + prev = subs.filter(submission__date__lte=time).count() - 1 + penalty += prev * self.config['penalty'] * 60 + else: + # We should always display the penalty, even if the user has a score of 0 + prev = subs.count() + else: + prev = 0 + + if score: + cumtime = max(cumtime, dt) + + format_data[str(prob)] = {'time': dt, 'points': score, 'penalty': prev} + points += score + + participation.cumtime = cumtime + penalty + participation.score = points + participation.format_data = format_data + participation.save() + + def display_user_problem(self, participation, contest_problem): + format_data = (participation.format_data or {}).get(str(contest_problem.id)) + if format_data: + penalty = format_html(' ({penalty})', + penalty=floatformat(format_data['penalty'])) if format_data['penalty'] else '' + return format_html( + '{points}{penalty}
{time}
', + state=(('pretest-' if self.contest.run_pretests_only and contest_problem.is_pretested else '') + + self.best_solution_state(format_data['points'], contest_problem.points)), + url=reverse('contest_user_submissions', + args=[self.contest.key, participation.user.user.username, contest_problem.problem.code]), + points=floatformat(format_data['points']), + penalty=penalty, + time=nice_repr(timedelta(seconds=format_data['time']), 'noday'), + ) + else: + return mark_safe('') diff --git a/judge/contest_format/base.py b/judge/contest_format/base.py new file mode 100644 index 0000000..7fcadc3 --- /dev/null +++ b/judge/contest_format/base.py @@ -0,0 +1,91 @@ +from abc import ABCMeta, abstractmethod, abstractproperty + +from django.utils import six + + +class abstractclassmethod(classmethod): + __isabstractmethod__ = True + + def __init__(self, callable): + callable.__isabstractmethod__ = True + super(abstractclassmethod, self).__init__(callable) + + +class BaseContestFormat(six.with_metaclass(ABCMeta)): + @abstractmethod + def __init__(self, contest, config): + self.config = config + self.contest = contest + + @abstractproperty + def name(self): + """ + Name of this contest format. Should be invoked with gettext_lazy. + + :return: str + """ + raise NotImplementedError() + + @abstractclassmethod + def validate(cls, config): + """ + Validates the contest format configuration. + + :param config: A dictionary containing the configuration for this contest format. + :return: None + :raises: ValidationError + """ + raise NotImplementedError() + + @abstractmethod + def update_participation(self, participation): + """ + Updates a ContestParticipation object's score, cumtime, and format_data fields based on this contest format. + Implementations should call ContestParticipation.save(). + + :param participation: A ContestParticipation object. + :return: None + """ + raise NotImplementedError() + + @abstractmethod + def display_user_problem(self, participation, contest_problem): + """ + Returns the HTML fragment to show a user's performance on an individual problem. This is expected to use + information from the format_data field instead of computing it from scratch. + + :param participation: The ContestParticipation object linking the user to the contest. + :param contest_problem: The ContestProblem object representing the problem in question. + :return: An HTML fragment, marked as safe for Jinja2. + """ + raise NotImplementedError() + + @abstractmethod + def display_participation_result(self, participation): + """ + Returns the HTML fragment to show a user's performance on the whole contest. This is expected to use + information from the format_data field instead of computing it from scratch. + + :param participation: The ContestParticipation object. + :return: An HTML fragment, marked as safe for Jinja2. + """ + raise NotImplementedError() + + @abstractmethod + def get_problem_breakdown(self, participation, contest_problems): + """ + Returns a machine-readable breakdown for the user's performance on every problem. + + :param participation: The ContestParticipation object. + :param contest_problems: The list of ContestProblem objects to display performance for. + :return: A list of dictionaries, whose content is to be determined by the contest system. + """ + raise NotImplementedError() + + @classmethod + def best_solution_state(cls, points, total): + if not points: + return 'failed-score' + if points == total: + return 'full-score' + return 'partial-score' diff --git a/judge/contest_format/default.py b/judge/contest_format/default.py new file mode 100644 index 0000000..d3cde2d --- /dev/null +++ b/judge/contest_format/default.py @@ -0,0 +1,70 @@ +from datetime import timedelta + +from django.core.exceptions import ValidationError +from django.db.models import Max +from django.template.defaultfilters import floatformat +from django.urls import reverse +from django.utils.html import format_html +from django.utils.safestring import mark_safe +from django.utils.translation import gettext_lazy + +from judge.contest_format.base import BaseContestFormat +from judge.contest_format.registry import register_contest_format +from judge.utils.timedelta import nice_repr + + +@register_contest_format('default') +class DefaultContestFormat(BaseContestFormat): + name = gettext_lazy('Default') + + @classmethod + def validate(cls, config): + if config is not None and (not isinstance(config, dict) or config): + raise ValidationError('default contest expects no config or empty dict as config') + + def __init__(self, contest, config): + super(DefaultContestFormat, self).__init__(contest, config) + + def update_participation(self, participation): + cumtime = 0 + points = 0 + format_data = {} + + for result in participation.submissions.values('problem_id').annotate( + time=Max('submission__date'), points=Max('points'), + ): + dt = (result['time'] - participation.start).total_seconds() + if result['points']: + cumtime += dt + format_data[str(result['problem_id'])] = {'time': dt, 'points': result['points']} + points += result['points'] + + participation.cumtime = max(cumtime, 0) + participation.score = points + participation.format_data = format_data + participation.save() + + def display_user_problem(self, participation, contest_problem): + format_data = (participation.format_data or {}).get(str(contest_problem.id)) + if format_data: + return format_html( + u'{points}
{time}
', + state=(('pretest-' if self.contest.run_pretests_only and contest_problem.is_pretested else '') + + self.best_solution_state(format_data['points'], contest_problem.points)), + url=reverse('contest_user_submissions', + args=[self.contest.key, participation.user.user.username, contest_problem.problem.code]), + points=floatformat(format_data['points']), + time=nice_repr(timedelta(seconds=format_data['time']), 'noday'), + ) + else: + return mark_safe('') + + def display_participation_result(self, participation): + return format_html( + u'{points}
{cumtime}
', + points=floatformat(participation.score), + cumtime=nice_repr(timedelta(seconds=participation.cumtime), 'noday'), + ) + + def get_problem_breakdown(self, participation, contest_problems): + return [(participation.format_data or {}).get(str(contest_problem.id)) for contest_problem in contest_problems] diff --git a/judge/contest_format/ecoo.py b/judge/contest_format/ecoo.py new file mode 100644 index 0000000..ff1060a --- /dev/null +++ b/judge/contest_format/ecoo.py @@ -0,0 +1,122 @@ +from datetime import timedelta + +from django.core.exceptions import ValidationError +from django.db import connection +from django.template.defaultfilters import floatformat +from django.urls import reverse +from django.utils.html import format_html +from django.utils.safestring import mark_safe +from django.utils.translation import gettext_lazy + +from judge.contest_format.default import DefaultContestFormat +from judge.contest_format.registry import register_contest_format +from judge.timezone import from_database_time +from judge.utils.timedelta import nice_repr + + +@register_contest_format('ecoo') +class ECOOContestFormat(DefaultContestFormat): + name = gettext_lazy('ECOO') + config_defaults = {'cumtime': False, 'first_ac_bonus': 10, 'time_bonus': 5} + config_validators = {'cumtime': lambda x: True, 'first_ac_bonus': lambda x: x >= 0, 'time_bonus': lambda x: x >= 0} + ''' + cumtime: Specify True if cumulative time is to be used in breaking ties. Defaults to False. + first_ac_bonus: The number of points to award if a solution gets AC on its first non-IE/CE run. Defaults to 10. + time_bonus: Number of minutes to award an extra point for submitting before the contest end. + Specify 0 to disable. Defaults to 5. + ''' + + @classmethod + def validate(cls, config): + if config is None: + return + + if not isinstance(config, dict): + raise ValidationError('ECOO-styled contest expects no config or dict as config') + + for key, value in config.items(): + if key not in cls.config_defaults: + raise ValidationError('unknown config key "%s"' % key) + if not isinstance(value, type(cls.config_defaults[key])): + raise ValidationError('invalid type for config key "%s"' % key) + if not cls.config_validators[key](value): + raise ValidationError('invalid value "%s" for config key "%s"' % (value, key)) + + def __init__(self, contest, config): + self.config = self.config_defaults.copy() + self.config.update(config or {}) + self.contest = contest + + def update_participation(self, participation): + cumtime = 0 + points = 0 + format_data = {} + + with connection.cursor() as cursor: + cursor.execute(''' + SELECT ( + SELECT MAX(ccs.points) + FROM judge_contestsubmission ccs LEFT OUTER JOIN + judge_submission csub ON (csub.id = ccs.submission_id) + WHERE ccs.problem_id = cp.id AND ccs.participation_id = %s AND csub.date = MAX(sub.date) + ) AS `score`, MAX(sub.date) AS `time`, cp.id AS `prob`, ( + SELECT COUNT(ccs.id) + FROM judge_contestsubmission ccs LEFT OUTER JOIN + judge_submission csub ON (csub.id = ccs.submission_id) + WHERE ccs.problem_id = cp.id AND ccs.participation_id = %s AND csub.result NOT IN ('IE', 'CE') + ) AS `subs`, cp.points AS `max_score` + FROM judge_contestproblem cp INNER JOIN + judge_contestsubmission cs ON (cs.problem_id = cp.id AND cs.participation_id = %s) LEFT OUTER JOIN + judge_submission sub ON (sub.id = cs.submission_id) + GROUP BY cp.id + ''', (participation.id, participation.id, participation.id)) + + for score, time, prob, subs, max_score in cursor.fetchall(): + time = from_database_time(time) + dt = (time - participation.start).total_seconds() + if self.config['cumtime']: + cumtime += dt + + bonus = 0 + if score > 0: + # First AC bonus + if subs == 1 and score == max_score: + bonus += self.config['first_ac_bonus'] + # Time bonus + if self.config['time_bonus']: + bonus += (participation.end_time - time).total_seconds() // 60 // self.config['time_bonus'] + points += bonus + + format_data[str(prob)] = {'time': dt, 'points': score, 'bonus': bonus} + points += score + + participation.cumtime = cumtime + participation.score = points + participation.format_data = format_data + participation.save() + + def display_user_problem(self, participation, contest_problem): + format_data = (participation.format_data or {}).get(str(contest_problem.id)) + if format_data: + bonus = format_html(' +{bonus}', + bonus=floatformat(format_data['bonus'])) if format_data['bonus'] else '' + + return format_html( + '{points}{bonus}
{time}
', + state=(('pretest-' if self.contest.run_pretests_only and contest_problem.is_pretested else '') + + self.best_solution_state(format_data['points'], contest_problem.points)), + url=reverse('contest_user_submissions', + args=[self.contest.key, participation.user.user.username, contest_problem.problem.code]), + points=floatformat(format_data['points']), + bonus=bonus, + time=nice_repr(timedelta(seconds=format_data['time']), 'noday'), + ) + else: + return mark_safe('') + + def display_participation_result(self, participation): + return format_html( + '{points}
{cumtime}
', + points=floatformat(participation.score), + cumtime=nice_repr(timedelta(seconds=participation.cumtime), 'noday') if self.config['cumtime'] else '', + ) diff --git a/judge/contest_format/ioi.py b/judge/contest_format/ioi.py new file mode 100644 index 0000000..ac84c4b --- /dev/null +++ b/judge/contest_format/ioi.py @@ -0,0 +1,99 @@ +from datetime import timedelta + +from django.core.exceptions import ValidationError +from django.db import connection +from django.template.defaultfilters import floatformat +from django.urls import reverse +from django.utils.html import format_html +from django.utils.safestring import mark_safe +from django.utils.translation import gettext_lazy + +from judge.contest_format.default import DefaultContestFormat +from judge.contest_format.registry import register_contest_format +from judge.timezone import from_database_time +from judge.utils.timedelta import nice_repr + + +@register_contest_format('ioi') +class IOIContestFormat(DefaultContestFormat): + name = gettext_lazy('IOI') + config_defaults = {'cumtime': False} + ''' + cumtime: Specify True if time penalties are to be computed. Defaults to False. + ''' + + @classmethod + def validate(cls, config): + if config is None: + return + + if not isinstance(config, dict): + raise ValidationError('IOI-styled contest expects no config or dict as config') + + for key, value in config.items(): + if key not in cls.config_defaults: + raise ValidationError('unknown config key "%s"' % key) + if not isinstance(value, type(cls.config_defaults[key])): + raise ValidationError('invalid type for config key "%s"' % key) + + def __init__(self, contest, config): + self.config = self.config_defaults.copy() + self.config.update(config or {}) + self.contest = contest + + def update_participation(self, participation): + cumtime = 0 + points = 0 + format_data = {} + + with connection.cursor() as cursor: + cursor.execute(''' + SELECT MAX(cs.points) as `score`, ( + SELECT MIN(csub.date) + FROM judge_contestsubmission ccs LEFT OUTER JOIN + judge_submission csub ON (csub.id = ccs.submission_id) + WHERE ccs.problem_id = cp.id AND ccs.participation_id = %s AND ccs.points = MAX(cs.points) + ) AS `time`, cp.id AS `prob` + FROM judge_contestproblem cp INNER JOIN + judge_contestsubmission cs ON (cs.problem_id = cp.id AND cs.participation_id = %s) LEFT OUTER JOIN + judge_submission sub ON (sub.id = cs.submission_id) + GROUP BY cp.id + ''', (participation.id, participation.id)) + + for score, time, prob in cursor.fetchall(): + if self.config['cumtime']: + dt = (from_database_time(time) - participation.start).total_seconds() + if score: + cumtime += dt + else: + dt = 0 + + format_data[str(prob)] = {'time': dt, 'points': score} + points += score + + participation.cumtime = max(cumtime, 0) + participation.score = points + participation.format_data = format_data + participation.save() + + def display_user_problem(self, participation, contest_problem): + format_data = (participation.format_data or {}).get(str(contest_problem.id)) + if format_data: + return format_html( + '{points}
{time}
', + state=(('pretest-' if self.contest.run_pretests_only and contest_problem.is_pretested else '') + + self.best_solution_state(format_data['points'], contest_problem.points)), + url=reverse('contest_user_submissions', + args=[self.contest.key, participation.user.user.username, contest_problem.problem.code]), + points=floatformat(format_data['points']), + time=nice_repr(timedelta(seconds=format_data['time']), 'noday') if self.config['cumtime'] else '', + ) + else: + return mark_safe('') + + def display_participation_result(self, participation): + return format_html( + '{points}
{cumtime}
', + points=floatformat(participation.score), + cumtime=nice_repr(timedelta(seconds=participation.cumtime), 'noday') if self.config['cumtime'] else '', + ) diff --git a/judge/contest_format/registry.py b/judge/contest_format/registry.py new file mode 100644 index 0000000..fba22c0 --- /dev/null +++ b/judge/contest_format/registry.py @@ -0,0 +1,16 @@ +from django.utils import six + +formats = {} + + +def register_contest_format(name): + def register_class(contest_format_class): + assert name not in formats + formats[name] = contest_format_class + return contest_format_class + + return register_class + + +def choices(): + return [(key, value.name) for key, value in sorted(six.iteritems(formats))] diff --git a/judge/dblock.py b/judge/dblock.py new file mode 100644 index 0000000..d4d5184 --- /dev/null +++ b/judge/dblock.py @@ -0,0 +1,23 @@ +from itertools import chain + +from django.db import connection, transaction + + +class LockModel(object): + def __init__(self, write, read=()): + self.tables = ', '.join(chain( + ('`%s` WRITE' % model._meta.db_table for model in write), + ('`%s` READ' % model._meta.db_table for model in read), + )) + self.cursor = connection.cursor() + + def __enter__(self): + self.cursor.execute('LOCK TABLES ' + self.tables) + + def __exit__(self, exc_type, exc_val, exc_tb): + if exc_type is None: + transaction.commit() + else: + transaction.rollback() + self.cursor.execute('UNLOCK TABLES') + self.cursor.close() diff --git a/judge/event_poster.py b/judge/event_poster.py new file mode 100644 index 0000000..29100bd --- /dev/null +++ b/judge/event_poster.py @@ -0,0 +1,18 @@ +from django.conf import settings + +__all__ = ['last', 'post'] + +if not settings.EVENT_DAEMON_USE: + real = False + + def post(channel, message): + return 0 + + def last(): + return 0 +elif hasattr(settings, 'EVENT_DAEMON_AMQP'): + from .event_poster_amqp import last, post + real = True +else: + from .event_poster_ws import last, post + real = True diff --git a/judge/event_poster_amqp.py b/judge/event_poster_amqp.py new file mode 100644 index 0000000..74f6331 --- /dev/null +++ b/judge/event_poster_amqp.py @@ -0,0 +1,55 @@ +import json +import threading +from time import time + +import pika +from django.conf import settings +from pika.exceptions import AMQPError + +__all__ = ['EventPoster', 'post', 'last'] + + +class EventPoster(object): + def __init__(self): + self._connect() + self._exchange = settings.EVENT_DAEMON_AMQP_EXCHANGE + + def _connect(self): + self._conn = pika.BlockingConnection(pika.URLParameters(settings.EVENT_DAEMON_AMQP)) + self._chan = self._conn.channel() + + def post(self, channel, message, tries=0): + try: + id = int(time() * 1000000) + self._chan.basic_publish(self._exchange, '', + json.dumps({'id': id, 'channel': channel, 'message': message})) + return id + except AMQPError: + if tries > 10: + raise + self._connect() + return self.post(channel, message, tries + 1) + + +_local = threading.local() + + +def _get_poster(): + if 'poster' not in _local.__dict__: + _local.poster = EventPoster() + return _local.poster + + +def post(channel, message): + try: + return _get_poster().post(channel, message) + except AMQPError: + try: + del _local.poster + except AttributeError: + pass + return 0 + + +def last(): + return int(time() * 1000000) diff --git a/judge/event_poster_ws.py b/judge/event_poster_ws.py new file mode 100644 index 0000000..fba4052 --- /dev/null +++ b/judge/event_poster_ws.py @@ -0,0 +1,82 @@ +import json +import socket +import threading + +from django.conf import settings +from websocket import WebSocketException, create_connection + +__all__ = ['EventPostingError', 'EventPoster', 'post', 'last'] +_local = threading.local() + + +class EventPostingError(RuntimeError): + pass + + +class EventPoster(object): + def __init__(self): + self._connect() + + def _connect(self): + self._conn = create_connection(settings.EVENT_DAEMON_POST) + if settings.EVENT_DAEMON_KEY is not None: + self._conn.send(json.dumps({'command': 'auth', 'key': settings.EVENT_DAEMON_KEY})) + resp = json.loads(self._conn.recv()) + if resp['status'] == 'error': + raise EventPostingError(resp['code']) + + def post(self, channel, message, tries=0): + try: + self._conn.send(json.dumps({'command': 'post', 'channel': channel, 'message': message})) + resp = json.loads(self._conn.recv()) + if resp['status'] == 'error': + raise EventPostingError(resp['code']) + else: + return resp['id'] + except WebSocketException: + if tries > 10: + raise + self._connect() + return self.post(channel, message, tries + 1) + + def last(self, tries=0): + try: + self._conn.send('{"command": "last-msg"}') + resp = json.loads(self._conn.recv()) + if resp['status'] == 'error': + raise EventPostingError(resp['code']) + else: + return resp['id'] + except WebSocketException: + if tries > 10: + raise + self._connect() + return self.last(tries + 1) + + +def _get_poster(): + if 'poster' not in _local.__dict__: + _local.poster = EventPoster() + return _local.poster + + +def post(channel, message): + try: + return _get_poster().post(channel, message) + except (WebSocketException, socket.error): + try: + del _local.poster + except AttributeError: + pass + return 0 + + +def last(): + try: + return _get_poster().last() + except (WebSocketException, socket.error): + try: + del _local.poster + except AttributeError: + pass + return 0 diff --git a/judge/feed.py b/judge/feed.py new file mode 100644 index 0000000..47e9d51 --- /dev/null +++ b/judge/feed.py @@ -0,0 +1,99 @@ +from django.conf import settings +from django.contrib.auth.models import AnonymousUser +from django.contrib.syndication.views import Feed +from django.core.cache import cache +from django.utils import timezone +from django.utils.feedgenerator import Atom1Feed + +from judge.jinja2.markdown import markdown +from judge.models import BlogPost, Comment, Problem + + +class ProblemFeed(Feed): + title = 'Recently Added %s Problems' % settings.SITE_NAME + link = '/' + description = 'The latest problems added on the %s website' % settings.SITE_LONG_NAME + + def items(self): + return Problem.objects.filter(is_public=True, is_organization_private=False).order_by('-date', '-id')[:25] + + def item_title(self, problem): + return problem.name + + def item_description(self, problem): + key = 'problem_feed:%d' % problem.id + desc = cache.get(key) + if desc is None: + desc = str(markdown(problem.description, 'problem'))[:500] + '...' + cache.set(key, desc, 86400) + return desc + + def item_pubdate(self, problem): + return problem.date + + item_updateddate = item_pubdate + + +class AtomProblemFeed(ProblemFeed): + feed_type = Atom1Feed + subtitle = ProblemFeed.description + + +class CommentFeed(Feed): + title = 'Latest %s Comments' % settings.SITE_NAME + link = '/' + description = 'The latest comments on the %s website' % settings.SITE_LONG_NAME + + def items(self): + return Comment.most_recent(AnonymousUser(), 25) + + def item_title(self, comment): + return '%s -> %s' % (comment.author.user.username, comment.page_title) + + def item_description(self, comment): + key = 'comment_feed:%d' % comment.id + desc = cache.get(key) + if desc is None: + desc = str(markdown(comment.body, 'comment')) + cache.set(key, desc, 86400) + return desc + + def item_pubdate(self, comment): + return comment.time + + item_updateddate = item_pubdate + + +class AtomCommentFeed(CommentFeed): + feed_type = Atom1Feed + subtitle = CommentFeed.description + + +class BlogFeed(Feed): + title = 'Latest %s Blog Posts' % settings.SITE_NAME + link = '/' + description = 'The latest blog posts from the %s' % settings.SITE_LONG_NAME + + def items(self): + return BlogPost.objects.filter(visible=True, publish_on__lte=timezone.now()).order_by('-sticky', '-publish_on') + + def item_title(self, post): + return post.title + + def item_description(self, post): + key = 'blog_feed:%d' % post.id + summary = cache.get(key) + if summary is None: + summary = str(markdown(post.summary or post.content, 'blog')) + cache.set(key, summary, 86400) + return summary + + def item_pubdate(self, post): + return post.publish_on + + item_updateddate = item_pubdate + + +class AtomBlogFeed(BlogFeed): + feed_type = Atom1Feed + subtitle = BlogFeed.description diff --git a/judge/fixtures/demo.json b/judge/fixtures/demo.json new file mode 100644 index 0000000..9d22a9f --- /dev/null +++ b/judge/fixtures/demo.json @@ -0,0 +1,173 @@ +[ + { + "fields": { + "about": "", + "ace_theme": "github", + "current_contest": null, + "display_rank": "admin", + "ip": "10.0.2.2", + "language": 1, + "last_access": "2017-12-02T08:57:10.093Z", + "math_engine": "auto", + "mute": false, + "organizations": [ + 1 + ], + "performance_points": 0.0, + "points": 0.0, + "problem_count": 0, + "rating": null, + "timezone": "America/Toronto", + "user": 1, + "user_script": "" + }, + "model": "judge.profile", + "pk": 1 + }, + { + "fields": { + "date_joined": "2017-12-02T08:34:17.408Z", + "email": "", + "first_name": "", + "groups": [ + + ], + "is_active": true, + "is_staff": true, + "is_superuser": true, + "last_login": "2017-12-02T08:34:31.840Z", + "last_name": "", + "password": "pbkdf2_sha256$36000$eFRRZq4DgktS$md1gk0bBJb7PH/+3YEXkcCW8K+KmiI+y/amqR32G2DY=", + "user_permissions": [ + + ], + "username": "admin" + }, + "model": "auth.user", + "pk": 1 + }, + { + "fields": { + "about": "This is a sample organization. You can use organizations to split up your user base, host private contests, and more.", + "access_code": null, + "admins": [ + 1 + ], + "creation_date": "2017-12-02T08:50:25.199Z", + "is_open": true, + "slug": "dmoj", + "name": "DMOJ: Modern Online Judge", + "registrant": 1, + "short_name": "DMOJ", + "slots": null + }, + "model": "judge.organization", + "pk": 1 + }, + { + "fields": { + "full_name": "Simple Math", + "name": "Simple Math" + }, + "model": "judge.problemtype", + "pk": 1 + }, + { + "fields": { + "full_name": "Uncategorized", + "name": "Uncategorized" + }, + "model": "judge.problemgroup", + "pk": 1 + }, + { + "fields": { + "ac_rate": 0.0, + "allowed_languages": [ + 3, + 4, + 5, + 6, + 2, + 7, + 1, + 8 + ], + "authors": [ + 1 + ], + "banned_users": [ + + ], + "code": "aplusb", + "curators": [ + + ], + "date": "2017-12-02T05:00:00Z", + "description": "Tudor is sitting in math class, on his laptop. Clearly, he is not paying attention in this situation. However, he gets called on by his math teacher to do some problems. Since his math teacher did not expect much from Tudor, he only needs to do some simple addition problems. However, simple for you and I may not be simple for Tudor , so please help him!\n\n## Input Specification\n\nThe first line will contain an integer ~N~ (~1 \\le N \\le 100\\,000~), the number of addition problems Tudor needs to do. The next ~N~ lines will each contain two space-separated integers whose absolute value is less than ~1\\,000\\,000\\,000~, the two integers Tudor needs to add.\n\n## Output Specification\n\nOutput ~N~ lines of one integer each, the solutions to the addition problems in order.\n\n## Sample Input\n\n 2\n 1 1\n -1 0\n\n## Sample Output\n\n 2\n -1", + "group": 1, + "is_manually_managed": false, + "is_public": true, + "license": null, + "memory_limit": 65536, + "name": "A Plus B", + "og_image": "", + "partial": true, + "points": 5.0, + "short_circuit": false, + "summary": "", + "testers": [ + + ], + "time_limit": 2.0, + "types": [ + 1 + ], + "user_count": 0 + }, + "model": "judge.problem", + "pk": 1 + }, + { + "fields": { + "authors": [ + 1 + ], + "content": "Welcome to DMOJ!\n\n```python\nprint \"Hello, World!\"\n```\n\nYou can get started by checking out [this problem we've added for you](/problem/aplusb).", + "og_image": "", + "publish_on": "2017-12-02T05:00:00Z", + "slug": "first-post", + "sticky": true, + "summary": "", + "title": "First Post", + "visible": true + }, + "model": "judge.blogpost", + "pk": 1 + }, + { + "fields": { + "author": 1, + "body": "This is your first comment!", + "hidden": false, + "level": 0, + "lft": 1, + "page": "b:1", + "parent": null, + "rght": 2, + "score": 0, + "time": "2017-12-02T08:46:54.007Z", + "tree_id": 1 + }, + "model": "judge.comment", + "pk": 1 + }, + { + "fields": { + "domain": "localhost:8081", + "name": "DMOJ: Modern Online Judge" + }, + "model": "sites.site", + "pk": 1 + } +] diff --git a/judge/fixtures/language_small.json b/judge/fixtures/language_small.json new file mode 100644 index 0000000..cfe49e1 --- /dev/null +++ b/judge/fixtures/language_small.json @@ -0,0 +1,122 @@ +[ + { + "fields": { + "ace": "python", + "common_name": "Python", + "description": "", + "extension": "", + "info": "python 2.7.9", + "key": "PY2", + "name": "Python 2", + "pygments": "python", + "short_name": "" + }, + "model": "judge.language", + "pk": 1 + }, + { + "fields": { + "ace": "assembly_x86", + "common_name": "Assembly", + "description": "", + "extension": "", + "info": "binutils 2.25", + "key": "GAS64", + "name": "Assembly (x64)", + "pygments": "gas", + "short_name": "" + }, + "model": "judge.language", + "pk": 2 + }, + { + "fields": { + "ace": "AWK", + "common_name": "Awk", + "description": "", + "extension": "", + "info": "mawk 1.3.3", + "key": "AWK", + "name": "AWK", + "pygments": "awk", + "short_name": "AWK" + }, + "model": "judge.language", + "pk": 3 + }, + { + "fields": { + "ace": "c_cpp", + "common_name": "C", + "description": "Compile options: `gcc -std=c99 -Wall -O2 -lm -march=native -s`\r\n", + "extension": "", + "info": "gcc 4.9.2", + "key": "C", + "name": "C", + "pygments": "c", + "short_name": "" + }, + "model": "judge.language", + "pk": 4 + }, + { + "fields": { + "ace": "c_cpp", + "common_name": "C++", + "description": "Compile options: `g++ -Wall -O2 -lm -march=native -s`\r\n", + "extension": "", + "info": "g++ 4.9.2", + "key": "CPP03", + "name": "C++03", + "pygments": "cpp", + "short_name": "C++03" + }, + "model": "judge.language", + "pk": 5 + }, + { + "fields": { + "ace": "c_cpp", + "common_name": "C++", + "description": "Compile options: `g++ -std=c++11 -Wall -O2 -lm -march=native -s`\r\n", + "extension": "", + "info": "g++-4.9.2 -std=c++11", + "key": "CPP11", + "name": "C++11", + "pygments": "cpp", + "short_name": "C++11" + }, + "model": "judge.language", + "pk": 6 + }, + { + "fields": { + "ace": "perl", + "common_name": "Perl", + "description": "", + "extension": "", + "info": "perl 5.10.1", + "key": "PERL", + "name": "Perl", + "pygments": "perl", + "short_name": "" + }, + "model": "judge.language", + "pk": 7 + }, + { + "fields": { + "ace": "python", + "common_name": "Python", + "description": "", + "extension": "", + "info": "python 3.4.2", + "key": "PY3", + "name": "Python 3", + "pygments": "python3", + "short_name": "" + }, + "model": "judge.language", + "pk": 8 + } +] diff --git a/judge/fixtures/navbar.json b/judge/fixtures/navbar.json new file mode 100644 index 0000000..d43868d --- /dev/null +++ b/judge/fixtures/navbar.json @@ -0,0 +1,98 @@ +[ + { + "fields": { + "key": "problems", + "label": "Problems", + "level": 0, + "lft": 1, + "order": 1, + "parent": null, + "path": "/problems/", + "regex": "^/problem", + "rght": 2, + "tree_id": 1 + }, + "model": "judge.navigationbar", + "pk": 1 + }, + { + "fields": { + "key": "submit", + "label": "Submissions", + "level": 0, + "lft": 1, + "order": 2, + "parent": null, + "path": "/submissions/", + "regex": "^/submi|^/src/", + "rght": 2, + "tree_id": 2 + }, + "model": "judge.navigationbar", + "pk": 2 + }, + { + "fields": { + "key": "user", + "label": "Users", + "level": 0, + "lft": 1, + "order": 3, + "parent": null, + "path": "/users/", + "regex": "^/user", + "rght": 2, + "tree_id": 3 + }, + "model": "judge.navigationbar", + "pk": 3 + }, + { + "fields": { + "key": "contest", + "label": "Contests", + "level": 0, + "lft": 1, + "order": 5, + "parent": null, + "path": "/contests/", + "regex": "^/contest", + "rght": 2, + "tree_id": 4 + }, + "model": "judge.navigationbar", + "pk": 5 + }, + { + "fields": { + "key": "about", + "label": "About", + "level": 0, + "lft": 1, + "order": 6, + "parent": null, + "path": "/about/", + "regex": "^/about/$", + "rght": 4, + "tree_id": 5 + }, + "model": "judge.navigationbar", + "pk": 6 + }, + { + "fields": { + "key": "status", + "label": "Status", + "level": 1, + "lft": 2, + "order": 7, + "parent": 6, + "path": "/status/", + "regex": "^/status/$|^/judge/", + "rght": 3, + "tree_id": 5 + }, + "model": "judge.navigationbar", + "pk": 7 + } +] diff --git a/judge/forms.py b/judge/forms.py new file mode 100644 index 0000000..11aa092 --- /dev/null +++ b/judge/forms.py @@ -0,0 +1,159 @@ +from operator import attrgetter + +import pyotp +from django import forms +from django.conf import settings +from django.contrib.auth.forms import AuthenticationForm +from django.core.exceptions import ValidationError +from django.core.validators import RegexValidator +from django.db.models import Q +from django.forms import CharField, Form, ModelForm +from django.urls import reverse_lazy +from django.utils.translation import gettext_lazy as _ + +from django_ace import AceWidget +from judge.models import Contest, Language, Organization, PrivateMessage, Problem, Profile, Submission +from judge.utils.subscription import newsletter_id +from judge.widgets import HeavyPreviewPageDownWidget, MathJaxPagedownWidget, PagedownWidget, Select2MultipleWidget, \ + Select2Widget + + +def fix_unicode(string, unsafe=tuple('\u202a\u202b\u202d\u202e')): + return string + (sum(k in unsafe for k in string) - string.count('\u202c')) * '\u202c' + + +class ProfileForm(ModelForm): + if newsletter_id is not None: + newsletter = forms.BooleanField(label=_('Subscribe to contest updates'), initial=False, required=False) + test_site = forms.BooleanField(label=_('Enable experimental features'), initial=False, required=False) + + class Meta: + model = Profile + fields = ['about', 'organizations', 'timezone', 'language', 'ace_theme', 'user_script'] + widgets = { + 'user_script': AceWidget(theme='github'), + 'timezone': Select2Widget(attrs={'style': 'width:200px'}), + 'language': Select2Widget(attrs={'style': 'width:200px'}), + 'ace_theme': Select2Widget(attrs={'style': 'width:200px'}), + } + + has_math_config = bool(settings.MATHOID_URL) + if has_math_config: + fields.append('math_engine') + widgets['math_engine'] = Select2Widget(attrs={'style': 'width:200px'}) + + if HeavyPreviewPageDownWidget is not None: + widgets['about'] = HeavyPreviewPageDownWidget( + preview=reverse_lazy('profile_preview'), + attrs={'style': 'max-width:700px;min-width:700px;width:700px'}, + ) + + def clean(self): + organizations = self.cleaned_data.get('organizations') or [] + max_orgs = settings.DMOJ_USER_MAX_ORGANIZATION_COUNT + + if sum(org.is_open for org in organizations) > max_orgs: + raise ValidationError( + _('You may not be part of more than {count} public organizations.').format(count=max_orgs)) + + return self.cleaned_data + + def __init__(self, *args, **kwargs): + user = kwargs.pop('user', None) + super(ProfileForm, self).__init__(*args, **kwargs) + if not user.has_perm('judge.edit_all_organization'): + self.fields['organizations'].queryset = Organization.objects.filter( + Q(is_open=True) | Q(id__in=user.profile.organizations.all()), + ) + + +class ProblemSubmitForm(ModelForm): + source = CharField(max_length=65536, widget=AceWidget(theme='twilight', no_ace_media=True)) + + def __init__(self, *args, **kwargs): + super(ProblemSubmitForm, self).__init__(*args, **kwargs) + self.fields['problem'].empty_label = None + self.fields['problem'].widget = forms.HiddenInput() + self.fields['language'].empty_label = None + self.fields['language'].label_from_instance = attrgetter('display_name') + self.fields['language'].queryset = Language.objects.filter(judges__online=True).distinct() + + class Meta: + model = Submission + fields = ['problem', 'language'] + + +class EditOrganizationForm(ModelForm): + class Meta: + model = Organization + fields = ['about', 'logo_override_image', 'admins'] + widgets = {'admins': Select2MultipleWidget()} + if HeavyPreviewPageDownWidget is not None: + widgets['about'] = HeavyPreviewPageDownWidget(preview=reverse_lazy('organization_preview')) + + +class NewMessageForm(ModelForm): + class Meta: + model = PrivateMessage + fields = ['title', 'content'] + widgets = {} + if PagedownWidget is not None: + widgets['content'] = MathJaxPagedownWidget() + + +class CustomAuthenticationForm(AuthenticationForm): + def __init__(self, *args, **kwargs): + super(CustomAuthenticationForm, self).__init__(*args, **kwargs) + self.fields['username'].widget.attrs.update({'placeholder': _('Username')}) + self.fields['password'].widget.attrs.update({'placeholder': _('Password')}) + + self.has_google_auth = self._has_social_auth('GOOGLE_OAUTH2') + self.has_facebook_auth = self._has_social_auth('FACEBOOK') + self.has_github_auth = self._has_social_auth('GITHUB_SECURE') + + def _has_social_auth(self, key): + return (getattr(settings, 'SOCIAL_AUTH_%s_KEY' % key, None) and + getattr(settings, 'SOCIAL_AUTH_%s_SECRET' % key, None)) + + +class NoAutoCompleteCharField(forms.CharField): + def widget_attrs(self, widget): + attrs = super(NoAutoCompleteCharField, self).widget_attrs(widget) + attrs['autocomplete'] = 'off' + return attrs + + +class TOTPForm(Form): + TOLERANCE = settings.DMOJ_TOTP_TOLERANCE_HALF_MINUTES + + totp_token = NoAutoCompleteCharField(validators=[ + RegexValidator('^[0-9]{6}$', _('Two Factor Authentication tokens must be 6 decimal digits.')), + ]) + + def __init__(self, *args, **kwargs): + self.totp_key = kwargs.pop('totp_key') + super(TOTPForm, self).__init__(*args, **kwargs) + + def clean_totp_token(self): + if not pyotp.TOTP(self.totp_key).verify(self.cleaned_data['totp_token'], valid_window=self.TOLERANCE): + raise ValidationError(_('Invalid Two Factor Authentication token.')) + + +class ProblemCloneForm(Form): + code = CharField(max_length=20, validators=[RegexValidator('^[a-z0-9]+$', _('Problem code must be ^[a-z0-9]+$'))]) + + def clean_code(self): + code = self.cleaned_data['code'] + if Problem.objects.filter(code=code).exists(): + raise ValidationError(_('Problem with code already exists.')) + return code + + +class ContestCloneForm(Form): + key = CharField(max_length=20, validators=[RegexValidator('^[a-z0-9]+$', _('Contest id must be ^[a-z0-9]+$'))]) + + def clean_key(self): + key = self.cleaned_data['key'] + if Contest.objects.filter(key=key).exists(): + raise ValidationError(_('Contest with key already exists.')) + return key diff --git a/judge/fulltext.py b/judge/fulltext.py new file mode 100644 index 0000000..5b9f7d3 --- /dev/null +++ b/judge/fulltext.py @@ -0,0 +1,55 @@ +# From: http://www.mercurytide.co.uk/news/article/django-full-text-search/ + +from django.db import connection, models +from django.db.models.query import QuerySet + + +class SearchQuerySet(QuerySet): + DEFAULT = '' + BOOLEAN = ' IN BOOLEAN MODE' + NATURAL_LANGUAGE = ' IN NATURAL LANGUAGE MODE' + QUERY_EXPANSION = ' WITH QUERY EXPANSION' + + def __init__(self, fields=None, **kwargs): + super(SearchQuerySet, self).__init__(**kwargs) + self._search_fields = fields + + def _clone(self, *args, **kwargs): + queryset = super(SearchQuerySet, self)._clone(*args, **kwargs) + queryset._search_fields = self._search_fields + return queryset + + def search(self, query, mode=DEFAULT): + meta = self.model._meta + + # Get the table name and column names from the model + # in `table_name`.`column_name` style + columns = [meta.get_field(name).column for name in self._search_fields] + full_names = ['%s.%s' % + (connection.ops.quote_name(meta.db_table), + connection.ops.quote_name(column)) + for column in columns] + + # Create the MATCH...AGAINST expressions + fulltext_columns = ', '.join(full_names) + match_expr = ('MATCH(%s) AGAINST (%%s%s)' % (fulltext_columns, mode)) + + # Add the extra SELECT and WHERE options + return self.extra(select={'relevance': match_expr}, + select_params=[query], + where=[match_expr], + params=[query]) + + +class SearchManager(models.Manager): + def __init__(self, fields=None): + super(SearchManager, self).__init__() + self._search_fields = fields + + def get_queryset(self): + if self._search_fields is not None: + return SearchQuerySet(model=self.model, fields=self._search_fields) + return super(SearchManager, self).get_queryset() + + def search(self, *args, **kwargs): + return self.get_queryset().search(*args, **kwargs) diff --git a/judge/highlight_code.py b/judge/highlight_code.py new file mode 100644 index 0000000..ff330f7 --- /dev/null +++ b/judge/highlight_code.py @@ -0,0 +1,37 @@ +from django.utils.html import escape, mark_safe + +__all__ = ['highlight_code'] + + +def _make_pre_code(code): + return mark_safe('
' + escape(code) + '
') + + +def _wrap_code(inner): + yield 0, "" + for tup in inner: + yield tup + yield 0, "" + + +try: + import pygments + import pygments.lexers + import pygments.formatters.html + import pygments.util +except ImportError: + def highlight_code(code, language, cssclass=None): + return _make_pre_code(code) +else: + class HtmlCodeFormatter(pygments.formatters.HtmlFormatter): + def wrap(self, source, outfile): + return self._wrap_div(self._wrap_pre(_wrap_code(source))) + + def highlight_code(code, language, cssclass='codehilite'): + try: + lexer = pygments.lexers.get_lexer_by_name(language) + except pygments.util.ClassNotFound: + return _make_pre_code(code) + + # return mark_safe(pygments.highlight(code, lexer, HtmlCodeFormatter(cssclass=cssclass, linenos='table'))) + return mark_safe(pygments.highlight(code, lexer, HtmlCodeFormatter(cssclass=cssclass))) diff --git a/judge/jinja2/__init__.py b/judge/jinja2/__init__.py new file mode 100644 index 0000000..f316397 --- /dev/null +++ b/judge/jinja2/__init__.py @@ -0,0 +1,36 @@ +import itertools +import json + +from django.utils.http import urlquote +from jinja2.ext import Extension +from mptt.utils import get_cached_trees +from statici18n.templatetags.statici18n import inlinei18n + +from judge.highlight_code import highlight_code +from judge.user_translations import gettext +from . import (camo, datetime, filesize, gravatar, language, markdown, rating, reference, render, social, + spaceless, submission, timedelta) +from . import registry + +registry.function('str', str) +registry.filter('str', str) +registry.filter('json', json.dumps) +registry.filter('highlight', highlight_code) +registry.filter('urlquote', urlquote) +registry.filter('roundfloat', round) +registry.function('inlinei18n', inlinei18n) +registry.function('mptt_tree', get_cached_trees) +registry.function('user_trans', gettext) + + +@registry.function +def counter(start=1): + return itertools.count(start).__next__ + + +class DMOJExtension(Extension): + def __init__(self, env): + super(DMOJExtension, self).__init__(env) + env.globals.update(registry.globals) + env.filters.update(registry.filters) + env.tests.update(registry.tests) diff --git a/judge/jinja2/camo.py b/judge/jinja2/camo.py new file mode 100644 index 0000000..1baeeb2 --- /dev/null +++ b/judge/jinja2/camo.py @@ -0,0 +1,9 @@ +from judge.utils.camo import client as camo_client +from . import registry + + +@registry.filter +def camo(url): + if camo_client is None: + return url + return camo_client.rewrite_url(url) diff --git a/judge/jinja2/datetime.py b/judge/jinja2/datetime.py new file mode 100644 index 0000000..76c6bfc --- /dev/null +++ b/judge/jinja2/datetime.py @@ -0,0 +1,27 @@ +import functools + +from django.template.defaultfilters import date, time +from django.templatetags.tz import localtime +from django.utils.translation import gettext as _ + +from . import registry + + +def localtime_wrapper(func): + @functools.wraps(func) + def wrapper(datetime, *args, **kwargs): + if getattr(datetime, 'convert_to_local_time', True): + datetime = localtime(datetime) + return func(datetime, *args, **kwargs) + + return wrapper + + +registry.filter(localtime_wrapper(date)) +registry.filter(localtime_wrapper(time)) + + +@registry.function +@registry.render_with('widgets/relative-time.html') +def relative_time(time, format=_('N j, Y, g:i a'), rel=_('{time}'), abs=_('on {time}')): + return {'time': time, 'format': format, 'rel_format': rel, 'abs_format': abs} diff --git a/judge/jinja2/filesize.py b/judge/jinja2/filesize.py new file mode 100644 index 0000000..7b27fde --- /dev/null +++ b/judge/jinja2/filesize.py @@ -0,0 +1,36 @@ +from django.utils.html import avoid_wrapping + +from . import registry + + +def _format_size(bytes, callback): + bytes = float(bytes) + + KB = 1 << 10 + MB = 1 << 20 + GB = 1 << 30 + TB = 1 << 40 + PB = 1 << 50 + + if bytes < KB: + return callback('', bytes) + elif bytes < MB: + return callback('K', bytes / KB) + elif bytes < GB: + return callback('M', bytes / MB) + elif bytes < TB: + return callback('G', bytes / GB) + elif bytes < PB: + return callback('T', bytes / TB) + else: + return callback('P', bytes / PB) + + +@registry.filter +def kbdetailformat(bytes): + return avoid_wrapping(_format_size(bytes * 1024, lambda x, y: ['%d %sB', '%.2f %sB'][bool(x)] % (y, x))) + + +@registry.filter +def kbsimpleformat(kb): + return _format_size(kb * 1024, lambda x, y: '%.0f%s' % (y, x or 'B')) diff --git a/judge/jinja2/gravatar.py b/judge/jinja2/gravatar.py new file mode 100644 index 0000000..35b3fb8 --- /dev/null +++ b/judge/jinja2/gravatar.py @@ -0,0 +1,25 @@ +import hashlib + +from django.contrib.auth.models import AbstractUser +from django.utils.http import urlencode + +from judge.models import Profile +from judge.utils.unicode import utf8bytes +from . import registry + + +@registry.function +def gravatar(email, size=80, default=None): + if isinstance(email, Profile): + if default is None: + default = email.mute + email = email.user.email + elif isinstance(email, AbstractUser): + email = email.email + + gravatar_url = '//www.gravatar.com/avatar/' + hashlib.md5(utf8bytes(email.strip().lower())).hexdigest() + '?' + args = {'d': 'identicon', 's': str(size)} + if default: + args['f'] = 'y' + gravatar_url += urlencode(args) + return gravatar_url diff --git a/judge/jinja2/language.py b/judge/jinja2/language.py new file mode 100644 index 0000000..344568a --- /dev/null +++ b/judge/jinja2/language.py @@ -0,0 +1,18 @@ +from django.utils import translation + +from . import registry + + +@registry.function('language_info') +def get_language_info(language): + # ``language`` is either a language code string or a sequence + # with the language code as its first item + if len(language[0]) > 1: + return translation.get_language_info(language[0]) + else: + return translation.get_language_info(str(language)) + + +@registry.function('language_info_list') +def get_language_info_list(langs): + return [get_language_info(lang) for lang in langs] diff --git a/judge/jinja2/markdown/__init__.py b/judge/jinja2/markdown/__init__.py new file mode 100644 index 0000000..4ca07bb --- /dev/null +++ b/judge/jinja2/markdown/__init__.py @@ -0,0 +1,142 @@ +import logging +import re +from html.parser import HTMLParser +from urllib.parse import urlparse + +import mistune +from django.conf import settings +from jinja2 import Markup +from lxml import html +from lxml.etree import ParserError, XMLSyntaxError + +from judge.highlight_code import highlight_code +from judge.jinja2.markdown.lazy_load import lazy_load as lazy_load_processor +from judge.jinja2.markdown.math import MathInlineGrammar, MathInlineLexer, MathRenderer +from judge.utils.camo import client as camo_client +from judge.utils.texoid import TEXOID_ENABLED, TexoidRenderer +from .. import registry + +logger = logging.getLogger('judge.html') + +NOFOLLOW_WHITELIST = settings.NOFOLLOW_EXCLUDED + + +class CodeSafeInlineGrammar(mistune.InlineGrammar): + double_emphasis = re.compile(r'^\*{2}([\s\S]+?)()\*{2}(?!\*)') # **word** + emphasis = re.compile(r'^\*((?:\*\*|[^\*])+?)()\*(?!\*)') # *word* + + +class AwesomeInlineGrammar(MathInlineGrammar, CodeSafeInlineGrammar): + pass + + +class AwesomeInlineLexer(MathInlineLexer, mistune.InlineLexer): + grammar_class = AwesomeInlineGrammar + + +class AwesomeRenderer(MathRenderer, mistune.Renderer): + def __init__(self, *args, **kwargs): + self.nofollow = kwargs.pop('nofollow', True) + self.texoid = TexoidRenderer() if kwargs.pop('texoid', False) else None + self.parser = HTMLParser() + super(AwesomeRenderer, self).__init__(*args, **kwargs) + + def _link_rel(self, href): + if href: + try: + url = urlparse(href) + except ValueError: + return ' rel="nofollow"' + else: + if url.netloc and url.netloc not in NOFOLLOW_WHITELIST: + return ' rel="nofollow"' + return '' + + def autolink(self, link, is_email=False): + text = link = mistune.escape(link) + if is_email: + link = 'mailto:%s' % link + return '%s' % (link, self._link_rel(link), text) + + def table(self, header, body): + return ( + '\n%s\n' + '\n%s\n
\n' + ) % (header, body) + + def link(self, link, title, text): + link = mistune.escape_link(link) + if not title: + return '%s' % (link, self._link_rel(link), text) + title = mistune.escape(title, quote=True) + return '%s' % (link, title, self._link_rel(link), text) + + def block_code(self, code, lang=None): + if not lang: + return '\n
%s
\n' % mistune.escape(code).rstrip() + return highlight_code(code, lang) + + def block_html(self, html): + if self.texoid and html.startswith('')] + latex = html[html.index('>') + 1:html.rindex('<')] + latex = self.parser.unescape(latex) + result = self.texoid.get_result(latex) + if not result: + return '
%s
' % mistune.escape(latex, smart_amp=False) + elif 'error' not in result: + img = ('''') % { + 'svg': result['svg'], 'png': result['png'], + 'width': result['meta']['width'], 'height': result['meta']['height'], + 'tail': ' /' if self.options.get('use_xhtml') else '', + } + style = ['max-width: 100%', + 'height: %s' % result['meta']['height'], + 'max-height: %s' % result['meta']['height'], + 'width: %s' % result['meta']['height']] + if 'inline' in attr: + tag = 'span' + else: + tag = 'div' + style += ['text-align: center'] + return '<%s style="%s">%s' % (tag, ';'.join(style), img, tag) + else: + return '
%s
' % mistune.escape(result['error'], smart_amp=False) + return super(AwesomeRenderer, self).block_html(html) + + def header(self, text, level, *args, **kwargs): + return super(AwesomeRenderer, self).header(text, level + 2, *args, **kwargs) + + +@registry.filter +def markdown(value, style, math_engine=None, lazy_load=False): + styles = settings.MARKDOWN_STYLES.get(style, settings.MARKDOWN_DEFAULT_STYLE) + escape = styles.get('safe_mode', True) + nofollow = styles.get('nofollow', True) + texoid = TEXOID_ENABLED and styles.get('texoid', False) + math = hasattr(settings, 'MATHOID_URL') and styles.get('math', False) + + post_processors = [] + if styles.get('use_camo', False) and camo_client is not None: + post_processors.append(camo_client.update_tree) + if lazy_load: + post_processors.append(lazy_load_processor) + + renderer = AwesomeRenderer(escape=escape, nofollow=nofollow, texoid=texoid, + math=math and math_engine is not None, math_engine=math_engine) + markdown = mistune.Markdown(renderer=renderer, inline=AwesomeInlineLexer, + parse_block_html=1, parse_inline_html=1) + result = markdown(value) + + if post_processors: + try: + tree = html.fromstring(result, parser=html.HTMLParser(recover=True)) + except (XMLSyntaxError, ParserError) as e: + if result and (not isinstance(e, ParserError) or e.args[0] != 'Document is empty'): + logger.exception('Failed to parse HTML string') + tree = html.Element('div') + for processor in post_processors: + processor(tree) + result = html.tostring(tree, encoding='unicode') + return Markup(result) diff --git a/judge/jinja2/markdown/lazy_load.py b/judge/jinja2/markdown/lazy_load.py new file mode 100644 index 0000000..cf9849c --- /dev/null +++ b/judge/jinja2/markdown/lazy_load.py @@ -0,0 +1,20 @@ +from copy import deepcopy + +from django.templatetags.static import static +from lxml import html + + +def lazy_load(tree): + blank = static('blank.gif') + for img in tree.xpath('.//img'): + src = img.get('src', '') + if src.startswith('data') or '-math' in img.get('class', ''): + continue + noscript = html.Element('noscript') + copy = deepcopy(img) + copy.tail = '' + noscript.append(copy) + img.addprevious(noscript) + img.set('data-src', src) + img.set('src', blank) + img.set('class', img.get('class') + ' unveil' if img.get('class') else 'unveil') diff --git a/judge/jinja2/markdown/math.py b/judge/jinja2/markdown/math.py new file mode 100644 index 0000000..d619d5b --- /dev/null +++ b/judge/jinja2/markdown/math.py @@ -0,0 +1,65 @@ +import re + +import mistune + +from judge.utils.mathoid import MathoidMathParser + +mistune._pre_tags.append('latex') + + +class MathInlineGrammar(mistune.InlineGrammar): + block_math = re.compile(r'^\$\$(.*?)\$\$|^\\\[(.*?)\\\]', re.DOTALL) + math = re.compile(r'^~(.*?)~|^\\\((.*?)\\\)', re.DOTALL) + text = re.compile(r'^[\s\S]+?(?=[\\%s' % (tag, extra, text, tag) + else: + html = m.group(0) + return self.renderer.inline_html(html) + + +class MathRenderer(mistune.Renderer): + def __init__(self, *args, **kwargs): + if kwargs.pop('math', False): + self.mathoid = MathoidMathParser(kwargs.pop('math_engine', None) or 'svg') + else: + self.mathoid = None + super(MathRenderer, self).__init__(*args, **kwargs) + + def block_math(self, math): + if self.mathoid is None or not math: + return r'\[%s\]' % mistune.escape(str(math)) + return self.mathoid.display_math(math) + + def math(self, math): + if self.mathoid is None or not math: + return r'\(%s\)' % mistune.escape(str(math)) + return self.mathoid.inline_math(math) diff --git a/judge/jinja2/rating.py b/judge/jinja2/rating.py new file mode 100644 index 0000000..b531bb7 --- /dev/null +++ b/judge/jinja2/rating.py @@ -0,0 +1,35 @@ +from django.utils import six + +from judge.ratings import rating_class, rating_name, rating_progress +from . import registry + + +def _get_rating_value(func, obj): + if obj is None: + return None + + if isinstance(obj, six.integer_types): + return func(obj) + else: + return func(obj.rating) + + +@registry.function('rating_class') +def get_rating_class(obj): + return _get_rating_value(rating_class, obj) or 'rate-none' + + +@registry.function(name='rating_name') +def get_name(obj): + return _get_rating_value(rating_name, obj) or 'Unrated' + + +@registry.function(name='rating_progress') +def get_progress(obj): + return _get_rating_value(rating_progress, obj) or 0.0 + + +@registry.function +@registry.render_with('user/rating.html') +def rating_number(obj): + return {'rating': obj} diff --git a/judge/jinja2/reference.py b/judge/jinja2/reference.py new file mode 100644 index 0000000..239f279 --- /dev/null +++ b/judge/jinja2/reference.py @@ -0,0 +1,187 @@ +import re +from collections import defaultdict +from urllib.parse import urljoin + +from ansi2html import Ansi2HTMLConverter +from django.contrib.auth.models import AbstractUser +from django.urls import reverse +from django.utils.safestring import mark_safe +from lxml.html import Element + +from judge import lxml_tree +from judge.models import Contest, Problem, Profile +from judge.ratings import rating_class, rating_progress +from . import registry + +rereference = re.compile(r'\[(r?user):(\w+)\]') + + +def get_user(username, data): + if not data: + element = Element('span') + element.text = username + return element + + element = Element('span', {'class': Profile.get_user_css_class(*data)}) + link = Element('a', {'href': reverse('user_page', args=[username])}) + link.text = username + element.append(link) + return element + + +def get_user_rating(username, data): + if not data: + element = Element('span') + element.text = username + return element + + rating = data[1] + element = Element('a', {'class': 'rate-group', 'href': reverse('user_page', args=[username])}) + if rating: + rating_css = rating_class(rating) + rate_box = Element('span', {'class': 'rate-box ' + rating_css}) + rate_box.append(Element('span', {'style': 'height: %3.fem' % rating_progress(rating)})) + user = Element('span', {'class': 'rating ' + rating_css}) + user.text = username + element.append(rate_box) + element.append(user) + else: + element.text = username + return element + + +def get_user_info(usernames): + return {name: (rank, rating) for name, rank, rating in + Profile.objects.filter(user__username__in=usernames) + .values_list('user__username', 'display_rank', 'rating')} + + +reference_map = { + 'user': (get_user, get_user_info), + 'ruser': (get_user_rating, get_user_info), +} + + +def process_reference(text): + # text/tail -> text/tail + elements + last = 0 + tail = text + prev = None + elements = [] + for piece in rereference.finditer(text): + if prev is None: + tail = text[last:piece.start()] + else: + prev.append(text[last:piece.start()]) + prev = list(piece.groups()) + elements.append(prev) + last = piece.end() + if prev is not None: + prev.append(text[last:]) + return tail, elements + + +def populate_list(queries, list, element, tail, children): + if children: + for elem in children: + queries[elem[0]].append(elem[1]) + list.append((element, tail, children)) + + +def update_tree(list, results, is_tail=False): + for element, text, children in list: + after = [] + for type, name, tail in children: + child = reference_map[type][0](name, results[type].get(name)) + child.tail = tail + after.append(child) + + after = iter(reversed(after)) + if is_tail: + element.tail = text + link = element.getnext() + if link is None: + link = next(after) + element.getparent().append(link) + else: + element.text = text + link = next(after) + element.insert(0, link) + for child in after: + link.addprevious(child) + link = child + + +@registry.filter +def reference(text): + tree = lxml_tree.fromstring(text) + texts = [] + tails = [] + queries = defaultdict(list) + for element in tree.iter(): + if element.text: + populate_list(queries, texts, element, *process_reference(element.text)) + if element.tail: + populate_list(queries, tails, element, *process_reference(element.tail)) + + results = {type: reference_map[type][1](values) for type, values in queries.items()} + update_tree(texts, results, is_tail=False) + update_tree(tails, results, is_tail=True) + return tree + + +@registry.filter +def item_title(item): + if isinstance(item, Problem): + return item.name + elif isinstance(item, Contest): + return item.name + return '' + + +@registry.function +@registry.render_with('user/link.html') +def link_user(user): + if isinstance(user, Profile): + user, profile = user.user, user + elif isinstance(user, AbstractUser): + profile = user.profile + elif type(user).__name__ == 'ContestRankingProfile': + user, profile = user.user, user + else: + raise ValueError('Expected profile or user, got %s' % (type(user),)) + return {'user': user, 'profile': profile} + + +@registry.function +@registry.render_with('user/link-list.html') +def link_users(users): + return {'users': users} + + +@registry.function +@registry.render_with('runtime-version-fragment.html') +def runtime_versions(versions): + return {'runtime_versions': versions} + + +@registry.filter(name='absolutify') +def absolute_links(text, url): + tree = lxml_tree.fromstring(text) + for anchor in tree.xpath('.//a'): + href = anchor.get('href') + if href: + anchor.set('href', urljoin(url, href)) + return tree + + +@registry.function(name='urljoin') +def join(first, second, *rest): + if not rest: + return urljoin(first, second) + return urljoin(urljoin(first, second), *rest) + + +@registry.filter(name='ansi2html') +def ansi2html(s): + return mark_safe(Ansi2HTMLConverter(inline=True).convert(s, full=False)) diff --git a/judge/jinja2/registry.py b/judge/jinja2/registry.py new file mode 100644 index 0000000..da12166 --- /dev/null +++ b/judge/jinja2/registry.py @@ -0,0 +1,53 @@ +from django_jinja.library import render_with + +globals = {} +tests = {} +filters = {} +extensions = [] + +__all__ = ['render_with', 'function', 'filter', 'test', 'extension'] + + +def _store_function(store, func, name=None): + if name is None: + name = func.__name__ + store[name] = func + + +def _register_function(store, name, func): + if name is None and func is None: + def decorator(func): + _store_function(store, func) + return func + + return decorator + elif name is not None and func is None: + if callable(name): + _store_function(store, name) + return name + else: + def decorator(func): + _store_function(store, func, name) + return func + + return decorator + else: + _store_function(store, func, name) + return func + + +def filter(name=None, func=None): + return _register_function(filters, name, func) + + +def function(name=None, func=None): + return _register_function(globals, name, func) + + +def test(name=None, func=None): + return _register_function(tests, name, func) + + +def extension(cls): + extensions.append(cls) + return cls diff --git a/judge/jinja2/render.py b/judge/jinja2/render.py new file mode 100644 index 0000000..778e26a --- /dev/null +++ b/judge/jinja2/render.py @@ -0,0 +1,27 @@ +from django.template import (Context, Template as DjangoTemplate, TemplateSyntaxError as DjangoTemplateSyntaxError, + VariableDoesNotExist) + +from . import registry + +MAX_CACHE = 100 +django_cache = {} + + +def compile_template(code): + if code in django_cache: + return django_cache[code] + + # If this works for re.compile, it works for us too. + if len(django_cache) > MAX_CACHE: + django_cache.clear() + + t = django_cache[code] = DjangoTemplate(code) + return t + + +@registry.function +def render_django(template, **context): + try: + return compile_template(template).render(Context(context)) + except (VariableDoesNotExist, DjangoTemplateSyntaxError): + return 'Error rendering: %r' % template diff --git a/judge/jinja2/social.py b/judge/jinja2/social.py new file mode 100644 index 0000000..9f82971 --- /dev/null +++ b/judge/jinja2/social.py @@ -0,0 +1,34 @@ +from django.template.loader import get_template +from django.utils.safestring import mark_safe +from django_social_share.templatetags.social_share import post_to_facebook_url, post_to_gplus_url, post_to_twitter_url + +from . import registry + +SHARES = [ + ('post_to_twitter', 'django_social_share/templatetags/post_to_twitter.html', post_to_twitter_url), + ('post_to_facebook', 'django_social_share/templatetags/post_to_facebook.html', post_to_facebook_url), + ('post_to_gplus', 'django_social_share/templatetags/post_to_gplus.html', post_to_gplus_url), + # For future versions: + # ('post_to_linkedin', 'django_social_share/templatetags/post_to_linkedin.html', post_to_linkedin_url), + # ('post_to_reddit', 'django_social_share/templatetags/post_to_reddit.html', post_to_reddit_url), +] + + +def make_func(name, template, url_func): + def func(request, *args): + link_text = args[-1] + context = {'request': request, 'link_text': mark_safe(link_text)} + context = url_func(context, *args[:-1]) + return mark_safe(get_template(template).render(context)) + + func.__name__ = name + registry.function(name, func) + + +for name, template, url_func in SHARES: + make_func(name, template, url_func) + + +@registry.function +def recaptcha_init(language=None): + return get_template('snowpenguin/recaptcha/recaptcha_init.html').render({'explicit': False, 'language': language}) diff --git a/judge/jinja2/spaceless.py b/judge/jinja2/spaceless.py new file mode 100644 index 0000000..81c5186 --- /dev/null +++ b/judge/jinja2/spaceless.py @@ -0,0 +1,29 @@ +import re + +from jinja2 import Markup, nodes +from jinja2.ext import Extension + + +class SpacelessExtension(Extension): + """ + Removes whitespace between HTML tags at compile time, including tab and newline characters. + It does not remove whitespace between jinja2 tags or variables. Neither does it remove whitespace between tags + and their text content. + Adapted from coffin: + https://github.com/coffin/coffin/blob/master/coffin/template/defaulttags.py + Adapted from StackOverflow: + https://stackoverflow.com/a/23741298/1090657 + """ + + tags = {'spaceless'} + + def parse(self, parser): + lineno = next(parser.stream).lineno + body = parser.parse_statements(['name:endspaceless'], drop_needle=True) + return nodes.CallBlock( + self.call_method('_strip_spaces', [], [], None, None), + [], [], body, + ).set_lineno(lineno) + + def _strip_spaces(self, caller=None): + return Markup(re.sub(r'>\s+<', '><', caller().unescape().strip())) diff --git a/judge/jinja2/submission.py b/judge/jinja2/submission.py new file mode 100644 index 0000000..f1d352e --- /dev/null +++ b/judge/jinja2/submission.py @@ -0,0 +1,21 @@ +from . import registry + + +@registry.function +def submission_layout(submission, profile_id, user, editable_problem_ids, completed_problem_ids): + problem_id = submission.problem_id + can_view = False + + if problem_id in editable_problem_ids: + can_view = True + + if profile_id == submission.user_id: + can_view = True + + if user.has_perm('judge.change_submission'): + can_view = True + + if submission.problem_id in completed_problem_ids: + can_view |= submission.problem.is_public or profile_id in submission.problem.tester_ids + + return can_view diff --git a/judge/jinja2/timedelta.py b/judge/jinja2/timedelta.py new file mode 100644 index 0000000..03fd9db --- /dev/null +++ b/judge/jinja2/timedelta.py @@ -0,0 +1,28 @@ +import datetime + +from judge.utils.timedelta import nice_repr +from . import registry + + +@registry.filter +def timedelta(value, display='long'): + if value is None: + return value + return nice_repr(value, display) + + +@registry.filter +def timestampdelta(value, display='long'): + value = datetime.timedelta(seconds=value) + return timedelta(value, display) + + +@registry.filter +def seconds(timedelta): + return timedelta.total_seconds() + + +@registry.filter +@registry.render_with('time-remaining-fragment.html') +def as_countdown(timedelta): + return {'countdown': timedelta} diff --git a/judge/judgeapi.py b/judge/judgeapi.py new file mode 100644 index 0000000..ca49460 --- /dev/null +++ b/judge/judgeapi.py @@ -0,0 +1,117 @@ +import json +import logging +import socket +import struct +import zlib + +from django.conf import settings + +from judge import event_poster as event + +logger = logging.getLogger('judge.judgeapi') +size_pack = struct.Struct('!I') + + +def _post_update_submission(submission, done=False): + if submission.problem.is_public: + event.post('submissions', {'type': 'done-submission' if done else 'update-submission', + 'id': submission.id, + 'contest': submission.contest_key, + 'user': submission.user_id, 'problem': submission.problem_id, + 'status': submission.status, 'language': submission.language.key}) + + +def judge_request(packet, reply=True): + sock = socket.create_connection(settings.BRIDGED_DJANGO_CONNECT or + settings.BRIDGED_DJANGO_ADDRESS[0]) + + output = json.dumps(packet, separators=(',', ':')) + output = zlib.compress(output.encode('utf-8')) + writer = sock.makefile('wb') + writer.write(size_pack.pack(len(output))) + writer.write(output) + writer.close() + + if reply: + reader = sock.makefile('rb', -1) + input = reader.read(size_pack.size) + if not input: + raise ValueError('Judge did not respond') + length = size_pack.unpack(input)[0] + input = reader.read(length) + if not input: + raise ValueError('Judge did not respond') + reader.close() + sock.close() + + result = json.loads(zlib.decompress(input).decode('utf-8')) + return result + + +def judge_submission(submission, rejudge, batch_rejudge=False): + from .models import ContestSubmission, Submission, SubmissionTestCase + + CONTEST_SUBMISSION_PRIORITY = 0 + DEFAULT_PRIORITY = 1 + REJUDGE_PRIORITY = 2 + BATCH_REJUDGE_PRIORITY = 3 + + updates = {'time': None, 'memory': None, 'points': None, 'result': None, 'error': None, + 'was_rejudged': rejudge, 'status': 'QU'} + try: + # This is set proactively; it might get unset in judgecallback's on_grading_begin if the problem doesn't + # actually have pretests stored on the judge. + updates['is_pretested'] = ContestSubmission.objects.filter(submission=submission) \ + .values_list('problem__contest__run_pretests_only', flat=True)[0] + except IndexError: + priority = DEFAULT_PRIORITY + else: + priority = CONTEST_SUBMISSION_PRIORITY + + # This should prevent double rejudge issues by permitting only the judging of + # QU (which is the initial state) and D (which is the final state). + # Even though the bridge will not queue a submission already being judged, + # we will destroy the current state by deleting all SubmissionTestCase objects. + # However, we can't drop the old state immediately before a submission is set for judging, + # as that would prevent people from knowing a submission is being scheduled for rejudging. + # It is worth noting that this mechanism does not prevent a new rejudge from being scheduled + # while already queued, but that does not lead to data corruption. + if not Submission.objects.filter(id=submission.id).exclude(status__in=('P', 'G')).update(**updates): + return False + + SubmissionTestCase.objects.filter(submission_id=submission.id).delete() + + try: + response = judge_request({ + 'name': 'submission-request', + 'submission-id': submission.id, + 'problem-id': submission.problem.code, + 'language': submission.language.key, + 'source': submission.source.source, + 'priority': BATCH_REJUDGE_PRIORITY if batch_rejudge else REJUDGE_PRIORITY if rejudge else priority, + }) + except BaseException: + logger.exception('Failed to send request to judge') + Submission.objects.filter(id=submission.id).update(status='IE') + success = False + else: + if response['name'] != 'submission-received' or response['submission-id'] != submission.id: + Submission.objects.filter(id=submission.id).update(status='IE') + _post_update_submission(submission) + success = True + return success + + +def disconnect_judge(judge, force=False): + judge_request({'name': 'disconnect-judge', 'judge-id': judge.name, 'force': force}, reply=False) + + +def abort_submission(submission): + from .models import Submission + response = judge_request({'name': 'terminate-submission', 'submission-id': submission.id}) + # This defaults to true, so that in the case the judgelist fails to remove the submission from the queue, + # and returns a bad-request, the submission is not falsely shown as "Aborted" when it will still be judged. + if not response.get('judge-aborted', True): + Submission.objects.filter(id=submission.id).update(status='AB', result='AB') + event.post('sub_%s' % Submission.get_id_secret(submission.id), {'type': 'aborted-submission'}) + _post_update_submission(submission, done=True) diff --git a/judge/lxml_tree.py b/judge/lxml_tree.py new file mode 100644 index 0000000..014f7dc --- /dev/null +++ b/judge/lxml_tree.py @@ -0,0 +1,59 @@ +import logging + +from django.utils.safestring import SafeData, mark_safe +from lxml import html +from lxml.etree import ParserError, XMLSyntaxError + +logger = logging.getLogger('judge.html') + + +class HTMLTreeString(SafeData): + def __init__(self, str): + try: + self._tree = html.fromstring(str, parser=html.HTMLParser(recover=True)) + except (XMLSyntaxError, ParserError) as e: + if str and (not isinstance(e, ParserError) or e.args[0] != 'Document is empty'): + logger.exception('Failed to parse HTML string') + self._tree = html.Element('div') + + def __getattr__(self, attr): + try: + return getattr(self._tree, attr) + except AttributeError: + return getattr(str(self), attr) + + def __setattr__(self, key, value): + if key[0] == '_': + super(HTMLTreeString, self).__setattr__(key, value) + setattr(self._tree, key, value) + + def __repr__(self): + return '' % str(self) + + def __str__(self): + return mark_safe(html.tostring(self._tree, encoding='unicode')) + + def __radd__(self, other): + return other + str(self) + + def __add__(self, other): + return str(self) + other + + def __getitem__(self, item): + return str(self)[item] + + def __getstate__(self): + return str(self) + + def __setstate__(self, state): + self._tree = html.fromstring(state) + + @property + def tree(self): + return self._tree + + +def fromstring(str): + if isinstance(str, HTMLTreeString): + return str + return HTMLTreeString(str) diff --git a/judge/management/__init__.py b/judge/management/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/judge/management/commands/__init__.py b/judge/management/commands/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/judge/management/commands/addjudge.py b/judge/management/commands/addjudge.py new file mode 100644 index 0000000..b659364 --- /dev/null +++ b/judge/management/commands/addjudge.py @@ -0,0 +1,17 @@ +from django.core.management.base import BaseCommand + +from judge.models import Judge + + +class Command(BaseCommand): + help = 'create a judge' + + def add_arguments(self, parser): + parser.add_argument('name', help='the name of the judge') + parser.add_argument('auth_key', help='authentication key for the judge') + + def handle(self, *args, **options): + judge = Judge() + judge.name = options['name'] + judge.auth_key = options['auth_key'] + judge.save() diff --git a/judge/management/commands/adduser.py b/judge/management/commands/adduser.py new file mode 100644 index 0000000..f214f4a --- /dev/null +++ b/judge/management/commands/adduser.py @@ -0,0 +1,32 @@ +from django.conf import settings +from django.contrib.auth.models import User +from django.core.management.base import BaseCommand + +from judge.models import Language, Profile + + +class Command(BaseCommand): + help = 'creates a user' + + def add_arguments(self, parser): + parser.add_argument('name', help='username') + parser.add_argument('email', help='email, not necessary to be resolvable') + parser.add_argument('password', help='password for the user') + parser.add_argument('language', nargs='?', default=settings.DEFAULT_USER_LANGUAGE, + help='default language ID for user') + + parser.add_argument('--superuser', action='store_true', default=False, + help="if specified, creates user with superuser privileges") + parser.add_argument('--staff', action='store_true', default=False, + help="if specified, creates user with staff privileges") + + def handle(self, *args, **options): + usr = User(username=options['name'], email=options['email'], is_active=True) + usr.set_password(options['password']) + usr.is_superuser = options['superuser'] + usr.is_staff = options['staff'] + usr.save() + + profile = Profile(user=usr) + profile.language = Language.objects.get(key=options['language']) + profile.save() diff --git a/judge/management/commands/camo.py b/judge/management/commands/camo.py new file mode 100644 index 0000000..aa65521 --- /dev/null +++ b/judge/management/commands/camo.py @@ -0,0 +1,16 @@ +from django.core.management.base import BaseCommand, CommandError + +from judge.utils.camo import client as camo_client + + +class Command(BaseCommand): + help = 'obtains the camo url for the specified url' + + def add_arguments(self, parser): + parser.add_argument('url', help='url to use camo on') + + def handle(self, *args, **options): + if camo_client is None: + raise CommandError('Camo not available') + + print(camo_client.image_url(options['url'])) diff --git a/judge/management/commands/copy_language.py b/judge/management/commands/copy_language.py new file mode 100644 index 0000000..233ccc7 --- /dev/null +++ b/judge/management/commands/copy_language.py @@ -0,0 +1,27 @@ +from django.core.management.base import BaseCommand, CommandError + +from judge.models import Language, LanguageLimit + + +class Command(BaseCommand): + help = 'allows the problems that allow to be submitted in ' + + def add_arguments(self, parser): + parser.add_argument('source', help='language to copy from') + parser.add_argument('target', help='language to copy to') + + def handle(self, *args, **options): + try: + source = Language.objects.get(key=options['source']) + except Language.DoesNotExist: + raise CommandError('Invalid source language: %s' % options['source']) + + try: + target = Language.objects.get(key=options['target']) + except Language.DoesNotExist: + raise CommandError('Invalid target language: %s' % options['target']) + + target.problem_set.set(source.problem_set.all()) + LanguageLimit.objects.bulk_create(LanguageLimit(problem=ll.problem, language=target, time_limit=ll.time_limit, + memory_limit=ll.memory_limit) + for ll in LanguageLimit.objects.filter(language=source)) diff --git a/judge/management/commands/create_problem.py b/judge/management/commands/create_problem.py new file mode 100644 index 0000000..b095e08 --- /dev/null +++ b/judge/management/commands/create_problem.py @@ -0,0 +1,23 @@ +from django.core.management.base import BaseCommand + +from judge.models import Problem, ProblemGroup, ProblemType + + +class Command(BaseCommand): + help = 'create an empty problem' + + def add_arguments(self, parser): + parser.add_argument('code', help='problem code') + parser.add_argument('name', help='problem title') + parser.add_argument('body', help='problem description') + parser.add_argument('type', help='problem type') + parser.add_argument('group', help='problem group') + + def handle(self, *args, **options): + problem = Problem() + problem.code = options['code'] + problem.name = options['name'] + problem.description = options['body'] + problem.group = ProblemGroup.objects.get(name=options['group']) + problem.types = [ProblemType.objects.get(name=options['type'])] + problem.save() diff --git a/judge/management/commands/makedmojmessages.py b/judge/management/commands/makedmojmessages.py new file mode 100644 index 0000000..55d3acc --- /dev/null +++ b/judge/management/commands/makedmojmessages.py @@ -0,0 +1,130 @@ +import glob +import io +import os +import sys + +from django.conf import settings +from django.core.management import CommandError +from django.core.management.commands.makemessages import Command as MakeMessagesCommand, check_programs + +from judge.models import NavigationBar, ProblemType + + +class Command(MakeMessagesCommand): + def add_arguments(self, parser): + parser.add_argument('--locale', '-l', default=[], dest='locale', action='append', + help='Creates or updates the message files for the given locale(s) (e.g. pt_BR). ' + 'Can be used multiple times.') + parser.add_argument('--exclude', '-x', default=[], dest='exclude', action='append', + help='Locales to exclude. Default is none. Can be used multiple times.') + parser.add_argument('--all', '-a', action='store_true', dest='all', + default=False, help='Updates the message files for all existing locales.') + parser.add_argument('--no-wrap', action='store_true', dest='no_wrap', + default=False, help="Don't break long message lines into several lines.") + parser.add_argument('--no-obsolete', action='store_true', dest='no_obsolete', + default=False, help="Remove obsolete message strings.") + parser.add_argument('--keep-pot', action='store_true', dest='keep_pot', + default=False, help="Keep .pot file after making messages. Useful when debugging.") + + def handle(self, *args, **options): + locale = options.get('locale') + exclude = options.get('exclude') + self.domain = 'dmoj-user' + self.verbosity = options.get('verbosity') + process_all = options.get('all') + + # Need to ensure that the i18n framework is enabled + if settings.configured: + settings.USE_I18N = True + else: + settings.configure(USE_I18N=True) + + # Avoid messing with mutable class variables + if options.get('no_wrap'): + self.msgmerge_options = self.msgmerge_options[:] + ['--no-wrap'] + self.msguniq_options = self.msguniq_options[:] + ['--no-wrap'] + self.msgattrib_options = self.msgattrib_options[:] + ['--no-wrap'] + self.xgettext_options = self.xgettext_options[:] + ['--no-wrap'] + if options.get('no_location'): + self.msgmerge_options = self.msgmerge_options[:] + ['--no-location'] + self.msguniq_options = self.msguniq_options[:] + ['--no-location'] + self.msgattrib_options = self.msgattrib_options[:] + ['--no-location'] + self.xgettext_options = self.xgettext_options[:] + ['--no-location'] + + self.no_obsolete = options.get('no_obsolete') + self.keep_pot = options.get('keep_pot') + + if locale is None and not exclude and not process_all: + raise CommandError("Type '%s help %s' for usage information." % ( + os.path.basename(sys.argv[0]), sys.argv[1])) + + self.invoked_for_django = False + self.locale_paths = [] + self.default_locale_path = None + if os.path.isdir(os.path.join('conf', 'locale')): + self.locale_paths = [os.path.abspath(os.path.join('conf', 'locale'))] + self.default_locale_path = self.locale_paths[0] + self.invoked_for_django = True + else: + self.locale_paths.extend(settings.LOCALE_PATHS) + # Allow to run makemessages inside an app dir + if os.path.isdir('locale'): + self.locale_paths.append(os.path.abspath('locale')) + if self.locale_paths: + self.default_locale_path = self.locale_paths[0] + if not os.path.exists(self.default_locale_path): + os.makedirs(self.default_locale_path) + + # Build locale list + locale_dirs = list(filter(os.path.isdir, glob.glob('%s/*' % self.default_locale_path))) + all_locales = list(map(os.path.basename, locale_dirs)) + + # Account for excluded locales + if process_all: + locales = all_locales + else: + locales = locale or all_locales + locales = set(locales) - set(exclude) + + if locales: + check_programs('msguniq', 'msgmerge', 'msgattrib') + + check_programs('xgettext') + + try: + potfiles = self.build_potfiles() + + # Build po files for each selected locale + for locale in locales: + if self.verbosity > 0: + self.stdout.write("processing locale %s\n" % locale) + for potfile in potfiles: + self.write_po_file(potfile, locale) + finally: + if not self.keep_pot: + self.remove_potfiles() + + def find_files(self, root): + return [] + + def _emit_message(self, potfile, string): + potfile.write(''' +msgid "%s" +msgstr "" +''' % string.replace('\\', r'\\').replace('\t', '\\t').replace('\n', '\\n').replace('"', '\\"')) + + def process_files(self, file_list): + with io.open(os.path.join(self.default_locale_path, 'dmoj-user.pot'), 'w', encoding='utf-8') as potfile: + if self.verbosity > 1: + self.stdout.write('processing navigation bar') + for label in NavigationBar.objects.values_list('label', flat=True): + if self.verbosity > 2: + self.stdout.write('processing navigation item label "%s"\n' % label) + self._emit_message(potfile, label) + + if self.verbosity > 1: + self.stdout.write('processing problem types') + for name in ProblemType.objects.values_list('full_name', flat=True): + if self.verbosity > 2: + self.stdout.write('processing problem type name "%s"\n' % name) + self._emit_message(potfile, name) diff --git a/judge/management/commands/render_pdf.py b/judge/management/commands/render_pdf.py new file mode 100644 index 0000000..cc45421 --- /dev/null +++ b/judge/management/commands/render_pdf.py @@ -0,0 +1,58 @@ +import os +import shutil +import sys + +from django.conf import settings +from django.core.management.base import BaseCommand +from django.template.loader import get_template +from django.utils import translation + +from judge.models import Problem, ProblemTranslation +from judge.pdf_problems import DefaultPdfMaker, PhantomJSPdfMaker, PuppeteerPDFRender, SlimerJSPdfMaker + + +class Command(BaseCommand): + help = 'renders a PDF file of a problem' + + def add_arguments(self, parser): + parser.add_argument('code', help='code of problem to render') + parser.add_argument('directory', nargs='?', help='directory to store temporaries') + parser.add_argument('-l', '--language', default=settings.LANGUAGE_CODE, + help='language to render PDF in') + parser.add_argument('-p', '--phantomjs', action='store_const', const=PhantomJSPdfMaker, + default=DefaultPdfMaker, dest='engine') + parser.add_argument('-s', '--slimerjs', action='store_const', const=SlimerJSPdfMaker, dest='engine') + parser.add_argument('-c', '--chrome', '--puppeteer', action='store_const', + const=PuppeteerPDFRender, dest='engine') + + def handle(self, *args, **options): + try: + problem = Problem.objects.get(code=options['code']) + except Problem.DoesNotExist: + print('Bad problem code') + return + + try: + trans = problem.translations.get(language=options['language']) + except ProblemTranslation.DoesNotExist: + trans = None + + directory = options['directory'] + with options['engine'](directory, clean_up=directory is None) as maker, \ + translation.override(options['language']): + problem_name = problem.name if trans is None else trans.name + maker.html = get_template('problem/raw.html').render({ + 'problem': problem, + 'problem_name': problem_name, + 'description': problem.description if trans is None else trans.description, + 'url': '', + 'math_engine': maker.math_engine, + }).replace('"//', '"https://').replace("'//", "'https://") + maker.title = problem_name + for file in ('style.css', 'pygment-github.css', 'mathjax_config.js'): + maker.load(file, os.path.join(settings.DMOJ_RESOURCES, file)) + maker.make(debug=True) + if not maker.success: + print(maker.log, file=sys.stderr) + elif directory is None: + shutil.move(maker.pdffile, problem.code + '.pdf') diff --git a/judge/management/commands/runbridged.py b/judge/management/commands/runbridged.py new file mode 100644 index 0000000..f20a9fe --- /dev/null +++ b/judge/management/commands/runbridged.py @@ -0,0 +1,33 @@ +import threading + +from django.conf import settings +from django.core.management.base import BaseCommand + +from judge.bridge import DjangoHandler, DjangoServer +from judge.bridge import DjangoJudgeHandler, JudgeServer + + +class Command(BaseCommand): + def handle(self, *args, **options): + judge_handler = DjangoJudgeHandler + + try: + import netaddr # noqa: F401, imported to see if it exists + except ImportError: + pass + else: + proxies = settings.BRIDGED_JUDGE_PROXIES + if proxies: + judge_handler = judge_handler.with_proxy_set(proxies) + + judge_server = JudgeServer(settings.BRIDGED_JUDGE_ADDRESS, judge_handler) + django_server = DjangoServer(judge_server.judges, settings.BRIDGED_DJANGO_ADDRESS, DjangoHandler) + + # TODO: Merge the two servers + threading.Thread(target=django_server.serve_forever).start() + try: + judge_server.serve_forever() + except KeyboardInterrupt: + pass + finally: + django_server.stop() diff --git a/judge/management/commands/runmoss.py b/judge/management/commands/runmoss.py new file mode 100644 index 0000000..9b2d40c --- /dev/null +++ b/judge/management/commands/runmoss.py @@ -0,0 +1,53 @@ +from django.conf import settings +from django.core.management.base import BaseCommand +from moss import * + +from judge.models import Contest, ContestParticipation, Submission + + +class Command(BaseCommand): + help = 'Checks for duplicate code using MOSS' + + LANG_MAPPING = { + ('C++', MOSS_LANG_CC), + ('C', MOSS_LANG_C), + ('Java', MOSS_LANG_JAVA), + ('Python', MOSS_LANG_PYTHON), + } + + def add_arguments(self, parser): + parser.add_argument('contest', help='the id of the contest') + + def handle(self, *args, **options): + moss_api_key = settings.MOSS_API_KEY + if moss_api_key is None: + print('No MOSS API Key supplied') + return + contest = options['contest'] + + for problem in Contest.objects.get(key=contest).problems.order_by('code'): + print('========== %s / %s ==========' % (problem.code, problem.name)) + for dmoj_lang, moss_lang in self.LANG_MAPPING: + print("%s: " % dmoj_lang, end=' ') + subs = Submission.objects.filter( + contest__participation__virtual__in=(ContestParticipation.LIVE, ContestParticipation.SPECTATE), + contest__participation__contest__key=contest, + result='AC', problem__id=problem.id, + language__common_name=dmoj_lang, + ).values_list('user__user__username', 'source__source') + if not subs: + print('') + continue + + moss_call = MOSS(moss_api_key, language=moss_lang, matching_file_limit=100, + comment='%s - %s' % (contest, problem.code)) + + users = set() + + for username, source in subs: + if username in users: + continue + users.add(username) + moss_call.add_file_from_memory(username, source.encode('utf-8')) + + print('(%d): %s' % (subs.count(), moss_call.process())) diff --git a/judge/middleware.py b/judge/middleware.py new file mode 100644 index 0000000..4a58882 --- /dev/null +++ b/judge/middleware.py @@ -0,0 +1,63 @@ +from django.conf import settings +from django.http import HttpResponseRedirect +from django.urls import Resolver404, resolve, reverse +from django.utils.http import urlquote + + +class ShortCircuitMiddleware: + def __init__(self, get_response): + self.get_response = get_response + + def __call__(self, request): + try: + callback, args, kwargs = resolve(request.path_info, getattr(request, 'urlconf', None)) + except Resolver404: + callback, args, kwargs = None, None, None + + if getattr(callback, 'short_circuit_middleware', False): + return callback(request, *args, **kwargs) + return self.get_response(request) + + +class DMOJLoginMiddleware(object): + def __init__(self, get_response): + self.get_response = get_response + + def __call__(self, request): + if request.user.is_authenticated: + profile = request.profile = request.user.profile + login_2fa_path = reverse('login_2fa') + if (profile.is_totp_enabled and not request.session.get('2fa_passed', False) and + request.path not in (login_2fa_path, reverse('auth_logout')) and + not request.path.startswith(settings.STATIC_URL)): + return HttpResponseRedirect(login_2fa_path + '?next=' + urlquote(request.get_full_path())) + else: + request.profile = None + return self.get_response(request) + + +class DMOJImpersonationMiddleware(object): + def __init__(self, get_response): + self.get_response = get_response + + def __call__(self, request): + if request.user.is_impersonate: + request.no_profile_update = True + request.profile = request.user.profile + return self.get_response(request) + + +class ContestMiddleware(object): + def __init__(self, get_response): + self.get_response = get_response + + def __call__(self, request): + profile = request.profile + if profile: + profile.update_contest() + request.participation = profile.current_contest + request.in_contest = request.participation is not None + else: + request.in_contest = False + request.participation = None + return self.get_response(request) diff --git a/judge/migrations/0001_squashed_0084_contest_formats.py b/judge/migrations/0001_squashed_0084_contest_formats.py new file mode 100644 index 0000000..22aa659 --- /dev/null +++ b/judge/migrations/0001_squashed_0084_contest_formats.py @@ -0,0 +1,761 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.20 on 2019-04-18 02:06 +import django.core.validators +import django.utils.timezone +import jsonfield.fields +import mptt.fields +import sortedm2m.fields +from django.conf import settings +from django.db import migrations, models + +import judge.models.interface +import judge.utils.problem_data + + +class Migration(migrations.Migration): + + replaces = [('judge', '0001_initial'), ('judge', '0002_license'), ('judge', '0003_license_key'), ('judge', '0004_language_limit'), ('judge', '0005_nav_path_len'), ('judge', '0006_language_extension'), ('judge', '0007_test_site_perm'), ('judge', '0008_contestproblem_order'), ('judge', '0009_solution_problem'), ('judge', '0010_comment_page_index'), ('judge', '0011_organization_is_open'), ('judge', '0012_organization_perms'), ('judge', '0013_private_contests'), ('judge', '0014_multi_organization'), ('judge', '0015_remove_single_organization'), ('judge', '0016_organizationrequest'), ('judge', '0017_edit_public_problem_perm'), ('judge', '0018_django_1_9'), ('judge', '0019_og_images'), ('judge', '0020_profile_user_script'), ('judge', '0021_output_prefix_override'), ('judge', '0022_judge_last_ping'), ('judge', '0023_contest_tag'), ('judge', '0024_submission_judge'), ('judge', '0025_submission_rejudge_flag'), ('judge', '0026_change_public_visibility_perm'), ('judge', '0027_bridge_revert'), ('judge', '0028_judge_ip'), ('judge', '0029_problem_translation'), ('judge', '0030_remove_contest_profile'), ('judge', '0031_judge_versions'), ('judge', '0032_hide_problem_tags_in_contest'), ('judge', '0033_proper_pretest_support'), ('judge', '0034_submission_is_pretested'), ('judge', '0035_contest_spectate_mode'), ('judge', '0036_contest_participation_unique'), ('judge', '0037_user_count_ac_rate_field'), ('judge', '0038_profile_problem_count'), ('judge', '0039_remove_contest_is_external'), ('judge', '0040_profile_math_engine'), ('judge', '0041_virtual_contest_participation'), ('judge', '0042_remove_spectate_field'), ('judge', '0043_contest_user_count'), ('judge', '0044_organization_slots'), ('judge', '0045_organization_access_code'), ('judge', '0046_blogpost_authors'), ('judge', '0047_site_managed_data'), ('judge', '0048_site_managed_checkers'), ('judge', '0049_contest_summary'), ('judge', '0050_problem_tester_field'), ('judge', '0051_was_rejudged_field'), ('judge', '0052_switch_to_durationfield'), ('judge', '0053_opengraph_problems'), ('judge', '0054_tickets'), ('judge', '0055_add_performance_points'), ('judge', '0056_ticket_is_open'), ('judge', '0057_blue_pretests'), ('judge', '0058_problem_curator_field'), ('judge', '0059_problem_is_manually_managed'), ('judge', '0060_contest_clarifications'), ('judge', '0061_language_template'), ('judge', '0062_add_contest_submission_limit'), ('judge', '0063_new_solutions'), ('judge', '0064_unique_solution'), ('judge', '0065_blogpost_perms'), ('judge', '0066_submission_date_index'), ('judge', '0067_contest_access_code'), ('judge', '0068_hide_scoreboard'), ('judge', '0069_judge_blocking'), ('judge', '0070_organization_slug'), ('judge', '0071_organization_private_problems'), ('judge', '0072_contest_logo_override_image'), ('judge', '0073_comment_lock'), ('judge', '0074_totp'), ('judge', '0075_organization_admin_reverse'), ('judge', '0076_problem_statistics'), ('judge', '0077_remove_organization_key'), ('judge', '0078_add_user_notes'), ('judge', '0079_remove_comment_title'), ('judge', '0080_contest_banned_users'), ('judge', '0081_unlisted_users'), ('judge', '0082_remove_profile_name'), ('judge', '0083_extended_feedback'), ('judge', '0084_contest_formats')] + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('contenttypes', '0002_remove_content_type_name'), + ] + + operations = [ + migrations.CreateModel( + name='BlogPost', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=100, verbose_name='post title')), + ('slug', models.SlugField(verbose_name='slug')), + ('visible', models.BooleanField(default=False, verbose_name='public visibility')), + ('sticky', models.BooleanField(default=False, verbose_name='sticky')), + ('publish_on', models.DateTimeField(verbose_name='publish after')), + ('content', models.TextField(verbose_name='post content')), + ('summary', models.TextField(blank=True, verbose_name='post summary')), + ('og_image', models.CharField(blank=True, default='', max_length=150, verbose_name='openGraph image')), + ], + options={ + 'verbose_name_plural': 'blog posts', + 'permissions': (('edit_all_post', 'Edit all posts'),), + 'verbose_name': 'blog post', + }, + ), + migrations.CreateModel( + name='Comment', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('time', models.DateTimeField(auto_now_add=True, verbose_name='posted time')), + ('page', models.CharField(db_index=True, max_length=30, validators=[django.core.validators.RegexValidator('^[pcs]:[a-z0-9]+$|^b:\\d+$', 'Page code must be ^[pcs]:[a-z0-9]+$|^b:\\d+$')], verbose_name='associated page')), + ('score', models.IntegerField(default=0, verbose_name='votes')), + ('body', models.TextField(max_length=8192, verbose_name='body of comment')), + ('hidden', models.BooleanField(default=0, verbose_name='hide the comment')), + ('lft', models.PositiveIntegerField(db_index=True, editable=False)), + ('rght', models.PositiveIntegerField(db_index=True, editable=False)), + ('tree_id', models.PositiveIntegerField(db_index=True, editable=False)), + ('level', models.PositiveIntegerField(db_index=True, editable=False)), + ], + options={ + 'verbose_name_plural': 'comments', + 'verbose_name': 'comment', + }, + ), + migrations.CreateModel( + name='CommentLock', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('page', models.CharField(db_index=True, max_length=30, validators=[django.core.validators.RegexValidator('^[pcs]:[a-z0-9]+$|^b:\\d+$', 'Page code must be ^[pcs]:[a-z0-9]+$|^b:\\d+$')], verbose_name='associated page')), + ], + options={ + 'permissions': (('override_comment_lock', 'Override comment lock'),), + }, + ), + migrations.CreateModel( + name='CommentVote', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('score', models.IntegerField()), + ('comment', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='votes', to='judge.Comment')), + ], + options={ + 'verbose_name_plural': 'comment votes', + 'verbose_name': 'comment vote', + }, + ), + migrations.CreateModel( + name='Contest', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.CharField(max_length=20, unique=True, validators=[django.core.validators.RegexValidator('^[a-z0-9]+$', 'Contest id must be ^[a-z0-9]+$')], verbose_name='contest id')), + ('name', models.CharField(db_index=True, max_length=100, verbose_name='contest name')), + ('description', models.TextField(blank=True, verbose_name='description')), + ('start_time', models.DateTimeField(db_index=True, verbose_name='start time')), + ('end_time', models.DateTimeField(db_index=True, verbose_name='end time')), + ('time_limit', models.DurationField(blank=True, null=True, verbose_name='time limit')), + ('is_public', models.BooleanField(default=False, help_text='Should be set even for organization-private contests, where it determines whether the contest is visible to members of the specified organizations.', verbose_name='publicly visible')), + ('is_rated', models.BooleanField(default=False, help_text='Whether this contest can be rated.', verbose_name='contest rated')), + ('hide_scoreboard', models.BooleanField(default=False, help_text='Whether the scoreboard should remain hidden for the duration of the contest.', verbose_name='hide scoreboard')), + ('use_clarifications', models.BooleanField(default=True, help_text='Use clarification system instead of comments.', verbose_name='no comments')), + ('rate_all', models.BooleanField(default=False, help_text='Rate all users who joined.', verbose_name='rate all')), + ('is_private', models.BooleanField(default=False, verbose_name='private to organizations')), + ('hide_problem_tags', models.BooleanField(default=False, help_text='Whether problem tags should be hidden by default.', verbose_name='hide problem tags')), + ('run_pretests_only', models.BooleanField(default=False, help_text='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.', verbose_name='run pretests only')), + ('og_image', models.CharField(blank=True, default='', max_length=150, verbose_name='OpenGraph image')), + ('logo_override_image', models.CharField(blank=True, default='', help_text='This image will replace the default site logo for users inside the contest.', max_length=150, verbose_name='Logo override image')), + ('user_count', models.IntegerField(default=0, verbose_name='the amount of live participants')), + ('summary', models.TextField(blank=True, help_text='Plain-text, shown in meta description tag, e.g. for social media.', verbose_name='contest summary')), + ('access_code', models.CharField(blank=True, default='', help_text='An optional code to prompt contestants before they are allowed to join the contest. Leave it blank to disable.', max_length=255, verbose_name='access code')), + ('format_name', models.CharField(choices=[('default', 'Default')], default='default', help_text='The contest format module to use.', max_length=32, verbose_name='contest format')), + ('format_config', jsonfield.fields.JSONField(blank=True, help_text='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.', null=True, verbose_name='contest format configuration')), + ], + options={ + 'verbose_name_plural': 'contests', + 'permissions': (('see_private_contest', 'See private contests'), ('edit_own_contest', 'Edit own contests'), ('edit_all_contest', 'Edit all contests'), ('contest_rating', 'Rate contests'), ('contest_access_code', 'Contest access codes')), + 'verbose_name': 'contest', + }, + ), + migrations.CreateModel( + name='ContestParticipation', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('real_start', models.DateTimeField(db_column='start', default=django.utils.timezone.now, verbose_name='start time')), + ('score', models.IntegerField(db_index=True, default=0, verbose_name='score')), + ('cumtime', models.PositiveIntegerField(default=0, verbose_name='cumulative time')), + ('virtual', models.IntegerField(default=0, help_text='0 means non-virtual, otherwise the n-th virtual participation', verbose_name='virtual participation id')), + ('format_data', jsonfield.fields.JSONField(blank=True, null=True, verbose_name='contest format specific data')), + ('contest', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='users', to='judge.Contest', verbose_name='associated contest')), + ], + options={ + 'verbose_name_plural': 'contest participations', + 'verbose_name': 'contest participation', + }, + ), + migrations.CreateModel( + name='ContestProblem', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('points', models.IntegerField(verbose_name='points')), + ('partial', models.BooleanField(default=True, verbose_name='partial')), + ('is_pretested', models.BooleanField(default=False, verbose_name='is pretested')), + ('order', models.PositiveIntegerField(db_index=True, verbose_name='order')), + ('output_prefix_override', models.IntegerField(blank=True, null=True, verbose_name='output prefix length override')), + ('max_submissions', models.IntegerField(default=0, help_text='Maximum number of submissions for this problem, or 0 for no limit.', validators=[django.core.validators.MinValueValidator(0, "Why include a problem you can't submit to?")])), + ('contest', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='contest_problems', to='judge.Contest', verbose_name='contest')), + ], + options={ + 'verbose_name_plural': 'contest problems', + 'verbose_name': 'contest problem', + }, + ), + migrations.CreateModel( + name='ContestSubmission', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('points', models.FloatField(default=0.0, verbose_name='points')), + ('is_pretest', models.BooleanField(default=False, help_text='Whether this submission was ran only on pretests.', verbose_name='is pretested')), + ('participation', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='submissions', related_query_name='submission', to='judge.ContestParticipation', verbose_name='participation')), + ('problem', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='submissions', related_query_name='submission', to='judge.ContestProblem', verbose_name='problem')), + ], + options={ + 'verbose_name_plural': 'contest submissions', + 'verbose_name': 'contest submission', + }, + ), + migrations.CreateModel( + name='ContestTag', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=20, unique=True, validators=[django.core.validators.RegexValidator('^[a-z-]+$', message='Lowercase letters and hyphens only.')], verbose_name='tag name')), + ('color', models.CharField(max_length=7, validators=[django.core.validators.RegexValidator('^#(?:[A-Fa-f0-9]{3}){1,2}$', 'Invalid colour.')], verbose_name='tag colour')), + ('description', models.TextField(blank=True, verbose_name='tag description')), + ], + options={ + 'verbose_name_plural': 'contest tags', + 'verbose_name': 'contest tag', + }, + ), + migrations.CreateModel( + name='Judge', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(help_text='Server name, hostname-style', max_length=50, unique=True)), + ('created', models.DateTimeField(auto_now_add=True, verbose_name='time of creation')), + ('auth_key', models.CharField(help_text='A key to authenticated this judge', max_length=100, verbose_name='authentication key')), + ('is_blocked', models.BooleanField(default=False, help_text='Whether this judge should be blocked from connecting, even if its key is correct.', verbose_name='block judge')), + ('online', models.BooleanField(default=False, verbose_name='judge online status')), + ('start_time', models.DateTimeField(null=True, verbose_name='judge start time')), + ('ping', models.FloatField(null=True, verbose_name='response time')), + ('load', models.FloatField(help_text='Load for the last minute, divided by processors to be fair.', null=True, verbose_name='system load')), + ('description', models.TextField(blank=True, verbose_name='description')), + ('last_ip', models.GenericIPAddressField(blank=True, null=True, verbose_name='Last connected IP')), + ], + options={ + 'ordering': ['name'], + 'verbose_name_plural': 'judges', + 'verbose_name': 'judge', + }, + ), + migrations.CreateModel( + name='Language', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.CharField(help_text='The identifier for this language; the same as its executor id for judges.', max_length=6, unique=True, verbose_name='short identifier')), + ('name', models.CharField(help_text='Longer name for the language, e.g. "Python 2" or "C++11".', max_length=20, verbose_name='long name')), + ('short_name', models.CharField(blank=True, help_text='More readable, but short, name to display publicly; e.g. "PY2" or "C++11". If left blank, it will default to the short identifier.', max_length=10, null=True, verbose_name='short name')), + ('common_name', models.CharField(help_text='Common name for the language. For example, the common name for C++03, C++11, and C++14 would be "C++"', max_length=10, verbose_name='common name')), + ('ace', models.CharField(help_text='Language ID for Ace.js editor highlighting, appended to "mode-" to determine the Ace JavaScript file to use, e.g., "python".', max_length=20, verbose_name='ace mode name')), + ('pygments', models.CharField(help_text='Language ID for Pygments highlighting in source windows.', max_length=20, verbose_name='pygments name')), + ('template', models.TextField(blank=True, help_text='Code template to display in submission editor.', verbose_name='code template')), + ('info', models.CharField(blank=True, help_text="Do not set this unless you know what you're doing! It will override the usually more specific, judge-provided runtime info!", max_length=50, verbose_name='runtime info override')), + ('description', models.TextField(blank=True, help_text='Use field this to inform users of quirks with your environment, additional restrictions, etc.', verbose_name='language description')), + ('extension', models.CharField(help_text='The extension of source files, e.g., "py" or "cpp".', max_length=10, verbose_name='extension')), + ], + options={ + 'ordering': ['key'], + 'verbose_name_plural': 'languages', + 'verbose_name': 'language', + }, + ), + migrations.CreateModel( + name='LanguageLimit', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('time_limit', models.FloatField(verbose_name='time limit')), + ('memory_limit', models.IntegerField(verbose_name='memory limit')), + ('language', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='judge.Language', verbose_name='language')), + ], + options={ + 'verbose_name_plural': 'language-specific resource limits', + 'verbose_name': 'language-specific resource limit', + }, + ), + migrations.CreateModel( + name='License', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.CharField(max_length=20, unique=True, validators=[django.core.validators.RegexValidator('^[-\\w.]+$', 'License key must be ^[-\\w.]+$')], verbose_name='key')), + ('link', models.CharField(max_length=256, verbose_name='link')), + ('name', models.CharField(max_length=256, verbose_name='full name')), + ('display', models.CharField(blank=True, help_text='Displayed on pages under this license', max_length=256, verbose_name='short name')), + ('icon', models.CharField(blank=True, help_text='URL to the icon', max_length=256, verbose_name='icon')), + ('text', models.TextField(verbose_name='license text')), + ], + options={ + 'verbose_name_plural': 'licenses', + 'verbose_name': 'license', + }, + ), + migrations.CreateModel( + name='MiscConfig', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('key', models.CharField(db_index=True, max_length=30)), + ('value', models.TextField(blank=True)), + ], + options={ + 'verbose_name_plural': 'miscellaneous configuration', + 'verbose_name': 'configuration item', + }, + ), + migrations.CreateModel( + name='NavigationBar', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('order', models.PositiveIntegerField(db_index=True, verbose_name='order')), + ('key', models.CharField(max_length=10, unique=True, verbose_name='identifier')), + ('label', models.CharField(max_length=20, verbose_name='label')), + ('path', models.CharField(max_length=255, verbose_name='link path')), + ('regex', models.TextField(validators=[judge.models.interface.validate_regex], verbose_name='highlight regex')), + ('lft', models.PositiveIntegerField(db_index=True, editable=False)), + ('rght', models.PositiveIntegerField(db_index=True, editable=False)), + ('tree_id', models.PositiveIntegerField(db_index=True, editable=False)), + ('level', models.PositiveIntegerField(db_index=True, editable=False)), + ('parent', mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='children', to='judge.NavigationBar', verbose_name='parent item')), + ], + options={ + 'verbose_name_plural': 'navigation bar', + 'verbose_name': 'navigation item', + }, + ), + migrations.CreateModel( + name='Organization', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=128, verbose_name='organization title')), + ('slug', models.SlugField(help_text='Organization name shown in URL', max_length=128, verbose_name='organization slug')), + ('short_name', models.CharField(help_text='Displayed beside user name during contests', max_length=20, verbose_name='short name')), + ('about', models.TextField(verbose_name='organization description')), + ('creation_date', models.DateTimeField(auto_now_add=True, verbose_name='creation date')), + ('is_open', models.BooleanField(default=True, help_text='Allow joining organization', verbose_name='is open organization?')), + ('slots', models.IntegerField(blank=True, help_text='Maximum amount of users in this organization, only applicable to private organizations', null=True, verbose_name='maximum size')), + ('access_code', models.CharField(blank=True, help_text='Student access code', max_length=7, null=True, verbose_name='access code')), + ], + options={ + 'ordering': ['name'], + 'verbose_name_plural': 'organizations', + 'permissions': (('organization_admin', 'Administer organizations'), ('edit_all_organization', 'Edit all organizations')), + 'verbose_name': 'organization', + }, + ), + migrations.CreateModel( + name='OrganizationRequest', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('time', models.DateTimeField(auto_now_add=True, verbose_name='request time')), + ('state', models.CharField(choices=[('P', 'Pending'), ('A', 'Approved'), ('R', 'Rejected')], max_length=1, verbose_name='state')), + ('reason', models.TextField(verbose_name='reason')), + ('organization', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='requests', to='judge.Organization', verbose_name='organization')), + ], + options={ + 'verbose_name_plural': 'organization join requests', + 'verbose_name': 'organization join request', + }, + ), + migrations.CreateModel( + name='PrivateMessage', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=50, verbose_name='message title')), + ('content', models.TextField(verbose_name='message body')), + ('timestamp', models.DateTimeField(auto_now_add=True, verbose_name='message timestamp')), + ('read', models.BooleanField(default=False, verbose_name='read')), + ], + ), + migrations.CreateModel( + name='PrivateMessageThread', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('messages', models.ManyToManyField(to='judge.PrivateMessage', verbose_name='messages in the thread')), + ], + ), + migrations.CreateModel( + name='Problem', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('code', models.CharField(max_length=20, unique=True, validators=[django.core.validators.RegexValidator('^[a-z0-9]+$', 'Problem code must be ^[a-z0-9]+$')], verbose_name='problem code')), + ('name', models.CharField(db_index=True, max_length=100, verbose_name='problem name')), + ('description', models.TextField(verbose_name='problem body')), + ('time_limit', models.FloatField(help_text='The time limit for this problem, in seconds. Fractional seconds (e.g. 1.5) are supported.', verbose_name='time limit')), + ('memory_limit', models.IntegerField(help_text='The memory limit for this problem, in kilobytes (e.g. 64mb = 65536 kilobytes).', verbose_name='memory limit')), + ('short_circuit', models.BooleanField(default=False)), + ('points', models.FloatField(verbose_name='points')), + ('partial', models.BooleanField(default=False, verbose_name='allows partial points')), + ('is_public', models.BooleanField(db_index=True, default=False, verbose_name='publicly visible')), + ('is_manually_managed', models.BooleanField(db_index=True, default=False, help_text='Whether judges should be allowed to manage data or not', verbose_name='manually managed')), + ('date', models.DateTimeField(blank=True, db_index=True, help_text="Doesn't have magic ability to auto-publish due to backward compatibility", null=True, verbose_name='date of publishing')), + ('og_image', models.CharField(blank=True, max_length=150, verbose_name='OpenGraph image')), + ('summary', models.TextField(blank=True, help_text='Plain-text, shown in meta description tag, e.g. for social media.', verbose_name='problem summary')), + ('user_count', models.IntegerField(default=0, help_text='The number of users who solved the problem.', verbose_name='number of users')), + ('ac_rate', models.FloatField(default=0, verbose_name='solve rate')), + ('is_organization_private', models.BooleanField(default=False, verbose_name='private to organizations')), + ('allowed_languages', models.ManyToManyField(to='judge.Language', verbose_name='allowed languages')), + ], + options={ + 'verbose_name_plural': 'problems', + 'permissions': (('see_private_problem', 'See hidden problems'), ('edit_own_problem', 'Edit own problems'), ('edit_all_problem', 'Edit all problems'), ('edit_public_problem', 'Edit all public problems'), ('clone_problem', 'Clone problem'), ('change_public_visibility', 'Change is_public field'), ('change_manually_managed', 'Change is_manually_managed field'), ('see_organization_problem', 'See organization-private problems')), + 'verbose_name': 'problem', + }, + ), + migrations.CreateModel( + name='ProblemClarification', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('description', models.TextField(verbose_name='clarification body')), + ('date', models.DateTimeField(auto_now_add=True, verbose_name='clarification timestamp')), + ('problem', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='judge.Problem', verbose_name='clarified problem')), + ], + ), + migrations.CreateModel( + name='ProblemData', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('zipfile', models.FileField(blank=True, null=True, storage=judge.utils.problem_data.ProblemDataStorage(), upload_to=judge.models.problem_data.problem_directory_file, verbose_name='data zip file')), + ('generator', models.FileField(blank=True, null=True, storage=judge.utils.problem_data.ProblemDataStorage(), upload_to=judge.models.problem_data.problem_directory_file, verbose_name='generator file')), + ('output_prefix', models.IntegerField(blank=True, null=True, verbose_name='output prefix length')), + ('output_limit', models.IntegerField(blank=True, null=True, verbose_name='output limit length')), + ('feedback', models.TextField(blank=True, verbose_name='init.yml generation feedback')), + ('checker', models.CharField(blank=True, choices=[('standard', 'Standard'), ('floats', 'Floats'), ('floatsabs', 'Floats (absolute)'), ('floatsrel', 'Floats (relative)'), ('rstripped', 'Non-trailing spaces'), ('sorted', 'Unordered'), ('identical', 'Byte identical'), ('linecount', 'Line-by-line')], max_length=10, verbose_name='checker')), + ('checker_args', models.TextField(blank=True, help_text='checker arguments as a JSON object', verbose_name='checker arguments')), + ('problem', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='data_files', to='judge.Problem', verbose_name='problem')), + ], + ), + migrations.CreateModel( + name='ProblemGroup', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=20, unique=True, verbose_name='problem group ID')), + ('full_name', models.CharField(max_length=100, verbose_name='problem group name')), + ], + options={ + 'ordering': ['full_name'], + 'verbose_name_plural': 'problem groups', + 'verbose_name': 'problem group', + }, + ), + migrations.CreateModel( + name='ProblemTestCase', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('order', models.IntegerField(verbose_name='case position')), + ('type', models.CharField(choices=[('C', 'Normal case'), ('S', 'Batch start'), ('E', 'Batch end')], default='C', max_length=1, verbose_name='case type')), + ('input_file', models.CharField(blank=True, max_length=100, verbose_name='input file name')), + ('output_file', models.CharField(blank=True, max_length=100, verbose_name='output file name')), + ('generator_args', models.TextField(blank=True, verbose_name='generator arguments')), + ('points', models.IntegerField(blank=True, null=True, verbose_name='point value')), + ('is_pretest', models.BooleanField(verbose_name='case is pretest?')), + ('output_prefix', models.IntegerField(blank=True, null=True, verbose_name='output prefix length')), + ('output_limit', models.IntegerField(blank=True, null=True, verbose_name='output limit length')), + ('checker', models.CharField(blank=True, choices=[('standard', 'Standard'), ('floats', 'Floats'), ('floatsabs', 'Floats (absolute)'), ('floatsrel', 'Floats (relative)'), ('rstripped', 'Non-trailing spaces'), ('sorted', 'Unordered'), ('identical', 'Byte identical'), ('linecount', 'Line-by-line')], max_length=10, verbose_name='checker')), + ('checker_args', models.TextField(blank=True, help_text='checker arguments as a JSON object', verbose_name='checker arguments')), + ('dataset', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='cases', to='judge.Problem', verbose_name='problem data set')), + ], + ), + migrations.CreateModel( + name='ProblemTranslation', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('language', models.CharField(choices=[('de', 'German'), ('en', 'English'), ('es', 'Spanish'), ('fr', 'French'), ('hr', 'Croatian'), ('hu', 'Hungarian'), ('ko', 'Korean'), ('ro', 'Romanian'), ('ru', 'Russian'), ('sr-latn', 'Serbian (Latin)'), ('tr', 'Turkish'), ('vi', 'Vietnamese'), ('zh-hans', 'Simplified Chinese')], max_length=7, verbose_name='language')), + ('name', models.CharField(db_index=True, max_length=100, verbose_name='translated name')), + ('description', models.TextField(verbose_name='translated description')), + ('problem', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='translations', to='judge.Problem', verbose_name='problem')), + ], + options={ + 'verbose_name_plural': 'problem translations', + 'verbose_name': 'problem translation', + }, + ), + migrations.CreateModel( + name='ProblemType', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=20, unique=True, verbose_name='problem category ID')), + ('full_name', models.CharField(max_length=100, verbose_name='problem category name')), + ], + options={ + 'ordering': ['full_name'], + 'verbose_name_plural': 'problem types', + 'verbose_name': 'problem type', + }, + ), + migrations.CreateModel( + name='Profile', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('about', models.TextField(blank=True, null=True, verbose_name='self-description')), + ('timezone', models.CharField(choices=[('Africa', [('Africa/Abidjan', 'Abidjan'), ('Africa/Accra', 'Accra'), ('Africa/Addis_Ababa', 'Addis_Ababa'), ('Africa/Algiers', 'Algiers'), ('Africa/Asmara', 'Asmara'), ('Africa/Asmera', 'Asmera'), ('Africa/Bamako', 'Bamako'), ('Africa/Bangui', 'Bangui'), ('Africa/Banjul', 'Banjul'), ('Africa/Bissau', 'Bissau'), ('Africa/Blantyre', 'Blantyre'), ('Africa/Brazzaville', 'Brazzaville'), ('Africa/Bujumbura', 'Bujumbura'), ('Africa/Cairo', 'Cairo'), ('Africa/Casablanca', 'Casablanca'), ('Africa/Ceuta', 'Ceuta'), ('Africa/Conakry', 'Conakry'), ('Africa/Dakar', 'Dakar'), ('Africa/Dar_es_Salaam', 'Dar_es_Salaam'), ('Africa/Djibouti', 'Djibouti'), ('Africa/Douala', 'Douala'), ('Africa/El_Aaiun', 'El_Aaiun'), ('Africa/Freetown', 'Freetown'), ('Africa/Gaborone', 'Gaborone'), ('Africa/Harare', 'Harare'), ('Africa/Johannesburg', 'Johannesburg'), ('Africa/Juba', 'Juba'), ('Africa/Kampala', 'Kampala'), ('Africa/Khartoum', 'Khartoum'), ('Africa/Kigali', 'Kigali'), ('Africa/Kinshasa', 'Kinshasa'), ('Africa/Lagos', 'Lagos'), ('Africa/Libreville', 'Libreville'), ('Africa/Lome', 'Lome'), ('Africa/Luanda', 'Luanda'), ('Africa/Lubumbashi', 'Lubumbashi'), ('Africa/Lusaka', 'Lusaka'), ('Africa/Malabo', 'Malabo'), ('Africa/Maputo', 'Maputo'), ('Africa/Maseru', 'Maseru'), ('Africa/Mbabane', 'Mbabane'), ('Africa/Mogadishu', 'Mogadishu'), ('Africa/Monrovia', 'Monrovia'), ('Africa/Nairobi', 'Nairobi'), ('Africa/Ndjamena', 'Ndjamena'), ('Africa/Niamey', 'Niamey'), ('Africa/Nouakchott', 'Nouakchott'), ('Africa/Ouagadougou', 'Ouagadougou'), ('Africa/Porto-Novo', 'Porto-Novo'), ('Africa/Sao_Tome', 'Sao_Tome'), ('Africa/Timbuktu', 'Timbuktu'), ('Africa/Tripoli', 'Tripoli'), ('Africa/Tunis', 'Tunis'), ('Africa/Windhoek', 'Windhoek')]), ('America', [('America/Adak', 'Adak'), ('America/Anchorage', 'Anchorage'), ('America/Anguilla', 'Anguilla'), ('America/Antigua', 'Antigua'), ('America/Araguaina', 'Araguaina'), ('America/Argentina/Buenos_Aires', 'Argentina/Buenos_Aires'), ('America/Argentina/Catamarca', 'Argentina/Catamarca'), ('America/Argentina/ComodRivadavia', 'Argentina/ComodRivadavia'), ('America/Argentina/Cordoba', 'Argentina/Cordoba'), ('America/Argentina/Jujuy', 'Argentina/Jujuy'), ('America/Argentina/La_Rioja', 'Argentina/La_Rioja'), ('America/Argentina/Mendoza', 'Argentina/Mendoza'), ('America/Argentina/Rio_Gallegos', 'Argentina/Rio_Gallegos'), ('America/Argentina/Salta', 'Argentina/Salta'), ('America/Argentina/San_Juan', 'Argentina/San_Juan'), ('America/Argentina/San_Luis', 'Argentina/San_Luis'), ('America/Argentina/Tucuman', 'Argentina/Tucuman'), ('America/Argentina/Ushuaia', 'Argentina/Ushuaia'), ('America/Aruba', 'Aruba'), ('America/Asuncion', 'Asuncion'), ('America/Atikokan', 'Atikokan'), ('America/Atka', 'Atka'), ('America/Bahia', 'Bahia'), ('America/Bahia_Banderas', 'Bahia_Banderas'), ('America/Barbados', 'Barbados'), ('America/Belem', 'Belem'), ('America/Belize', 'Belize'), ('America/Blanc-Sablon', 'Blanc-Sablon'), ('America/Boa_Vista', 'Boa_Vista'), ('America/Bogota', 'Bogota'), ('America/Boise', 'Boise'), ('America/Buenos_Aires', 'Buenos_Aires'), ('America/Cambridge_Bay', 'Cambridge_Bay'), ('America/Campo_Grande', 'Campo_Grande'), ('America/Cancun', 'Cancun'), ('America/Caracas', 'Caracas'), ('America/Catamarca', 'Catamarca'), ('America/Cayenne', 'Cayenne'), ('America/Cayman', 'Cayman'), ('America/Chicago', 'Chicago'), ('America/Chihuahua', 'Chihuahua'), ('America/Coral_Harbour', 'Coral_Harbour'), ('America/Cordoba', 'Cordoba'), ('America/Costa_Rica', 'Costa_Rica'), ('America/Creston', 'Creston'), ('America/Cuiaba', 'Cuiaba'), ('America/Curacao', 'Curacao'), ('America/Danmarkshavn', 'Danmarkshavn'), ('America/Dawson', 'Dawson'), ('America/Dawson_Creek', 'Dawson_Creek'), ('America/Denver', 'Denver'), ('America/Detroit', 'Detroit'), ('America/Dominica', 'Dominica'), ('America/Edmonton', 'Edmonton'), ('America/Eirunepe', 'Eirunepe'), ('America/El_Salvador', 'El_Salvador'), ('America/Ensenada', 'Ensenada'), ('America/Fort_Nelson', 'Fort_Nelson'), ('America/Fort_Wayne', 'Fort_Wayne'), ('America/Fortaleza', 'Fortaleza'), ('America/Glace_Bay', 'Glace_Bay'), ('America/Godthab', 'Godthab'), ('America/Goose_Bay', 'Goose_Bay'), ('America/Grand_Turk', 'Grand_Turk'), ('America/Grenada', 'Grenada'), ('America/Guadeloupe', 'Guadeloupe'), ('America/Guatemala', 'Guatemala'), ('America/Guayaquil', 'Guayaquil'), ('America/Guyana', 'Guyana'), ('America/Halifax', 'Halifax'), ('America/Havana', 'Havana'), ('America/Hermosillo', 'Hermosillo'), ('America/Indiana/Indianapolis', 'Indiana/Indianapolis'), ('America/Indiana/Knox', 'Indiana/Knox'), ('America/Indiana/Marengo', 'Indiana/Marengo'), ('America/Indiana/Petersburg', 'Indiana/Petersburg'), ('America/Indiana/Tell_City', 'Indiana/Tell_City'), ('America/Indiana/Vevay', 'Indiana/Vevay'), ('America/Indiana/Vincennes', 'Indiana/Vincennes'), ('America/Indiana/Winamac', 'Indiana/Winamac'), ('America/Indianapolis', 'Indianapolis'), ('America/Inuvik', 'Inuvik'), ('America/Iqaluit', 'Iqaluit'), ('America/Jamaica', 'Jamaica'), ('America/Jujuy', 'Jujuy'), ('America/Juneau', 'Juneau'), ('America/Kentucky/Louisville', 'Kentucky/Louisville'), ('America/Kentucky/Monticello', 'Kentucky/Monticello'), ('America/Knox_IN', 'Knox_IN'), ('America/Kralendijk', 'Kralendijk'), ('America/La_Paz', 'La_Paz'), ('America/Lima', 'Lima'), ('America/Los_Angeles', 'Los_Angeles'), ('America/Louisville', 'Louisville'), ('America/Lower_Princes', 'Lower_Princes'), ('America/Maceio', 'Maceio'), ('America/Managua', 'Managua'), ('America/Manaus', 'Manaus'), ('America/Marigot', 'Marigot'), ('America/Martinique', 'Martinique'), ('America/Matamoros', 'Matamoros'), ('America/Mazatlan', 'Mazatlan'), ('America/Mendoza', 'Mendoza'), ('America/Menominee', 'Menominee'), ('America/Merida', 'Merida'), ('America/Metlakatla', 'Metlakatla'), ('America/Mexico_City', 'Mexico_City'), ('America/Miquelon', 'Miquelon'), ('America/Moncton', 'Moncton'), ('America/Monterrey', 'Monterrey'), ('America/Montevideo', 'Montevideo'), ('America/Montreal', 'Montreal'), ('America/Montserrat', 'Montserrat'), ('America/Nassau', 'Nassau'), ('America/New_York', 'New_York'), ('America/Nipigon', 'Nipigon'), ('America/Nome', 'Nome'), ('America/Noronha', 'Noronha'), ('America/North_Dakota/Beulah', 'North_Dakota/Beulah'), ('America/North_Dakota/Center', 'North_Dakota/Center'), ('America/North_Dakota/New_Salem', 'North_Dakota/New_Salem'), ('America/Ojinaga', 'Ojinaga'), ('America/Panama', 'Panama'), ('America/Pangnirtung', 'Pangnirtung'), ('America/Paramaribo', 'Paramaribo'), ('America/Phoenix', 'Phoenix'), ('America/Port-au-Prince', 'Port-au-Prince'), ('America/Port_of_Spain', 'Port_of_Spain'), ('America/Porto_Acre', 'Porto_Acre'), ('America/Porto_Velho', 'Porto_Velho'), ('America/Puerto_Rico', 'Puerto_Rico'), ('America/Punta_Arenas', 'Punta_Arenas'), ('America/Rainy_River', 'Rainy_River'), ('America/Rankin_Inlet', 'Rankin_Inlet'), ('America/Recife', 'Recife'), ('America/Regina', 'Regina'), ('America/Resolute', 'Resolute'), ('America/Rio_Branco', 'Rio_Branco'), ('America/Rosario', 'Rosario'), ('America/Santa_Isabel', 'Santa_Isabel'), ('America/Santarem', 'Santarem'), ('America/Santiago', 'Santiago'), ('America/Santo_Domingo', 'Santo_Domingo'), ('America/Sao_Paulo', 'Sao_Paulo'), ('America/Scoresbysund', 'Scoresbysund'), ('America/Shiprock', 'Shiprock'), ('America/Sitka', 'Sitka'), ('America/St_Barthelemy', 'St_Barthelemy'), ('America/St_Johns', 'St_Johns'), ('America/St_Kitts', 'St_Kitts'), ('America/St_Lucia', 'St_Lucia'), ('America/St_Thomas', 'St_Thomas'), ('America/St_Vincent', 'St_Vincent'), ('America/Swift_Current', 'Swift_Current'), ('America/Tegucigalpa', 'Tegucigalpa'), ('America/Thule', 'Thule'), ('America/Thunder_Bay', 'Thunder_Bay'), ('America/Tijuana', 'Tijuana'), ('America/Toronto', 'Toronto'), ('America/Tortola', 'Tortola'), ('America/Vancouver', 'Vancouver'), ('America/Virgin', 'Virgin'), ('America/Whitehorse', 'Whitehorse'), ('America/Winnipeg', 'Winnipeg'), ('America/Yakutat', 'Yakutat'), ('America/Yellowknife', 'Yellowknife')]), ('Antarctica', [('Antarctica/Casey', 'Casey'), ('Antarctica/Davis', 'Davis'), ('Antarctica/DumontDUrville', 'DumontDUrville'), ('Antarctica/Macquarie', 'Macquarie'), ('Antarctica/Mawson', 'Mawson'), ('Antarctica/McMurdo', 'McMurdo'), ('Antarctica/Palmer', 'Palmer'), ('Antarctica/Rothera', 'Rothera'), ('Antarctica/South_Pole', 'South_Pole'), ('Antarctica/Syowa', 'Syowa'), ('Antarctica/Troll', 'Troll'), ('Antarctica/Vostok', 'Vostok')]), ('Arctic', [('Arctic/Longyearbyen', 'Longyearbyen')]), ('Asia', [('Asia/Aden', 'Aden'), ('Asia/Almaty', 'Almaty'), ('Asia/Amman', 'Amman'), ('Asia/Anadyr', 'Anadyr'), ('Asia/Aqtau', 'Aqtau'), ('Asia/Aqtobe', 'Aqtobe'), ('Asia/Ashgabat', 'Ashgabat'), ('Asia/Ashkhabad', 'Ashkhabad'), ('Asia/Atyrau', 'Atyrau'), ('Asia/Baghdad', 'Baghdad'), ('Asia/Bahrain', 'Bahrain'), ('Asia/Baku', 'Baku'), ('Asia/Bangkok', 'Bangkok'), ('Asia/Barnaul', 'Barnaul'), ('Asia/Beirut', 'Beirut'), ('Asia/Bishkek', 'Bishkek'), ('Asia/Brunei', 'Brunei'), ('Asia/Calcutta', 'Calcutta'), ('Asia/Chita', 'Chita'), ('Asia/Choibalsan', 'Choibalsan'), ('Asia/Chongqing', 'Chongqing'), ('Asia/Chungking', 'Chungking'), ('Asia/Colombo', 'Colombo'), ('Asia/Dacca', 'Dacca'), ('Asia/Damascus', 'Damascus'), ('Asia/Dhaka', 'Dhaka'), ('Asia/Dili', 'Dili'), ('Asia/Dubai', 'Dubai'), ('Asia/Dushanbe', 'Dushanbe'), ('Asia/Famagusta', 'Famagusta'), ('Asia/Gaza', 'Gaza'), ('Asia/Harbin', 'Harbin'), ('Asia/Hebron', 'Hebron'), ('Asia/Ho_Chi_Minh', 'Ho_Chi_Minh'), ('Asia/Hong_Kong', 'Hong_Kong'), ('Asia/Hovd', 'Hovd'), ('Asia/Irkutsk', 'Irkutsk'), ('Asia/Istanbul', 'Istanbul'), ('Asia/Jakarta', 'Jakarta'), ('Asia/Jayapura', 'Jayapura'), ('Asia/Jerusalem', 'Jerusalem'), ('Asia/Kabul', 'Kabul'), ('Asia/Kamchatka', 'Kamchatka'), ('Asia/Karachi', 'Karachi'), ('Asia/Kashgar', 'Kashgar'), ('Asia/Kathmandu', 'Kathmandu'), ('Asia/Katmandu', 'Katmandu'), ('Asia/Khandyga', 'Khandyga'), ('Asia/Kolkata', 'Kolkata'), ('Asia/Krasnoyarsk', 'Krasnoyarsk'), ('Asia/Kuala_Lumpur', 'Kuala_Lumpur'), ('Asia/Kuching', 'Kuching'), ('Asia/Kuwait', 'Kuwait'), ('Asia/Macao', 'Macao'), ('Asia/Macau', 'Macau'), ('Asia/Magadan', 'Magadan'), ('Asia/Makassar', 'Makassar'), ('Asia/Manila', 'Manila'), ('Asia/Muscat', 'Muscat'), ('Asia/Nicosia', 'Nicosia'), ('Asia/Novokuznetsk', 'Novokuznetsk'), ('Asia/Novosibirsk', 'Novosibirsk'), ('Asia/Omsk', 'Omsk'), ('Asia/Oral', 'Oral'), ('Asia/Phnom_Penh', 'Phnom_Penh'), ('Asia/Pontianak', 'Pontianak'), ('Asia/Pyongyang', 'Pyongyang'), ('Asia/Qatar', 'Qatar'), ('Asia/Qostanay', 'Qostanay'), ('Asia/Qyzylorda', 'Qyzylorda'), ('Asia/Rangoon', 'Rangoon'), ('Asia/Riyadh', 'Riyadh'), ('Asia/Saigon', 'Saigon'), ('Asia/Sakhalin', 'Sakhalin'), ('Asia/Samarkand', 'Samarkand'), ('Asia/Seoul', 'Seoul'), ('Asia/Shanghai', 'Shanghai'), ('Asia/Singapore', 'Singapore'), ('Asia/Srednekolymsk', 'Srednekolymsk'), ('Asia/Taipei', 'Taipei'), ('Asia/Tashkent', 'Tashkent'), ('Asia/Tbilisi', 'Tbilisi'), ('Asia/Tehran', 'Tehran'), ('Asia/Tel_Aviv', 'Tel_Aviv'), ('Asia/Thimbu', 'Thimbu'), ('Asia/Thimphu', 'Thimphu'), ('Asia/Tokyo', 'Tokyo'), ('Asia/Tomsk', 'Tomsk'), ('Asia/Ujung_Pandang', 'Ujung_Pandang'), ('Asia/Ulaanbaatar', 'Ulaanbaatar'), ('Asia/Ulan_Bator', 'Ulan_Bator'), ('Asia/Urumqi', 'Urumqi'), ('Asia/Ust-Nera', 'Ust-Nera'), ('Asia/Vientiane', 'Vientiane'), ('Asia/Vladivostok', 'Vladivostok'), ('Asia/Yakutsk', 'Yakutsk'), ('Asia/Yangon', 'Yangon'), ('Asia/Yekaterinburg', 'Yekaterinburg'), ('Asia/Yerevan', 'Yerevan')]), ('Atlantic', [('Atlantic/Azores', 'Azores'), ('Atlantic/Bermuda', 'Bermuda'), ('Atlantic/Canary', 'Canary'), ('Atlantic/Cape_Verde', 'Cape_Verde'), ('Atlantic/Faeroe', 'Faeroe'), ('Atlantic/Faroe', 'Faroe'), ('Atlantic/Jan_Mayen', 'Jan_Mayen'), ('Atlantic/Madeira', 'Madeira'), ('Atlantic/Reykjavik', 'Reykjavik'), ('Atlantic/South_Georgia', 'South_Georgia'), ('Atlantic/St_Helena', 'St_Helena'), ('Atlantic/Stanley', 'Stanley')]), ('Australia', [('Australia/ACT', 'ACT'), ('Australia/Adelaide', 'Adelaide'), ('Australia/Brisbane', 'Brisbane'), ('Australia/Broken_Hill', 'Broken_Hill'), ('Australia/Canberra', 'Canberra'), ('Australia/Currie', 'Currie'), ('Australia/Darwin', 'Darwin'), ('Australia/Eucla', 'Eucla'), ('Australia/Hobart', 'Hobart'), ('Australia/LHI', 'LHI'), ('Australia/Lindeman', 'Lindeman'), ('Australia/Lord_Howe', 'Lord_Howe'), ('Australia/Melbourne', 'Melbourne'), ('Australia/NSW', 'NSW'), ('Australia/North', 'North'), ('Australia/Perth', 'Perth'), ('Australia/Queensland', 'Queensland'), ('Australia/South', 'South'), ('Australia/Sydney', 'Sydney'), ('Australia/Tasmania', 'Tasmania'), ('Australia/Victoria', 'Victoria'), ('Australia/West', 'West'), ('Australia/Yancowinna', 'Yancowinna')]), ('Brazil', [('Brazil/Acre', 'Acre'), ('Brazil/DeNoronha', 'DeNoronha'), ('Brazil/East', 'East'), ('Brazil/West', 'West')]), ('Canada', [('Canada/Atlantic', 'Atlantic'), ('Canada/Central', 'Central'), ('Canada/Eastern', 'Eastern'), ('Canada/Mountain', 'Mountain'), ('Canada/Newfoundland', 'Newfoundland'), ('Canada/Pacific', 'Pacific'), ('Canada/Saskatchewan', 'Saskatchewan'), ('Canada/Yukon', 'Yukon')]), ('Chile', [('Chile/Continental', 'Continental'), ('Chile/EasterIsland', 'EasterIsland')]), ('Etc', [('Etc/Greenwich', 'Greenwich'), ('Etc/UCT', 'UCT'), ('Etc/UTC', 'UTC'), ('Etc/Universal', 'Universal'), ('Etc/Zulu', 'Zulu')]), ('Europe', [('Europe/Amsterdam', 'Amsterdam'), ('Europe/Andorra', 'Andorra'), ('Europe/Astrakhan', 'Astrakhan'), ('Europe/Athens', 'Athens'), ('Europe/Belfast', 'Belfast'), ('Europe/Belgrade', 'Belgrade'), ('Europe/Berlin', 'Berlin'), ('Europe/Bratislava', 'Bratislava'), ('Europe/Brussels', 'Brussels'), ('Europe/Bucharest', 'Bucharest'), ('Europe/Budapest', 'Budapest'), ('Europe/Busingen', 'Busingen'), ('Europe/Chisinau', 'Chisinau'), ('Europe/Copenhagen', 'Copenhagen'), ('Europe/Dublin', 'Dublin'), ('Europe/Gibraltar', 'Gibraltar'), ('Europe/Guernsey', 'Guernsey'), ('Europe/Helsinki', 'Helsinki'), ('Europe/Isle_of_Man', 'Isle_of_Man'), ('Europe/Istanbul', 'Istanbul'), ('Europe/Jersey', 'Jersey'), ('Europe/Kaliningrad', 'Kaliningrad'), ('Europe/Kiev', 'Kiev'), ('Europe/Kirov', 'Kirov'), ('Europe/Lisbon', 'Lisbon'), ('Europe/Ljubljana', 'Ljubljana'), ('Europe/London', 'London'), ('Europe/Luxembourg', 'Luxembourg'), ('Europe/Madrid', 'Madrid'), ('Europe/Malta', 'Malta'), ('Europe/Mariehamn', 'Mariehamn'), ('Europe/Minsk', 'Minsk'), ('Europe/Monaco', 'Monaco'), ('Europe/Moscow', 'Moscow'), ('Europe/Nicosia', 'Nicosia'), ('Europe/Oslo', 'Oslo'), ('Europe/Paris', 'Paris'), ('Europe/Podgorica', 'Podgorica'), ('Europe/Prague', 'Prague'), ('Europe/Riga', 'Riga'), ('Europe/Rome', 'Rome'), ('Europe/Samara', 'Samara'), ('Europe/San_Marino', 'San_Marino'), ('Europe/Sarajevo', 'Sarajevo'), ('Europe/Saratov', 'Saratov'), ('Europe/Simferopol', 'Simferopol'), ('Europe/Skopje', 'Skopje'), ('Europe/Sofia', 'Sofia'), ('Europe/Stockholm', 'Stockholm'), ('Europe/Tallinn', 'Tallinn'), ('Europe/Tirane', 'Tirane'), ('Europe/Tiraspol', 'Tiraspol'), ('Europe/Ulyanovsk', 'Ulyanovsk'), ('Europe/Uzhgorod', 'Uzhgorod'), ('Europe/Vaduz', 'Vaduz'), ('Europe/Vatican', 'Vatican'), ('Europe/Vienna', 'Vienna'), ('Europe/Vilnius', 'Vilnius'), ('Europe/Volgograd', 'Volgograd'), ('Europe/Warsaw', 'Warsaw'), ('Europe/Zagreb', 'Zagreb'), ('Europe/Zaporozhye', 'Zaporozhye'), ('Europe/Zurich', 'Zurich')]), ('Indian', [('Indian/Antananarivo', 'Antananarivo'), ('Indian/Chagos', 'Chagos'), ('Indian/Christmas', 'Christmas'), ('Indian/Cocos', 'Cocos'), ('Indian/Comoro', 'Comoro'), ('Indian/Kerguelen', 'Kerguelen'), ('Indian/Mahe', 'Mahe'), ('Indian/Maldives', 'Maldives'), ('Indian/Mauritius', 'Mauritius'), ('Indian/Mayotte', 'Mayotte'), ('Indian/Reunion', 'Reunion')]), ('Mexico', [('Mexico/BajaNorte', 'BajaNorte'), ('Mexico/BajaSur', 'BajaSur'), ('Mexico/General', 'General')]), ('Other', [('CET', 'CET'), ('CST6CDT', 'CST6CDT'), ('Cuba', 'Cuba'), ('EET', 'EET'), ('EST', 'EST'), ('EST5EDT', 'EST5EDT'), ('Egypt', 'Egypt'), ('Eire', 'Eire'), ('GB', 'GB'), ('GB-Eire', 'GB-Eire'), ('Greenwich', 'Greenwich'), ('HST', 'HST'), ('Hongkong', 'Hongkong'), ('Iceland', 'Iceland'), ('Iran', 'Iran'), ('Israel', 'Israel'), ('Jamaica', 'Jamaica'), ('Japan', 'Japan'), ('Kwajalein', 'Kwajalein'), ('Libya', 'Libya'), ('MET', 'MET'), ('MST', 'MST'), ('MST7MDT', 'MST7MDT'), ('NZ', 'NZ'), ('NZ-CHAT', 'NZ-CHAT'), ('Navajo', 'Navajo'), ('PRC', 'PRC'), ('PST8PDT', 'PST8PDT'), ('Poland', 'Poland'), ('Portugal', 'Portugal'), ('ROC', 'ROC'), ('ROK', 'ROK'), ('Singapore', 'Singapore'), ('Turkey', 'Turkey'), ('UCT', 'UCT'), ('UTC', 'UTC'), ('Universal', 'Universal'), ('W-SU', 'W-SU'), ('WET', 'WET'), ('Zulu', 'Zulu')]), ('Pacific', [('Pacific/Apia', 'Apia'), ('Pacific/Auckland', 'Auckland'), ('Pacific/Bougainville', 'Bougainville'), ('Pacific/Chatham', 'Chatham'), ('Pacific/Chuuk', 'Chuuk'), ('Pacific/Easter', 'Easter'), ('Pacific/Efate', 'Efate'), ('Pacific/Enderbury', 'Enderbury'), ('Pacific/Fakaofo', 'Fakaofo'), ('Pacific/Fiji', 'Fiji'), ('Pacific/Funafuti', 'Funafuti'), ('Pacific/Galapagos', 'Galapagos'), ('Pacific/Gambier', 'Gambier'), ('Pacific/Guadalcanal', 'Guadalcanal'), ('Pacific/Guam', 'Guam'), ('Pacific/Honolulu', 'Honolulu'), ('Pacific/Johnston', 'Johnston'), ('Pacific/Kiritimati', 'Kiritimati'), ('Pacific/Kosrae', 'Kosrae'), ('Pacific/Kwajalein', 'Kwajalein'), ('Pacific/Majuro', 'Majuro'), ('Pacific/Marquesas', 'Marquesas'), ('Pacific/Midway', 'Midway'), ('Pacific/Nauru', 'Nauru'), ('Pacific/Niue', 'Niue'), ('Pacific/Norfolk', 'Norfolk'), ('Pacific/Noumea', 'Noumea'), ('Pacific/Pago_Pago', 'Pago_Pago'), ('Pacific/Palau', 'Palau'), ('Pacific/Pitcairn', 'Pitcairn'), ('Pacific/Pohnpei', 'Pohnpei'), ('Pacific/Ponape', 'Ponape'), ('Pacific/Port_Moresby', 'Port_Moresby'), ('Pacific/Rarotonga', 'Rarotonga'), ('Pacific/Saipan', 'Saipan'), ('Pacific/Samoa', 'Samoa'), ('Pacific/Tahiti', 'Tahiti'), ('Pacific/Tarawa', 'Tarawa'), ('Pacific/Tongatapu', 'Tongatapu'), ('Pacific/Truk', 'Truk'), ('Pacific/Wake', 'Wake'), ('Pacific/Wallis', 'Wallis'), ('Pacific/Yap', 'Yap')]), ('US', [('US/Alaska', 'Alaska'), ('US/Aleutian', 'Aleutian'), ('US/Arizona', 'Arizona'), ('US/Central', 'Central'), ('US/East-Indiana', 'East-Indiana'), ('US/Eastern', 'Eastern'), ('US/Hawaii', 'Hawaii'), ('US/Indiana-Starke', 'Indiana-Starke'), ('US/Michigan', 'Michigan'), ('US/Mountain', 'Mountain'), ('US/Pacific', 'Pacific'), ('US/Samoa', 'Samoa')])], default='America/Toronto', max_length=50, verbose_name='location')), + ('points', models.FloatField(db_index=True, default=0)), + ('performance_points', models.FloatField(db_index=True, default=0)), + ('problem_count', models.IntegerField(db_index=True, default=0)), + ('ace_theme', models.CharField(choices=[('ambiance', 'Ambiance'), ('chaos', 'Chaos'), ('chrome', 'Chrome'), ('clouds', 'Clouds'), ('clouds_midnight', 'Clouds Midnight'), ('cobalt', 'Cobalt'), ('crimson_editor', 'Crimson Editor'), ('dawn', 'Dawn'), ('dreamweaver', 'Dreamweaver'), ('eclipse', 'Eclipse'), ('github', 'Github'), ('idle_fingers', 'Idle Fingers'), ('katzenmilch', 'Katzenmilch'), ('kr_theme', 'KR Theme'), ('kuroir', 'Kuroir'), ('merbivore', 'Merbivore'), ('merbivore_soft', 'Merbivore Soft'), ('mono_industrial', 'Mono Industrial'), ('monokai', 'Monokai'), ('pastel_on_dark', 'Pastel on Dark'), ('solarized_dark', 'Solarized Dark'), ('solarized_light', 'Solarized Light'), ('terminal', 'Terminal'), ('textmate', 'Textmate'), ('tomorrow', 'Tomorrow'), ('tomorrow_night', 'Tomorrow Night'), ('tomorrow_night_blue', 'Tomorrow Night Blue'), ('tomorrow_night_bright', 'Tomorrow Night Bright'), ('tomorrow_night_eighties', 'Tomorrow Night Eighties'), ('twilight', 'Twilight'), ('vibrant_ink', 'Vibrant Ink'), ('xcode', 'XCode')], default='github', max_length=30)), + ('last_access', models.DateTimeField(default=django.utils.timezone.now, verbose_name='last access time')), + ('ip', models.GenericIPAddressField(blank=True, null=True, verbose_name='last IP')), + ('display_rank', models.CharField(choices=[('user', 'Normal User'), ('setter', 'Problem Setter'), ('admin', 'Admin')], default='user', max_length=10, verbose_name='display rank')), + ('mute', models.BooleanField(default=False, help_text='Some users are at their best when silent.', verbose_name='comment mute')), + ('is_unlisted', models.BooleanField(default=False, help_text='User will not be ranked.', verbose_name='unlisted user')), + ('rating', models.IntegerField(default=None, null=True)), + ('user_script', models.TextField(blank=True, default='', help_text='User-defined JavaScript for site customization.', max_length=65536, verbose_name='user script')), + ('math_engine', models.CharField(choices=[('tex', 'Leave as LaTeX'), ('svg', 'SVG with PNG fallback'), ('mml', 'MathML only'), ('jax', 'MathJax with SVG/PNG fallback'), ('auto', 'Detect best quality')], default='auto', help_text='the rendering engine used to render math', max_length=4, verbose_name='math engine')), + ('is_totp_enabled', models.BooleanField(default=False, help_text='check to enable TOTP-based two factor authentication', verbose_name='2FA enabled')), + ('totp_key', judge.models.profile.EncryptedNullCharField(blank=True, help_text='32 character base32-encoded key for TOTP', max_length=32, null=True, validators=[django.core.validators.RegexValidator('^$|^[A-Z2-7]{32}$', 'TOTP key must be empty or base32')], verbose_name='TOTP key')), + ('notes', models.TextField(blank=True, help_text='Notes for administrators regarding this user.', null=True, verbose_name='internal notes')), + ('current_contest', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='judge.ContestParticipation', verbose_name='current contest')), + ('language', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='judge.Language', verbose_name='preferred language')), + ('organizations', sortedm2m.fields.SortedManyToManyField(blank=True, help_text=None, related_name='members', related_query_name='member', to='judge.Organization', verbose_name='organization')), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='user associated')), + ], + options={ + 'verbose_name_plural': 'user profiles', + 'permissions': (('test_site', 'Shows in-progress development stuff'), ('totp', 'Edit TOTP settings')), + 'verbose_name': 'user profile', + }, + ), + migrations.CreateModel( + name='Rating', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('rank', models.IntegerField(verbose_name='rank')), + ('rating', models.IntegerField(verbose_name='rating')), + ('volatility', models.IntegerField(verbose_name='volatility')), + ('last_rated', models.DateTimeField(db_index=True, verbose_name='last rated')), + ('contest', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='ratings', to='judge.Contest', verbose_name='contest')), + ('participation', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='rating', to='judge.ContestParticipation', verbose_name='participation')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='ratings', to='judge.Profile', verbose_name='user')), + ], + options={ + 'verbose_name_plural': 'contest ratings', + 'verbose_name': 'contest rating', + }, + ), + migrations.CreateModel( + name='RuntimeVersion', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=64, verbose_name='runtime name')), + ('version', models.CharField(blank=True, max_length=64, verbose_name='runtime version')), + ('priority', models.IntegerField(default=0, verbose_name='order in which to display this runtime')), + ('judge', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='judge.Judge', verbose_name='judge on which this runtime exists')), + ('language', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='judge.Language', verbose_name='language to which this runtime belongs')), + ], + ), + migrations.CreateModel( + name='Solution', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('is_public', models.BooleanField(default=False, verbose_name='public visibility')), + ('publish_on', models.DateTimeField(verbose_name='publish date')), + ('content', models.TextField(verbose_name='editorial content')), + ('authors', models.ManyToManyField(blank=True, to='judge.Profile', verbose_name='authors')), + ('problem', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='solution', to='judge.Problem', verbose_name='associated problem')), + ], + options={ + 'verbose_name_plural': 'solutions', + 'permissions': (('see_private_solution', 'See hidden solutions'),), + 'verbose_name': 'solution', + }, + ), + migrations.CreateModel( + name='Submission', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('date', models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='submission time')), + ('time', models.FloatField(db_index=True, null=True, verbose_name='execution time')), + ('memory', models.FloatField(null=True, verbose_name='memory usage')), + ('points', models.FloatField(db_index=True, null=True, verbose_name='points granted')), + ('source', models.TextField(max_length=65536, verbose_name='source code')), + ('status', models.CharField(choices=[('QU', 'Queued'), ('P', 'Processing'), ('G', 'Grading'), ('D', 'Completed'), ('IE', 'Internal Error'), ('CE', 'Compile Error'), ('AB', 'Aborted')], db_index=True, default='QU', max_length=2, verbose_name='status')), + ('result', models.CharField(blank=True, choices=[('AC', 'Accepted'), ('WA', 'Wrong Answer'), ('TLE', 'Time Limit Exceeded'), ('MLE', 'Memory Limit Exceeded'), ('OLE', 'Output Limit Exceeded'), ('IR', 'Invalid Return'), ('RTE', 'Runtime Error'), ('CE', 'Compile Error'), ('IE', 'Internal Error'), ('SC', 'Short circuit'), ('AB', 'Aborted')], db_index=True, default=None, max_length=3, null=True, verbose_name='result')), + ('error', models.TextField(blank=True, null=True, verbose_name='compile errors')), + ('current_testcase', models.IntegerField(default=0)), + ('batch', models.BooleanField(default=False, verbose_name='batched cases')), + ('case_points', models.FloatField(default=0, verbose_name='test case points')), + ('case_total', models.FloatField(default=0, verbose_name='test case total points')), + ('was_rejudged', models.BooleanField(default=False, verbose_name='was rejudged by admin')), + ('is_pretested', models.BooleanField(default=False, verbose_name='was ran on pretests only')), + ('judged_on', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='judge.Judge', verbose_name='judged on')), + ('language', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='judge.Language', verbose_name='submission language')), + ('problem', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='judge.Problem')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='judge.Profile')), + ], + options={ + 'verbose_name_plural': 'submissions', + 'permissions': (('abort_any_submission', 'Abort any submission'), ('rejudge_submission', 'Rejudge the submission'), ('rejudge_submission_lot', 'Rejudge a lot of submissions'), ('spam_submission', 'Submit without limit'), ('view_all_submission', 'View all submission'), ('resubmit_other', "Resubmit others' submission")), + 'verbose_name': 'submission', + }, + ), + migrations.CreateModel( + name='SubmissionTestCase', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('case', models.IntegerField(verbose_name='test case ID')), + ('status', models.CharField(choices=[('AC', 'Accepted'), ('WA', 'Wrong Answer'), ('TLE', 'Time Limit Exceeded'), ('MLE', 'Memory Limit Exceeded'), ('OLE', 'Output Limit Exceeded'), ('IR', 'Invalid Return'), ('RTE', 'Runtime Error'), ('CE', 'Compile Error'), ('IE', 'Internal Error'), ('SC', 'Short circuit'), ('AB', 'Aborted')], max_length=3, verbose_name='status flag')), + ('time', models.FloatField(null=True, verbose_name='execution time')), + ('memory', models.FloatField(null=True, verbose_name='memory usage')), + ('points', models.FloatField(null=True, verbose_name='points granted')), + ('total', models.FloatField(null=True, verbose_name='points possible')), + ('batch', models.IntegerField(null=True, verbose_name='batch number')), + ('feedback', models.CharField(blank=True, max_length=50, verbose_name='judging feedback')), + ('extended_feedback', models.TextField(blank=True, verbose_name='extended judging feedback')), + ('output', models.TextField(blank=True, verbose_name='program output')), + ('submission', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='test_cases', to='judge.Submission', verbose_name='associated submission')), + ], + options={ + 'verbose_name_plural': 'submission test cases', + 'verbose_name': 'submission test case', + }, + ), + migrations.CreateModel( + name='Ticket', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=100, verbose_name='ticket title')), + ('time', models.DateTimeField(auto_now_add=True, verbose_name='creation time')), + ('notes', models.TextField(blank=True, help_text='Staff notes for this issue to aid in processing.', verbose_name='quick notes')), + ('object_id', models.PositiveIntegerField(verbose_name='linked item ID')), + ('is_open', models.BooleanField(default=True, verbose_name='is ticket open?')), + ('assignees', models.ManyToManyField(related_name='assigned_tickets', to='judge.Profile', verbose_name='assignees')), + ('content_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType', verbose_name='linked item type')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='tickets', to='judge.Profile', verbose_name='ticket creator')), + ], + ), + migrations.CreateModel( + name='TicketMessage', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('body', models.TextField(verbose_name='message body')), + ('time', models.DateTimeField(auto_now_add=True, verbose_name='message time')), + ('ticket', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='messages', related_query_name='message', to='judge.Ticket', verbose_name='ticket')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='ticket_messages', to='judge.Profile', verbose_name='poster')), + ], + ), + migrations.AddField( + model_name='problem', + name='authors', + field=models.ManyToManyField(blank=True, related_name='authored_problems', to='judge.Profile', verbose_name='creators'), + ), + migrations.AddField( + model_name='problem', + name='banned_users', + field=models.ManyToManyField(blank=True, help_text='Bans the selected users from submitting to this problem.', to='judge.Profile', verbose_name='personae non gratae'), + ), + migrations.AddField( + model_name='problem', + name='curators', + field=models.ManyToManyField(blank=True, help_text='These users will be able to edit a problem, but not be publicly shown as an author.', related_name='curated_problems', to='judge.Profile', verbose_name='curators'), + ), + migrations.AddField( + model_name='problem', + name='group', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='judge.ProblemGroup', verbose_name='problem group'), + ), + migrations.AddField( + model_name='problem', + name='license', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='judge.License'), + ), + migrations.AddField( + model_name='problem', + name='organizations', + field=models.ManyToManyField(blank=True, help_text='If private, only these organizations may see the problem.', to='judge.Organization', verbose_name='organizations'), + ), + migrations.AddField( + model_name='problem', + name='testers', + field=models.ManyToManyField(blank=True, help_text='These users will be able to view a private problem, but not edit it.', related_name='tested_problems', to='judge.Profile', verbose_name='testers'), + ), + migrations.AddField( + model_name='problem', + name='types', + field=models.ManyToManyField(to='judge.ProblemType', verbose_name='problem types'), + ), + migrations.AddField( + model_name='privatemessage', + name='sender', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='sent_messages', to='judge.Profile', verbose_name='sender'), + ), + migrations.AddField( + model_name='privatemessage', + name='target', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='received_messages', to='judge.Profile', verbose_name='target'), + ), + migrations.AddField( + model_name='organizationrequest', + name='user', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='requests', to='judge.Profile', verbose_name='user'), + ), + migrations.AddField( + model_name='organization', + name='admins', + field=models.ManyToManyField(help_text='Those who can edit this organization', related_name='admin_of', to='judge.Profile', verbose_name='administrators'), + ), + migrations.AddField( + model_name='organization', + name='registrant', + field=models.ForeignKey(help_text='User who registered this organization', on_delete=django.db.models.deletion.CASCADE, related_name='registrant+', to='judge.Profile', verbose_name='registrant'), + ), + migrations.AddField( + model_name='languagelimit', + name='problem', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='language_limits', to='judge.Problem', verbose_name='problem'), + ), + migrations.AddField( + model_name='judge', + name='problems', + field=models.ManyToManyField(related_name='judges', to='judge.Problem', verbose_name='problems'), + ), + migrations.AddField( + model_name='judge', + name='runtimes', + field=models.ManyToManyField(related_name='judges', to='judge.Language', verbose_name='judges'), + ), + migrations.AddField( + model_name='contestsubmission', + name='submission', + field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='contest', to='judge.Submission', verbose_name='submission'), + ), + migrations.AddField( + model_name='contestproblem', + name='problem', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='contests', to='judge.Problem', verbose_name='problem'), + ), + migrations.AddField( + model_name='contestparticipation', + name='user', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='contest_history', to='judge.Profile', verbose_name='user'), + ), + migrations.AddField( + model_name='contest', + name='banned_users', + field=models.ManyToManyField(blank=True, help_text='Bans the selected users from joining this contest.', to='judge.Profile', verbose_name='personae non gratae'), + ), + migrations.AddField( + model_name='contest', + name='organizations', + field=models.ManyToManyField(blank=True, help_text='If private, only these organizations may see the contest', to='judge.Organization', verbose_name='organizations'), + ), + migrations.AddField( + model_name='contest', + name='organizers', + field=models.ManyToManyField(help_text='These people will be able to edit the contest.', related_name='_contest_organizers_+', to='judge.Profile'), + ), + migrations.AddField( + model_name='contest', + name='problems', + field=models.ManyToManyField(through='judge.ContestProblem', to='judge.Problem', verbose_name='problems'), + ), + migrations.AddField( + model_name='contest', + name='rate_exclude', + field=models.ManyToManyField(blank=True, related_name='_contest_rate_exclude_+', to='judge.Profile', verbose_name='exclude from ratings'), + ), + migrations.AddField( + model_name='contest', + name='tags', + field=models.ManyToManyField(blank=True, related_name='contests', to='judge.ContestTag', verbose_name='contest tags'), + ), + migrations.AddField( + model_name='commentvote', + name='voter', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='voted_comments', to='judge.Profile'), + ), + migrations.AddField( + model_name='comment', + name='author', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='judge.Profile', verbose_name='commenter'), + ), + migrations.AddField( + model_name='comment', + name='parent', + field=mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='replies', to='judge.Comment', verbose_name='parent'), + ), + migrations.AddField( + model_name='blogpost', + name='authors', + field=models.ManyToManyField(blank=True, to='judge.Profile', verbose_name='authors'), + ), + migrations.AlterUniqueTogether( + name='rating', + unique_together=set([('user', 'contest')]), + ), + migrations.AlterUniqueTogether( + name='problemtranslation', + unique_together=set([('problem', 'language')]), + ), + migrations.AlterUniqueTogether( + name='languagelimit', + unique_together=set([('problem', 'language')]), + ), + migrations.AlterUniqueTogether( + name='contestproblem', + unique_together=set([('problem', 'contest')]), + ), + migrations.AlterUniqueTogether( + name='contestparticipation', + unique_together=set([('contest', 'user', 'virtual')]), + ), + migrations.AlterUniqueTogether( + name='commentvote', + unique_together=set([('voter', 'comment')]), + ), + ] diff --git a/judge/migrations/0085_submission_source.py b/judge/migrations/0085_submission_source.py new file mode 100644 index 0000000..d094efd --- /dev/null +++ b/judge/migrations/0085_submission_source.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.15 on 2019-01-31 22:18 +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('judge', '0084_contest_formats'), + ] + + operations = [ + migrations.CreateModel( + name='SubmissionSource', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('source', models.TextField(max_length=65536, verbose_name='source code')), + ('submission', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='link', to='judge.Submission', verbose_name='associated submission')), + ], + ), + migrations.RunSQL( + ['''INSERT INTO judge_submissionsource (source, submission_id) + SELECT source, id AS 'submission_id' FROM judge_submission;'''], + ['''UPDATE judge_submission sub + INNER JOIN judge_submissionsource src ON sub.id = src.submission_id + SET sub.source = src.source;'''], + elidable=True, + ), + migrations.RemoveField( + model_name='submission', + name='source', + ), + migrations.AlterField( + model_name='submissionsource', + name='submission', + field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='source', to='judge.Submission', verbose_name='associated submission'), + ), + ] diff --git a/judge/migrations/0086_rating_ceiling.py b/judge/migrations/0086_rating_ceiling.py new file mode 100644 index 0000000..a544a21 --- /dev/null +++ b/judge/migrations/0086_rating_ceiling.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.20 on 2019-06-20 16:04 +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('judge', '0085_submission_source'), + ] + + operations = [ + migrations.AddField( + model_name='contest', + name='rating_ceiling', + field=models.IntegerField(blank=True, help_text='Rating ceiling for contest', null=True, verbose_name='rating ceiling'), + ), + migrations.AddField( + model_name='contest', + name='rating_floor', + field=models.IntegerField(blank=True, help_text='Rating floor for contest', null=True, verbose_name='rating floor'), + ), + ] diff --git a/judge/migrations/0087_problem_resource_limits.py b/judge/migrations/0087_problem_resource_limits.py new file mode 100644 index 0000000..e6da153 --- /dev/null +++ b/judge/migrations/0087_problem_resource_limits.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.20 on 2019-06-09 14:44 +import django.core.validators +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('judge', '0086_rating_ceiling'), + ] + + operations = [ + migrations.AlterField( + model_name='problem', + name='memory_limit', + field=models.PositiveIntegerField(help_text='The memory limit for this problem, in kilobytes (e.g. 64mb = 65536 kilobytes).', verbose_name='memory limit'), + ), + migrations.AlterField( + model_name='problem', + name='time_limit', + field=models.FloatField(help_text='The time limit for this problem, in seconds. Fractional seconds (e.g. 1.5) are supported.', validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(2000)], verbose_name='time limit'), + ), + ] diff --git a/judge/migrations/0088_private_contests.py b/judge/migrations/0088_private_contests.py new file mode 100644 index 0000000..b3505b5 --- /dev/null +++ b/judge/migrations/0088_private_contests.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.20 on 2019-09-02 15:58 +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('judge', '0087_problem_resource_limits'), + ] + + operations = [ + migrations.AlterModelOptions( + name='contest', + options={'permissions': (('see_private_contest', 'See private contests'), ('edit_own_contest', 'Edit own contests'), ('edit_all_contest', 'Edit all contests'), ('contest_rating', 'Rate contests'), ('contest_access_code', 'Contest access codes'), ('create_private_contest', 'Create private contests')), 'verbose_name': 'contest', 'verbose_name_plural': 'contests'}, + ), + migrations.RenameField( + model_name='contest', + old_name='is_public', + new_name='is_visible', + ), + migrations.AddField( + model_name='contest', + name='is_organization_private', + field=models.BooleanField(default=False, verbose_name='private to organizations'), + ), + migrations.AddField( + model_name='contest', + name='private_contestants', + field=models.ManyToManyField(blank=True, help_text='If private, only these users may see the contest', related_name='_contest_private_contestants_+', to='judge.Profile', verbose_name='private contestants'), + ), + migrations.AlterField( + model_name='contest', + name='is_private', + field=models.BooleanField(default=False, verbose_name='private to specific users'), + ), + ] diff --git a/judge/migrations/0089_submission_to_contest.py b/judge/migrations/0089_submission_to_contest.py new file mode 100644 index 0000000..5d464cb --- /dev/null +++ b/judge/migrations/0089_submission_to_contest.py @@ -0,0 +1,27 @@ +# Generated by Django 2.1.12 on 2019-09-25 23:28 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('judge', '0088_private_contests'), + ] + + operations = [ + migrations.AddField( + model_name='submission', + name='contest_object', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='judge.Contest', verbose_name='contest'), + ), + migrations.RunSQL(''' + UPDATE `judge_submission` + INNER JOIN `judge_contestsubmission` + ON (`judge_submission`.`id` = `judge_contestsubmission`.`submission_id`) + INNER JOIN `judge_contestparticipation` + ON (`judge_contestsubmission`.`participation_id` = `judge_contestparticipation`.`id`) + SET `judge_submission`.`contest_object_id` = `judge_contestparticipation`.`contest_id` + ''', migrations.RunSQL.noop), + ] diff --git a/judge/migrations/0090_fix_contest_visibility.py b/judge/migrations/0090_fix_contest_visibility.py new file mode 100644 index 0000000..10480fb --- /dev/null +++ b/judge/migrations/0090_fix_contest_visibility.py @@ -0,0 +1,19 @@ +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('judge', '0089_submission_to_contest'), + ] + + operations = [ + migrations.RunSQL(''' + UPDATE `judge_contest` + SET `judge_contest`.`is_private` = 0, `judge_contest`.`is_organization_private` = 1 + WHERE `judge_contest`.`is_private` = 1 + ''', ''' + UPDATE `judge_contest` + SET `judge_contest`.`is_private` = `judge_contest`.`is_organization_private` + '''), + ] diff --git a/judge/migrations/0091_compiler_message_ansi2html.py b/judge/migrations/0091_compiler_message_ansi2html.py new file mode 100644 index 0000000..7240f95 --- /dev/null +++ b/judge/migrations/0091_compiler_message_ansi2html.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +import lxml.html as lh +from django.db import migrations +from lxml.html.clean import clean_html + + +def strip_error_html(apps, schema_editor): + Submission = apps.get_model('judge', 'Submission') + for sub in Submission.objects.filter(error__isnull=False).iterator(): + if sub.error: + sub.error = clean_html(lh.fromstring(sub.error)).text_content() + sub.save(update_fields=['error']) + + +class Migration(migrations.Migration): + + dependencies = [ + ('judge', '0090_fix_contest_visibility'), + ] + + operations = [ + migrations.RunPython(strip_error_html, migrations.RunPython.noop, atomic=True), + ] diff --git a/judge/migrations/0092_contest_clone.py b/judge/migrations/0092_contest_clone.py new file mode 100644 index 0000000..0235513 --- /dev/null +++ b/judge/migrations/0092_contest_clone.py @@ -0,0 +1,17 @@ +# Generated by Django 2.1.12 on 2019-09-30 21:25 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('judge', '0091_compiler_message_ansi2html'), + ] + + operations = [ + migrations.AlterModelOptions( + name='contest', + options={'permissions': (('see_private_contest', 'See private contests'), ('edit_own_contest', 'Edit own contests'), ('edit_all_contest', 'Edit all contests'), ('clone_contest', 'Clone contest'), ('contest_rating', 'Rate contests'), ('contest_access_code', 'Contest access codes'), ('create_private_contest', 'Create private contests')), 'verbose_name': 'contest', 'verbose_name_plural': 'contests'}, + ), + ] diff --git a/judge/migrations/0093_contest_moss.py b/judge/migrations/0093_contest_moss.py new file mode 100644 index 0000000..10e2799 --- /dev/null +++ b/judge/migrations/0093_contest_moss.py @@ -0,0 +1,45 @@ +# Generated by Django 2.1.12 on 2019-10-17 20:52 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('judge', '0092_contest_clone'), + ] + + operations = [ + migrations.CreateModel( + name='ContestMoss', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('language', models.CharField(max_length=10)), + ('submission_count', models.PositiveIntegerField(default=0)), + ('url', models.URLField(blank=True, null=True)), + ], + options={ + 'verbose_name': 'contest moss result', + 'verbose_name_plural': 'contest moss results', + }, + ), + migrations.AlterModelOptions( + name='contest', + options={'permissions': (('see_private_contest', 'See private contests'), ('edit_own_contest', 'Edit own contests'), ('edit_all_contest', 'Edit all contests'), ('clone_contest', 'Clone contest'), ('moss_contest', 'MOSS contest'), ('contest_rating', 'Rate contests'), ('contest_access_code', 'Contest access codes'), ('create_private_contest', 'Create private contests')), 'verbose_name': 'contest', 'verbose_name_plural': 'contests'}, + ), + migrations.AddField( + model_name='contestmoss', + name='contest', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='moss', to='judge.Contest', verbose_name='contest'), + ), + migrations.AddField( + model_name='contestmoss', + name='problem', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='moss', to='judge.Problem', verbose_name='problem'), + ), + migrations.AlterUniqueTogether( + name='contestmoss', + unique_together={('contest', 'problem', 'language')}, + ), + ] diff --git a/judge/migrations/0094_submissiontestcase_unique_together.py b/judge/migrations/0094_submissiontestcase_unique_together.py new file mode 100644 index 0000000..8341329 --- /dev/null +++ b/judge/migrations/0094_submissiontestcase_unique_together.py @@ -0,0 +1,14 @@ +from django.db import migrations + + +class Migration(migrations.Migration): + dependencies = [ + ('judge', '0093_contest_moss'), + ] + + operations = [ + migrations.AlterUniqueTogether( + name='submissiontestcase', + unique_together={('submission', 'case')}, + ), + ] diff --git a/judge/migrations/0095_organization_logo_override.py b/judge/migrations/0095_organization_logo_override.py new file mode 100644 index 0000000..b1d86eb --- /dev/null +++ b/judge/migrations/0095_organization_logo_override.py @@ -0,0 +1,18 @@ +# Generated by Django 2.1.12 on 2019-10-23 00:11 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('judge', '0094_submissiontestcase_unique_together'), + ] + + operations = [ + migrations.AddField( + model_name='organization', + name='logo_override_image', + field=models.CharField(blank=True, default='', help_text='This image will replace the default site logo for users viewing the organization.', max_length=150, verbose_name='Logo override image'), + ), + ] diff --git a/judge/migrations/0096_profile_language_set_default.py b/judge/migrations/0096_profile_language_set_default.py new file mode 100644 index 0000000..536b7fd --- /dev/null +++ b/judge/migrations/0096_profile_language_set_default.py @@ -0,0 +1,21 @@ +# Generated by Django 2.2.6 on 2019-11-08 01:27 + +import django.db.models.deletion +from django.db import migrations, models + +import judge.models.runtime + + +class Migration(migrations.Migration): + + dependencies = [ + ('judge', '0095_organization_logo_override'), + ] + + operations = [ + migrations.AlterField( + model_name='profile', + name='language', + field=models.ForeignKey(default=judge.models.runtime.Language.get_default_language_pk, on_delete=django.db.models.deletion.SET_DEFAULT, to='judge.Language', verbose_name='preferred language'), + ), + ] diff --git a/judge/migrations/0097_participation_is_disqualified.py b/judge/migrations/0097_participation_is_disqualified.py new file mode 100644 index 0000000..537f83f --- /dev/null +++ b/judge/migrations/0097_participation_is_disqualified.py @@ -0,0 +1,23 @@ +# Generated by Django 2.2.7 on 2019-11-10 02:13 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('judge', '0096_profile_language_set_default'), + ] + + operations = [ + migrations.AddField( + model_name='contestparticipation', + name='is_disqualified', + field=models.BooleanField(default=False, help_text='Whether this participation is disqualified.', verbose_name='is disqualified'), + ), + migrations.AlterField( + model_name='contestparticipation', + name='virtual', + field=models.IntegerField(default=0, help_text='0 means non-virtual, otherwise the n-th virtual participation.', verbose_name='virtual participation id'), + ), + ] diff --git a/judge/migrations/__init__.py b/judge/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/judge/models/__init__.py b/judge/models/__init__.py new file mode 100644 index 0000000..d780360 --- /dev/null +++ b/judge/models/__init__.py @@ -0,0 +1,29 @@ +from reversion import revisions + +from judge.models.choices import ACE_THEMES, EFFECTIVE_MATH_ENGINES, MATH_ENGINES_CHOICES, TIMEZONE +from judge.models.comment import Comment, CommentLock, CommentVote +from judge.models.contest import Contest, ContestMoss, ContestParticipation, ContestProblem, ContestSubmission, \ + ContestTag, Rating +from judge.models.interface import BlogPost, MiscConfig, NavigationBar, validate_regex +from judge.models.message import PrivateMessage, PrivateMessageThread +from judge.models.problem import LanguageLimit, License, Problem, ProblemClarification, ProblemGroup, \ + ProblemTranslation, ProblemType, Solution, TranslatedProblemForeignKeyQuerySet, TranslatedProblemQuerySet +from judge.models.problem_data import CHECKERS, ProblemData, ProblemTestCase, problem_data_storage, \ + problem_directory_file +from judge.models.profile import Organization, OrganizationRequest, Profile +from judge.models.runtime import Judge, Language, RuntimeVersion +from judge.models.submission import SUBMISSION_RESULT, Submission, SubmissionSource, SubmissionTestCase +from judge.models.ticket import Ticket, TicketMessage + +revisions.register(Profile, exclude=['points', 'last_access', 'ip', 'rating']) +revisions.register(Problem, follow=['language_limits']) +revisions.register(LanguageLimit) +revisions.register(Contest, follow=['contest_problems']) +revisions.register(ContestProblem) +revisions.register(Organization) +revisions.register(BlogPost) +revisions.register(Solution) +revisions.register(Judge, fields=['name', 'created', 'auth_key', 'description']) +revisions.register(Language) +revisions.register(Comment, fields=['author', 'time', 'page', 'score', 'body', 'hidden', 'parent']) +del revisions diff --git a/judge/models/choices.py b/judge/models/choices.py new file mode 100644 index 0000000..16c57de --- /dev/null +++ b/judge/models/choices.py @@ -0,0 +1,66 @@ +from collections import defaultdict +from operator import itemgetter + +import pytz +from django.utils.translation import gettext_lazy as _ + + +def make_timezones(): + data = defaultdict(list) + for tz in pytz.all_timezones: + if '/' in tz: + area, loc = tz.split('/', 1) + else: + area, loc = 'Other', tz + if not loc.startswith('GMT'): + data[area].append((tz, loc)) + return sorted(data.items(), key=itemgetter(0)) + + +TIMEZONE = make_timezones() +del make_timezones + +ACE_THEMES = ( + ('ambiance', 'Ambiance'), + ('chaos', 'Chaos'), + ('chrome', 'Chrome'), + ('clouds', 'Clouds'), + ('clouds_midnight', 'Clouds Midnight'), + ('cobalt', 'Cobalt'), + ('crimson_editor', 'Crimson Editor'), + ('dawn', 'Dawn'), + ('dreamweaver', 'Dreamweaver'), + ('eclipse', 'Eclipse'), + ('github', 'Github'), + ('idle_fingers', 'Idle Fingers'), + ('katzenmilch', 'Katzenmilch'), + ('kr_theme', 'KR Theme'), + ('kuroir', 'Kuroir'), + ('merbivore', 'Merbivore'), + ('merbivore_soft', 'Merbivore Soft'), + ('mono_industrial', 'Mono Industrial'), + ('monokai', 'Monokai'), + ('pastel_on_dark', 'Pastel on Dark'), + ('solarized_dark', 'Solarized Dark'), + ('solarized_light', 'Solarized Light'), + ('terminal', 'Terminal'), + ('textmate', 'Textmate'), + ('tomorrow', 'Tomorrow'), + ('tomorrow_night', 'Tomorrow Night'), + ('tomorrow_night_blue', 'Tomorrow Night Blue'), + ('tomorrow_night_bright', 'Tomorrow Night Bright'), + ('tomorrow_night_eighties', 'Tomorrow Night Eighties'), + ('twilight', 'Twilight'), + ('vibrant_ink', 'Vibrant Ink'), + ('xcode', 'XCode'), +) + +MATH_ENGINES_CHOICES = ( + ('tex', _('Leave as LaTeX')), + ('svg', _('SVG with PNG fallback')), + ('mml', _('MathML only')), + ('jax', _('MathJax with SVG/PNG fallback')), + ('auto', _('Detect best quality')), +) + +EFFECTIVE_MATH_ENGINES = ('svg', 'mml', 'tex', 'jax') diff --git a/judge/models/comment.py b/judge/models/comment.py new file mode 100644 index 0000000..d14d613 --- /dev/null +++ b/judge/models/comment.py @@ -0,0 +1,185 @@ +import itertools + +from django.contrib.contenttypes.fields import GenericRelation +from django.core.cache import cache +from django.core.exceptions import ObjectDoesNotExist +from django.core.validators import RegexValidator +from django.db import models +from django.db.models import CASCADE +from django.urls import reverse +from django.utils.functional import cached_property +from django.utils.translation import gettext_lazy as _ +from mptt.fields import TreeForeignKey +from mptt.models import MPTTModel +from reversion.models import Version + +from judge.models.contest import Contest +from judge.models.interface import BlogPost +from judge.models.problem import Problem +from judge.models.profile import Profile +from judge.utils.cachedict import CacheDict + +__all__ = ['Comment', 'CommentLock', 'CommentVote'] + +comment_validator = RegexValidator(r'^[pcs]:[a-z0-9]+$|^b:\d+$', + _(r'Page code must be ^[pcs]:[a-z0-9]+$|^b:\d+$')) + + +class VersionRelation(GenericRelation): + def __init__(self): + super(VersionRelation, self).__init__(Version, object_id_field='object_id') + + def get_extra_restriction(self, where_class, alias, remote_alias): + cond = super(VersionRelation, self).get_extra_restriction(where_class, alias, remote_alias) + field = self.remote_field.model._meta.get_field('db') + lookup = field.get_lookup('exact')(field.get_col(remote_alias), 'default') + cond.add(lookup, 'AND') + return cond + + +class Comment(MPTTModel): + author = models.ForeignKey(Profile, verbose_name=_('commenter'), on_delete=CASCADE) + time = models.DateTimeField(verbose_name=_('posted time'), auto_now_add=True) + page = models.CharField(max_length=30, verbose_name=_('associated page'), db_index=True, + validators=[comment_validator]) + score = models.IntegerField(verbose_name=_('votes'), default=0) + body = models.TextField(verbose_name=_('body of comment'), max_length=8192) + hidden = models.BooleanField(verbose_name=_('hide the comment'), default=0) + parent = TreeForeignKey('self', verbose_name=_('parent'), null=True, blank=True, related_name='replies', + on_delete=CASCADE) + versions = VersionRelation() + + class Meta: + verbose_name = _('comment') + verbose_name_plural = _('comments') + + class MPTTMeta: + order_insertion_by = ['-time'] + + @classmethod + def most_recent(cls, user, n, batch=None): + queryset = cls.objects.filter(hidden=False).select_related('author__user') \ + .defer('author__about', 'body').order_by('-id') + + problem_access = CacheDict(lambda code: Problem.objects.get(code=code).is_accessible_by(user)) + contest_access = CacheDict(lambda key: Contest.objects.get(key=key).is_accessible_by(user)) + blog_access = CacheDict(lambda id: BlogPost.objects.get(id=id).can_see(user)) + + if user.is_superuser: + return queryset[:n] + if batch is None: + batch = 2 * n + output = [] + for i in itertools.count(0): + slice = queryset[i * batch:i * batch + batch] + if not slice: + break + for comment in slice: + if comment.page.startswith('p:') or comment.page.startswith('s:'): + try: + if problem_access[comment.page[2:]]: + output.append(comment) + except Problem.DoesNotExist: + pass + elif comment.page.startswith('c:'): + try: + if contest_access[comment.page[2:]]: + output.append(comment) + except Contest.DoesNotExist: + pass + elif comment.page.startswith('b:'): + try: + if blog_access[comment.page[2:]]: + output.append(comment) + except BlogPost.DoesNotExist: + pass + else: + output.append(comment) + if len(output) >= n: + return output + return output + + @cached_property + def link(self): + try: + link = None + if self.page.startswith('p:'): + link = reverse('problem_detail', args=(self.page[2:],)) + elif self.page.startswith('c:'): + link = reverse('contest_view', args=(self.page[2:],)) + elif self.page.startswith('b:'): + key = 'blog_slug:%s' % self.page[2:] + slug = cache.get(key) + if slug is None: + try: + slug = BlogPost.objects.get(id=self.page[2:]).slug + except ObjectDoesNotExist: + slug = '' + cache.set(key, slug, 3600) + link = reverse('blog_post', args=(self.page[2:], slug)) + elif self.page.startswith('s:'): + link = reverse('problem_editorial', args=(self.page[2:],)) + except Exception: + link = 'invalid' + return link + + @classmethod + def get_page_title(cls, page): + try: + if page.startswith('p:'): + return Problem.objects.values_list('name', flat=True).get(code=page[2:]) + elif page.startswith('c:'): + return Contest.objects.values_list('name', flat=True).get(key=page[2:]) + elif page.startswith('b:'): + return BlogPost.objects.values_list('title', flat=True).get(id=page[2:]) + elif page.startswith('s:'): + return _('Editorial for %s') % Problem.objects.values_list('name', flat=True).get(code=page[2:]) + return '' + except ObjectDoesNotExist: + return '' + + @cached_property + def page_title(self): + return self.get_page_title(self.page) + + def get_absolute_url(self): + return '%s#comment-%d' % (self.link, self.id) + + def __str__(self): + return '%(page)s by %(user)s' % {'page': self.page, 'user': self.author.user.username} + + # Only use this when queried with + # .prefetch_related(Prefetch('votes', queryset=CommentVote.objects.filter(voter_id=profile_id))) + # It's rather stupid to put a query specific property on the model, but the alternative requires + # digging Django internals, and could not be guaranteed to work forever. + # Hence it is left here for when the alternative breaks. + # @property + # def vote_score(self): + # queryset = self.votes.all() + # if not queryset: + # return 0 + # return queryset[0].score + + +class CommentVote(models.Model): + voter = models.ForeignKey(Profile, related_name='voted_comments', on_delete=CASCADE) + comment = models.ForeignKey(Comment, related_name='votes', on_delete=CASCADE) + score = models.IntegerField() + + class Meta: + unique_together = ['voter', 'comment'] + verbose_name = _('comment vote') + verbose_name_plural = _('comment votes') + + +class CommentLock(models.Model): + page = models.CharField(max_length=30, verbose_name=_('associated page'), db_index=True, + validators=[comment_validator]) + + class Meta: + permissions = ( + ('override_comment_lock', _('Override comment lock')), + ) + + def __str__(self): + return str(self.page) diff --git a/judge/models/contest.py b/judge/models/contest.py new file mode 100644 index 0000000..d5fb697 --- /dev/null +++ b/judge/models/contest.py @@ -0,0 +1,412 @@ +from django.core.exceptions import ValidationError +from django.core.validators import MinValueValidator, RegexValidator +from django.db import models, transaction +from django.db.models import CASCADE +from django.urls import reverse +from django.utils import timezone +from django.utils.functional import cached_property +from django.utils.translation import gettext, gettext_lazy as _ +from jsonfield import JSONField +from moss import MOSS_LANG_C, MOSS_LANG_CC, MOSS_LANG_JAVA, MOSS_LANG_PYTHON + +from judge import contest_format +from judge.models.problem import Problem +from judge.models.profile import Organization, Profile +from judge.models.submission import Submission +from judge.ratings import rate_contest + +__all__ = ['Contest', 'ContestTag', 'ContestParticipation', 'ContestProblem', 'ContestSubmission', 'Rating'] + + +class ContestTag(models.Model): + color_validator = RegexValidator('^#(?:[A-Fa-f0-9]{3}){1,2}$', _('Invalid colour.')) + + name = models.CharField(max_length=20, verbose_name=_('tag name'), unique=True, + validators=[RegexValidator(r'^[a-z-]+$', message=_('Lowercase letters and hyphens only.'))]) + color = models.CharField(max_length=7, verbose_name=_('tag colour'), validators=[color_validator]) + description = models.TextField(verbose_name=_('tag description'), blank=True) + + def __str__(self): + return self.name + + def get_absolute_url(self): + return reverse('contest_tag', args=[self.name]) + + @property + def text_color(self, cache={}): + if self.color not in cache: + if len(self.color) == 4: + r, g, b = [ord(bytes.fromhex(i * 2)) for i in self.color[1:]] + else: + r, g, b = [i for i in bytes.fromhex(self.color[1:])] + cache[self.color] = '#000' if 299 * r + 587 * g + 144 * b > 140000 else '#fff' + return cache[self.color] + + class Meta: + verbose_name = _('contest tag') + verbose_name_plural = _('contest tags') + + +class Contest(models.Model): + key = models.CharField(max_length=20, verbose_name=_('contest id'), unique=True, + validators=[RegexValidator('^[a-z0-9]+$', _('Contest id must be ^[a-z0-9]+$'))]) + name = models.CharField(max_length=100, verbose_name=_('contest name'), db_index=True) + organizers = models.ManyToManyField(Profile, help_text=_('These people will be able to edit the contest.'), + related_name='organizers+') + description = models.TextField(verbose_name=_('description'), blank=True) + problems = models.ManyToManyField(Problem, verbose_name=_('problems'), through='ContestProblem') + start_time = models.DateTimeField(verbose_name=_('start time'), db_index=True) + end_time = models.DateTimeField(verbose_name=_('end time'), db_index=True) + time_limit = models.DurationField(verbose_name=_('time limit'), blank=True, null=True) + is_visible = models.BooleanField(verbose_name=_('publicly visible'), default=False, + help_text=_('Should be set even for organization-private contests, where it ' + 'determines whether the contest is visible to members of the ' + 'specified organizations.')) + is_rated = models.BooleanField(verbose_name=_('contest rated'), help_text=_('Whether this contest can be rated.'), + default=False) + hide_scoreboard = models.BooleanField(verbose_name=_('hide scoreboard'), + help_text=_('Whether the scoreboard should remain hidden for the duration ' + 'of the contest.'), + default=False) + use_clarifications = models.BooleanField(verbose_name=_('no comments'), + help_text=_("Use clarification system instead of comments."), + default=True) + rating_floor = models.IntegerField(verbose_name=('rating floor'), help_text=_('Rating floor for contest'), + null=True, blank=True) + rating_ceiling = models.IntegerField(verbose_name=('rating ceiling'), help_text=_('Rating ceiling for contest'), + null=True, blank=True) + rate_all = models.BooleanField(verbose_name=_('rate all'), help_text=_('Rate all users who joined.'), default=False) + rate_exclude = models.ManyToManyField(Profile, verbose_name=_('exclude from ratings'), blank=True, + related_name='rate_exclude+') + is_private = models.BooleanField(verbose_name=_('private to specific users'), default=False) + private_contestants = models.ManyToManyField(Profile, blank=True, verbose_name=_('private contestants'), + help_text=_('If private, only these users may see the contest'), + related_name='private_contestants+') + hide_problem_tags = models.BooleanField(verbose_name=_('hide problem tags'), + help_text=_('Whether problem tags should be hidden by default.'), + default=False) + run_pretests_only = models.BooleanField(verbose_name=_('run pretests only'), + help_text=_('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.'), + default=False) + is_organization_private = models.BooleanField(verbose_name=_('private to organizations'), default=False) + organizations = models.ManyToManyField(Organization, blank=True, verbose_name=_('organizations'), + help_text=_('If private, only these organizations may see the contest')) + og_image = models.CharField(verbose_name=_('OpenGraph image'), default='', max_length=150, blank=True) + logo_override_image = models.CharField(verbose_name=_('Logo override image'), default='', max_length=150, + blank=True, + help_text=_('This image will replace the default site logo for users ' + 'inside the contest.')) + tags = models.ManyToManyField(ContestTag, verbose_name=_('contest tags'), blank=True, related_name='contests') + user_count = models.IntegerField(verbose_name=_('the amount of live participants'), default=0) + summary = models.TextField(blank=True, verbose_name=_('contest summary'), + help_text=_('Plain-text, shown in meta description tag, e.g. for social media.')) + access_code = models.CharField(verbose_name=_('access code'), blank=True, default='', max_length=255, + help_text=_('An optional code to prompt contestants before they are allowed ' + 'to join the contest. Leave it blank to disable.')) + banned_users = models.ManyToManyField(Profile, verbose_name=_('personae non gratae'), blank=True, + help_text=_('Bans the selected users from joining this contest.')) + format_name = models.CharField(verbose_name=_('contest format'), default='default', max_length=32, + choices=contest_format.choices(), help_text=_('The contest format module to use.')) + format_config = JSONField(verbose_name=_('contest format configuration'), null=True, blank=True, + help_text=_('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.')) + + @cached_property + def format_class(self): + return contest_format.formats[self.format_name] + + @cached_property + def format(self): + return self.format_class(self, self.format_config) + + def clean(self): + # Django will complain if you didn't fill in start_time or end_time, so we don't have to. + if self.start_time and self.end_time and self.start_time >= self.end_time: + raise ValidationError('What is this? A contest that ended before it starts?') + self.format_class.validate(self.format_config) + + def is_in_contest(self, user): + if user.is_authenticated: + profile = user.profile + return profile and profile.current_contest is not None and profile.current_contest.contest == self + return False + + def can_see_scoreboard(self, user): + if user.has_perm('judge.see_private_contest'): + return True + if user.is_authenticated and self.organizers.filter(id=user.profile.id).exists(): + return True + if not self.is_visible: + return False + if self.start_time is not None and self.start_time > timezone.now(): + return False + if self.hide_scoreboard and not self.is_in_contest(user) and self.end_time > timezone.now(): + return False + return True + + @property + def contest_window_length(self): + return self.end_time - self.start_time + + @cached_property + def _now(self): + # This ensures that all methods talk about the same now. + return timezone.now() + + @cached_property + def can_join(self): + return self.start_time <= self._now + + @property + def time_before_start(self): + if self.start_time >= self._now: + return self.start_time - self._now + else: + return None + + @property + def time_before_end(self): + if self.end_time >= self._now: + return self.end_time - self._now + else: + return None + + @cached_property + def ended(self): + return self.end_time < self._now + + def __str__(self): + return self.name + + def get_absolute_url(self): + return reverse('contest_view', args=(self.key,)) + + def update_user_count(self): + self.user_count = self.users.filter(virtual=0).count() + self.save() + + update_user_count.alters_data = True + + @cached_property + def show_scoreboard(self): + if self.hide_scoreboard and not self.ended: + return False + return True + + def is_accessible_by(self, user): + # Contest is publicly visible + if self.is_visible: + # Contest is not private + if not self.is_private and not self.is_organization_private: + return True + if user.is_authenticated: + # User is in the organizations it is private to + if self.organizations.filter(id__in=user.profile.organizations.all()).exists(): + return True + # User is in the group of private contestants + if self.private_contestants.filter(id=user.profile.id).exists(): + return True + + # If the user can view all contests + if user.has_perm('judge.see_private_contest'): + return True + + # User can edit the contest + return self.is_editable_by(user) + + def is_editable_by(self, user): + # If the user can edit all contests + if user.has_perm('judge.edit_all_contest'): + return True + + # If the user is a contest organizer + if user.has_perm('judge.edit_own_contest') and \ + self.organizers.filter(id=user.profile.id).exists(): + return True + + return False + + def rate(self): + Rating.objects.filter(contest__end_time__gte=self.end_time).delete() + for contest in Contest.objects.filter(is_rated=True, end_time__gte=self.end_time).order_by('end_time'): + rate_contest(contest) + + class Meta: + permissions = ( + ('see_private_contest', _('See private contests')), + ('edit_own_contest', _('Edit own contests')), + ('edit_all_contest', _('Edit all contests')), + ('clone_contest', _('Clone contest')), + ('moss_contest', _('MOSS contest')), + ('contest_rating', _('Rate contests')), + ('contest_access_code', _('Contest access codes')), + ('create_private_contest', _('Create private contests')), + ) + verbose_name = _('contest') + verbose_name_plural = _('contests') + + +class ContestParticipation(models.Model): + LIVE = 0 + SPECTATE = -1 + + contest = models.ForeignKey(Contest, verbose_name=_('associated contest'), related_name='users', on_delete=CASCADE) + user = models.ForeignKey(Profile, verbose_name=_('user'), related_name='contest_history', on_delete=CASCADE) + real_start = models.DateTimeField(verbose_name=_('start time'), default=timezone.now, db_column='start') + score = models.IntegerField(verbose_name=_('score'), default=0, db_index=True) + cumtime = models.PositiveIntegerField(verbose_name=_('cumulative time'), default=0) + is_disqualified = models.BooleanField(verbose_name=_('is disqualified'), default=False, + help_text=_('Whether this participation is disqualified.')) + virtual = models.IntegerField(verbose_name=_('virtual participation id'), default=LIVE, + help_text=_('0 means non-virtual, otherwise the n-th virtual participation.')) + format_data = JSONField(verbose_name=_('contest format specific data'), null=True, blank=True) + + def recompute_results(self): + with transaction.atomic(): + self.contest.format.update_participation(self) + if self.is_disqualified: + self.score = -9999 + self.save(update_fields=['score']) + recompute_results.alters_data = True + + def set_disqualified(self, disqualified): + self.is_disqualified = disqualified + self.recompute_results() + if self.contest.is_rated and self.contest.ratings.exists(): + self.contest.rate() + if self.is_disqualified: + if self.user.current_contest == self: + self.user.remove_contest() + self.contest.banned_users.add(self.user) + else: + self.contest.banned_users.remove(self.user) + set_disqualified.alters_data = True + + @property + def live(self): + return self.virtual == self.LIVE + + @property + def spectate(self): + return self.virtual == self.SPECTATE + + @cached_property + def start(self): + contest = self.contest + return contest.start_time if contest.time_limit is None and (self.live or self.spectate) else self.real_start + + @cached_property + def end_time(self): + contest = self.contest + if self.spectate: + return contest.end_time + if self.virtual: + if contest.time_limit: + return self.real_start + contest.time_limit + else: + return self.real_start + (contest.end_time - contest.start_time) + return contest.end_time if contest.time_limit is None else \ + min(self.real_start + contest.time_limit, contest.end_time) + + @cached_property + def _now(self): + # This ensures that all methods talk about the same now. + return timezone.now() + + @property + def ended(self): + return self.end_time is not None and self.end_time < self._now + + @property + def time_remaining(self): + end = self.end_time + if end is not None and end >= self._now: + return end - self._now + + def __str__(self): + if self.spectate: + return gettext('%s spectating in %s') % (self.user.username, self.contest.name) + if self.virtual: + return gettext('%s in %s, v%d') % (self.user.username, self.contest.name, self.virtual) + return gettext('%s in %s') % (self.user.username, self.contest.name) + + class Meta: + verbose_name = _('contest participation') + verbose_name_plural = _('contest participations') + + unique_together = ('contest', 'user', 'virtual') + + +class ContestProblem(models.Model): + problem = models.ForeignKey(Problem, verbose_name=_('problem'), related_name='contests', on_delete=CASCADE) + contest = models.ForeignKey(Contest, verbose_name=_('contest'), related_name='contest_problems', on_delete=CASCADE) + points = models.IntegerField(verbose_name=_('points')) + partial = models.BooleanField(default=True, verbose_name=_('partial')) + is_pretested = models.BooleanField(default=False, verbose_name=_('is pretested')) + order = models.PositiveIntegerField(db_index=True, verbose_name=_('order')) + output_prefix_override = models.IntegerField(verbose_name=_('output prefix length override'), null=True, blank=True) + max_submissions = models.IntegerField(help_text=_('Maximum number of submissions for this problem, ' + 'or 0 for no limit.'), default=0, + validators=[MinValueValidator(0, _('Why include a problem you ' + 'can\'t submit to?'))]) + + class Meta: + unique_together = ('problem', 'contest') + verbose_name = _('contest problem') + verbose_name_plural = _('contest problems') + + +class ContestSubmission(models.Model): + submission = models.OneToOneField(Submission, verbose_name=_('submission'), + related_name='contest', on_delete=CASCADE) + problem = models.ForeignKey(ContestProblem, verbose_name=_('problem'), on_delete=CASCADE, + related_name='submissions', related_query_name='submission') + participation = models.ForeignKey(ContestParticipation, verbose_name=_('participation'), on_delete=CASCADE, + related_name='submissions', related_query_name='submission') + points = models.FloatField(default=0.0, verbose_name=_('points')) + is_pretest = models.BooleanField(verbose_name=_('is pretested'), + help_text=_('Whether this submission was ran only on pretests.'), + default=False) + + class Meta: + verbose_name = _('contest submission') + verbose_name_plural = _('contest submissions') + + +class Rating(models.Model): + user = models.ForeignKey(Profile, verbose_name=_('user'), related_name='ratings', on_delete=CASCADE) + contest = models.ForeignKey(Contest, verbose_name=_('contest'), related_name='ratings', on_delete=CASCADE) + participation = models.OneToOneField(ContestParticipation, verbose_name=_('participation'), + related_name='rating', on_delete=CASCADE) + rank = models.IntegerField(verbose_name=_('rank')) + rating = models.IntegerField(verbose_name=_('rating')) + volatility = models.IntegerField(verbose_name=_('volatility')) + last_rated = models.DateTimeField(db_index=True, verbose_name=_('last rated')) + + class Meta: + unique_together = ('user', 'contest') + verbose_name = _('contest rating') + verbose_name_plural = _('contest ratings') + + +class ContestMoss(models.Model): + LANG_MAPPING = [ + ('C', MOSS_LANG_C), + ('C++', MOSS_LANG_CC), + ('Java', MOSS_LANG_JAVA), + ('Python', MOSS_LANG_PYTHON), + ] + + contest = models.ForeignKey(Contest, verbose_name=_('contest'), related_name='moss', on_delete=CASCADE) + problem = models.ForeignKey(Problem, verbose_name=_('problem'), related_name='moss', on_delete=CASCADE) + language = models.CharField(max_length=10) + submission_count = models.PositiveIntegerField(default=0) + url = models.URLField(null=True, blank=True) + + class Meta: + unique_together = ('contest', 'problem', 'language') + verbose_name = _('contest moss result') + verbose_name_plural = _('contest moss results') diff --git a/judge/models/interface.py b/judge/models/interface.py new file mode 100644 index 0000000..ed25d63 --- /dev/null +++ b/judge/models/interface.py @@ -0,0 +1,94 @@ +import re + +from django.core.exceptions import ValidationError +from django.db import models +from django.urls import reverse +from django.utils import timezone +from django.utils.translation import gettext_lazy as _ +from mptt.fields import TreeForeignKey +from mptt.models import MPTTModel + +from judge.models.profile import Profile + +__all__ = ['MiscConfig', 'validate_regex', 'NavigationBar', 'BlogPost'] + + +class MiscConfig(models.Model): + key = models.CharField(max_length=30, db_index=True) + value = models.TextField(blank=True) + + def __str__(self): + return self.key + + class Meta: + verbose_name = _('configuration item') + verbose_name_plural = _('miscellaneous configuration') + + +def validate_regex(regex): + try: + re.compile(regex, re.VERBOSE) + except re.error as e: + raise ValidationError('Invalid regex: %s' % e.message) + + +class NavigationBar(MPTTModel): + class Meta: + verbose_name = _('navigation item') + verbose_name_plural = _('navigation bar') + + class MPTTMeta: + order_insertion_by = ['order'] + + order = models.PositiveIntegerField(db_index=True, verbose_name=_('order')) + key = models.CharField(max_length=10, unique=True, verbose_name=_('identifier')) + label = models.CharField(max_length=20, verbose_name=_('label')) + path = models.CharField(max_length=255, verbose_name=_('link path')) + regex = models.TextField(verbose_name=_('highlight regex'), validators=[validate_regex]) + parent = TreeForeignKey('self', verbose_name=_('parent item'), null=True, blank=True, + related_name='children', on_delete=models.CASCADE) + + def __str__(self): + return self.label + + @property + def pattern(self, cache={}): + # A cache with a bad policy is an alias for memory leak + # Thankfully, there will never be too many regexes to cache. + if self.regex in cache: + return cache[self.regex] + else: + pattern = cache[self.regex] = re.compile(self.regex, re.VERBOSE) + return pattern + + +class BlogPost(models.Model): + title = models.CharField(verbose_name=_('post title'), max_length=100) + authors = models.ManyToManyField(Profile, verbose_name=_('authors'), blank=True) + slug = models.SlugField(verbose_name=_('slug')) + visible = models.BooleanField(verbose_name=_('public visibility'), default=False) + sticky = models.BooleanField(verbose_name=_('sticky'), default=False) + publish_on = models.DateTimeField(verbose_name=_('publish after')) + content = models.TextField(verbose_name=_('post content')) + summary = models.TextField(verbose_name=_('post summary'), blank=True) + og_image = models.CharField(verbose_name=_('openGraph image'), default='', max_length=150, blank=True) + + def __str__(self): + return self.title + + def get_absolute_url(self): + return reverse('blog_post', args=(self.id, self.slug)) + + def can_see(self, user): + if self.visible and self.publish_on <= timezone.now(): + return True + if user.has_perm('judge.edit_all_post'): + return True + return user.is_authenticated and self.authors.filter(id=user.profile.id).exists() + + class Meta: + permissions = ( + ('edit_all_post', _('Edit all posts')), + ) + verbose_name = _('blog post') + verbose_name_plural = _('blog posts') diff --git a/judge/models/message.py b/judge/models/message.py new file mode 100644 index 0000000..541d63f --- /dev/null +++ b/judge/models/message.py @@ -0,0 +1,20 @@ +from django.db import models +from django.db.models import CASCADE +from django.utils.translation import gettext_lazy as _ + +from judge.models.profile import Profile + +__all__ = ['PrivateMessage', 'PrivateMessageThread'] + + +class PrivateMessage(models.Model): + title = models.CharField(verbose_name=_('message title'), max_length=50) + content = models.TextField(verbose_name=_('message body')) + sender = models.ForeignKey(Profile, verbose_name=_('sender'), related_name='sent_messages', on_delete=CASCADE) + target = models.ForeignKey(Profile, verbose_name=_('target'), related_name='received_messages', on_delete=CASCADE) + timestamp = models.DateTimeField(verbose_name=_('message timestamp'), auto_now_add=True) + read = models.BooleanField(verbose_name=_('read'), default=False) + + +class PrivateMessageThread(models.Model): + messages = models.ManyToManyField(PrivateMessage, verbose_name=_('messages in the thread')) diff --git a/judge/models/problem.py b/judge/models/problem.py new file mode 100644 index 0000000..a469ef6 --- /dev/null +++ b/judge/models/problem.py @@ -0,0 +1,413 @@ +from operator import attrgetter + +from django.conf import settings +from django.contrib.contenttypes.fields import GenericRelation +from django.core.cache import cache +from django.core.validators import MaxValueValidator, MinValueValidator, RegexValidator +from django.db import models +from django.db.models import CASCADE, F, QuerySet, SET_NULL +from django.db.models.expressions import RawSQL +from django.db.models.functions import Coalesce +from django.urls import reverse +from django.utils.functional import cached_property +from django.utils.translation import gettext_lazy as _ + +from judge.fulltext import SearchQuerySet +from judge.models.profile import Organization, Profile +from judge.models.runtime import Language +from judge.user_translations import gettext as user_gettext +from judge.utils.raw_sql import RawSQLColumn, unique_together_left_join + +__all__ = ['ProblemGroup', 'ProblemType', 'Problem', 'ProblemTranslation', 'ProblemClarification', + 'License', 'Solution', 'TranslatedProblemQuerySet', 'TranslatedProblemForeignKeyQuerySet'] + + +class ProblemType(models.Model): + name = models.CharField(max_length=20, verbose_name=_('problem category ID'), unique=True) + full_name = models.CharField(max_length=100, verbose_name=_('problem category name')) + + def __str__(self): + return self.full_name + + class Meta: + ordering = ['full_name'] + verbose_name = _('problem type') + verbose_name_plural = _('problem types') + + +class ProblemGroup(models.Model): + name = models.CharField(max_length=20, verbose_name=_('problem group ID'), unique=True) + full_name = models.CharField(max_length=100, verbose_name=_('problem group name')) + + def __str__(self): + return self.full_name + + class Meta: + ordering = ['full_name'] + verbose_name = _('problem group') + verbose_name_plural = _('problem groups') + + +class License(models.Model): + key = models.CharField(max_length=20, unique=True, verbose_name=_('key'), + validators=[RegexValidator(r'^[-\w.]+$', r'License key must be ^[-\w.]+$')]) + link = models.CharField(max_length=256, verbose_name=_('link')) + name = models.CharField(max_length=256, verbose_name=_('full name')) + display = models.CharField(max_length=256, blank=True, verbose_name=_('short name'), + help_text=_('Displayed on pages under this license')) + icon = models.CharField(max_length=256, blank=True, verbose_name=_('icon'), help_text=_('URL to the icon')) + text = models.TextField(verbose_name=_('license text')) + + def __str__(self): + return self.name + + def get_absolute_url(self): + return reverse('license', args=(self.key,)) + + class Meta: + verbose_name = _('license') + verbose_name_plural = _('licenses') + + +class TranslatedProblemQuerySet(SearchQuerySet): + def __init__(self, **kwargs): + super(TranslatedProblemQuerySet, self).__init__(('code', 'name', 'description'), **kwargs) + + def add_i18n_name(self, language): + queryset = self._clone() + alias = unique_together_left_join(queryset, ProblemTranslation, 'problem', 'language', language) + return queryset.annotate(i18n_name=Coalesce(RawSQL('%s.name' % alias, ()), F('name'), + output_field=models.CharField())) + + +class TranslatedProblemForeignKeyQuerySet(QuerySet): + def add_problem_i18n_name(self, key, language, name_field=None): + queryset = self._clone() if name_field is None else self.annotate(_name=F(name_field)) + alias = unique_together_left_join(queryset, ProblemTranslation, 'problem', 'language', language, + parent_model=Problem) + # You must specify name_field if Problem is not yet joined into the QuerySet. + kwargs = {key: Coalesce(RawSQL('%s.name' % alias, ()), + F(name_field) if name_field else RawSQLColumn(Problem, 'name'), + output_field=models.CharField())} + return queryset.annotate(**kwargs) + + +class Problem(models.Model): + code = models.CharField(max_length=20, verbose_name=_('problem code'), unique=True, + validators=[RegexValidator('^[a-z0-9]+$', _('Problem code must be ^[a-z0-9]+$'))], + help_text=_('A short, unique code for the problem, ' + 'used in the url after /problem/')) + name = models.CharField(max_length=100, verbose_name=_('problem name'), db_index=True, + help_text=_('The full name of the problem, ' + 'as shown in the problem list.')) + description = models.TextField(verbose_name=_('problem body')) + authors = models.ManyToManyField(Profile, verbose_name=_('creators'), blank=True, related_name='authored_problems', + help_text=_('These users will be able to edit the problem, ' + 'and be listed as authors.')) + curators = models.ManyToManyField(Profile, verbose_name=_('curators'), blank=True, related_name='curated_problems', + help_text=_('These users will be able to edit the problem, ' + 'but not be listed as authors.')) + testers = models.ManyToManyField(Profile, verbose_name=_('testers'), blank=True, related_name='tested_problems', + help_text=_( + 'These users will be able to view the private problem, but not edit it.')) + types = models.ManyToManyField(ProblemType, verbose_name=_('problem types'), + help_text=_('The type of problem, ' + "as shown on the problem's page.")) + group = models.ForeignKey(ProblemGroup, verbose_name=_('problem group'), on_delete=CASCADE, + help_text=_('The group of problem, shown under Category in the problem list.')) + time_limit = models.FloatField(verbose_name=_('time limit'), + help_text=_('The time limit for this problem, in seconds. ' + 'Fractional seconds (e.g. 1.5) are supported.'), + validators=[MinValueValidator(settings.DMOJ_PROBLEM_MIN_TIME_LIMIT), + MaxValueValidator(settings.DMOJ_PROBLEM_MAX_TIME_LIMIT)]) + memory_limit = models.PositiveIntegerField(verbose_name=_('memory limit'), + help_text=_('The memory limit for this problem, in kilobytes ' + '(e.g. 64mb = 65536 kilobytes).'), + validators=[MinValueValidator(settings.DMOJ_PROBLEM_MIN_MEMORY_LIMIT), + MaxValueValidator(settings.DMOJ_PROBLEM_MAX_MEMORY_LIMIT)]) + short_circuit = models.BooleanField(default=False) + points = models.FloatField(verbose_name=_('points'), + help_text=_('Points awarded for problem completion. ' + "Points are displayed with a 'p' suffix if partial."), + validators=[MinValueValidator(settings.DMOJ_PROBLEM_MIN_PROBLEM_POINTS)]) + partial = models.BooleanField(verbose_name=_('allows partial points'), default=False) + allowed_languages = models.ManyToManyField(Language, verbose_name=_('allowed languages'), + help_text=_('List of allowed submission languages.')) + is_public = models.BooleanField(verbose_name=_('publicly visible'), db_index=True, default=False) + is_manually_managed = models.BooleanField(verbose_name=_('manually managed'), db_index=True, default=False, + help_text=_('Whether judges should be allowed to manage data or not.')) + date = models.DateTimeField(verbose_name=_('date of publishing'), null=True, blank=True, db_index=True, + help_text=_("Doesn't have magic ability to auto-publish due to backward compatibility")) + banned_users = models.ManyToManyField(Profile, verbose_name=_('personae non gratae'), blank=True, + help_text=_('Bans the selected users from submitting to this problem.')) + license = models.ForeignKey(License, null=True, blank=True, on_delete=SET_NULL, + help_text=_('The license under which this problem is published.')) + og_image = models.CharField(verbose_name=_('OpenGraph image'), max_length=150, blank=True) + summary = models.TextField(blank=True, verbose_name=_('problem summary'), + help_text=_('Plain-text, shown in meta description tag, e.g. for social media.')) + user_count = models.IntegerField(verbose_name=_('number of users'), default=0, + help_text=_('The number of users who solved the problem.')) + ac_rate = models.FloatField(verbose_name=_('solve rate'), default=0) + + objects = TranslatedProblemQuerySet.as_manager() + tickets = GenericRelation('Ticket') + + organizations = models.ManyToManyField(Organization, blank=True, verbose_name=_('organizations'), + help_text=_('If private, only these organizations may see the problem.')) + is_organization_private = models.BooleanField(verbose_name=_('private to organizations'), default=False) + + def __init__(self, *args, **kwargs): + super(Problem, self).__init__(*args, **kwargs) + self._translated_name_cache = {} + self._i18n_name = None + self.__original_code = self.code + + @cached_property + def types_list(self): + return list(map(user_gettext, map(attrgetter('full_name'), self.types.all()))) + + def languages_list(self): + return self.allowed_languages.values_list('common_name', flat=True).distinct().order_by('common_name') + + def is_editor(self, profile): + return (self.authors.filter(id=profile.id) | self.curators.filter(id=profile.id)).exists() + + def is_editable_by(self, user): + if not user.is_authenticated: + return False + if user.has_perm('judge.edit_all_problem') or user.has_perm('judge.edit_public_problem') and self.is_public: + return True + return user.has_perm('judge.edit_own_problem') and self.is_editor(user.profile) + + def is_accessible_by(self, user): + # Problem is public. + if self.is_public: + # Problem is not private to an organization. + if not self.is_organization_private: + return True + + # If the user can see all organization private problems. + if user.has_perm('judge.see_organization_problem'): + return True + + # If the user is in the organization. + if user.is_authenticated and \ + self.organizations.filter(id__in=user.profile.organizations.all()): + return True + + # If the user can view all problems. + if user.has_perm('judge.see_private_problem'): + return True + + if not user.is_authenticated: + return False + + # If the user authored the problem or is a curator. + if user.has_perm('judge.edit_own_problem') and self.is_editor(user.profile): + return True + + # If user is a tester. + if self.testers.filter(id=user.profile.id).exists(): + return True + + # If user is currently in a contest containing that problem. + current = user.profile.current_contest_id + if current is None: + return False + from judge.models import ContestProblem + return ContestProblem.objects.filter(problem_id=self.id, contest__users__id=current).exists() + + def is_subs_manageable_by(self, user): + return user.is_staff and user.has_perm('judge.rejudge_submission') and self.is_editable_by(user) + + def __str__(self): + return self.name + + def get_absolute_url(self): + return reverse('problem_detail', args=(self.code,)) + + @cached_property + def author_ids(self): + return self.authors.values_list('id', flat=True) + + @cached_property + def editor_ids(self): + return self.author_ids | self.curators.values_list('id', flat=True) + + @cached_property + def tester_ids(self): + return self.testers.values_list('id', flat=True) + + @cached_property + def usable_common_names(self): + return set(self.usable_languages.values_list('common_name', flat=True)) + + @property + def usable_languages(self): + return self.allowed_languages.filter(judges__in=self.judges.filter(online=True)).distinct() + + def translated_name(self, language): + if language in self._translated_name_cache: + return self._translated_name_cache[language] + # Hits database despite prefetch_related. + try: + name = self.translations.filter(language=language).values_list('name', flat=True)[0] + except IndexError: + name = self.name + self._translated_name_cache[language] = name + return name + + @property + def i18n_name(self): + if self._i18n_name is None: + self._i18n_name = self._trans[0].name if self._trans else self.name + return self._i18n_name + + @i18n_name.setter + def i18n_name(self, value): + self._i18n_name = value + + @property + def clarifications(self): + return ProblemClarification.objects.filter(problem=self) + + def update_stats(self): + self.user_count = self.submission_set.filter(points__gte=self.points, result='AC', + user__is_unlisted=False).values('user').distinct().count() + submissions = self.submission_set.count() + if submissions: + self.ac_rate = 100.0 * self.submission_set.filter(points__gte=self.points, result='AC', + user__is_unlisted=False).count() / submissions + else: + self.ac_rate = 0 + self.save() + + update_stats.alters_data = True + + def _get_limits(self, key): + global_limit = getattr(self, key) + limits = {limit['language_id']: (limit['language__name'], limit[key]) + for limit in self.language_limits.values('language_id', 'language__name', key) + if limit[key] != global_limit} + limit_ids = set(limits.keys()) + common = [] + + for cn, ids in Language.get_common_name_map().items(): + if ids - limit_ids: + continue + limit = set(limits[id][1] for id in ids) + if len(limit) == 1: + limit = next(iter(limit)) + common.append((cn, limit)) + for id in ids: + del limits[id] + + limits = list(limits.values()) + common + limits.sort() + return limits + + @property + def language_time_limit(self): + key = 'problem_tls:%d' % self.id + result = cache.get(key) + if result is not None: + return result + result = self._get_limits('time_limit') + cache.set(key, result) + return result + + @property + def language_memory_limit(self): + key = 'problem_mls:%d' % self.id + result = cache.get(key) + if result is not None: + return result + result = self._get_limits('memory_limit') + cache.set(key, result) + return result + + def save(self, *args, **kwargs): + super(Problem, self).save(*args, **kwargs) + if self.code != self.__original_code: + try: + problem_data = self.data_files + except AttributeError: + pass + else: + problem_data._update_code(self.__original_code, self.code) + + save.alters_data = True + + class Meta: + permissions = ( + ('see_private_problem', 'See hidden problems'), + ('edit_own_problem', 'Edit own problems'), + ('edit_all_problem', 'Edit all problems'), + ('edit_public_problem', 'Edit all public problems'), + ('clone_problem', 'Clone problem'), + ('change_public_visibility', 'Change is_public field'), + ('change_manually_managed', 'Change is_manually_managed field'), + ('see_organization_problem', 'See organization-private problems'), + ) + verbose_name = _('problem') + verbose_name_plural = _('problems') + + +class ProblemTranslation(models.Model): + problem = models.ForeignKey(Problem, verbose_name=_('problem'), related_name='translations', on_delete=CASCADE) + language = models.CharField(verbose_name=_('language'), max_length=7, choices=settings.LANGUAGES) + name = models.CharField(verbose_name=_('translated name'), max_length=100, db_index=True) + description = models.TextField(verbose_name=_('translated description')) + + class Meta: + unique_together = ('problem', 'language') + verbose_name = _('problem translation') + verbose_name_plural = _('problem translations') + + +class ProblemClarification(models.Model): + problem = models.ForeignKey(Problem, verbose_name=_('clarified problem'), on_delete=CASCADE) + description = models.TextField(verbose_name=_('clarification body')) + date = models.DateTimeField(verbose_name=_('clarification timestamp'), auto_now_add=True) + + +class LanguageLimit(models.Model): + problem = models.ForeignKey(Problem, verbose_name=_('problem'), related_name='language_limits', on_delete=CASCADE) + language = models.ForeignKey(Language, verbose_name=_('language'), on_delete=CASCADE) + time_limit = models.FloatField(verbose_name=_('time limit'), + validators=[MinValueValidator(settings.DMOJ_PROBLEM_MIN_TIME_LIMIT), + MaxValueValidator(settings.DMOJ_PROBLEM_MAX_TIME_LIMIT)]) + memory_limit = models.IntegerField(verbose_name=_('memory limit'), + validators=[MinValueValidator(settings.DMOJ_PROBLEM_MIN_MEMORY_LIMIT), + MaxValueValidator(settings.DMOJ_PROBLEM_MAX_MEMORY_LIMIT)]) + + class Meta: + unique_together = ('problem', 'language') + verbose_name = _('language-specific resource limit') + verbose_name_plural = _('language-specific resource limits') + + +class Solution(models.Model): + problem = models.OneToOneField(Problem, on_delete=SET_NULL, verbose_name=_('associated problem'), + null=True, blank=True, related_name='solution') + is_public = models.BooleanField(verbose_name=_('public visibility'), default=False) + publish_on = models.DateTimeField(verbose_name=_('publish date')) + authors = models.ManyToManyField(Profile, verbose_name=_('authors'), blank=True) + content = models.TextField(verbose_name=_('editorial content')) + + def get_absolute_url(self): + problem = self.problem + if problem is None: + return reverse('home') + else: + return reverse('problem_editorial', args=[problem.code]) + + def __str__(self): + return _('Editorial for %s') % self.problem.name + + class Meta: + permissions = ( + ('see_private_solution', 'See hidden solutions'), + ) + verbose_name = _('solution') + verbose_name_plural = _('solutions') diff --git a/judge/models/problem_data.py b/judge/models/problem_data.py new file mode 100644 index 0000000..8ae25b7 --- /dev/null +++ b/judge/models/problem_data.py @@ -0,0 +1,94 @@ +import errno +import os + +from django.db import models +from django.utils.translation import gettext_lazy as _ + +from judge.utils.problem_data import ProblemDataStorage + +__all__ = ['problem_data_storage', 'problem_directory_file', 'ProblemData', 'ProblemTestCase', 'CHECKERS'] + +problem_data_storage = ProblemDataStorage() + + +def _problem_directory_file(code, filename): + return os.path.join(code, os.path.basename(filename)) + + +def problem_directory_file(data, filename): + return _problem_directory_file(data.problem.code, filename) + + +CHECKERS = ( + ('standard', _('Standard')), + ('floats', _('Floats')), + ('floatsabs', _('Floats (absolute)')), + ('floatsrel', _('Floats (relative)')), + ('rstripped', _('Non-trailing spaces')), + ('sorted', _('Unordered')), + ('identical', _('Byte identical')), + ('linecount', _('Line-by-line')), +) + + +class ProblemData(models.Model): + problem = models.OneToOneField('Problem', verbose_name=_('problem'), related_name='data_files', + on_delete=models.CASCADE) + zipfile = models.FileField(verbose_name=_('data zip file'), storage=problem_data_storage, null=True, blank=True, + upload_to=problem_directory_file) + generator = models.FileField(verbose_name=_('generator file'), storage=problem_data_storage, null=True, blank=True, + upload_to=problem_directory_file) + output_prefix = models.IntegerField(verbose_name=_('output prefix length'), blank=True, null=True) + output_limit = models.IntegerField(verbose_name=_('output limit length'), blank=True, null=True) + feedback = models.TextField(verbose_name=_('init.yml generation feedback'), blank=True) + checker = models.CharField(max_length=10, verbose_name=_('checker'), choices=CHECKERS, blank=True) + checker_args = models.TextField(verbose_name=_('checker arguments'), blank=True, + help_text=_('checker arguments as a JSON object')) + + __original_zipfile = None + + def __init__(self, *args, **kwargs): + super(ProblemData, self).__init__(*args, **kwargs) + self.__original_zipfile = self.zipfile + + def save(self, *args, **kwargs): + if self.zipfile != self.__original_zipfile: + self.__original_zipfile.delete(save=False) + return super(ProblemData, self).save(*args, **kwargs) + + def has_yml(self): + return problem_data_storage.exists('%s/init.yml' % self.problem.code) + + def _update_code(self, original, new): + try: + problem_data_storage.rename(original, new) + except OSError as e: + if e.errno != errno.ENOENT: + raise + if self.zipfile: + self.zipfile.name = _problem_directory_file(new, self.zipfile.name) + if self.generator: + self.generator.name = _problem_directory_file(new, self.generator.name) + self.save() + _update_code.alters_data = True + + +class ProblemTestCase(models.Model): + dataset = models.ForeignKey('Problem', verbose_name=_('problem data set'), related_name='cases', + on_delete=models.CASCADE) + order = models.IntegerField(verbose_name=_('case position')) + type = models.CharField(max_length=1, verbose_name=_('case type'), + choices=(('C', _('Normal case')), + ('S', _('Batch start')), + ('E', _('Batch end'))), + default='C') + input_file = models.CharField(max_length=100, verbose_name=_('input file name'), blank=True) + output_file = models.CharField(max_length=100, verbose_name=_('output file name'), blank=True) + generator_args = models.TextField(verbose_name=_('generator arguments'), blank=True) + points = models.IntegerField(verbose_name=_('point value'), blank=True, null=True) + is_pretest = models.BooleanField(verbose_name=_('case is pretest?')) + output_prefix = models.IntegerField(verbose_name=_('output prefix length'), blank=True, null=True) + output_limit = models.IntegerField(verbose_name=_('output limit length'), blank=True, null=True) + checker = models.CharField(max_length=10, verbose_name=_('checker'), choices=CHECKERS, blank=True) + checker_args = models.TextField(verbose_name=_('checker arguments'), blank=True, + help_text=_('checker arguments as a JSON object')) diff --git a/judge/models/profile.py b/judge/models/profile.py new file mode 100644 index 0000000..9cf046c --- /dev/null +++ b/judge/models/profile.py @@ -0,0 +1,204 @@ +from operator import mul + +from django.conf import settings +from django.contrib.auth.models import User +from django.core.validators import RegexValidator +from django.db import models +from django.db.models import Max +from django.urls import reverse +from django.utils.functional import cached_property +from django.utils.timezone import now +from django.utils.translation import gettext_lazy as _ +from fernet_fields import EncryptedCharField +from sortedm2m.fields import SortedManyToManyField + +from judge.models.choices import ACE_THEMES, MATH_ENGINES_CHOICES, TIMEZONE +from judge.models.runtime import Language +from judge.ratings import rating_class + +__all__ = ['Organization', 'Profile', 'OrganizationRequest'] + + +class EncryptedNullCharField(EncryptedCharField): + def get_prep_value(self, value): + if not value: + return None + return super(EncryptedNullCharField, self).get_prep_value(value) + + +class Organization(models.Model): + name = models.CharField(max_length=128, verbose_name=_('organization title')) + slug = models.SlugField(max_length=128, verbose_name=_('organization slug'), + help_text=_('Organization name shown in URL')) + short_name = models.CharField(max_length=20, verbose_name=_('short name'), + help_text=_('Displayed beside user name during contests')) + about = models.TextField(verbose_name=_('organization description')) + registrant = models.ForeignKey('Profile', verbose_name=_('registrant'), on_delete=models.CASCADE, + related_name='registrant+', help_text=_('User who registered this organization')) + admins = models.ManyToManyField('Profile', verbose_name=_('administrators'), related_name='admin_of', + help_text=_('Those who can edit this organization')) + creation_date = models.DateTimeField(verbose_name=_('creation date'), auto_now_add=True) + is_open = models.BooleanField(verbose_name=_('is open organization?'), + help_text=_('Allow joining organization'), default=True) + slots = models.IntegerField(verbose_name=_('maximum size'), null=True, blank=True, + help_text=_('Maximum amount of users in this organization, ' + 'only applicable to private organizations')) + access_code = models.CharField(max_length=7, help_text=_('Student access code'), + verbose_name=_('access code'), null=True, blank=True) + logo_override_image = models.CharField(verbose_name=_('Logo override image'), default='', max_length=150, + blank=True, + help_text=_('This image will replace the default site logo for users ' + 'viewing the organization.')) + + def __contains__(self, item): + if isinstance(item, int): + return self.members.filter(id=item).exists() + elif isinstance(item, Profile): + return self.members.filter(id=item.id).exists() + else: + raise TypeError('Organization membership test must be Profile or primany key') + + def __str__(self): + return self.name + + def get_absolute_url(self): + return reverse('organization_home', args=(self.id, self.slug)) + + def get_users_url(self): + return reverse('organization_users', args=(self.id, self.slug)) + + class Meta: + ordering = ['name'] + permissions = ( + ('organization_admin', 'Administer organizations'), + ('edit_all_organization', 'Edit all organizations'), + ) + verbose_name = _('organization') + verbose_name_plural = _('organizations') + + +class Profile(models.Model): + user = models.OneToOneField(User, verbose_name=_('user associated'), on_delete=models.CASCADE) + about = models.TextField(verbose_name=_('self-description'), null=True, blank=True) + timezone = models.CharField(max_length=50, verbose_name=_('location'), choices=TIMEZONE, + default=settings.DEFAULT_USER_TIME_ZONE) + language = models.ForeignKey('Language', verbose_name=_('preferred language'), on_delete=models.SET_DEFAULT, + default=Language.get_default_language_pk) + points = models.FloatField(default=0, db_index=True) + performance_points = models.FloatField(default=0, db_index=True) + problem_count = models.IntegerField(default=0, db_index=True) + ace_theme = models.CharField(max_length=30, choices=ACE_THEMES, default='github') + last_access = models.DateTimeField(verbose_name=_('last access time'), default=now) + ip = models.GenericIPAddressField(verbose_name=_('last IP'), blank=True, null=True) + organizations = SortedManyToManyField(Organization, verbose_name=_('organization'), blank=True, + related_name='members', related_query_name='member') + display_rank = models.CharField(max_length=10, default='user', verbose_name=_('display rank'), + choices=(('user', 'Normal User'), ('setter', 'Problem Setter'), ('admin', 'Admin'))) + mute = models.BooleanField(verbose_name=_('comment mute'), help_text=_('Some users are at their best when silent.'), + default=False) + is_unlisted = models.BooleanField(verbose_name=_('unlisted user'), help_text=_('User will not be ranked.'), + default=False) + rating = models.IntegerField(null=True, default=None) + user_script = models.TextField(verbose_name=_('user script'), default='', blank=True, max_length=65536, + help_text=_('User-defined JavaScript for site customization.')) + current_contest = models.OneToOneField('ContestParticipation', verbose_name=_('current contest'), + null=True, blank=True, related_name='+', on_delete=models.SET_NULL) + math_engine = models.CharField(verbose_name=_('math engine'), choices=MATH_ENGINES_CHOICES, max_length=4, + default=settings.MATHOID_DEFAULT_TYPE, + help_text=_('the rendering engine used to render math')) + is_totp_enabled = models.BooleanField(verbose_name=_('2FA enabled'), default=False, + help_text=_('check to enable TOTP-based two factor authentication')) + totp_key = EncryptedNullCharField(max_length=32, null=True, blank=True, verbose_name=_('TOTP key'), + help_text=_('32 character base32-encoded key for TOTP'), + validators=[RegexValidator('^$|^[A-Z2-7]{32}$', + _('TOTP key must be empty or base32'))]) + notes = models.TextField(verbose_name=_('internal notes'), null=True, blank=True, + help_text=_('Notes for administrators regarding this user.')) + + @cached_property + def organization(self): + # We do this to take advantage of prefetch_related + orgs = self.organizations.all() + return orgs[0] if orgs else None + + @cached_property + def username(self): + return self.user.username + + _pp_table = [pow(settings.DMOJ_PP_STEP, i) for i in range(settings.DMOJ_PP_ENTRIES)] + + def calculate_points(self, table=_pp_table): + from judge.models import Problem + data = (Problem.objects.filter(submission__user=self, submission__points__isnull=False, is_public=True, + is_organization_private=False) + .annotate(max_points=Max('submission__points')).order_by('-max_points') + .values_list('max_points', flat=True).filter(max_points__gt=0)) + extradata = Problem.objects.filter(submission__user=self, submission__result='AC', is_public=True) \ + .values('id').distinct().count() + bonus_function = settings.DMOJ_PP_BONUS_FUNCTION + points = sum(data) + problems = len(data) + entries = min(len(data), len(table)) + pp = sum(map(mul, table[:entries], data[:entries])) + bonus_function(extradata) + if self.points != points or problems != self.problem_count or self.performance_points != pp: + self.points = points + self.problem_count = problems + self.performance_points = pp + self.save(update_fields=['points', 'problem_count', 'performance_points']) + return points + + calculate_points.alters_data = True + + def remove_contest(self): + self.current_contest = None + self.save() + + remove_contest.alters_data = True + + def update_contest(self): + contest = self.current_contest + if contest is not None and (contest.ended or not contest.contest.is_accessible_by(self.user)): + self.remove_contest() + + update_contest.alters_data = True + + def get_absolute_url(self): + return reverse('user_page', args=(self.user.username,)) + + def __str__(self): + return self.user.username + + @classmethod + def get_user_css_class(cls, display_rank, rating, rating_colors=settings.DMOJ_RATING_COLORS): + if rating_colors: + return 'rating %s %s' % (rating_class(rating) if rating is not None else 'rate-none', display_rank) + return display_rank + + @cached_property + def css_class(self): + return self.get_user_css_class(self.display_rank, self.rating) + + class Meta: + permissions = ( + ('test_site', 'Shows in-progress development stuff'), + ('totp', 'Edit TOTP settings'), + ) + verbose_name = _('user profile') + verbose_name_plural = _('user profiles') + + +class OrganizationRequest(models.Model): + user = models.ForeignKey(Profile, verbose_name=_('user'), related_name='requests', on_delete=models.CASCADE) + organization = models.ForeignKey(Organization, verbose_name=_('organization'), related_name='requests', + on_delete=models.CASCADE) + time = models.DateTimeField(verbose_name=_('request time'), auto_now_add=True) + state = models.CharField(max_length=1, verbose_name=_('state'), choices=( + ('P', 'Pending'), + ('A', 'Approved'), + ('R', 'Rejected'), + )) + reason = models.TextField(verbose_name=_('reason')) + + class Meta: + verbose_name = _('organization join request') + verbose_name_plural = _('organization join requests') diff --git a/judge/models/runtime.py b/judge/models/runtime.py new file mode 100644 index 0000000..d28be9c --- /dev/null +++ b/judge/models/runtime.py @@ -0,0 +1,176 @@ +from collections import OrderedDict, defaultdict +from operator import attrgetter + +from django.conf import settings +from django.core.cache import cache +from django.db import models +from django.db.models import CASCADE +from django.urls import reverse +from django.utils import timezone +from django.utils.functional import cached_property +from django.utils.translation import gettext_lazy as _ + +from judge.judgeapi import disconnect_judge + +__all__ = ['Language', 'RuntimeVersion', 'Judge'] + + +class Language(models.Model): + key = models.CharField(max_length=6, verbose_name=_('short identifier'), + help_text=_('The identifier for this language; the same as its executor id for judges.'), + unique=True) + name = models.CharField(max_length=20, verbose_name=_('long name'), + help_text=_('Longer name for the language, e.g. "Python 2" or "C++11".')) + short_name = models.CharField(max_length=10, verbose_name=_('short name'), + help_text=_('More readable, but short, name to display publicly; e.g. "PY2" or ' + '"C++11". If left blank, it will default to the ' + 'short identifier.'), + null=True, blank=True) + common_name = models.CharField(max_length=10, verbose_name=_('common name'), + help_text=_('Common name for the language. For example, the common name for C++03, ' + 'C++11, and C++14 would be "C++"')) + ace = models.CharField(max_length=20, verbose_name=_('ace mode name'), + help_text=_('Language ID for Ace.js editor highlighting, appended to "mode-" to determine ' + 'the Ace JavaScript file to use, e.g., "python".')) + pygments = models.CharField(max_length=20, verbose_name=_('pygments name'), + help_text=_('Language ID for Pygments highlighting in source windows.')) + template = models.TextField(verbose_name=_('code template'), + help_text=_('Code template to display in submission editor.'), blank=True) + info = models.CharField(max_length=50, verbose_name=_('runtime info override'), blank=True, + help_text=_("Do not set this unless you know what you're doing! It will override the " + "usually more specific, judge-provided runtime info!")) + description = models.TextField(verbose_name=_('language description'), + help_text=_('Use this field to inform users of quirks with your environment, ' + 'additional restrictions, etc.'), blank=True) + extension = models.CharField(max_length=10, verbose_name=_('extension'), + help_text=_('The extension of source files, e.g., "py" or "cpp".')) + + def runtime_versions(self): + runtimes = OrderedDict() + # There be dragons here if two judges specify different priorities + for runtime in self.runtimeversion_set.all(): + id = runtime.name + if id not in runtimes: + runtimes[id] = set() + if not runtime.version: # empty str == error determining version on judge side + continue + runtimes[id].add(runtime.version) + + lang_versions = [] + for id, version_list in runtimes.items(): + lang_versions.append((id, sorted(version_list, key=lambda a: tuple(map(int, a.split('.')))))) + return lang_versions + + @classmethod + def get_common_name_map(cls): + result = cache.get('lang:cn_map') + if result is not None: + return result + result = defaultdict(set) + for id, cn in Language.objects.values_list('id', 'common_name'): + result[cn].add(id) + result = {id: cns for id, cns in result.items() if len(cns) > 1} + cache.set('lang:cn_map', result, 86400) + return result + + @cached_property + def short_display_name(self): + return self.short_name or self.key + + def __str__(self): + return self.name + + @cached_property + def display_name(self): + if self.info: + return '%s (%s)' % (self.name, self.info) + else: + return self.name + + @classmethod + def get_python3(cls): + # We really need a default language, and this app is in Python 3 + return Language.objects.get_or_create(key='PY3', defaults={'name': 'Python 3'})[0] + + def get_absolute_url(self): + return reverse('runtime_list') + '#' + self.key + + @classmethod + def get_default_language(cls): + return Language.objects.get(key=settings.DEFAULT_USER_LANGUAGE) + + @classmethod + def get_default_language_pk(cls): + return cls.get_default_language().pk + + class Meta: + ordering = ['key'] + verbose_name = _('language') + verbose_name_plural = _('languages') + + +class RuntimeVersion(models.Model): + language = models.ForeignKey(Language, verbose_name=_('language to which this runtime belongs'), on_delete=CASCADE) + judge = models.ForeignKey('Judge', verbose_name=_('judge on which this runtime exists'), on_delete=CASCADE) + name = models.CharField(max_length=64, verbose_name=_('runtime name')) + version = models.CharField(max_length=64, verbose_name=_('runtime version'), blank=True) + priority = models.IntegerField(verbose_name=_('order in which to display this runtime'), default=0) + + +class Judge(models.Model): + name = models.CharField(max_length=50, help_text=_('Server name, hostname-style'), unique=True) + created = models.DateTimeField(auto_now_add=True, verbose_name=_('time of creation')) + auth_key = models.CharField(max_length=100, help_text=_('A key to authenticate this judge'), + verbose_name=_('authentication key')) + is_blocked = models.BooleanField(verbose_name=_('block judge'), default=False, + help_text=_('Whether this judge should be blocked from connecting, ' + 'even if its key is correct.')) + online = models.BooleanField(verbose_name=_('judge online status'), default=False) + start_time = models.DateTimeField(verbose_name=_('judge start time'), null=True) + ping = models.FloatField(verbose_name=_('response time'), null=True) + load = models.FloatField(verbose_name=_('system load'), null=True, + help_text=_('Load for the last minute, divided by processors to be fair.')) + description = models.TextField(blank=True, verbose_name=_('description')) + last_ip = models.GenericIPAddressField(verbose_name='Last connected IP', blank=True, null=True) + problems = models.ManyToManyField('Problem', verbose_name=_('problems'), related_name='judges') + runtimes = models.ManyToManyField(Language, verbose_name=_('judges'), related_name='judges') + + def __str__(self): + return self.name + + def disconnect(self, force=False): + disconnect_judge(self, force=force) + + disconnect.alters_data = True + + @cached_property + def runtime_versions(self): + qs = (self.runtimeversion_set.values('language__key', 'language__name', 'version', 'name') + .order_by('language__key', 'priority')) + + ret = OrderedDict() + + for data in qs: + key = data['language__key'] + if key not in ret: + ret[key] = {'name': data['language__name'], 'runtime': []} + ret[key]['runtime'].append((data['name'], (data['version'],))) + + return list(ret.items()) + + @cached_property + def uptime(self): + return timezone.now() - self.start_time if self.online else 'N/A' + + @cached_property + def ping_ms(self): + return self.ping * 1000 if self.ping is not None else None + + @cached_property + def runtime_list(self): + return map(attrgetter('name'), self.runtimes.all()) + + class Meta: + ordering = ['name'] + verbose_name = _('judge') + verbose_name_plural = _('judges') diff --git a/judge/models/submission.py b/judge/models/submission.py new file mode 100644 index 0000000..0941eb2 --- /dev/null +++ b/judge/models/submission.py @@ -0,0 +1,217 @@ +import hashlib +import hmac + +from django.conf import settings +from django.core.exceptions import ObjectDoesNotExist +from django.db import models +from django.urls import reverse +from django.utils.functional import cached_property +from django.utils.translation import gettext_lazy as _ + +from judge.judgeapi import abort_submission, judge_submission +from judge.models.problem import Problem, TranslatedProblemForeignKeyQuerySet +from judge.models.profile import Profile +from judge.models.runtime import Language +from judge.utils.unicode import utf8bytes + +__all__ = ['SUBMISSION_RESULT', 'Submission', 'SubmissionSource', 'SubmissionTestCase'] + +SUBMISSION_RESULT = ( + ('AC', _('Accepted')), + ('WA', _('Wrong Answer')), + ('TLE', _('Time Limit Exceeded')), + ('MLE', _('Memory Limit Exceeded')), + ('OLE', _('Output Limit Exceeded')), + ('IR', _('Invalid Return')), + ('RTE', _('Runtime Error')), + ('CE', _('Compile Error')), + ('IE', _('Internal Error')), + ('SC', _('Short circuit')), + ('AB', _('Aborted')), +) + + +class Submission(models.Model): + STATUS = ( + ('QU', _('Queued')), + ('P', _('Processing')), + ('G', _('Grading')), + ('D', _('Completed')), + ('IE', _('Internal Error')), + ('CE', _('Compile Error')), + ('AB', _('Aborted')), + ) + IN_PROGRESS_GRADING_STATUS = ('QU', 'P', 'G') + RESULT = SUBMISSION_RESULT + USER_DISPLAY_CODES = { + 'AC': _('Accepted'), + 'WA': _('Wrong Answer'), + 'SC': "Short Circuited", + 'TLE': _('Time Limit Exceeded'), + 'MLE': _('Memory Limit Exceeded'), + 'OLE': _('Output Limit Exceeded'), + 'IR': _('Invalid Return'), + 'RTE': _('Runtime Error'), + 'CE': _('Compile Error'), + 'IE': _('Internal Error (judging server error)'), + 'QU': _('Queued'), + 'P': _('Processing'), + 'G': _('Grading'), + 'D': _('Completed'), + 'AB': _('Aborted'), + } + + user = models.ForeignKey(Profile, on_delete=models.CASCADE) + problem = models.ForeignKey(Problem, on_delete=models.CASCADE) + date = models.DateTimeField(verbose_name=_('submission time'), auto_now_add=True, db_index=True) + time = models.FloatField(verbose_name=_('execution time'), null=True, db_index=True) + memory = models.FloatField(verbose_name=_('memory usage'), null=True) + points = models.FloatField(verbose_name=_('points granted'), null=True, db_index=True) + language = models.ForeignKey(Language, verbose_name=_('submission language'), on_delete=models.CASCADE) + status = models.CharField(verbose_name=_('status'), max_length=2, choices=STATUS, default='QU', db_index=True) + result = models.CharField(verbose_name=_('result'), max_length=3, choices=SUBMISSION_RESULT, + default=None, null=True, blank=True, db_index=True) + error = models.TextField(verbose_name=_('compile errors'), null=True, blank=True) + current_testcase = models.IntegerField(default=0) + batch = models.BooleanField(verbose_name=_('batched cases'), default=False) + case_points = models.FloatField(verbose_name=_('test case points'), default=0) + case_total = models.FloatField(verbose_name=_('test case total points'), default=0) + judged_on = models.ForeignKey('Judge', verbose_name=_('judged on'), null=True, blank=True, + on_delete=models.SET_NULL) + was_rejudged = models.BooleanField(verbose_name=_('was rejudged by admin'), default=False) + is_pretested = models.BooleanField(verbose_name=_('was ran on pretests only'), default=False) + contest_object = models.ForeignKey('Contest', verbose_name=_('contest'), null=True, blank=True, + on_delete=models.SET_NULL, related_name='+') + + objects = TranslatedProblemForeignKeyQuerySet.as_manager() + + @classmethod + def result_class_from_code(cls, result, case_points, case_total): + if result == 'AC': + if case_points == case_total: + return 'AC' + return '_AC' + return result + + @property + def result_class(self): + # This exists to save all these conditionals from being executed (slowly) in each row.jade template + if self.status in ('IE', 'CE'): + return self.status + return Submission.result_class_from_code(self.result, self.case_points, self.case_total) + + @property + def memory_bytes(self): + return self.memory * 1024 if self.memory is not None else 0 + + @property + def short_status(self): + return self.result or self.status + + @property + def long_status(self): + return Submission.USER_DISPLAY_CODES.get(self.short_status, '') + + def judge(self, rejudge=False, batch_rejudge=False): + judge_submission(self, rejudge, batch_rejudge) + + judge.alters_data = True + + def abort(self): + abort_submission(self) + + abort.alters_data = True + + def update_contest(self): + try: + contest = self.contest + except AttributeError: + return + + contest_problem = contest.problem + contest.points = round(self.case_points / self.case_total * contest_problem.points + if self.case_total > 0 else 0, 3) + if not contest_problem.partial and contest.points != contest_problem.points: + contest.points = 0 + contest.save() + contest.participation.recompute_results() + + update_contest.alters_data = True + + @property + def is_graded(self): + return self.status not in ('QU', 'P', 'G') + + @cached_property + def contest_key(self): + if hasattr(self, 'contest'): + return self.contest_object.key + + def __str__(self): + return 'Submission %d of %s by %s' % (self.id, self.problem, self.user.user.username) + + def get_absolute_url(self): + return reverse('submission_status', args=(self.id,)) + + @cached_property + def contest_or_none(self): + try: + return self.contest + except ObjectDoesNotExist: + return None + + @classmethod + def get_id_secret(cls, sub_id): + return (hmac.new(utf8bytes(settings.EVENT_DAEMON_SUBMISSION_KEY), b'%d' % sub_id, hashlib.sha512) + .hexdigest()[:16] + '%08x' % sub_id) + + @cached_property + def id_secret(self): + return self.get_id_secret(self.id) + + class Meta: + permissions = ( + ('abort_any_submission', 'Abort any submission'), + ('rejudge_submission', 'Rejudge the submission'), + ('rejudge_submission_lot', 'Rejudge a lot of submissions'), + ('spam_submission', 'Submit without limit'), + ('view_all_submission', 'View all submission'), + ('resubmit_other', "Resubmit others' submission"), + ) + verbose_name = _('submission') + verbose_name_plural = _('submissions') + + +class SubmissionSource(models.Model): + submission = models.OneToOneField(Submission, on_delete=models.CASCADE, verbose_name=_('associated submission'), + related_name='source') + source = models.TextField(verbose_name=_('source code'), max_length=65536) + + def __str__(self): + return 'Source of %s' % self.submission + + +class SubmissionTestCase(models.Model): + RESULT = SUBMISSION_RESULT + + submission = models.ForeignKey(Submission, verbose_name=_('associated submission'), + related_name='test_cases', on_delete=models.CASCADE) + case = models.IntegerField(verbose_name=_('test case ID')) + status = models.CharField(max_length=3, verbose_name=_('status flag'), choices=SUBMISSION_RESULT) + time = models.FloatField(verbose_name=_('execution time'), null=True) + memory = models.FloatField(verbose_name=_('memory usage'), null=True) + points = models.FloatField(verbose_name=_('points granted'), null=True) + total = models.FloatField(verbose_name=_('points possible'), null=True) + batch = models.IntegerField(verbose_name=_('batch number'), null=True) + feedback = models.CharField(max_length=50, verbose_name=_('judging feedback'), blank=True) + extended_feedback = models.TextField(verbose_name=_('extended judging feedback'), blank=True) + output = models.TextField(verbose_name=_('program output'), blank=True) + + @property + def long_status(self): + return Submission.USER_DISPLAY_CODES.get(self.status, '') + + class Meta: + unique_together = ('submission', 'case') + verbose_name = _('submission test case') + verbose_name_plural = _('submission test cases') diff --git a/judge/models/ticket.py b/judge/models/ticket.py new file mode 100644 index 0000000..9b3fc54 --- /dev/null +++ b/judge/models/ticket.py @@ -0,0 +1,30 @@ +from django.contrib.contenttypes.fields import GenericForeignKey +from django.contrib.contenttypes.models import ContentType +from django.db import models +from django.utils.translation import gettext_lazy as _ + +from judge.models.profile import Profile + + +class Ticket(models.Model): + title = models.CharField(max_length=100, verbose_name=_('ticket title')) + user = models.ForeignKey(Profile, verbose_name=_('ticket creator'), related_name='tickets', + on_delete=models.CASCADE) + time = models.DateTimeField(verbose_name=_('creation time'), auto_now_add=True) + assignees = models.ManyToManyField(Profile, verbose_name=_('assignees'), related_name='assigned_tickets') + notes = models.TextField(verbose_name=_('quick notes'), blank=True, + help_text=_('Staff notes for this issue to aid in processing.')) + content_type = models.ForeignKey(ContentType, verbose_name=_('linked item type'), + on_delete=models.CASCADE) + object_id = models.PositiveIntegerField(verbose_name=_('linked item ID')) + linked_item = GenericForeignKey() + is_open = models.BooleanField(verbose_name=_('is ticket open?'), default=True) + + +class TicketMessage(models.Model): + ticket = models.ForeignKey(Ticket, verbose_name=_('ticket'), related_name='messages', + related_query_name='message', on_delete=models.CASCADE) + user = models.ForeignKey(Profile, verbose_name=_('poster'), related_name='ticket_messages', + on_delete=models.CASCADE) + body = models.TextField(verbose_name=_('message body')) + time = models.DateTimeField(verbose_name=_('message time'), auto_now_add=True) diff --git a/judge/pdf_problems.py b/judge/pdf_problems.py new file mode 100644 index 0000000..0e9835e --- /dev/null +++ b/judge/pdf_problems.py @@ -0,0 +1,268 @@ +import errno +import io +import json +import logging +import os +import shutil +import subprocess +import uuid + +from django.conf import settings +from django.utils.translation import gettext + +HAS_PHANTOMJS = os.access(settings.PHANTOMJS, os.X_OK) +HAS_SLIMERJS = os.access(settings.SLIMERJS, os.X_OK) + +NODE_PATH = settings.NODEJS +PUPPETEER_MODULE = settings.PUPPETEER_MODULE +HAS_PUPPETEER = os.access(NODE_PATH, os.X_OK) and os.path.isdir(PUPPETEER_MODULE) + +HAS_PDF = (os.path.isdir(settings.DMOJ_PDF_PROBLEM_CACHE) and + (HAS_PHANTOMJS or HAS_SLIMERJS or HAS_PUPPETEER)) + +EXIFTOOL = settings.EXIFTOOL +HAS_EXIFTOOL = os.access(EXIFTOOL, os.X_OK) + +logger = logging.getLogger('judge.problem.pdf') + + +class BasePdfMaker(object): + math_engine = 'jax' + title = None + + def __init__(self, dir=None, clean_up=True): + self.dir = dir or os.path.join(settings.DMOJ_PDF_PROBLEM_TEMP_DIR, str(uuid.uuid1())) + self.proc = None + self.log = None + self.htmlfile = os.path.join(self.dir, 'input.html') + self.pdffile = os.path.join(self.dir, 'output.pdf') + self.clean_up = clean_up + + def load(self, file, source): + with open(os.path.join(self.dir, file), 'w') as target, open(source) as source: + target.write(source.read()) + + def make(self, debug=False): + self._make(debug) + + if self.title and HAS_EXIFTOOL: + try: + subprocess.check_output([EXIFTOOL, '-Title=%s' % (self.title,), self.pdffile]) + except subprocess.CalledProcessError as e: + logger.error('Failed to run exiftool to set title for: %s\n%s', self.title, e.output) + + def _make(self, debug): + raise NotImplementedError() + + @property + def html(self): + with io.open(self.htmlfile, encoding='utf-8') as f: + return f.read() + + @html.setter + def html(self, data): + with io.open(self.htmlfile, 'w', encoding='utf-8') as f: + f.write(data) + + @property + def success(self): + return self.proc.returncode == 0 + + @property + def created(self): + return os.path.exists(self.pdffile) + + def __enter__(self): + try: + os.makedirs(self.dir) + except OSError as e: + if e.errno != errno.EEXIST: + raise + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + if self.clean_up: + shutil.rmtree(self.dir, ignore_errors=True) + + +class PhantomJSPdfMaker(BasePdfMaker): + template = '''\ +"use strict"; +var page = require('webpage').create(); +var param = {params}; + +page.paperSize = { + format: param.paper, orientation: 'portrait', margin: '1cm', + footer: { + height: '1cm', + contents: phantom.callback(function(num, pages) { + return ('
' + + param.footer.replace('[page]', num).replace('[topage]', pages) + '
'); + }) + } +}; + +page.onCallback = function (data) { + if (data.action === 'snapshot') { + page.render(param.output); + phantom.exit(); + } +} + +page.open(param.input, function (status) { + if (status !== 'success') { + console.log('Unable to load the address!'); + phantom.exit(1); + } else { + page.evaluate(function (zoom) { + document.documentElement.style.zoom = zoom; + }, param.zoom); + window.setTimeout(function () { + page.render(param.output); + phantom.exit(); + }, param.timeout); + } +}); +''' + + def get_render_script(self): + return self.template.replace('{params}', json.dumps({ + 'zoom': settings.PHANTOMJS_PDF_ZOOM, + 'timeout': int(settings.PHANTOMJS_PDF_TIMEOUT * 1000), + 'input': 'input.html', 'output': 'output.pdf', + 'paper': settings.PHANTOMJS_PAPER_SIZE, + 'footer': gettext('Page [page] of [topage]'), + })) + + def _make(self, debug): + with io.open(os.path.join(self.dir, '_render.js'), 'w', encoding='utf-8') as f: + f.write(self.get_render_script()) + cmdline = [settings.PHANTOMJS, '_render.js'] + self.proc = subprocess.Popen(cmdline, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, cwd=self.dir) + self.log = self.proc.communicate()[0] + + +class SlimerJSPdfMaker(BasePdfMaker): + math_engine = 'mml' + + template = '''\ +"use strict"; +try { + var param = {params}; + + var {Cc, Ci} = require('chrome'); + var prefs = Cc['@mozilla.org/preferences-service;1'].getService(Ci.nsIPrefService); + // Changing the serif font so that printed footers show up as Segoe UI. + var branch = prefs.getBranch('font.name.serif.'); + branch.setCharPref('x-western', 'Segoe UI'); + + var page = require('webpage').create(); + + page.paperSize = { + format: param.paper, orientation: 'portrait', margin: '1cm', edge: '0.5cm', + footerStr: { left: '', right: '', center: param.footer } + }; + + page.open(param.input, function (status) { + if (status !== 'success') { + console.log('Unable to load the address!'); + slimer.exit(1); + } else { + page.render(param.output, { ratio: param.zoom }); + slimer.exit(); + } + }); +} catch (e) { + console.error(e); + slimer.exit(1); +} +''' + + def get_render_script(self): + return self.template.replace('{params}', json.dumps({ + 'zoom': settings.SLIMERJS_PDF_ZOOM, + 'input': 'input.html', 'output': 'output.pdf', + 'paper': settings.SLIMERJS_PAPER_SIZE, + 'footer': gettext('Page [page] of [topage]').replace('[page]', '&P').replace('[topage]', '&L'), + })) + + def _make(self, debug): + with io.open(os.path.join(self.dir, '_render.js'), 'w', encoding='utf-8') as f: + f.write(self.get_render_script()) + + env = None + firefox = settings.SLIMERJS_FIREFOX_PATH + if firefox: + env = os.environ.copy() + env['SLIMERJSLAUNCHER'] = firefox + + cmdline = [settings.SLIMERJS, '--headless', '_render.js'] + self.proc = subprocess.Popen(cmdline, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, cwd=self.dir, env=env) + self.log = self.proc.communicate()[0] + + +class PuppeteerPDFRender(BasePdfMaker): + template = '''\ +"use strict"; +const param = {params}; +const puppeteer = require('puppeteer'); + +puppeteer.launch().then(browser => Promise.resolve() + .then(async () => { + const page = await browser.newPage(); + await page.goto(param.input, { waitUntil: 'load' }); + await page.waitForSelector('.math-loaded', { timeout: 15000 }); + await page.pdf({ + path: param.output, + format: param.paper, + margin: { + top: '1cm', + bottom: '1cm', + left: '1cm', + right: '1cm', + }, + printBackground: true, + displayHeaderFooter: true, + headerTemplate: '
', + footerTemplate: '
' + + param.footer.replace('[page]', '') + .replace('[topage]', '') + + '
', + }); + await browser.close(); + }) + .catch(e => browser.close().then(() => {throw e})) +).catch(e => { + console.error(e); + process.exit(1); +}); +''' + + def get_render_script(self): + return self.template.replace('{params}', json.dumps({ + 'input': 'file://' + os.path.abspath(os.path.join(self.dir, 'input.html')), + 'output': os.path.abspath(os.path.join(self.dir, 'output.pdf')), + 'paper': settings.PUPPETEER_PAPER_SIZE, + 'footer': gettext('Page [page] of [topage]'), + })) + + def _make(self, debug): + with io.open(os.path.join(self.dir, '_render.js'), 'w', encoding='utf-8') as f: + f.write(self.get_render_script()) + + env = os.environ.copy() + env['NODE_PATH'] = os.path.dirname(PUPPETEER_MODULE) + + cmdline = [NODE_PATH, '_render.js'] + self.proc = subprocess.Popen(cmdline, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, cwd=self.dir, env=env) + self.log = self.proc.communicate()[0] + + +if HAS_PUPPETEER: + DefaultPdfMaker = PuppeteerPDFRender +elif HAS_SLIMERJS: + DefaultPdfMaker = SlimerJSPdfMaker +elif HAS_PHANTOMJS: + DefaultPdfMaker = PhantomJSPdfMaker +else: + DefaultPdfMaker = None diff --git a/judge/performance_points.py b/judge/performance_points.py new file mode 100644 index 0000000..eee3c10 --- /dev/null +++ b/judge/performance_points.py @@ -0,0 +1,78 @@ +from collections import namedtuple + +from django.conf import settings +from django.db import connection + +from judge.models import Submission +from judge.timezone import from_database_time + +PP_WEIGHT_TABLE = [pow(settings.DMOJ_PP_STEP, i) for i in range(settings.DMOJ_PP_ENTRIES)] + +PPBreakdown = namedtuple('PPBreakdown', 'points weight scaled_points problem_name problem_code ' + 'sub_id sub_date sub_points sub_total sub_result_class ' + 'sub_short_status sub_long_status sub_lang') + + +def get_pp_breakdown(user, start=0, end=settings.DMOJ_PP_ENTRIES): + with connection.cursor() as cursor: + cursor.execute(''' + SELECT max_points_table.problem_code, + max_points_table.problem_name, + max_points_table.max_points, + judge_submission.id, + judge_submission.date, + judge_submission.case_points, + judge_submission.case_total, + judge_submission.result, + judge_language.short_name, + judge_language.key + FROM judge_submission + JOIN (SELECT judge_problem.id problem_id, + judge_problem.name problem_name, + judge_problem.code problem_code, + MAX(judge_submission.points) AS max_points + FROM judge_problem + INNER JOIN judge_submission ON (judge_problem.id = judge_submission.problem_id) + WHERE (judge_problem.is_public = True AND + judge_problem.is_organization_private = False AND + judge_submission.points IS NOT NULL AND + judge_submission.user_id = %s) + GROUP BY judge_problem.id + HAVING MAX(judge_submission.points) > 0.0) AS max_points_table + ON (judge_submission.problem_id = max_points_table.problem_id AND + judge_submission.points = max_points_table.max_points AND + judge_submission.user_id = %s) + JOIN judge_language + ON judge_submission.language_id = judge_language.id + GROUP BY max_points_table.problem_id + ORDER BY max_points DESC, judge_submission.date DESC + LIMIT %s OFFSET %s + ''', (user.id, user.id, end - start + 1, start)) + data = cursor.fetchall() + + breakdown = [] + for weight, contrib in zip(PP_WEIGHT_TABLE[start:end], data): + code, name, points, id, date, case_points, case_total, result, lang_short_name, lang_key = contrib + + # Replicates a lot of the logic usually done on Submission objects + lang_short_display_name = lang_short_name or lang_key + result_class = Submission.result_class_from_code(result, case_points, case_total) + long_status = Submission.USER_DISPLAY_CODES.get(result, '') + + breakdown.append(PPBreakdown( + points=points, + weight=weight * 100, + scaled_points=points * weight, + problem_name=name, + problem_code=code, + sub_id=id, + sub_date=from_database_time(date), + sub_points=case_points, + sub_total=case_total, + sub_short_status=result, + sub_long_status=long_status, + sub_result_class=result_class, + sub_lang=lang_short_display_name, + )) + has_more = end < min(len(PP_WEIGHT_TABLE), start + len(data)) + return breakdown, has_more diff --git a/judge/ratings.py b/judge/ratings.py new file mode 100644 index 0000000..8fb5ff8 --- /dev/null +++ b/judge/ratings.py @@ -0,0 +1,181 @@ +import math +from bisect import bisect +from operator import itemgetter + +from django.db import connection, transaction +from django.db.models import Count +from django.utils import timezone + +from judge.utils.ranker import tie_ranker + + +def rational_approximation(t): + # Abramowitz and Stegun formula 26.2.23. + # The absolute value of the error should be less than 4.5 e-4. + c = [2.515517, 0.802853, 0.010328] + d = [1.432788, 0.189269, 0.001308] + numerator = (c[2] * t + c[1]) * t + c[0] + denominator = ((d[2] * t + d[1]) * t + d[0]) * t + 1.0 + return t - numerator / denominator + + +def normal_CDF_inverse(p): + assert 0.0 < p < 1 + + # See article above for explanation of this section. + if p < 0.5: + # F^-1(p) = - G^-1(p) + return -rational_approximation(math.sqrt(-2.0 * math.log(p))) + else: + # F^-1(p) = G^-1(1-p) + return rational_approximation(math.sqrt(-2.0 * math.log(1.0 - p))) + + +def WP(RA, RB, VA, VB): + return (math.erf((RB - RA) / math.sqrt(2 * (VA * VA + VB * VB))) + 1) / 2.0 + + +def recalculate_ratings(old_rating, old_volatility, actual_rank, times_rated): + # actual_rank: 1 is first place, N is last place + # if there are ties, use the average of places (if places 2, 3, 4, 5 tie, use 3.5 for all of them) + + N = len(old_rating) + new_rating = old_rating[:] + new_volatility = old_volatility[:] + if N <= 1: + return new_rating, new_volatility + + ranking = list(range(N)) + ranking.sort(key=old_rating.__getitem__, reverse=True) + + ave_rating = float(sum(old_rating)) / N + sum1 = sum(i * i for i in old_volatility) / N + sum2 = sum((i - ave_rating) ** 2 for i in old_rating) / (N - 1) + CF = math.sqrt(sum1 + sum2) + + for i in range(N): + ERank = 0.5 + for j in range(N): + ERank += WP(old_rating[i], old_rating[j], old_volatility[i], old_volatility[j]) + + EPerf = -normal_CDF_inverse((ERank - 0.5) / N) + APerf = -normal_CDF_inverse((actual_rank[i] - 0.5) / N) + PerfAs = old_rating[i] + CF * (APerf - EPerf) + Weight = 1.0 / (1 - (0.42 / (times_rated[i] + 1) + 0.18)) - 1.0 + if old_rating[i] > 2500: + Weight *= 0.8 + elif old_rating[i] >= 2000: + Weight *= 0.9 + + Cap = 150.0 + 1500.0 / (times_rated[i] + 2) + + new_rating[i] = (old_rating[i] + Weight * PerfAs) / (1.0 + Weight) + + if times_rated[i] == 0: + new_volatility[i] = 385 + else: + new_volatility[i] = math.sqrt(((new_rating[i] - old_rating[i]) ** 2) / Weight + + (old_volatility[i] ** 2) / (Weight + 1)) + if abs(old_rating[i] - new_rating[i]) > Cap: + if old_rating[i] < new_rating[i]: + new_rating[i] = old_rating[i] + Cap + else: + new_rating[i] = old_rating[i] - Cap + + # try to keep the sum of ratings constant + adjust = float(sum(old_rating) - sum(new_rating)) / N + new_rating = list(map(adjust.__add__, new_rating)) + # inflate a little if we have to so people who placed first don't lose rating + best_rank = min(actual_rank) + for i in range(N): + if abs(actual_rank[i] - best_rank) <= 1e-3 and new_rating[i] < old_rating[i] + 1: + new_rating[i] = old_rating[i] + 1 + return list(map(int, map(round, new_rating))), list(map(int, map(round, new_volatility))) + + +def rate_contest(contest): + from judge.models import Rating, Profile + + cursor = connection.cursor() + cursor.execute(''' + SELECT judge_rating.user_id, judge_rating.rating, judge_rating.volatility, r.times + FROM judge_rating INNER JOIN + judge_contest ON (judge_contest.id = judge_rating.contest_id) INNER JOIN ( + SELECT judge_rating.user_id AS id, MAX(judge_contest.end_time) AS last_time, + COUNT(judge_rating.user_id) AS times + FROM judge_contestparticipation INNER JOIN + judge_rating ON (judge_rating.user_id = judge_contestparticipation.user_id) INNER JOIN + judge_contest ON (judge_contest.id = judge_rating.contest_id) + WHERE judge_contestparticipation.contest_id = %s AND judge_contest.end_time < %s AND + judge_contestparticipation.user_id NOT IN ( + SELECT profile_id FROM judge_contest_rate_exclude WHERE contest_id = %s + ) AND judge_contestparticipation.virtual = 0 + GROUP BY judge_rating.user_id + ORDER BY judge_contestparticipation.score DESC, judge_contestparticipation.cumtime ASC + ) AS r ON (judge_rating.user_id = r.id AND judge_contest.end_time = r.last_time) + ''', (contest.id, contest.end_time, contest.id)) + data = {user: (rating, volatility, times) for user, rating, volatility, times in cursor.fetchall()} + cursor.close() + + users = contest.users.order_by('is_disqualified', '-score', 'cumtime').annotate(submissions=Count('submission')) \ + .exclude(user_id__in=contest.rate_exclude.all()).filter(virtual=0, user__is_unlisted=False) \ + .values_list('id', 'user_id', 'score', 'cumtime') + if not contest.rate_all: + users = users.filter(submissions__gt=0) + if contest.rating_floor is not None: + users = users.exclude(user__rating__lt=contest.rating_floor) + if contest.rating_ceiling is not None: + users = users.exclude(user__rating__gt=contest.rating_ceiling) + users = list(tie_ranker(users, key=itemgetter(2, 3))) + participation_ids = [user[1][0] for user in users] + user_ids = [user[1][1] for user in users] + ranking = list(map(itemgetter(0), users)) + old_data = [data.get(user, (1200, 535, 0)) for user in user_ids] + old_rating = list(map(itemgetter(0), old_data)) + old_volatility = list(map(itemgetter(1), old_data)) + times_ranked = list(map(itemgetter(2), old_data)) + rating, volatility = recalculate_ratings(old_rating, old_volatility, ranking, times_ranked) + + now = timezone.now() + ratings = [Rating(user_id=id, contest=contest, rating=r, volatility=v, last_rated=now, participation_id=p, rank=z) + for id, p, r, v, z in zip(user_ids, participation_ids, rating, volatility, ranking)] + cursor = connection.cursor() + cursor.execute('CREATE TEMPORARY TABLE _profile_rating_update(id integer, rating integer)') + cursor.executemany('INSERT INTO _profile_rating_update VALUES (%s, %s)', list(zip(user_ids, rating))) + with transaction.atomic(): + Rating.objects.filter(contest=contest).delete() + Rating.objects.bulk_create(ratings) + cursor.execute(''' + UPDATE `%s` p INNER JOIN `_profile_rating_update` tmp ON (p.id = tmp.id) + SET p.rating = tmp.rating + ''' % Profile._meta.db_table) + cursor.execute('DROP TABLE _profile_rating_update') + cursor.close() + return old_rating, old_volatility, ranking, times_ranked, rating, volatility + + +RATING_LEVELS = ['Newbie', 'Amateur', 'Expert', 'Candidate Master', 'Master', 'Grandmaster', 'Target'] +RATING_VALUES = [1000, 1200, 1500, 1800, 2200, 3000] +RATING_CLASS = ['rate-newbie', 'rate-amateur', 'rate-expert', 'rate-candidate-master', + 'rate-master', 'rate-grandmaster', 'rate-target'] + + +def rating_level(rating): + return bisect(RATING_VALUES, rating) + + +def rating_name(rating): + return RATING_LEVELS[rating_level(rating)] + + +def rating_class(rating): + return RATING_CLASS[rating_level(rating)] + + +def rating_progress(rating): + level = bisect(RATING_VALUES, rating) + if level == len(RATING_VALUES): + return 1.0 + prev = 0 if not level else RATING_VALUES[level - 1] + next = RATING_VALUES[level] + return (rating - prev + 0.0) / (next - prev) diff --git a/judge/signals.py b/judge/signals.py new file mode 100644 index 0000000..e03c17c --- /dev/null +++ b/judge/signals.py @@ -0,0 +1,132 @@ +import errno +import os + +from django.conf import settings +from django.contrib.sites.models import Site +from django.core.cache import cache +from django.core.cache.utils import make_template_fragment_key +from django.db.models.signals import post_delete, post_save +from django.dispatch import receiver + +from .caching import finished_submission +from .models import BlogPost, Comment, Contest, ContestSubmission, EFFECTIVE_MATH_ENGINES, Judge, Language, License, \ + MiscConfig, Organization, Problem, Profile, Submission + + +def get_pdf_path(basename): + return os.path.join(settings.DMOJ_PDF_PROBLEM_CACHE, basename) + + +def unlink_if_exists(file): + try: + os.unlink(file) + except OSError as e: + if e.errno != errno.ENOENT: + raise + + +@receiver(post_save, sender=Problem) +def problem_update(sender, instance, **kwargs): + if hasattr(instance, '_updating_stats_only'): + return + + cache.delete_many([ + make_template_fragment_key('submission_problem', (instance.id,)), + make_template_fragment_key('problem_feed', (instance.id,)), + 'problem_tls:%s' % instance.id, 'problem_mls:%s' % instance.id, + ]) + cache.delete_many([make_template_fragment_key('problem_html', (instance.id, engine, lang)) + for lang, _ in settings.LANGUAGES for engine in EFFECTIVE_MATH_ENGINES]) + cache.delete_many([make_template_fragment_key('problem_authors', (instance.id, lang)) + for lang, _ in settings.LANGUAGES]) + cache.delete_many(['generated-meta-problem:%s:%d' % (lang, instance.id) for lang, _ in settings.LANGUAGES]) + + for lang, _ in settings.LANGUAGES: + unlink_if_exists(get_pdf_path('%s.%s.pdf' % (instance.code, lang))) + + +@receiver(post_save, sender=Profile) +def profile_update(sender, instance, **kwargs): + if hasattr(instance, '_updating_stats_only'): + return + + cache.delete_many([make_template_fragment_key('user_about', (instance.id, engine)) + for engine in EFFECTIVE_MATH_ENGINES] + + [make_template_fragment_key('org_member_count', (org_id,)) + for org_id in instance.organizations.values_list('id', flat=True)]) + + +@receiver(post_save, sender=Contest) +def contest_update(sender, instance, **kwargs): + if hasattr(instance, '_updating_stats_only'): + return + + cache.delete_many(['generated-meta-contest:%d' % instance.id] + + [make_template_fragment_key('contest_html', (instance.id, engine)) + for engine in EFFECTIVE_MATH_ENGINES]) + + +@receiver(post_save, sender=License) +def license_update(sender, instance, **kwargs): + cache.delete(make_template_fragment_key('license_html', (instance.id,))) + + +@receiver(post_save, sender=Language) +def language_update(sender, instance, **kwargs): + cache.delete_many([make_template_fragment_key('language_html', (instance.id,)), + 'lang:cn_map']) + + +@receiver(post_save, sender=Judge) +def judge_update(sender, instance, **kwargs): + cache.delete(make_template_fragment_key('judge_html', (instance.id,))) + + +@receiver(post_save, sender=Comment) +def comment_update(sender, instance, **kwargs): + cache.delete('comment_feed:%d' % instance.id) + + +@receiver(post_save, sender=BlogPost) +def post_update(sender, instance, **kwargs): + cache.delete_many([ + make_template_fragment_key('post_summary', (instance.id,)), + 'blog_slug:%d' % instance.id, + 'blog_feed:%d' % instance.id, + ]) + cache.delete_many([make_template_fragment_key('post_content', (instance.id, engine)) + for engine in EFFECTIVE_MATH_ENGINES]) + + +@receiver(post_delete, sender=Submission) +def submission_delete(sender, instance, **kwargs): + finished_submission(instance) + instance.user.calculate_points() + + +@receiver(post_delete, sender=ContestSubmission) +def contest_submission_delete(sender, instance, **kwargs): + participation = instance.participation + participation.recompute_results() + + +@receiver(post_save, sender=Organization) +def organization_update(sender, instance, **kwargs): + cache.delete_many([make_template_fragment_key('organization_html', (instance.id, engine)) + for engine in EFFECTIVE_MATH_ENGINES]) + + +_misc_config_i18n = [code for code, _ in settings.LANGUAGES] +_misc_config_i18n.append('') + + +@receiver(post_save, sender=MiscConfig) +def misc_config_update(sender, instance, **kwargs): + cache.delete_many(['misc_config:%s:%s:%s' % (domain, lang, instance.key.split('.')[0]) + for lang in _misc_config_i18n + for domain in Site.objects.values_list('domain', flat=True)]) + + +@receiver(post_save, sender=ContestSubmission) +def contest_submission_update(sender, instance, **kwargs): + Submission.objects.filter(id=instance.submission_id).update(contest_object_id=instance.participation.contest_id) diff --git a/judge/sitemap.py b/judge/sitemap.py new file mode 100644 index 0000000..5678d76 --- /dev/null +++ b/judge/sitemap.py @@ -0,0 +1,102 @@ +from django.contrib.auth.models import User +from django.contrib.sitemaps import Sitemap +from django.urls import reverse +from django.utils import timezone + +from judge.models import BlogPost, Contest, Organization, Problem, Solution + + +class ProblemSitemap(Sitemap): + changefreq = 'daily' + priority = 0.8 + + def items(self): + return Problem.objects.filter(is_public=True, is_organization_private=False).values_list('code') + + def location(self, obj): + return reverse('problem_detail', args=obj) + + +class UserSitemap(Sitemap): + changefreq = 'hourly' + priority = 0.5 + + def items(self): + return User.objects.values_list('username') + + def location(self, obj): + return reverse('user_page', args=obj) + + +class ContestSitemap(Sitemap): + changefreq = 'hourly' + priority = 0.5 + + def items(self): + return Contest.objects.filter(is_visible=True, is_private=False, + is_organization_private=False).values_list('key') + + def location(self, obj): + return reverse('contest_view', args=obj) + + +class OrganizationSitemap(Sitemap): + changefreq = 'hourly' + priority = 0.5 + + def items(self): + return Organization.objects.values_list('id', 'slug') + + def location(self, obj): + return reverse('organization_home', args=obj) + + +class BlogPostSitemap(Sitemap): + changefreq = 'hourly' + priority = 0.7 + + def items(self): + return BlogPost.objects.filter(visible=True, publish_on__lte=timezone.now()).values_list('id', 'slug') + + def location(self, obj): + return reverse('blog_post', args=obj) + + +class SolutionSitemap(Sitemap): + changefreq = 'hourly' + priority = 0.8 + + def items(self): + return (Solution.objects.filter(is_public=True, publish_on__lte=timezone.now(), problem__isnull=False) + .values_list('problem__code')) + + def location(self, obj): + return reverse('problem_editorial', args=obj) + + +class HomePageSitemap(Sitemap): + priority = 1.0 + changefreq = 'daily' + + def items(self): + return ['home'] + + def location(self, obj): + return reverse(obj) + + +class UrlSitemap(Sitemap): + def __init__(self, pages): + self.pages = pages + + def items(self): + return self.pages + + def location(self, obj): + return obj['location'] if isinstance(obj, dict) else obj + + def priority(self, obj): + return obj.get('priority', 0.5) if isinstance(obj, dict) else 0.5 + + def changefreq(self, obj): + return obj.get('changefreq', 'daily') if isinstance(obj, dict) else 'daily' diff --git a/judge/social_auth.py b/judge/social_auth.py new file mode 100644 index 0000000..b6c5e10 --- /dev/null +++ b/judge/social_auth.py @@ -0,0 +1,109 @@ +import logging +import re +from operator import itemgetter +from urllib.parse import quote + +from django import forms +from django.contrib.auth.models import User +from django.db import transaction +from django.http import HttpResponseRedirect +from django.shortcuts import render +from django.urls import reverse +from requests import HTTPError +from reversion import revisions +from social_core.backends.github import GithubOAuth2 +from social_core.exceptions import InvalidEmail, SocialAuthBaseException +from social_core.pipeline.partial import partial +from social_django.middleware import SocialAuthExceptionMiddleware as OldSocialAuthExceptionMiddleware + +from judge.forms import ProfileForm +from judge.models import Language, Profile + +logger = logging.getLogger('judge.social_auth') + + +class GitHubSecureEmailOAuth2(GithubOAuth2): + name = 'github-secure' + + def user_data(self, access_token, *args, **kwargs): + data = self._user_data(access_token) + try: + emails = self._user_data(access_token, '/emails') + except (HTTPError, ValueError, TypeError): + emails = [] + + emails = [(e.get('email'), e.get('primary'), 0) for e in emails if isinstance(e, dict) and e.get('verified')] + emails.sort(key=itemgetter(1), reverse=True) + emails = list(map(itemgetter(0), emails)) + + if emails: + data['email'] = emails[0] + else: + data['email'] = None + + return data + + +def slugify_username(username, renotword=re.compile(r'[^\w]')): + return renotword.sub('', username.replace('-', '_')) + + +def verify_email(backend, details, *args, **kwargs): + if not details['email']: + raise InvalidEmail(backend) + + +class UsernameForm(forms.Form): + username = forms.RegexField(regex=r'^\w+$', max_length=30, label='Username', + error_messages={'invalid': 'A username must contain letters, numbers, or underscores'}) + + def clean_username(self): + if User.objects.filter(username=self.cleaned_data['username']).exists(): + raise forms.ValidationError('Sorry, the username is taken.') + return self.cleaned_data['username'] + + +@partial +def choose_username(backend, user, username=None, *args, **kwargs): + if not user: + request = backend.strategy.request + if request.POST: + form = UsernameForm(request.POST) + if form.is_valid(): + return {'username': form.cleaned_data['username']} + else: + form = UsernameForm(initial={'username': username}) + return render(request, 'registration/username_select.html', { + 'title': 'Choose a username', 'form': form, + }) + + +@partial +def make_profile(backend, user, response, is_new=False, *args, **kwargs): + if is_new: + if not hasattr(user, 'profile'): + profile = Profile(user=user) + profile.language = Language.get_python3() + logger.info('Info from %s: %s', backend.name, response) + profile.save() + form = ProfileForm(instance=profile, user=user) + else: + data = backend.strategy.request_data() + logger.info(data) + form = ProfileForm(data, instance=user.profile, user=user) + if form.is_valid(): + with transaction.atomic(), revisions.create_revision(): + form.save() + revisions.set_user(user) + revisions.set_comment('Updated on registration') + return + return render(backend.strategy.request, 'registration/profile_creation.html', { + 'title': 'Create your profile', 'form': form, + }) + + +class SocialAuthExceptionMiddleware(OldSocialAuthExceptionMiddleware): + def process_exception(self, request, exception): + if isinstance(exception, SocialAuthBaseException): + return HttpResponseRedirect('%s?message=%s' % (reverse('social_auth_error'), + quote(self.get_message(request, exception)))) diff --git a/judge/tasks/__init__.py b/judge/tasks/__init__.py new file mode 100644 index 0000000..e2ad1f2 --- /dev/null +++ b/judge/tasks/__init__.py @@ -0,0 +1,3 @@ +from judge.tasks.demo import * +from judge.tasks.moss import * +from judge.tasks.submission import * diff --git a/judge/tasks/demo.py b/judge/tasks/demo.py new file mode 100644 index 0000000..c09dcbf --- /dev/null +++ b/judge/tasks/demo.py @@ -0,0 +1,25 @@ +import time + +from celery import shared_task + +from judge.utils.celery import Progress + +__all__ = ('success', 'failure', 'progress') + + +@shared_task +def success(): + pass + + +@shared_task +def failure(): + raise RuntimeError('This task always fails.') + + +@shared_task(bind=True) +def progress(self, seconds=10): + with Progress(self, seconds) as p: + for i in range(seconds): + time.sleep(1) + p.did(1) diff --git a/judge/tasks/moss.py b/judge/tasks/moss.py new file mode 100644 index 0000000..66a4119 --- /dev/null +++ b/judge/tasks/moss.py @@ -0,0 +1,57 @@ +from celery import shared_task +from django.conf import settings +from django.core.exceptions import ImproperlyConfigured +from django.utils.translation import gettext as _ +from moss import MOSS + +from judge.models import Contest, ContestMoss, ContestParticipation, Submission +from judge.utils.celery import Progress + +__all__ = ('run_moss',) + + +@shared_task(bind=True) +def run_moss(self, contest_key): + moss_api_key = settings.MOSS_API_KEY + if moss_api_key is None: + raise ImproperlyConfigured('No MOSS API Key supplied') + + contest = Contest.objects.get(key=contest_key) + ContestMoss.objects.filter(contest=contest).delete() + + length = len(ContestMoss.LANG_MAPPING) * contest.problems.count() + moss_results = [] + + with Progress(self, length, stage=_('Running MOSS')) as p: + for problem in contest.problems.all(): + for dmoj_lang, moss_lang in ContestMoss.LANG_MAPPING: + result = ContestMoss(contest=contest, problem=problem, language=dmoj_lang) + + subs = Submission.objects.filter( + contest__participation__virtual__in=(ContestParticipation.LIVE, ContestParticipation.SPECTATE), + contest_object=contest, + problem=problem, + language__common_name=dmoj_lang, + ).order_by('-points').values_list('user__user__username', 'source__source') + + if subs.exists(): + moss_call = MOSS(moss_api_key, language=moss_lang, matching_file_limit=100, + comment='%s - %s' % (contest.key, problem.code)) + + users = set() + + for username, source in subs: + if username in users: + continue + users.add(username) + moss_call.add_file_from_memory(username, source.encode('utf-8')) + + result.url = moss_call.process() + result.submission_count = len(users) + + moss_results.append(result) + p.did(1) + + ContestMoss.objects.bulk_create(moss_results) + + return len(moss_results) diff --git a/judge/tasks/submission.py b/judge/tasks/submission.py new file mode 100644 index 0000000..a11de8c --- /dev/null +++ b/judge/tasks/submission.py @@ -0,0 +1,67 @@ +from celery import shared_task +from django.core.cache import cache +from django.utils.translation import gettext as _ + +from judge.models import Problem, Profile, Submission +from judge.utils.celery import Progress + +__all__ = ('apply_submission_filter', 'rejudge_problem_filter', 'rescore_problem') + + +def apply_submission_filter(queryset, id_range, languages, results): + if id_range: + start, end = id_range + queryset = queryset.filter(id__gte=start, id__lte=end) + if languages: + queryset = queryset.filter(language_id__in=languages) + if results: + queryset = queryset.filter(result__in=results) + queryset = queryset.exclude(status__in=Submission.IN_PROGRESS_GRADING_STATUS) + return queryset + + +@shared_task(bind=True) +def rejudge_problem_filter(self, problem_id, id_range=None, languages=None, results=None): + queryset = Submission.objects.filter(problem_id=problem_id) + queryset = apply_submission_filter(queryset, id_range, languages, results) + + rejudged = 0 + with Progress(self, queryset.count()) as p: + for submission in queryset.iterator(): + submission.judge(rejudge=True, batch_rejudge=True) + rejudged += 1 + if rejudged % 10 == 0: + p.done = rejudged + return rejudged + + +@shared_task(bind=True) +def rescore_problem(self, problem_id): + problem = Problem.objects.get(id=problem_id) + submissions = Submission.objects.filter(problem_id=problem_id) + + with Progress(self, submissions.count(), stage=_('Modifying submissions')) as p: + rescored = 0 + for submission in submissions.iterator(): + submission.points = round(submission.case_points / submission.case_total * problem.points + if submission.case_total else 0, 1) + if not problem.partial and submission.points < problem.points: + submission.points = 0 + submission.save(update_fields=['points']) + submission.update_contest() + rescored += 1 + if rescored % 10 == 0: + p.done = rescored + + with Progress(self, submissions.values('user_id').distinct().count(), stage=_('Recalculating user points')) as p: + users = 0 + profiles = Profile.objects.filter(id__in=submissions.values_list('user_id', flat=True).distinct()) + for profile in profiles.iterator(): + profile._updating_stats_only = True + profile.calculate_points() + cache.delete('user_complete:%d' % profile.id) + cache.delete('user_attempted:%d' % profile.id) + users += 1 + if users % 10 == 0: + p.done = users + return rescored diff --git a/judge/template_context.py b/judge/template_context.py new file mode 100644 index 0000000..6348407 --- /dev/null +++ b/judge/template_context.py @@ -0,0 +1,121 @@ +from functools import partial + +from django.conf import settings +from django.contrib.auth.context_processors import PermWrapper +from django.contrib.sites.shortcuts import get_current_site +from django.core.cache import cache +from django.utils.functional import SimpleLazyObject, new_method_proxy + +from judge.utils.caniuse import CanIUse, SUPPORT +from .models import MiscConfig, NavigationBar, Profile + + +class FixedSimpleLazyObject(SimpleLazyObject): + if not hasattr(SimpleLazyObject, '__iter__'): + __iter__ = new_method_proxy(iter) + + +def get_resource(request): + use_https = settings.DMOJ_SSL + if use_https == 1: + scheme = 'https' if request.is_secure() else 'http' + elif use_https > 1: + scheme = 'https' + else: + scheme = 'http' + return { + 'PYGMENT_THEME': settings.PYGMENT_THEME, + 'INLINE_JQUERY': settings.INLINE_JQUERY, + 'INLINE_FONTAWESOME': settings.INLINE_FONTAWESOME, + 'JQUERY_JS': settings.JQUERY_JS, + 'FONTAWESOME_CSS': settings.FONTAWESOME_CSS, + 'DMOJ_SCHEME': scheme, + 'DMOJ_CANONICAL': settings.DMOJ_CANONICAL, + } + + +def get_profile(request): + if request.user.is_authenticated: + return Profile.objects.get_or_create(user=request.user)[0] + return None + + +def comet_location(request): + if request.is_secure(): + websocket = getattr(settings, 'EVENT_DAEMON_GET_SSL', settings.EVENT_DAEMON_GET) + poll = getattr(settings, 'EVENT_DAEMON_POLL_SSL', settings.EVENT_DAEMON_POLL) + else: + websocket = settings.EVENT_DAEMON_GET + poll = settings.EVENT_DAEMON_POLL + return {'EVENT_DAEMON_LOCATION': websocket, + 'EVENT_DAEMON_POLL_LOCATION': poll} + + +def __nav_tab(path): + result = list(NavigationBar.objects.extra(where=['%s REGEXP BINARY regex'], params=[path])[:1]) + return result[0].get_ancestors(include_self=True).values_list('key', flat=True) if result else [] + + +def general_info(request): + path = request.get_full_path() + return { + 'nav_tab': FixedSimpleLazyObject(partial(__nav_tab, request.path)), + 'nav_bar': NavigationBar.objects.all(), + 'LOGIN_RETURN_PATH': '' if path.startswith('/accounts/') else path, + 'perms': PermWrapper(request.user), + } + + +def site(request): + return {'site': get_current_site(request)} + + +class MiscConfigDict(dict): + __slots__ = ('language', 'site') + + def __init__(self, language='', domain=None): + self.language = language + self.site = domain + super(MiscConfigDict, self).__init__() + + def __missing__(self, key): + cache_key = 'misc_config:%s:%s:%s' % (self.site, self.language, key) + value = cache.get(cache_key) + if value is None: + keys = ['%s.%s' % (key, self.language), key] if self.language else [key] + if self.site is not None: + keys = ['%s:%s' % (self.site, key) for key in keys] + keys + map = dict(MiscConfig.objects.values_list('key', 'value').filter(key__in=keys)) + for item in keys: + if item in map: + value = map[item] + break + else: + value = '' + cache.set(cache_key, value, 86400) + self[key] = value + return value + + +def misc_config(request): + domain = get_current_site(request).domain + return {'misc_config': MiscConfigDict(domain=domain), + 'i18n_config': MiscConfigDict(language=request.LANGUAGE_CODE, domain=domain)} + + +def site_name(request): + return {'SITE_NAME': settings.SITE_NAME, + 'SITE_LONG_NAME': settings.SITE_LONG_NAME, + 'SITE_ADMIN_EMAIL': settings.SITE_ADMIN_EMAIL} + + +def math_setting(request): + caniuse = CanIUse(request.META.get('HTTP_USER_AGENT', '')) + + if request.user.is_authenticated: + engine = request.profile.math_engine + else: + engine = settings.MATHOID_DEFAULT_TYPE + if engine == 'auto': + engine = 'mml' if bool(settings.MATHOID_URL) and caniuse.mathml == SUPPORT else 'jax' + return {'MATH_ENGINE': engine, 'REQUIRE_JAX': engine == 'jax', 'caniuse': caniuse} diff --git a/judge/templatetags/__init__.py b/judge/templatetags/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/judge/templatetags/code_highlight.py b/judge/templatetags/code_highlight.py new file mode 100644 index 0000000..e47e165 --- /dev/null +++ b/judge/templatetags/code_highlight.py @@ -0,0 +1,10 @@ +from django import template + +from judge.highlight_code import highlight_code + +register = template.Library() + + +@register.filter +def highlight(code, language): + return highlight_code(code, language) diff --git a/judge/templatetags/counter.py b/judge/templatetags/counter.py new file mode 100644 index 0000000..237d2f2 --- /dev/null +++ b/judge/templatetags/counter.py @@ -0,0 +1,10 @@ +from itertools import count + +from django import template + +register = template.Library() + + +@register.simple_tag +def get_counter(start=1): + return count(start).__next__ diff --git a/judge/templatetags/dicts.py b/judge/templatetags/dicts.py new file mode 100644 index 0000000..3afc15b --- /dev/null +++ b/judge/templatetags/dicts.py @@ -0,0 +1,8 @@ +from django import template + +register = template.Library() + + +@register.filter(name='get_dict_item') +def get_item(dictionary, key): + return dictionary.get(key) diff --git a/judge/templatetags/list_processor.py b/judge/templatetags/list_processor.py new file mode 100644 index 0000000..dc37105 --- /dev/null +++ b/judge/templatetags/list_processor.py @@ -0,0 +1,58 @@ +from operator import attrgetter, itemgetter + +from django import template + +register = template.Library() + + +@register.filter(name='list_attr') +def list_attr(iterable, prop): + result = [] + for item in iterable: + if hasattr(item, str(prop)): + result.append(getattr(item, prop)) + else: + try: + result.append(item[prop]) + except KeyError: + result.append('') + except TypeError: + try: + result.append(item[int(prop)]) + except (IndexError, ValueError, TypeError): + result.append('') + return result + + +@register.filter(name='list_getitem') +def list_getitem(iterable, prop): + return list(map(itemgetter(prop), iterable)) + + +@register.filter(name='list_getindex') +def list_getindex(iterable, index): + return list(map(itemgetter(int(index)), iterable)) + + +@register.filter(name='list_getattr') +def list_getattr(iterable, prop): + return list(map(attrgetter(prop), iterable)) + + +@register.filter(name='sum_list') +def sum_list(iterable): + return sum(iterable) + + +@register.filter(name='max_list') +def max_list(iterable): + if not iterable: + return 0 + return max(iterable) + + +@register.filter(name='min_list') +def min_list(iterable): + if not iterable: + return 0 + return min(iterable) diff --git a/judge/templatetags/strings.py b/judge/templatetags/strings.py new file mode 100644 index 0000000..6bd685a --- /dev/null +++ b/judge/templatetags/strings.py @@ -0,0 +1,18 @@ +from django import template + +register = template.Library() + + +@register.filter(name='split') +def split(value): + return value.split('\n') + + +@register.filter(name='cutoff') +def cutoff(value, length): + return value[:int(length)] + + +@register.filter(name='roundfloat') +def roundfloat(value, at): + return str(round(value, int(at))) diff --git a/judge/tests.py b/judge/tests.py new file mode 100644 index 0000000..a39b155 --- /dev/null +++ b/judge/tests.py @@ -0,0 +1 @@ +# Create your tests here. diff --git a/judge/timezone.py b/judge/timezone.py new file mode 100644 index 0000000..c3b5b04 --- /dev/null +++ b/judge/timezone.py @@ -0,0 +1,27 @@ +import pytz +from django.conf import settings +from django.db import connection +from django.utils import timezone +from django.utils.timezone import make_aware + + +class TimezoneMiddleware(object): + def __init__(self, get_response=None): + self.get_response = get_response + + def get_timezone(self, request): + tzname = settings.DEFAULT_USER_TIME_ZONE + if request.profile: + tzname = request.profile.timezone + return pytz.timezone(tzname) + + def __call__(self, request): + with timezone.override(self.get_timezone(request)): + return self.get_response(request) + + +def from_database_time(datetime): + tz = connection.timezone + if tz is None: + return datetime + return make_aware(datetime, tz) diff --git a/judge/user_log.py b/judge/user_log.py new file mode 100644 index 0000000..d5304ff --- /dev/null +++ b/judge/user_log.py @@ -0,0 +1,21 @@ +from django.utils.timezone import now + +from judge.models import Profile + + +class LogUserAccessMiddleware(object): + def __init__(self, get_response=None): + self.get_response = get_response + + def __call__(self, request): + response = self.get_response(request) + + if (hasattr(request, 'user') and request.user.is_authenticated and + not getattr(request, 'no_profile_update', False)): + updates = {'last_access': now()} + # Decided on using REMOTE_ADDR as nginx will translate it to the external IP that hits it. + if request.META.get('REMOTE_ADDR'): + updates['ip'] = request.META.get('REMOTE_ADDR') + Profile.objects.filter(user_id=request.user.pk).update(**updates) + + return response diff --git a/judge/user_translations.py b/judge/user_translations.py new file mode 100644 index 0000000..edc32ae --- /dev/null +++ b/judge/user_translations.py @@ -0,0 +1,40 @@ +from django.conf import settings +from django.utils import six +from django.utils.safestring import SafeData, mark_safe + +if settings.USE_I18N: + from django.utils.translation.trans_real import DjangoTranslation, get_language + + _translations = {} + + def translation(language): + global _translations + if language not in _translations: + _translations[language] = DjangoTranslation(language, domain='dmoj-user') + return _translations[language] + + def do_translate(message, translation_function): + """Copied from django.utils.translation.trans_real""" + # str() is allowing a bytestring message to remain bytestring on Python 2 + eol_message = message.replace(str('\r\n'), str('\n')).replace(str('\r'), str('\n')) + + if len(eol_message) == 0: + # Returns an empty value of the corresponding type if an empty message + # is given, instead of metadata, which is the default gettext behavior. + result = '' + else: + translation_object = translation(get_language()) + result = getattr(translation_object, translation_function)(eol_message) + if not isinstance(result, six.text_type): + result = result.decode('utf-8') + + if isinstance(message, SafeData): + return mark_safe(result) + + return result + + def gettext(message): + return do_translate(message, 'gettext') +else: + def gettext(message): + return message diff --git a/judge/utils/__init__.py b/judge/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/judge/utils/cachedict.py b/judge/utils/cachedict.py new file mode 100644 index 0000000..e3a8eb0 --- /dev/null +++ b/judge/utils/cachedict.py @@ -0,0 +1,8 @@ +class CacheDict(dict): + def __init__(self, func): + super(CacheDict, self).__init__() + self.func = func + + def __missing__(self, key): + self[key] = value = self.func(key) + return value diff --git a/judge/utils/camo.py b/judge/utils/camo.py new file mode 100644 index 0000000..a3c90a5 --- /dev/null +++ b/judge/utils/camo.py @@ -0,0 +1,48 @@ +import hmac +from hashlib import sha1 + +from django.conf import settings + +from judge.utils.unicode import utf8bytes + + +class CamoClient(object): + """Based on https://github.com/sionide21/camo-client""" + + def __init__(self, server, key, excluded=(), https=False): + self.server = server.rstrip('/') + self.key = key + self.https = https + self.excluded = excluded + + def image_url(self, url): + return '%s/%s/%s' % (self.server, + hmac.new(utf8bytes(self.key), utf8bytes(url), sha1).hexdigest(), + utf8bytes(url).hex()) + + def rewrite_url(self, url): + if url.startswith(self.server) or url.startswith(self.excluded): + return url + elif url.startswith(('http://', 'https://')): + return self.image_url(url) + elif url.startswith('//'): + return self.rewrite_url(('https:' if self.https else 'http:') + url) + else: + return url + + def update_tree(self, doc): + for img in doc.xpath('.//img'): + for attr in ('src', 'data-src'): + if img.get(attr): + img.set(attr, self.rewrite_url(img.get(attr))) + for obj in doc.xpath('.//object'): + if obj.get('data'): + obj.set('data', self.rewrite_url(obj.get('data'))) + + +if settings.DMOJ_CAMO_URL and settings.DMOJ_CAMO_KEY: + client = CamoClient(settings.DMOJ_CAMO_URL, key=settings.DMOJ_CAMO_KEY, + excluded=settings.DMOJ_CAMO_EXCLUDE, + https=settings.DMOJ_CAMO_HTTPS) +else: + client = None diff --git a/judge/utils/caniuse.py b/judge/utils/caniuse.py new file mode 100644 index 0000000..bd4bb52 --- /dev/null +++ b/judge/utils/caniuse.py @@ -0,0 +1,148 @@ +import requests +from ua_parser import user_agent_parser + +_SUPPORT_DATA = requests.get('https://raw.githubusercontent.com/Fyrd/caniuse/master/data.json').json()['data'] + +SUPPORT = 'y' +PARTIAL_SUPPORT = 'a' +UNSUPPORTED = 'n' +POLYFILL = 'p' +UNKNOWN = 'u' +PREFIX = 'x' +DISABLED = 'd' + + +def safe_int(string): + try: + return int(string) + except (ValueError, TypeError): + return 0 + + +class BrowserFamily(object): + def __init__(self, data): + self._data = data + self._ranges = ranges = [] + self._versions = versions = {} + max_version = () + max_support = UNKNOWN + + for version, support in data.items(): + if version == 'all': + self.max_support = support + elif '-' in version: + start, end = version.split('-') + start = tuple(map(int, start.split('.'))) + end = tuple(map(int, end.split('.'))) + (1e3000,) + ranges.append((start, end, support)) + if end > max_version: + max_version = end + max_support = support + else: + try: + version = tuple(map(int, version.split('.'))) + except ValueError: + pass + else: + if version > max_version: + max_version = version + max_support = support + versions[version] = support + + self.max_version = max_version + self.max_support = max_support + + def check(self, major, minor, patch): + int_major, int_minor, int_patch = map(safe_int, (major, minor, patch)) + + version = (int_major, int_minor, int_patch) + if version > self.max_version: + return self.max_support + + for key in ((int_major, int_minor, int_patch), (int_major, int_minor), (int_major,), major): + try: + return self._versions[key] + except KeyError: + pass + + for start, end, support in self._ranges: + if start <= version < end: + return support + + return UNKNOWN + + +class Feat(object): + def __init__(self, data): + self._data = data + self._family = {name: BrowserFamily(data) for name, data in data['stats'].items()} + + def __getitem__(self, item): + return self._family[item] + + +class Database(object): + def __init__(self, data): + self._data = data + self._feats = {feat: Feat(data) for feat, data in data.items()} + + def __getitem__(self, item): + return self._feats[item] + + +database = Database(_SUPPORT_DATA) + + +class CanIUse(object): + def __init__(self, ua): + self._agent = user_agent_parser.Parse(ua) + + os_family = self._agent['os']['family'] + browser_family = self._agent['user_agent']['family'] + + family = None + + if os_family == 'Android': + if 'Firefox' in browser_family: + family = 'and_ff' + elif 'Chrome' in browser_family: + family = 'and_chr' + elif 'Android' in browser_family: + family = 'android' + else: + if 'Edge' in browser_family: + family = 'edge' + elif 'Firefox' in browser_family: + family = 'firefox' + elif 'Chrome' in browser_family: + family = 'chrome' + elif 'IE' in browser_family: + family = 'ie' + elif 'Opera' in browser_family: + family = 'opera' + elif 'Safari' in browser_family: + family = 'safari' + + self._family = family + + def _check_feat(self, feat): + if not self._family: + return UNKNOWN + + try: + stats = feat[self._family] + except KeyError: + return UNKNOWN + else: + ua = self._agent['user_agent'] + return stats.check(ua['major'], ua['minor'], ua['patch'])[0] + + def __getattr__(self, attr): + try: + feat = database[attr.replace('_', '-')] + except KeyError: + raise AttributeError(attr) + else: + result = self._check_feat(feat) + setattr(self, attr, result) + return result diff --git a/judge/utils/celery.py b/judge/utils/celery.py new file mode 100644 index 0000000..c905eae --- /dev/null +++ b/judge/utils/celery.py @@ -0,0 +1,67 @@ +from django.http import HttpResponseRedirect +from django.urls import reverse +from django.utils.http import urlencode + + +class Progress: + def __init__(self, task, total, stage=None): + self.task = task + self._total = total + self._done = 0 + self._stage = stage + + def _update_state(self): + self.task.update_state( + state='PROGRESS', + meta={ + 'done': self._done, + 'total': self._total, + 'stage': self._stage, + }, + ) + + @property + def done(self): + return self._done + + @done.setter + def done(self, value): + self._done = value + self._update_state() + + @property + def total(self): + return self._total + + @total.setter + def total(self, value): + self._total = value + self._done = min(self._done, value) + self._update_state() + + def did(self, delta): + self._done += delta + self._update_state() + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + if exc_type is None: + self.done = self._total + + +def task_status_url(result, message=None, redirect=None): + args = {} + if message: + args['message'] = message + if redirect: + args['redirect'] = redirect + url = reverse('task_status', args=[result.id]) + if args: + url += '?' + urlencode(args) + return url + + +def redirect_to_task_status(result, message=None, redirect=None): + return HttpResponseRedirect(task_status_url(result, message, redirect)) diff --git a/judge/utils/diggpaginator.py b/judge/utils/diggpaginator.py new file mode 100644 index 0000000..2832d2d --- /dev/null +++ b/judge/utils/diggpaginator.py @@ -0,0 +1,290 @@ +import math +from functools import reduce + +from django.core.paginator import InvalidPage, Page, Paginator + +__all__ = ( + 'InvalidPage', + 'ExPaginator', + 'DiggPaginator', + 'QuerySetDiggPaginator', +) + + +class ExPaginator(Paginator): + """Adds a ``softlimit`` option to ``page()``. If True, querying a + page number larger than max. will not fail, but instead return the + last available page. + + This is useful when the data source can not provide an exact count + at all times (like some search engines), meaning the user could + possibly see links to invalid pages at some point which we wouldn't + want to fail as 404s. + + >>> items = range(1, 1000) + >>> paginator = ExPaginator(items, 10) + >>> paginator.page(1000) + Traceback (most recent call last): + InvalidPage: That page contains no results + >>> paginator.page(1000, softlimit=True) + + + # [bug] graceful handling of non-int args + >>> paginator.page("str") + Traceback (most recent call last): + InvalidPage: That page number is not an integer + """ + + def _ensure_int(self, num, e): + # see Django #7307 + try: + return int(num) + except ValueError: + raise e + + def page(self, number, softlimit=False): + try: + return super(ExPaginator, self).page(number) + except InvalidPage as e: + number = self._ensure_int(number, e) + if number > self.num_pages and softlimit: + return self.page(self.num_pages, softlimit=False) + else: + raise e + + +class DiggPaginator(ExPaginator): + """ + Based on Django's default paginator, it adds "Digg-style" page ranges + with a leading block of pages, an optional middle block, and another + block at the end of the page range. They are available as attributes + on the page: + + {# with: page = digg_paginator.page(1) #} + {% for num in page.leading_range %} ... + {% for num in page.main_range %} ... + {% for num in page.trailing_range %} ... + + Additionally, ``page_range`` contains a nun-numeric ``False`` element + for every transition between two ranges. + + {% for num in page.page_range %} + {% if not num %} ... {# literally output dots #} + {% else %}{{ num }} + {% endif %} + {% endfor %} + + Additional arguments passed to the constructor allow customization of + how those bocks are constructed: + + body=5, tail=2 + + [1] 2 3 4 5 ... 91 92 + |_________| |___| + body tail + |_____| + margin + + body=5, tail=2, padding=2 + + 1 2 ... 6 7 [8] 9 10 ... 91 92 + |_| |__| + ^padding^ + |_| |__________| |___| + tail body tail + + ``margin`` is the minimum number of pages required between two ranges; if + there are less, they are combined into one. + + When ``align_left`` is set to ``True``, the paginator operates in a + special mode that always skips the right tail, e.g. does not display the + end block unless necessary. This is useful for situations in which the + exact number of items/pages is not actually known. + + # odd body length + >>> print DiggPaginator(range(1,1000), 10, body=5).page(1) + 1 2 3 4 5 ... 99 100 + >>> print DiggPaginator(range(1,1000), 10, body=5).page(100) + 1 2 ... 96 97 98 99 100 + + # even body length + >>> print DiggPaginator(range(1,1000), 10, body=6).page(1) + 1 2 3 4 5 6 ... 99 100 + >>> print DiggPaginator(range(1,1000), 10, body=6).page(100) + 1 2 ... 95 96 97 98 99 100 + + # leading range and main range are combined when close; note how + # we have varying body and padding values, and their effect. + >>> print DiggPaginator(range(1,1000), 10, body=5, padding=2, margin=2).page(3) + 1 2 3 4 5 ... 99 100 + >>> print DiggPaginator(range(1,1000), 10, body=6, padding=2, margin=2).page(4) + 1 2 3 4 5 6 ... 99 100 + >>> print DiggPaginator(range(1,1000), 10, body=5, padding=1, margin=2).page(6) + 1 2 3 4 5 6 7 ... 99 100 + >>> print DiggPaginator(range(1,1000), 10, body=5, padding=2, margin=2).page(7) + 1 2 ... 5 6 7 8 9 ... 99 100 + >>> print DiggPaginator(range(1,1000), 10, body=5, padding=1, margin=2).page(7) + 1 2 ... 5 6 7 8 9 ... 99 100 + + # the trailing range works the same + >>> print DiggPaginator(range(1,1000), 10, body=5, padding=2, margin=2, ).page(98) + 1 2 ... 96 97 98 99 100 + >>> print DiggPaginator(range(1,1000), 10, body=6, padding=2, margin=2, ).page(97) + 1 2 ... 95 96 97 98 99 100 + >>> print DiggPaginator(range(1,1000), 10, body=5, padding=1, margin=2, ).page(95) + 1 2 ... 94 95 96 97 98 99 100 + >>> print DiggPaginator(range(1,1000), 10, body=5, padding=2, margin=2, ).page(94) + 1 2 ... 92 93 94 95 96 ... 99 100 + >>> print DiggPaginator(range(1,1000), 10, body=5, padding=1, margin=2, ).page(94) + 1 2 ... 92 93 94 95 96 ... 99 100 + + # all three ranges may be combined as well + >>> print DiggPaginator(range(1,151), 10, body=6, padding=2).page(7) + 1 2 3 4 5 6 7 8 9 ... 14 15 + >>> print DiggPaginator(range(1,151), 10, body=6, padding=2).page(8) + 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 + >>> print DiggPaginator(range(1,151), 10, body=6, padding=1).page(8) + 1 2 3 4 5 6 7 8 9 ... 14 15 + + # no leading or trailing ranges might be required if there are only + # a very small number of pages + >>> print DiggPaginator(range(1,80), 10, body=10).page(1) + 1 2 3 4 5 6 7 8 + >>> print DiggPaginator(range(1,80), 10, body=10).page(8) + 1 2 3 4 5 6 7 8 + >>> print DiggPaginator(range(1,12), 10, body=5).page(1) + 1 2 + + # test left align mode + >>> print DiggPaginator(range(1,1000), 10, body=5, align_left=True).page(1) + 1 2 3 4 5 + >>> print DiggPaginator(range(1,1000), 10, body=5, align_left=True).page(50) + 1 2 ... 48 49 50 51 52 + >>> print DiggPaginator(range(1,1000), 10, body=5, align_left=True).page(97) + 1 2 ... 95 96 97 98 99 + >>> print DiggPaginator(range(1,1000), 10, body=5, align_left=True).page(100) + 1 2 ... 96 97 98 99 100 + + # padding: default value + >>> DiggPaginator(range(1,1000), 10, body=10).padding + 4 + + # padding: automatic reduction + >>> DiggPaginator(range(1,1000), 10, body=5).padding + 2 + >>> DiggPaginator(range(1,1000), 10, body=6).padding + 2 + + # padding: sanity check + >>> DiggPaginator(range(1,1000), 10, body=5, padding=3) + Traceback (most recent call last): + ValueError: padding too large for body (max 2) + """ + + def __init__(self, *args, **kwargs): + self.body = kwargs.pop('body', 10) + self.tail = kwargs.pop('tail', 2) + self.align_left = kwargs.pop('align_left', False) + self.margin = kwargs.pop('margin', 4) # TODO: make the default relative to body? + # validate padding value + max_padding = int(math.ceil(self.body / 2.0) - 1) + self.padding = kwargs.pop('padding', min(4, max_padding)) + if self.padding > max_padding: + raise ValueError('padding too large for body (max %d)' % max_padding) + super(DiggPaginator, self).__init__(*args, **kwargs) + + def page(self, number, *args, **kwargs): + """Return a standard ``Page`` instance with custom, digg-specific + page ranges attached. + """ + + page = super(DiggPaginator, self).page(number, *args, **kwargs) + number = int(number) # we know this will work + + # easier access + num_pages, body, tail, padding, margin = \ + self.num_pages, self.body, self.tail, self.padding, self.margin + + # put active page in middle of main range + main_range = list(map(int, [ + math.floor(number - body / 2.0) + 1, # +1 = shift odd body to right + math.floor(number + body / 2.0)])) + # adjust bounds + if main_range[0] < 1: + main_range = list(map(abs(main_range[0] - 1).__add__, main_range)) + if main_range[1] > num_pages: + main_range = list(map((num_pages - main_range[1]).__add__, main_range)) + + # Determine leading and trailing ranges; if possible and appropriate, + # combine them with the main range, in which case the resulting main + # block might end up considerable larger than requested. While we + # can't guarantee the exact size in those cases, we can at least try + # to come as close as possible: we can reduce the other boundary to + # max padding, instead of using half the body size, which would + # otherwise be the case. If the padding is large enough, this will + # of course have no effect. + # Example: + # total pages=100, page=4, body=5, (default padding=2) + # 1 2 3 [4] 5 6 ... 99 100 + # total pages=100, page=4, body=5, padding=1 + # 1 2 3 [4] 5 ... 99 100 + # If it were not for this adjustment, both cases would result in the + # first output, regardless of the padding value. + if main_range[0] <= tail + margin: + leading = [] + main_range = [1, max(body, min(number + padding, main_range[1]))] + main_range[0] = 1 + else: + leading = list(range(1, tail + 1)) + # basically same for trailing range, but not in ``left_align`` mode + if self.align_left: + trailing = [] + else: + if main_range[1] >= num_pages - (tail + margin) + 1: + trailing = [] + if not leading: + # ... but handle the special case of neither leading nor + # trailing ranges; otherwise, we would now modify the + # main range low bound, which we just set in the previous + # section, again. + main_range = [1, num_pages] + else: + main_range = [min(num_pages - body + 1, max(number - padding, main_range[0])), num_pages] + else: + trailing = list(range(num_pages - tail + 1, num_pages + 1)) + + # finally, normalize values that are out of bound; this basically + # fixes all the things the above code screwed up in the simple case + # of few enough pages where one range would suffice. + main_range = [max(main_range[0], 1), min(main_range[1], num_pages)] + + # make the result of our calculations available as custom ranges + # on the ``Page`` instance. + page.main_range = list(range(main_range[0], main_range[1] + 1)) + page.leading_range = leading + page.trailing_range = trailing + page.page_range = reduce(lambda x, y: x + ((x and y) and [False]) + y, + [page.leading_range, page.main_range, page.trailing_range]) + + page.__class__ = DiggPage + return page + + +class DiggPage(Page): + def __str__(self): + return " ... ".join(filter(None, [ + " ".join(map(str, self.leading_range)), + " ".join(map(str, self.main_range)), + " ".join(map(str, self.trailing_range))])) + + @property + def num_pages(self): + return self.paginator.num_pages + + +QuerySetDiggPaginator = DiggPaginator + +if __name__ == "__main__": + import doctest + + doctest.testmod() diff --git a/judge/utils/file_cache.py b/judge/utils/file_cache.py new file mode 100644 index 0000000..3864f59 --- /dev/null +++ b/judge/utils/file_cache.py @@ -0,0 +1,45 @@ +import errno +import os +from gzip import open as gzip_open +from urllib.parse import urljoin + + +class HashFileCache(object): + def __init__(self, root, url, gzip=False): + self.root = root + self.url = url + self.gzip = gzip + + def create(self, hash): + try: + os.makedirs(os.path.join(self.root, hash)) + except OSError as e: + if e.errno != errno.EEXIST: + raise + + def has_file(self, hash, file): + return os.path.isfile(self.get_path(hash, file)) + + def get_path(self, hash, file): + return os.path.join(self.root, hash, file) + + def get_url(self, hash, file): + return urljoin(self.url, '%s/%s' % (hash, file)) + + def read_file(self, hash, file): + return open(self.get_path(hash, file), 'rb') + + def read_data(self, hash, file): + with self.read_file(hash, file) as f: + return f.read() + + def cache_data(self, hash, file, data, url=True, gzip=True): + if gzip and self.gzip: + with gzip_open(self.get_path(hash, file + '.gz'), 'wb') as f: + f.write(data) + + with open(self.get_path(hash, file), 'wb') as f: + f.write(data) + + if url: + return self.get_url(hash, file) diff --git a/judge/utils/mathoid.py b/judge/utils/mathoid.py new file mode 100644 index 0000000..a28357d --- /dev/null +++ b/judge/utils/mathoid.py @@ -0,0 +1,185 @@ +import hashlib +import logging +import re + +import requests +from django.conf import settings +from django.core.cache import caches +from django.utils.html import format_html +from django.utils.safestring import mark_safe +from mistune import escape + +from judge.utils.file_cache import HashFileCache +from judge.utils.unicode import utf8bytes, utf8text + +logger = logging.getLogger('judge.mathoid') +reescape = re.compile(r'(?'), + ('&', '&'), + ('−', '-'), + ('≤', r'\le'), + ('≥', r'\ge'), + ('…', '...'), + (r'\lt', '<'), + (r'\gt', '>'), +] + + +def format_math(math): + for a, b in REPLACES: + math = math.replace(a, b) + return math + + +class MathoidMathParser(object): + types = ('svg', 'mml', 'tex', 'jax') + + def __init__(self, type): + self.type = type + + self.mathoid_url = settings.MATHOID_URL + self.cache = HashFileCache(settings.MATHOID_CACHE_ROOT, + settings.MATHOID_CACHE_URL, + settings.MATHOID_GZIP) + + mml_cache = settings.MATHOID_MML_CACHE + self.mml_cache = mml_cache and caches[mml_cache] + self.css_cache = caches[settings.MATHOID_CSS_CACHE] + + self.mml_cache_ttl = settings.MATHOID_MML_CACHE_TTL + + def query_mathoid(self, formula, hash): + self.cache.create(hash) + + try: + response = requests.post(self.mathoid_url, data={ + 'q': reescape.sub(lambda m: '\\' + m.group(0), formula).encode('utf-8'), + 'type': 'tex' if formula.startswith(r'\displaystyle') else 'inline-tex', + }) + response.raise_for_status() + data = response.json() + except requests.ConnectionError: + logger.exception('Failed to connect to mathoid for: %s', formula) + return + except requests.HTTPError as e: + logger.error('Mathoid failed to render: %s\n%s', formula, e.response.text) + return + except Exception: + logger.exception('Failed to connect to mathoid for: %s', formula) + return + + if not data['success']: + logger.error('Mathoid failure for: %s\n%s', formula, data) + return + + if any(i not in data for i in ('mml', 'png', 'svg', 'mathoidStyle')): + logger.error('Mathoid did not return required information (mml, png, svg, mathoidStyle needed):\n%s', data) + return + + css = data['mathoidStyle'] + mml = data['mml'] + result = { + 'css': css, 'mml': mml, + 'png': self.cache.cache_data(hash, 'png', bytearray(data['png']['data'])), + 'svg': self.cache.cache_data(hash, 'svg', data['svg'].encode('utf-8')), + } + self.cache.cache_data(hash, 'mml', mml.encode('utf-8'), url=False, gzip=False) + self.cache.cache_data(hash, 'css', css.encode('utf-8'), url=False, gzip=False) + return result + + def query_cache(self, hash): + result = { + 'svg': self.cache.get_url(hash, 'svg'), + 'png': self.cache.get_url(hash, 'png'), + } + + key = 'mathoid:css:' + hash + css = result['css'] = self.css_cache.get(key) + if css is None: + css = result['css'] = self.cache.read_data(hash, 'css').decode('utf-8') + self.css_cache.set(key, css, self.mml_cache_ttl) + + mml = None + if self.mml_cache: + mml = result['mml'] = self.mml_cache.get('mathoid:mml:' + hash) + if mml is None: + mml = result['mml'] = self.cache.read_data(hash, 'mml').decode('utf-8') + if self.mml_cache: + self.mml_cache.set('mathoid:mml:' + hash, mml, self.mml_cache_ttl) + return result + + def get_result(self, formula): + if self.type == 'tex': + return + + hash = hashlib.sha1(utf8bytes(formula)).hexdigest() + formula = utf8text(formula) + if self.cache.has_file(hash, 'css'): + result = self.query_cache(hash) + else: + result = self.query_mathoid(formula, hash) + + if not result: + return None + + result['tex'] = formula + result['display'] = formula.startswith(r'\displaystyle') + return { + 'mml': self.output_mml, + 'msp': self.output_msp, + 'svg': self.output_svg, + 'jax': self.output_jax, + 'png': self.output_png, + 'raw': lambda x: x, + }[self.type](result) + + def output_mml(self, result): + return result['mml'] + + def output_msp(self, result): + # 100% MediaWiki compatibility. + return format_html('' + '' + '', + mark_safe(result['mml']), result['svg'], result['png'], result['css'], result['tex'], + ['inline', 'display'][result['display']]) + + def output_jax(self, result): + return format_html('' + '''{3}''' + '''''' + '', + result['svg'], result['png'], result['css'], result['tex'], + ['inline-math', 'display-math'][result['display']], ['~', '$$'][result['display']]) + + def output_svg(self, result): + return format_html('{3}''', + result['svg'], result['png'], result['css'], result['tex'], + ['inline-math', 'display-math'][result['display']]) + + def output_png(self, result): + return format_html('{2}', + result['png'], result['css'], result['tex'], + ['inline-math', 'display-math'][result['display']]) + + def display_math(self, math): + math = format_math(math) + return self.get_result(r'\displaystyle ' + math) or r'\[%s\]' % escape(math) + + def inline_math(self, math): + math = format_math(math) + return self.get_result(math) or r'\(%s\)' % escape(math) diff --git a/judge/utils/opengraph.py b/judge/utils/opengraph.py new file mode 100644 index 0000000..df016c2 --- /dev/null +++ b/judge/utils/opengraph.py @@ -0,0 +1,24 @@ +from django.core.cache import cache +from django.template.defaultfilters import truncatewords + +from judge.jinja2.markdown import markdown +from judge.jinja2.reference import reference + + +def generate_opengraph(cache_key, data, style): + metadata = cache.get(cache_key) + if metadata is None: + description = None + tree = reference(markdown(data, style)).tree + for p in tree.iterfind('.//p'): + text = p.text_content().strip() + if text: + description = text + break + if description: + for remove in (r'\[', r'\]', r'\(', r'\)'): + description = description.replace(remove, '') + img = tree.xpath('.//img') + metadata = truncatewords(description, 60), img[0].get('src') if img else None + cache.set(cache_key, metadata, 86400) + return metadata diff --git a/judge/utils/problem_data.py b/judge/utils/problem_data.py new file mode 100644 index 0000000..9655f76 --- /dev/null +++ b/judge/utils/problem_data.py @@ -0,0 +1,198 @@ +import json +import os +import re + +import yaml +from django.conf import settings +from django.core.files.base import ContentFile +from django.core.files.storage import FileSystemStorage +from django.urls import reverse +from django.utils.translation import gettext as _ + +if os.altsep: + def split_path_first(path, repath=re.compile('[%s]' % re.escape(os.sep + os.altsep))): + return repath.split(path, 1) +else: + def split_path_first(path): + return path.split(os.sep, 1) + + +class ProblemDataStorage(FileSystemStorage): + def __init__(self): + super(ProblemDataStorage, self).__init__(settings.DMOJ_PROBLEM_DATA_ROOT) + + def url(self, name): + path = split_path_first(name) + if len(path) != 2: + raise ValueError('This file is not accessible via a URL.') + return reverse('problem_data_file', args=path) + + def _save(self, name, content): + if self.exists(name): + self.delete(name) + return super(ProblemDataStorage, self)._save(name, content) + + def get_available_name(self, name, max_length=None): + return name + + def rename(self, old, new): + return os.rename(self.path(old), self.path(new)) + + +class ProblemDataError(Exception): + def __init__(self, message): + super(ProblemDataError, self).__init__(message) + self.message = message + + +class ProblemDataCompiler(object): + def __init__(self, problem, data, cases, files): + self.problem = problem + self.data = data + self.cases = cases + self.files = files + + self.generator = data.generator + + def make_init(self): + cases = [] + batch = None + + def end_batch(): + if not batch['batched']: + raise ProblemDataError(_('Empty batches not allowed.')) + cases.append(batch) + + def make_checker(case): + if case.checker_args: + return { + 'name': case.checker, + 'args': json.loads(case.checker_args), + } + return case.checker + + for i, case in enumerate(self.cases, 1): + if case.type == 'C': + data = {} + if batch: + case.points = None + case.is_pretest = batch['is_pretest'] + else: + if case.points is None: + raise ProblemDataError(_('Points must be defined for non-batch case #%d.') % i) + data['is_pretest'] = case.is_pretest + + if not self.generator: + if case.input_file not in self.files: + raise ProblemDataError(_('Input file for case %d does not exist: %s') % + (i, case.input_file)) + if case.output_file not in self.files: + raise ProblemDataError(_('Output file for case %d does not exist: %s') % + (i, case.output_file)) + + if case.input_file: + data['in'] = case.input_file + if case.output_file: + data['out'] = case.output_file + if case.points is not None: + data['points'] = case.points + if case.generator_args: + data['generator_args'] = case.generator_args.splitlines() + if case.output_limit is not None: + data['output_limit_length'] = case.output_limit + if case.output_prefix is not None: + data['output_prefix_length'] = case.output_prefix + if case.checker: + data['checker'] = make_checker(case) + else: + case.checker_args = '' + case.save(update_fields=('checker_args', 'is_pretest')) + (batch['batched'] if batch else cases).append(data) + elif case.type == 'S': + if batch: + end_batch() + if case.points is None: + raise ProblemDataError(_('Batch start case #%d requires points.') % i) + batch = { + 'points': case.points, + 'batched': [], + 'is_pretest': case.is_pretest, + } + if case.generator_args: + batch['generator_args'] = case.generator_args.splitlines() + if case.output_limit is not None: + batch['output_limit_length'] = case.output_limit + if case.output_prefix is not None: + batch['output_prefix_length'] = case.output_prefix + if case.checker: + batch['checker'] = make_checker(case) + else: + case.checker_args = '' + case.input_file = '' + case.output_file = '' + case.save(update_fields=('checker_args', 'input_file', 'output_file')) + elif case.type == 'E': + if not batch: + raise ProblemDataError(_('Attempt to end batch outside of one in case #%d') % i) + case.is_pretest = batch['is_pretest'] + case.input_file = '' + case.output_file = '' + case.generator_args = '' + case.checker = '' + case.checker_args = '' + case.save() + end_batch() + batch = None + if batch: + end_batch() + + init = {} + + if self.data.zipfile: + zippath = split_path_first(self.data.zipfile.name) + if len(zippath) != 2: + raise ProblemDataError(_('How did you corrupt the zip path?')) + init['archive'] = zippath[1] + + if self.generator: + generator_path = split_path_first(self.generator.name) + if len(generator_path) != 2: + raise ProblemDataError(_('How did you corrupt the generator path?')) + init['generator'] = generator_path[1] + + pretests = [case for case in cases if case['is_pretest']] + for case in cases: + del case['is_pretest'] + if pretests: + init['pretest_test_cases'] = pretests + if cases: + init['test_cases'] = cases + if self.data.output_limit is not None: + init['output_limit_length'] = self.data.output_limit + if self.data.output_prefix is not None: + init['output_prefix_length'] = self.data.output_prefix + if self.data.checker: + init['checker'] = make_checker(self.data) + else: + self.data.checker_args = '' + return init + + def compile(self): + from judge.models import problem_data_storage + + yml_file = '%s/init.yml' % self.problem.code + try: + init = yaml.safe_dump(self.make_init()) + except ProblemDataError as e: + self.data.feedback = e.message + self.data.save() + problem_data_storage.delete(yml_file) + else: + self.data.feedback = '' + self.data.save() + problem_data_storage.save(yml_file, ContentFile(init)) + + @classmethod + def generate(cls, *args, **kwargs): + self = cls(*args, **kwargs) + self.compile() diff --git a/judge/utils/problems.py b/judge/utils/problems.py new file mode 100644 index 0000000..f87f807 --- /dev/null +++ b/judge/utils/problems.py @@ -0,0 +1,147 @@ +from collections import defaultdict +from math import e + +from django.core.cache import cache +from django.db.models import Case, Count, ExpressionWrapper, F, Max, Q, When +from django.db.models.fields import FloatField +from django.utils import timezone +from django.utils.translation import gettext as _, gettext_noop + +from judge.models import Problem, Submission + +__all__ = ['contest_completed_ids', 'get_result_data', 'user_completed_ids', 'user_authored_ids', 'user_editable_ids'] + + +def user_authored_ids(profile): + result = set(Problem.objects.filter(authors=profile).values_list('id', flat=True)) + return result + + +def user_editable_ids(profile): + result = set((Problem.objects.filter(authors=profile) | Problem.objects.filter(curators=profile)) + .values_list('id', flat=True)) + return result + + +def contest_completed_ids(participation): + key = 'contest_complete:%d' % participation.id + result = cache.get(key) + if result is None: + result = set(participation.submissions.filter(submission__result='AC', points=F('problem__points')) + .values_list('problem__problem__id', flat=True).distinct()) + cache.set(key, result, 86400) + return result + + +def user_completed_ids(profile): + key = 'user_complete:%d' % profile.id + result = cache.get(key) + if result is None: + result = set(Submission.objects.filter(user=profile, result='AC', points=F('problem__points')) + .values_list('problem_id', flat=True).distinct()) + cache.set(key, result, 86400) + return result + + +def contest_attempted_ids(participation): + key = 'contest_attempted:%s' % participation.id + result = cache.get(key) + if result is None: + result = {id: {'achieved_points': points, 'max_points': max_points} + for id, max_points, points in (participation.submissions + .values_list('problem__problem__id', 'problem__points') + .annotate(points=Max('points')) + .filter(points__lt=F('problem__points')))} + cache.set(key, result, 86400) + return result + + +def user_attempted_ids(profile): + key = 'user_attempted:%s' % profile.id + result = cache.get(key) + if result is None: + result = {id: {'achieved_points': points, 'max_points': max_points} + for id, max_points, points in (Submission.objects.filter(user=profile) + .values_list('problem__id', 'problem__points') + .annotate(points=Max('points')) + .filter(points__lt=F('problem__points')))} + cache.set(key, result, 86400) + return result + + +def _get_result_data(results): + return { + 'categories': [ + # Using gettext_noop here since this will be tacked into the cache, so it must be language neutral. + # The caller, SubmissionList.get_result_data will run ugettext on the name. + {'code': 'AC', 'name': gettext_noop('Accepted'), 'count': results['AC']}, + {'code': 'WA', 'name': gettext_noop('Wrong'), 'count': results['WA']}, + {'code': 'CE', 'name': gettext_noop('Compile Error'), 'count': results['CE']}, + {'code': 'TLE', 'name': gettext_noop('Timeout'), 'count': results['TLE']}, + {'code': 'ERR', 'name': gettext_noop('Error'), + 'count': results['MLE'] + results['OLE'] + results['IR'] + results['RTE'] + results['AB'] + results['IE']}, + ], + 'total': sum(results.values()), + } + + +def get_result_data(*args, **kwargs): + if args: + submissions = args[0] + if kwargs: + raise ValueError(_("Can't pass both queryset and keyword filters")) + else: + submissions = Submission.objects.filter(**kwargs) if kwargs is not None else Submission.objects + raw = submissions.values('result').annotate(count=Count('result')).values_list('result', 'count') + return _get_result_data(defaultdict(int, raw)) + + +def editable_problems(user, profile=None): + subquery = Problem.objects.all() + if profile is None: + profile = user.profile + if not user.has_perm('judge.edit_all_problem'): + subfilter = Q(authors__id=profile.id) | Q(curators__id=profile.id) + if user.has_perm('judge.edit_public_problem'): + subfilter |= Q(is_public=True) + subquery = subquery.filter(subfilter) + return subquery + + +def hot_problems(duration, limit): + cache_key = 'hot_problems:%d:%d' % (duration.total_seconds(), limit) + qs = cache.get(cache_key) + if qs is None: + qs = Problem.objects.filter(is_public=True, is_organization_private=False, + submission__date__gt=timezone.now() - duration, points__gt=3, points__lt=25) + qs0 = qs.annotate(k=Count('submission__user', distinct=True)).order_by('-k').values_list('k', flat=True) + + if not qs0: + return [] + # make this an aggregate + mx = float(qs0[0]) + + qs = qs.annotate(unique_user_count=Count('submission__user', distinct=True)) + # fix braindamage in excluding CE + qs = qs.annotate(submission_volume=Count(Case( + When(submission__result='AC', then=1), + When(submission__result='WA', then=1), + When(submission__result='IR', then=1), + When(submission__result='RTE', then=1), + When(submission__result='TLE', then=1), + When(submission__result='OLE', then=1), + output_field=FloatField(), + ))) + qs = qs.annotate(ac_volume=Count(Case( + When(submission__result='AC', then=1), + output_field=FloatField(), + ))) + qs = qs.filter(unique_user_count__gt=max(mx / 3.0, 1)) + + qs = qs.annotate(ordering=ExpressionWrapper( + 0.5 * F('points') * (0.4 * F('ac_volume') / F('submission_volume') + 0.6 * F('ac_rate')) + + 100 * e ** (F('unique_user_count') / mx), output_field=FloatField(), + )).order_by('-ordering').defer('description')[:limit] + + cache.set(cache_key, qs, 900) + return qs diff --git a/judge/utils/pwned.py b/judge/utils/pwned.py new file mode 100644 index 0000000..fa3df63 --- /dev/null +++ b/judge/utils/pwned.py @@ -0,0 +1,137 @@ +""" +Based on https://github.com/ubernostrum/pwned-passwords-django. + +Original license: + +Copyright (c) 2018, James Bennett +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of the author nor the names of other + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.""" + + +import hashlib +import logging + +import requests +from django.conf import settings +from django.contrib.auth.password_validation import CommonPasswordValidator +from django.core.exceptions import ValidationError +from django.utils.six import string_types +from django.utils.translation import gettext as _, ungettext + +from judge.utils.unicode import utf8bytes + +log = logging.getLogger(__name__) + +API_ENDPOINT = 'https://api.pwnedpasswords.com/range/{}' +REQUEST_TIMEOUT = 2.0 # 2 seconds + + +def _get_pwned(prefix): + """ + Fetches a dict of all hash suffixes from Pwned Passwords for a + given SHA-1 prefix. + """ + try: + response = requests.get( + url=API_ENDPOINT.format(prefix), + timeout=getattr( + settings, + 'PWNED_PASSWORDS_API_TIMEOUT', + REQUEST_TIMEOUT, + ), + ) + response.raise_for_status() + except requests.RequestException: + # Gracefully handle timeouts and HTTP error response codes. + log.warning('Skipped Pwned Passwords check due to error', exc_info=True) + return None + + results = {} + for line in response.text.splitlines(): + line_suffix, _, times = line.partition(':') + results[line_suffix] = int(times) + + return results + + +def pwned_password(password): + """ + Checks a password against the Pwned Passwords database. + """ + if not isinstance(password, string_types): + raise TypeError('Password values to check must be strings.') + password_hash = hashlib.sha1(utf8bytes(password)).hexdigest().upper() + prefix, suffix = password_hash[:5], password_hash[5:] + results = _get_pwned(prefix) + if results is None: + # Gracefully handle timeouts and HTTP error response codes. + return None + return results.get(suffix, 0) + + +class PwnedPasswordsValidator(object): + """ + Password validator which checks the Pwned Passwords database. + """ + DEFAULT_HELP_MESSAGE = _("Your password can't be a commonly used password.") + DEFAULT_PWNED_MESSAGE = _('This password is too common.') + + def __init__(self, error_message=None, help_message=None): + self.help_message = help_message or self.DEFAULT_HELP_MESSAGE + error_message = error_message or self.DEFAULT_PWNED_MESSAGE + + # If there is no plural, use the same message for both forms. + if isinstance(error_message, string_types): + singular, plural = error_message, error_message + else: + singular, plural = error_message + self.error_message = { + 'singular': singular, + 'plural': plural, + } + + def validate(self, password, user=None): + amount = pwned_password(password) + if amount is None: + # HIBP API failure. Instead of allowing a potentially compromised + # password, check Django's list of common passwords generated from + # the same database. + CommonPasswordValidator().validate(password, user) + elif amount: + raise ValidationError( + ungettext( + self.error_message['singular'], + self.error_message['plural'], + amount, + ), + params={'amount': amount}, + code='pwned_password', + ) + + def get_help_text(self): + return self.help_message diff --git a/judge/utils/ranker.py b/judge/utils/ranker.py new file mode 100644 index 0000000..b1a856a --- /dev/null +++ b/judge/utils/ranker.py @@ -0,0 +1,34 @@ +from operator import attrgetter + + +def ranker(iterable, key=attrgetter('points'), rank=0): + delta = 1 + last = None + for item in iterable: + new = key(item) + if new != last: + rank += delta + delta = 0 + delta += 1 + yield rank, item + last = key(item) + + +def tie_ranker(iterable, key=attrgetter('points')): + rank = 0 + delta = 1 + last = None + buf = [] + for item in iterable: + new = key(item) + if new != last: + for i in buf: + yield rank + (delta - 1) / 2.0, i + rank += delta + delta = 0 + buf = [] + delta += 1 + buf.append(item) + last = key(item) + for i in buf: + yield rank + (delta - 1) / 2.0, i diff --git a/judge/utils/raw_sql.py b/judge/utils/raw_sql.py new file mode 100644 index 0000000..edbca4c --- /dev/null +++ b/judge/utils/raw_sql.py @@ -0,0 +1,96 @@ +from copy import copy + +from django.db import connections +from django.db.models import Field +from django.db.models.expressions import RawSQL +from django.db.models.sql.constants import INNER, LOUTER +from django.db.models.sql.datastructures import Join +from django.utils import six + +from judge.utils.cachedict import CacheDict + + +def unique_together_left_join(queryset, model, link_field_name, filter_field_name, filter_value, parent_model=None): + link_field = copy(model._meta.get_field(link_field_name).remote_field) + filter_field = model._meta.get_field(filter_field_name) + + def restrictions(where_class, alias, related_alias): + cond = where_class() + cond.add(filter_field.get_lookup('exact')(filter_field.get_col(alias), filter_value), 'AND') + return cond + + link_field.get_extra_restriction = restrictions + + if parent_model is not None: + parent_alias = parent_model._meta.db_table + else: + parent_alias = queryset.query.get_initial_alias() + return queryset.query.join(Join(model._meta.db_table, parent_alias, None, LOUTER, link_field, True)) + + +class RawSQLJoin(Join): + def __init__(self, subquery, subquery_params, parent_alias, table_alias, join_type, join_field, nullable, + filtered_relation=None): + self.subquery_params = subquery_params + super().__init__(subquery, parent_alias, table_alias, join_type, join_field, nullable, filtered_relation) + + def as_sql(self, compiler, connection): + compiler.quote_cache[self.table_name] = '(%s)' % self.table_name + sql, params = super().as_sql(compiler, connection) + return sql, self.subquery_params + params + + +class FakeJoinField: + def __init__(self, joining_columns): + self.joining_columns = joining_columns + + def get_joining_columns(self): + return self.joining_columns + + def get_extra_restriction(self, where_class, alias, remote_alias): + pass + + +def join_sql_subquery(queryset, subquery, params, join_fields, alias, join_type=INNER, parent_model=None): + if parent_model is not None: + parent_alias = parent_model._meta.db_table + else: + parent_alias = queryset.query.get_initial_alias() + queryset.query.external_aliases.add(alias) + join = RawSQLJoin(subquery, params, parent_alias, alias, join_type, FakeJoinField(join_fields), join_type == LOUTER) + queryset.query.join(join) + join.table_alias = alias + + +def RawSQLColumn(model, field=None): + if isinstance(model, Field): + field = model + model = field.model + if isinstance(field, six.string_types): + field = model._meta.get_field(field) + return RawSQL('%s.%s' % (model._meta.db_table, field.get_attname_column()[1]), ()) + + +def make_straight_join_query(QueryType): + class Query(QueryType): + def join(self, join, *args, **kwargs): + alias = super().join(join, *args, **kwargs) + join = self.alias_map[alias] + if join.join_type == INNER: + join.join_type = 'STRAIGHT_JOIN' + return alias + + return Query + + +straight_join_cache = CacheDict(make_straight_join_query) + + +def use_straight_join(queryset): + if connections[queryset.db].vendor != 'mysql': + return + try: + cloner = queryset.query.chain + except AttributeError: + cloner = queryset.query.clone + queryset.query = cloner(straight_join_cache[type(queryset.query)]) diff --git a/judge/utils/recaptcha.py b/judge/utils/recaptcha.py new file mode 100644 index 0000000..331a12d --- /dev/null +++ b/judge/utils/recaptcha.py @@ -0,0 +1,11 @@ +try: + from snowpenguin.django.recaptcha2.fields import ReCaptchaField + from snowpenguin.django.recaptcha2.widgets import ReCaptchaWidget +except ImportError: + ReCaptchaField = None + ReCaptchaWidget = None +else: + from django.conf import settings + if not hasattr(settings, 'RECAPTCHA_PRIVATE_KEY'): + ReCaptchaField = None + ReCaptchaWidget = None diff --git a/judge/utils/stats.py b/judge/utils/stats.py new file mode 100644 index 0000000..cf3b251 --- /dev/null +++ b/judge/utils/stats.py @@ -0,0 +1,53 @@ +from operator import itemgetter + +__all__ = ('chart_colors', 'highlight_colors', 'get_pie_chart', 'get_bar_chart') + + +chart_colors = [0x3366CC, 0xDC3912, 0xFF9900, 0x109618, 0x990099, 0x3B3EAC, 0x0099C6, 0xDD4477, 0x66AA00, 0xB82E2E, + 0x316395, 0x994499, 0x22AA99, 0xAAAA11, 0x6633CC, 0xE67300, 0x8B0707, 0x329262, 0x5574A6, 0x3B3EAC] + + +highlight_colors = [] + + +def _highlight_colors(): + for color in chart_colors: + r, g, b = color >> 16, (color >> 8) & 0xFF, color & 0xFF + highlight_colors.append('#%02X%02X%02X' % (min(int(r * 1.2), 255), + min(int(g * 1.2), 255), + min(int(b * 1.2), 255))) + + +_highlight_colors() + + +chart_colors = list(map('#%06X'.__mod__, chart_colors)) + + +def get_pie_chart(data): + return { + 'labels': list(map(itemgetter(0), data)), + 'datasets': [ + { + 'backgroundColor': chart_colors, + 'highlightBackgroundColor': highlight_colors, + 'data': list(map(itemgetter(1), data)), + }, + ], + } + + +def get_bar_chart(data, **kwargs): + return { + 'labels': list(map(itemgetter(0), data)), + 'datasets': [ + { + 'backgroundColor': kwargs.get('fillColor', 'rgba(151,187,205,0.5)'), + 'borderColor': kwargs.get('strokeColor', 'rgba(151,187,205,0.8)'), + 'borderWidth': 1, + 'hoverBackgroundColor': kwargs.get('highlightFill', 'rgba(151,187,205,0.75)'), + 'hoverBorderColor': kwargs.get('highlightStroke', 'rgba(151,187,205,1)'), + 'data': list(map(itemgetter(1), data)), + }, + ], + } diff --git a/judge/utils/strings.py b/judge/utils/strings.py new file mode 100644 index 0000000..2298730 --- /dev/null +++ b/judge/utils/strings.py @@ -0,0 +1,12 @@ +def safe_int_or_none(value): + try: + return int(value) + except (ValueError, TypeError): + return None + + +def safe_float_or_none(value): + try: + return float(value) + except (ValueError, TypeError): + return None diff --git a/judge/utils/subscription.py b/judge/utils/subscription.py new file mode 100644 index 0000000..1129b0d --- /dev/null +++ b/judge/utils/subscription.py @@ -0,0 +1,8 @@ +from django.conf import settings + +if 'newsletter' in settings.INSTALLED_APPS: + from newsletter.models import Subscription +else: + Subscription = None + +newsletter_id = None if Subscription is None else settings.DMOJ_NEWSLETTER_ID_ON_REGISTER diff --git a/judge/utils/texoid.py b/judge/utils/texoid.py new file mode 100644 index 0000000..d668066 --- /dev/null +++ b/judge/utils/texoid.py @@ -0,0 +1,85 @@ +import hashlib +import json +import logging +from base64 import b64decode + +import requests +from django.conf import settings +from django.core.cache import caches + +from judge.utils.file_cache import HashFileCache +from judge.utils.unicode import utf8bytes + +logger = logging.getLogger('judge.texoid') + +TEXOID_ENABLED = hasattr(settings, 'TEXOID_URL') + + +class TexoidRenderer(object): + def __init__(self): + self.cache = HashFileCache(settings.TEXOID_CACHE_ROOT, + settings.TEXOID_CACHE_URL, + settings.TEXOID_GZIP) + self.meta_cache = caches[settings.TEXOID_META_CACHE] + self.meta_cache_ttl = settings.TEXOID_META_CACHE_TTL + + def query_texoid(self, document, hash): + self.cache.create(hash) + + try: + response = requests.post(settings.TEXOID_URL, data=utf8bytes(document), headers={ + 'Content-Type': 'application/x-tex', + }) + response.raise_for_status() + except requests.HTTPError as e: + if e.response.status == 400: + logger.error('Texoid failed to render: %s\n%s', document, e.response.text) + else: + logger.exception('Failed to connect to texoid for: %s', document) + return + except Exception: + logger.exception('Failed to connect to texoid for: %s', document) + return + + try: + data = response.json() + except ValueError: + logger.exception('Invalid texoid response for: %s\n%s', document, response.text) + return + + if not data['success']: + logger.error('Texoid failure for: %s\n%s', document, data) + return {'error': data['error']} + + meta = data['meta'] + self.cache.cache_data(hash, 'meta', utf8bytes(json.dumps(meta)), url=False, gzip=False) + + result = { + 'png': self.cache.cache_data(hash, 'png', b64decode(data['png'])), + 'svg': self.cache.cache_data(hash, 'svg', data['svg'].encode('utf-8')), + 'meta': meta, + } + return result + + def query_cache(self, hash): + result = { + 'svg': self.cache.get_url(hash, 'svg'), + 'png': self.cache.get_url(hash, 'png'), + } + + key = 'texoid:meta:' + hash + cached_meta = self.meta_cache.get(key) + if cached_meta is None: + cached_meta = json.loads(self.cache.read_data(hash, 'meta').decode('utf-8')) + self.meta_cache.set(key, cached_meta, self.meta_cache_ttl) + result['meta'] = cached_meta + + return result + + def get_result(self, formula): + hash = hashlib.sha1(utf8bytes(formula)).hexdigest() + + if self.cache.has_file(hash, 'svg'): + return self.query_cache(hash) + else: + return self.query_texoid(formula, hash) diff --git a/judge/utils/tickets.py b/judge/utils/tickets.py new file mode 100644 index 0000000..1743db4 --- /dev/null +++ b/judge/utils/tickets.py @@ -0,0 +1,17 @@ +from django.contrib.contenttypes.models import ContentType +from django.db.models import Q + +from judge.models import Problem +from judge.utils.problems import editable_problems + + +def own_ticket_filter(profile_id): + return Q(assignees__id=profile_id) | Q(user_id=profile_id) + + +def filter_visible_tickets(queryset, user, profile=None): + if profile is None: + profile = user.profile + return queryset.filter(own_ticket_filter(profile.id) | + Q(content_type=ContentType.objects.get_for_model(Problem), + object_id__in=editable_problems(user, profile))).distinct() diff --git a/judge/utils/timedelta.py b/judge/utils/timedelta.py new file mode 100644 index 0000000..292caeb --- /dev/null +++ b/judge/utils/timedelta.py @@ -0,0 +1,90 @@ +import datetime + +from django.utils.translation import npgettext, pgettext, ungettext + + +def nice_repr(timedelta, display='long', sep=', '): + """ + Turns a datetime.timedelta object into a nice string repr. + + display can be 'minimal', 'short' or 'long' [default]. + + >>> from datetime import timedelta as td + >>> nice_repr(td(days=1, hours=2, minutes=3, seconds=4)) + '1 day, 2 hours, 3 minutes, 4 seconds' + >>> nice_repr(td(days=1, seconds=1), 'minimal') + '1d, 1s' + """ + + assert isinstance(timedelta, datetime.timedelta), 'First argument must be a timedelta.' + + result = [] + + weeks = timedelta.days // 7 + days = timedelta.days % 7 + hours = timedelta.seconds // 3600 + minutes = (timedelta.seconds % 3600) // 60 + seconds = timedelta.seconds % 60 + + if display == 'simple-no-seconds': + days += weeks * 7 + if days: + if hours or minutes: + return '%d day%s %d:%02d' % (days, 's'[days == 1:], hours, minutes) + return '%d day%s' % (days, 's'[days == 1:]) + else: + return '%d:%02d' % (hours, minutes) + elif display == 'sql': + days += weeks * 7 + return '%d %02d:%02d:%02d' % (days, hours, minutes, seconds) + elif display == 'simple': + days += weeks * 7 + if days: + return '%d day%s %02d:%02d:%02d' % (days, 's'[days == 1:], hours, minutes, seconds) + else: + return '%02d:%02d:%02d' % (hours, minutes, seconds) + elif display == 'localized': + days += weeks * 7 + if days: + return npgettext('time format with day', '%d day %h:%m:%s', '%d days %h:%m:%s', days) \ + .replace('%d', str(days)).replace('%h', '%02d' % hours).replace('%m', '%02d' % minutes) \ + .replace('%s', '%02d' % seconds) + else: + return pgettext('time format without day', '%h:%m:%s') \ + .replace('%h', '%02d' % hours).replace('%m', '%02d' % minutes).replace('%s', '%02d' % seconds) + elif display == 'localized-no-seconds': + days += weeks * 7 + if days: + if hours or minutes: + return npgettext('time format no seconds with day', '%d day %h:%m', '%d days %h:%m', days) \ + .replace('%d', str(days)).replace('%h', '%02d' % hours).replace('%m', '%02d' % minutes) + return ungettext('%d day', '%d days', days) % days + else: + return pgettext('hours and minutes', '%h:%m').replace('%h', '%02d' % hours).replace('%m', '%02d' % minutes) + elif display == 'concise': + days += weeks * 7 + if days: + return '%dd %02d:%02d:%02d' % (days, hours, minutes, seconds) + else: + return '%02d:%02d:%02d' % (hours, minutes, seconds) + elif display == 'noday': + days += weeks * 7 + hours += days * 24 + return '%02d:%02d:%02d' % (hours, minutes, seconds) + elif display == 'minimal': + words = ['w', 'd', 'h', 'm', 's'] + elif display == 'short': + words = [' wks', ' days', ' hrs', ' min', ' sec'] + else: + words = [' weeks', ' days', ' hours', ' minutes', ' seconds'] + + values = [weeks, days, hours, minutes, seconds] + + for i in range(len(values)): + if values[i]: + if values[i] == 1 and len(words[i]) > 1: + result.append('%i%s' % (values[i], words[i].rstrip('s'))) + else: + result.append('%i%s' % (values[i], words[i])) + + return sep.join(result) diff --git a/judge/utils/unicode.py b/judge/utils/unicode.py new file mode 100644 index 0000000..78cc176 --- /dev/null +++ b/judge/utils/unicode.py @@ -0,0 +1,17 @@ +from django.utils import six + + +def utf8bytes(maybe_text): + if maybe_text is None: + return + if isinstance(maybe_text, six.binary_type): + return maybe_text + return maybe_text.encode('utf-8') + + +def utf8text(maybe_bytes, errors='strict'): + if maybe_bytes is None: + return + if isinstance(maybe_bytes, six.text_type): + return maybe_bytes + return maybe_bytes.decode('utf-8', errors) diff --git a/judge/utils/views.py b/judge/utils/views.py new file mode 100644 index 0000000..ba383ce --- /dev/null +++ b/judge/utils/views.py @@ -0,0 +1,115 @@ +from django.shortcuts import render +from django.utils.decorators import method_decorator +from django.views.generic import FormView +from django.views.generic.detail import SingleObjectMixin + +from judge.utils.diggpaginator import DiggPaginator + + +def class_view_decorator(function_decorator): + """Convert a function based decorator into a class based decorator usable + on class based Views. + + Can't subclass the `View` as it breaks inheritance (super in particular), + so we monkey-patch instead. + """ + + def simple_decorator(View): + View.dispatch = method_decorator(function_decorator)(View.dispatch) + return View + + return simple_decorator + + +def generic_message(request, title, message, status=None): + return render(request, 'generic-message.html', { + 'message': message, + 'title': title, + }, status=status) + + +def paginate_query_context(request): + query = request.GET.copy() + query.setlist('page', []) + query = query.urlencode() + if query: + return {'page_prefix': '%s?%s&page=' % (request.path, query), + 'first_page_href': '%s?%s' % (request.path, query)} + else: + return {'page_prefix': '%s?page=' % request.path, + 'first_page_href': request.path} + + +class TitleMixin(object): + title = '(untitled)' + content_title = None + + def get_context_data(self, **kwargs): + context = super(TitleMixin, self).get_context_data(**kwargs) + context['title'] = self.get_title() + content_title = self.get_content_title() + if content_title is not None: + context['content_title'] = content_title + return context + + def get_content_title(self): + return self.content_title + + def get_title(self): + return self.title + + +class DiggPaginatorMixin(object): + def get_paginator(self, queryset, per_page, orphans=0, + allow_empty_first_page=True, **kwargs): + return DiggPaginator(queryset, per_page, body=6, padding=2, + orphans=orphans, allow_empty_first_page=allow_empty_first_page, **kwargs) + + +class QueryStringSortMixin(object): + all_sorts = None + default_sort = None + default_desc = () + + def get_default_sort_order(self, request): + return self.default_sort + + def get(self, request, *args, **kwargs): + order = request.GET.get('order', '') + if not ((not order.startswith('-') or order.count('-') == 1) and (order.lstrip('-') in self.all_sorts)): + order = self.get_default_sort_order(request) + self.order = order + + return super(QueryStringSortMixin, self).get(request, *args, **kwargs) + + def get_sort_context(self): + query = self.request.GET.copy() + query.setlist('order', []) + query = query.urlencode() + sort_prefix = '%s?%s&order=' % (self.request.path, query) if query else '%s?order=' % self.request.path + current = self.order.lstrip('-') + + links = {key: sort_prefix + ('-' if key in self.default_desc else '') + key for key in self.all_sorts} + links[current] = sort_prefix + ('' if self.order.startswith('-') else '-') + current + + order = {key: '' for key in self.all_sorts} + order[current] = ' \u25BE' if self.order.startswith('-') else u' \u25B4' + return {'sort_links': links, 'sort_order': order} + + def get_sort_paginate_context(self): + return paginate_query_context(self.request) + + +def short_circuit_middleware(view): + view.short_circuit_middleware = True + return view + + +class SingleObjectFormView(SingleObjectMixin, FormView): + def post(self, request, *args, **kwargs): + self.object = self.get_object() + return super().post(request, *args, **kwargs) + + def get(self, request, *args, **kwargs): + self.object = self.get_object() + return super().get(request, *args, **kwargs) diff --git a/judge/views/__init__.py b/judge/views/__init__.py new file mode 100644 index 0000000..37d173d --- /dev/null +++ b/judge/views/__init__.py @@ -0,0 +1,10 @@ +from django.views.generic import TemplateView + + +class TitledTemplateView(TemplateView): + title = None + + def get_context_data(self, **kwargs): + if 'title' not in kwargs and self.title is not None: + kwargs['title'] = self.title + return super(TitledTemplateView, self).get_context_data(**kwargs) diff --git a/judge/views/api/__init__.py b/judge/views/api/__init__.py new file mode 100644 index 0000000..3d3f085 --- /dev/null +++ b/judge/views/api/__init__.py @@ -0,0 +1,2 @@ +from .api_v1 import * +from .api_v2 import * diff --git a/judge/views/api/api_v1.py b/judge/views/api/api_v1.py new file mode 100644 index 0000000..93e7690 --- /dev/null +++ b/judge/views/api/api_v1.py @@ -0,0 +1,173 @@ +from operator import attrgetter + +from django.db.models import F, Prefetch +from django.http import Http404, JsonResponse +from django.shortcuts import get_object_or_404 + +from dmoj import settings +from judge.models import Contest, ContestParticipation, ContestTag, Problem, Profile, Submission + + +def sane_time_repr(delta): + days = delta.days + hours = delta.seconds / 3600 + minutes = (delta.seconds % 3600) / 60 + return '%02d:%02d:%02d' % (days, hours, minutes) + + +def api_v1_contest_list(request): + queryset = Contest.objects.filter(is_visible=True, is_private=False, + is_organization_private=False).prefetch_related( + Prefetch('tags', queryset=ContestTag.objects.only('name'), to_attr='tag_list')).defer('description') + + return JsonResponse({c.key: { + 'name': c.name, + 'start_time': c.start_time.isoformat(), + 'end_time': c.end_time.isoformat(), + 'time_limit': c.time_limit and sane_time_repr(c.time_limit), + 'labels': list(map(attrgetter('name'), c.tag_list)), + } for c in queryset}) + + +def api_v1_contest_detail(request, contest): + contest = get_object_or_404(Contest, key=contest) + + in_contest = contest.is_in_contest(request.user) + can_see_rankings = contest.can_see_scoreboard(request.user) + if contest.hide_scoreboard and in_contest: + can_see_rankings = False + + problems = list(contest.contest_problems.select_related('problem') + .defer('problem__description').order_by('order')) + participations = (contest.users.filter(virtual=0, user__is_unlisted=False) + .prefetch_related('user__organizations') + .annotate(username=F('user__user__username')) + .order_by('-score', 'cumtime') if can_see_rankings else []) + + can_see_problems = (in_contest or contest.ended or contest.is_editable_by(request.user)) + + return JsonResponse({ + 'time_limit': contest.time_limit and contest.time_limit.total_seconds(), + 'start_time': contest.start_time.isoformat(), + 'end_time': contest.end_time.isoformat(), + 'tags': list(contest.tags.values_list('name', flat=True)), + 'is_rated': contest.is_rated, + 'rate_all': contest.is_rated and contest.rate_all, + 'has_rating': contest.ratings.exists(), + 'rating_floor': contest.rating_floor, + 'rating_ceiling': contest.rating_ceiling, + 'format': { + 'name': contest.format_name, + 'config': contest.format_config, + }, + 'problems': [ + { + 'points': int(problem.points), + 'partial': problem.partial, + 'name': problem.problem.name, + 'code': problem.problem.code, + } for problem in problems] if can_see_problems else [], + 'rankings': [ + { + 'user': participation.username, + 'points': participation.score, + 'cumtime': participation.cumtime, + 'is_disqualified': participation.is_disqualified, + 'solutions': contest.format.get_problem_breakdown(participation, problems), + } for participation in participations], + }) + + +def api_v1_problem_list(request): + queryset = Problem.objects.filter(is_public=True, is_organization_private=False) + if settings.ENABLE_FTS and 'search' in request.GET: + query = ' '.join(request.GET.getlist('search')).strip() + if query: + queryset = queryset.search(query) + queryset = queryset.values_list('code', 'points', 'partial', 'name', 'group__full_name') + + return JsonResponse({code: { + 'points': points, + 'partial': partial, + 'name': name, + 'group': group, + } for code, points, partial, name, group in queryset}) + + +def api_v1_problem_info(request, problem): + p = get_object_or_404(Problem, code=problem) + if not p.is_accessible_by(request.user): + raise Http404() + + return JsonResponse({ + 'name': p.name, + 'authors': list(p.authors.values_list('user__username', flat=True)), + 'types': list(p.types.values_list('full_name', flat=True)), + 'group': p.group.full_name, + 'time_limit': p.time_limit, + 'memory_limit': p.memory_limit, + 'points': p.points, + 'partial': p.partial, + 'languages': list(p.allowed_languages.values_list('key', flat=True)), + }) + + +def api_v1_user_list(request): + queryset = Profile.objects.filter(is_unlisted=False).values_list('user__username', 'points', 'performance_points', + 'display_rank') + return JsonResponse({username: { + 'points': points, + 'performance_points': performance_points, + 'rank': rank, + } for username, points, performance_points, rank in queryset}) + + +def api_v1_user_info(request, user): + profile = get_object_or_404(Profile, user__username=user) + submissions = list(Submission.objects.filter(case_points=F('case_total'), user=profile, problem__is_public=True, + problem__is_organization_private=False) + .values('problem').distinct().values_list('problem__code', flat=True)) + resp = { + 'points': profile.points, + 'performance_points': profile.performance_points, + 'rank': profile.display_rank, + 'solved_problems': submissions, + 'organizations': list(profile.organizations.values_list('id', flat=True)), + } + + last_rating = profile.ratings.last() + + contest_history = {} + if not profile.is_unlisted: + participations = ContestParticipation.objects.filter(user=profile, virtual=0, contest__is_visible=True, + contest__is_private=False, + contest__is_organization_private=False) + for contest_key, rating, volatility in participations.values_list('contest__key', 'rating__rating', + 'rating__volatility'): + contest_history[contest_key] = { + 'rating': rating, + 'volatility': volatility, + } + + resp['contests'] = { + 'current_rating': last_rating.rating if last_rating else None, + 'volatility': last_rating.volatility if last_rating else None, + 'history': contest_history, + } + + return JsonResponse(resp) + + +def api_v1_user_submissions(request, user): + profile = get_object_or_404(Profile, user__username=user) + subs = Submission.objects.filter(user=profile, problem__is_public=True, problem__is_organization_private=False) + + return JsonResponse({sub['id']: { + 'problem': sub['problem__code'], + 'time': sub['time'], + 'memory': sub['memory'], + 'points': sub['points'], + 'language': sub['language__key'], + 'status': sub['status'], + 'result': sub['result'], + } for sub in subs.values('id', 'problem__code', 'time', 'memory', 'points', 'language__key', 'status', 'result')}) diff --git a/judge/views/api/api_v2.py b/judge/views/api/api_v2.py new file mode 100644 index 0000000..7850d96 --- /dev/null +++ b/judge/views/api/api_v2.py @@ -0,0 +1,122 @@ +from operator import attrgetter + +from django.db.models import Max +from django.http import JsonResponse + +from judge.models import ContestParticipation, Problem, Profile, Submission +from judge.utils.ranker import ranker +from judge.views.contests import contest_ranking_list + + +def error(message): + return JsonResponse({'error': message}, status=422) + + +def api_v2_user_info(request): + """ + { + "points": 100.0, + "rating": 2452, + "rank": "user", + "organizations": [], + "solved_problems": ["ccc14s4", ...], + "attempted_problems": [ + { + "code": "Hello, World!", + "points": 1.0, + "max_points": 2.0 + } + ], + "authored_problems": ["dmpg16s4"], + "contest_history": [ + { + "contest": { + "code": "halloween14", + "name": "Kemonomimi Party", + "tags": ["seasonal"], + "time_limit": null, + "start_time": "2014-10-31T04:00:00+00:00", + "end_time": "2014-11-10T05:00:00+00:00" + }, + "rank": 1, + "rating:": 1800 + }, + // ... + ] + } + """ + try: + username = request.GET['username'] + except KeyError: + return error("no username passed") + if not username: + return error("username argument not provided") + try: + profile = Profile.objects.get(user__username=username) + except Profile.DoesNotExist: + return error("no such user") + + last_rating = list(profile.ratings.order_by('-contest__end_time')) + + resp = { + "rank": profile.display_rank, + "organizations": list(profile.organizations.values_list('key', flat=True)), + } + + contest_history = [] + for participation in (ContestParticipation.objects.filter(user=profile, virtual=0, contest__is_visible=True) + .order_by('-contest__end_time')): + contest = participation.contest + + problems = list(contest.contest_problems.select_related('problem').defer('problem__description') + .order_by('order')) + rank, result = next(filter(lambda data: data[1].user == profile.user, + ranker(contest_ranking_list(contest, problems), + key=attrgetter('points', 'cumtime')))) + + contest_history.append({ + 'contest': { + 'code': contest.key, + 'name': contest.name, + 'tags': list(contest.tags.values_list('name', flat=True)), + 'time_limit': contest.time_limit and contest.time_limit.total_seconds(), + 'start_time': contest.start_time.isoformat(), + 'end_time': contest.end_time.isoformat(), + }, + 'rank': rank, + 'rating': result.participation_rating, + }) + + resp['contests'] = { + "current_rating": last_rating[0].rating if last_rating else None, + "volatility": last_rating[0].volatility if last_rating else None, + 'history': contest_history, + } + + solved_problems = [] + attempted_problems = [] + + problem_data = (Submission.objects.filter(points__gt=0, user=profile, problem__is_public=True, + problem__is_organization_private=False) + .annotate(max_pts=Max('points')) + .values_list('max_pts', 'problem__points', 'problem__code') + .distinct()) + for awarded_pts, max_pts, problem in problem_data: + if awarded_pts == max_pts: + solved_problems.append(problem) + else: + attempted_problems.append({ + 'awarded': awarded_pts, + 'max': max_pts, + 'problem': problem, + }) + + resp['problems'] = { + 'points': profile.points, + 'solved': solved_problems, + 'attempted': attempted_problems, + 'authored': list(Problem.objects.filter(is_public=True, is_organization_private=False, authors=profile) + .values_list('code', flat=True)), + } + + return JsonResponse(resp) diff --git a/judge/views/blog.py b/judge/views/blog.py new file mode 100644 index 0000000..66832c8 --- /dev/null +++ b/judge/views/blog.py @@ -0,0 +1,126 @@ +from django.conf import settings +from django.db.models import Count, Max, Q +from django.http import Http404 +from django.urls import reverse +from django.utils import timezone +from django.utils.functional import lazy +from django.utils.translation import ugettext as _ +from django.views.generic import ListView + +from judge.comments import CommentedDetailView +from judge.models import BlogPost, Comment, Contest, Language, Problem, ProblemClarification, Profile, Submission, \ + Ticket +from judge.utils.cachedict import CacheDict +from judge.utils.diggpaginator import DiggPaginator +from judge.utils.problems import user_completed_ids +from judge.utils.tickets import filter_visible_tickets +from judge.utils.views import TitleMixin + + +class PostList(ListView): + model = BlogPost + paginate_by = 10 + context_object_name = 'posts' + template_name = 'blog/list.html' + title = None + + def get_paginator(self, queryset, per_page, orphans=0, + allow_empty_first_page=True, **kwargs): + return DiggPaginator(queryset, per_page, body=6, padding=2, + orphans=orphans, allow_empty_first_page=allow_empty_first_page, **kwargs) + + def get_queryset(self): + return (BlogPost.objects.filter(visible=True, publish_on__lte=timezone.now()).order_by('-sticky', '-publish_on') + .prefetch_related('authors__user')) + + def get_context_data(self, **kwargs): + context = super(PostList, self).get_context_data(**kwargs) + context['title'] = self.title or _('Page %d of Posts') % context['page_obj'].number + context['first_page_href'] = reverse('home') + context['page_prefix'] = reverse('blog_post_list') + context['comments'] = Comment.most_recent(self.request.user, 10) + context['new_problems'] = Problem.objects.filter(is_public=True, is_organization_private=False) \ + .order_by('-date', '-id')[:settings.DMOJ_BLOG_NEW_PROBLEM_COUNT] + context['page_titles'] = CacheDict(lambda page: Comment.get_page_title(page)) + + context['has_clarifications'] = False + if self.request.user.is_authenticated: + participation = self.request.profile.current_contest + if participation: + clarifications = ProblemClarification.objects.filter(problem__in=participation.contest.problems.all()) + context['has_clarifications'] = clarifications.count() > 0 + context['clarifications'] = clarifications.order_by('-date') + + context['user_count'] = lazy(Profile.objects.count, int, int) + context['problem_count'] = lazy(Problem.objects.filter(is_public=True).count, int, int) + context['submission_count'] = lazy(Submission.objects.count, int, int) + context['language_count'] = lazy(Language.objects.count, int, int) + + context['post_comment_counts'] = { + int(page[2:]): count for page, count in + Comment.objects + .filter(page__in=['b:%d' % post.id for post in context['posts']], hidden=False) + .values_list('page').annotate(count=Count('page')).order_by() + } + + now = timezone.now() + + # Dashboard stuff + if self.request.user.is_authenticated: + user = self.request.profile + context['recently_attempted_problems'] = (Submission.objects.filter(user=user) + .exclude(problem__in=user_completed_ids(user)) + .values_list('problem__code', 'problem__name', 'problem__points') + .annotate(points=Max('points'), latest=Max('date')) + .order_by('-latest') + [:settings.DMOJ_BLOG_RECENTLY_ATTEMPTED_PROBLEMS_COUNT]) + + visible_contests = Contest.objects.filter(is_visible=True).order_by('start_time') + q = Q(is_private=False, is_organization_private=False) + if self.request.user.is_authenticated: + q |= Q(is_organization_private=True, organizations__in=user.organizations.all()) + q |= Q(is_private=True, private_contestants=user) + visible_contests = visible_contests.filter(q) + context['current_contests'] = visible_contests.filter(start_time__lte=now, end_time__gt=now) + context['future_contests'] = visible_contests.filter(start_time__gt=now) + + if self.request.user.is_authenticated: + profile = self.request.profile + context['own_open_tickets'] = (Ticket.objects.filter(user=profile, is_open=True).order_by('-id') + .prefetch_related('linked_item').select_related('user__user')) + else: + profile = None + context['own_open_tickets'] = [] + + # Superusers better be staffs, not the spell-casting kind either. + if self.request.user.is_staff: + tickets = (Ticket.objects.order_by('-id').filter(is_open=True).prefetch_related('linked_item') + .select_related('user__user')) + context['open_tickets'] = filter_visible_tickets(tickets, self.request.user, profile)[:10] + else: + context['open_tickets'] = [] + return context + + +class PostView(TitleMixin, CommentedDetailView): + model = BlogPost + pk_url_kwarg = 'id' + context_object_name = 'post' + template_name = 'blog/content.html' + + def get_title(self): + return self.object.title + + def get_comment_page(self): + return 'b:%s' % self.object.id + + def get_context_data(self, **kwargs): + context = super(PostView, self).get_context_data(**kwargs) + context['og_image'] = self.object.og_image + return context + + def get_object(self, queryset=None): + post = super(PostView, self).get_object(queryset) + if not post.can_see(self.request.user): + raise Http404() + return post diff --git a/judge/views/comment.py b/judge/views/comment.py new file mode 100644 index 0000000..f216bba --- /dev/null +++ b/judge/views/comment.py @@ -0,0 +1,170 @@ +from django.contrib.auth.decorators import login_required +from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin +from django.core.exceptions import PermissionDenied +from django.db import IntegrityError, transaction +from django.db.models import F +from django.forms.models import ModelForm +from django.http import Http404, HttpResponse, HttpResponseBadRequest, HttpResponseForbidden +from django.shortcuts import get_object_or_404 +from django.utils.translation import gettext as _ +from django.views.decorators.http import require_POST +from django.views.generic import DetailView, UpdateView +from reversion import revisions +from reversion.models import Version + +from judge.dblock import LockModel +from judge.models import Comment, CommentVote +from judge.utils.views import TitleMixin +from judge.widgets import MathJaxPagedownWidget + +__all__ = ['upvote_comment', 'downvote_comment', 'CommentEditAjax', 'CommentContent', + 'CommentEdit'] + + +@login_required +def vote_comment(request, delta): + if abs(delta) != 1: + return HttpResponseBadRequest(_('Messing around, are we?'), content_type='text/plain') + + if request.method != 'POST': + return HttpResponseForbidden() + + if 'id' not in request.POST: + return HttpResponseBadRequest() + + if not request.user.is_staff and not request.profile.submission_set.filter(points=F('problem__points')).exists(): + return HttpResponseBadRequest(_('You must solve at least one problem before you can vote.'), + content_type='text/plain') + + try: + comment_id = int(request.POST['id']) + except ValueError: + return HttpResponseBadRequest() + else: + if not Comment.objects.filter(id=comment_id).exists(): + raise Http404() + + vote = CommentVote() + vote.comment_id = comment_id + vote.voter = request.profile + vote.score = delta + + while True: + try: + vote.save() + except IntegrityError: + with LockModel(write=(CommentVote,)): + try: + vote = CommentVote.objects.get(comment_id=comment_id, voter=request.profile) + except CommentVote.DoesNotExist: + # We must continue racing in case this is exploited to manipulate votes. + continue + if -vote.score != delta: + return HttpResponseBadRequest(_('You already voted.'), content_type='text/plain') + vote.delete() + Comment.objects.filter(id=comment_id).update(score=F('score') - vote.score) + else: + Comment.objects.filter(id=comment_id).update(score=F('score') + delta) + break + return HttpResponse('success', content_type='text/plain') + + +def upvote_comment(request): + return vote_comment(request, 1) + + +def downvote_comment(request): + return vote_comment(request, -1) + + +class CommentMixin(object): + model = Comment + pk_url_kwarg = 'id' + context_object_name = 'comment' + + +class CommentRevisionAjax(CommentMixin, DetailView): + template_name = 'comments/revision-ajax.html' + + def get_context_data(self, **kwargs): + context = super(CommentRevisionAjax, self).get_context_data(**kwargs) + revisions = Version.objects.get_for_object(self.object).order_by('-revision') + try: + wanted = min(max(int(self.request.GET.get('revision', 0)), 0), len(revisions) - 1) + except ValueError: + raise Http404 + context['revision'] = revisions[wanted] + return context + + def get_object(self, queryset=None): + comment = super(CommentRevisionAjax, self).get_object(queryset) + if comment.hidden and not self.request.user.has_perm('judge.change_comment'): + raise Http404() + return comment + + +class CommentEditForm(ModelForm): + class Meta: + model = Comment + fields = ['body'] + if MathJaxPagedownWidget is not None: + widgets = {'body': MathJaxPagedownWidget(attrs={'id': 'id-edit-comment-body'})} + + +class CommentEditAjax(LoginRequiredMixin, CommentMixin, UpdateView): + template_name = 'comments/edit-ajax.html' + form_class = CommentEditForm + + def form_valid(self, form): + with transaction.atomic(), revisions.create_revision(): + revisions.set_comment(_('Edited from site')) + revisions.set_user(self.request.user) + return super(CommentEditAjax, self).form_valid(form) + + def get_success_url(self): + return self.object.get_absolute_url() + + def get_object(self, queryset=None): + comment = super(CommentEditAjax, self).get_object(queryset) + if self.request.user.has_perm('judge.change_comment'): + return comment + profile = self.request.profile + if profile != comment.author or profile.mute or comment.hidden: + raise Http404() + return comment + + +class CommentEdit(TitleMixin, CommentEditAjax): + template_name = 'comments/edit.html' + + def get_title(self): + return _('Editing comment') + + +class CommentContent(CommentMixin, DetailView): + template_name = 'comments/content.html' + + +class CommentVotesAjax(PermissionRequiredMixin, CommentMixin, DetailView): + template_name = 'comments/votes.html' + permission_required = 'judge.change_commentvote' + + def get_context_data(self, **kwargs): + context = super(CommentVotesAjax, self).get_context_data(**kwargs) + context['votes'] = (self.object.votes.select_related('voter__user') + .only('id', 'voter__display_rank', 'voter__user__username', 'score')) + return context + + +@require_POST +def comment_hide(request): + if not request.user.has_perm('judge.change_comment'): + raise PermissionDenied() + try: + comment_id = int(request.POST['id']) + except ValueError: + return HttpResponseBadRequest() + + comment = get_object_or_404(Comment, id=comment_id) + comment.get_descendants(include_self=True).update(hidden=True) + return HttpResponse('ok') diff --git a/judge/views/contests.py b/judge/views/contests.py new file mode 100644 index 0000000..d803375 --- /dev/null +++ b/judge/views/contests.py @@ -0,0 +1,793 @@ +import json +from calendar import Calendar, SUNDAY +from collections import defaultdict, namedtuple +from datetime import date, datetime, time, timedelta +from functools import partial +from itertools import chain +from operator import attrgetter, itemgetter + +from django import forms +from django.conf import settings +from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin +from django.core.cache import cache +from django.core.exceptions import ImproperlyConfigured, ObjectDoesNotExist +from django.db import IntegrityError +from django.db.models import Case, Count, FloatField, IntegerField, Max, Min, Q, Sum, Value, When +from django.db.models.expressions import CombinedExpression +from django.http import Http404, HttpResponse, HttpResponseBadRequest, HttpResponseRedirect +from django.shortcuts import get_object_or_404, render +from django.template.defaultfilters import date as date_filter +from django.urls import reverse +from django.utils import timezone +from django.utils.functional import cached_property +from django.utils.html import format_html +from django.utils.safestring import mark_safe +from django.utils.timezone import make_aware +from django.utils.translation import gettext as _, gettext_lazy +from django.views.generic import ListView, TemplateView +from django.views.generic.detail import BaseDetailView, DetailView, SingleObjectMixin, View + +from judge import event_poster as event +from judge.comments import CommentedDetailView +from judge.forms import ContestCloneForm +from judge.models import Contest, ContestMoss, ContestParticipation, ContestProblem, ContestTag, \ + Problem, Profile, Submission +from judge.tasks import run_moss +from judge.utils.celery import redirect_to_task_status +from judge.utils.opengraph import generate_opengraph +from judge.utils.problems import _get_result_data +from judge.utils.ranker import ranker +from judge.utils.stats import get_bar_chart, get_pie_chart +from judge.utils.views import DiggPaginatorMixin, SingleObjectFormView, TitleMixin, generic_message + +__all__ = ['ContestList', 'ContestDetail', 'ContestRanking', 'ContestJoin', 'ContestLeave', 'ContestCalendar', + 'ContestClone', 'ContestStats', 'ContestMossView', 'ContestMossDelete', 'contest_ranking_ajax', + 'ContestParticipationList', 'ContestParticipationDisqualify', 'get_contest_ranking_list', + 'base_contest_ranking_list'] + + +def _find_contest(request, key, private_check=True): + try: + contest = Contest.objects.get(key=key) + if private_check and not contest.is_accessible_by(request.user): + raise ObjectDoesNotExist() + except ObjectDoesNotExist: + return generic_message(request, _('No such contest'), + _('Could not find a contest with the key "%s".') % key, status=404), False + return contest, True + + +class ContestListMixin(object): + def get_queryset(self): + queryset = Contest.objects.all() + if not self.request.user.has_perm('judge.see_private_contest'): + q = Q(is_visible=True) + if self.request.user.is_authenticated: + q |= Q(organizers=self.request.profile) + queryset = queryset.filter(q) + if not self.request.user.has_perm('judge.edit_all_contest'): + q = Q(is_private=False, is_organization_private=False) + if self.request.user.is_authenticated: + q |= Q(is_organization_private=True, organizations__in=self.request.profile.organizations.all()) + q |= Q(is_private=True, private_contestants=self.request.profile) + queryset = queryset.filter(q) + return queryset.distinct() + + +class ContestList(DiggPaginatorMixin, TitleMixin, ContestListMixin, ListView): + model = Contest + paginate_by = 20 + template_name = 'contest/list.html' + title = gettext_lazy('Contests') + context_object_name = 'past_contests' + + @cached_property + def _now(self): + return timezone.now() + + def _get_queryset(self): + return super(ContestList, self).get_queryset() \ + .order_by('-start_time', 'key').prefetch_related('tags', 'organizations', 'organizers') + + def get_queryset(self): + return self._get_queryset().filter(end_time__lt=self._now) + + def get_context_data(self, **kwargs): + context = super(ContestList, self).get_context_data(**kwargs) + present, active, future = [], [], [] + for contest in self._get_queryset().exclude(end_time__lt=self._now): + if contest.start_time > self._now: + future.append(contest) + else: + present.append(contest) + + if self.request.user.is_authenticated: + for participation in ContestParticipation.objects.filter(virtual=0, user=self.request.profile, + contest_id__in=present) \ + .select_related('contest').prefetch_related('contest__organizers'): + if not participation.ended: + active.append(participation) + present.remove(participation.contest) + + active.sort(key=attrgetter('end_time')) + future.sort(key=attrgetter('start_time')) + context['active_participations'] = active + context['current_contests'] = present + context['future_contests'] = future + context['now'] = self._now + context['first_page_href'] = '.' + return context + + +class PrivateContestError(Exception): + def __init__(self, name, is_private, is_organization_private, orgs): + self.name = name + self.is_private = is_private + self.is_organization_private = is_organization_private + self.orgs = orgs + + +class ContestMixin(object): + context_object_name = 'contest' + model = Contest + slug_field = 'key' + slug_url_kwarg = 'contest' + + @cached_property + def is_organizer(self): + return self.check_organizer() + + def check_organizer(self, contest=None, user=None): + if user is None: + user = self.request.user + return (contest or self.object).is_editable_by(user) + + def get_context_data(self, **kwargs): + context = super(ContestMixin, self).get_context_data(**kwargs) + if self.request.user.is_authenticated: + profile = self.request.profile + in_contest = context['in_contest'] = (profile.current_contest is not None and + profile.current_contest.contest == self.object) + if in_contest: + context['participation'] = profile.current_contest + context['participating'] = True + else: + try: + context['participation'] = profile.contest_history.get(contest=self.object, virtual=0) + except ContestParticipation.DoesNotExist: + context['participating'] = False + context['participation'] = None + else: + context['participating'] = True + else: + context['participating'] = False + context['participation'] = None + context['in_contest'] = False + context['now'] = timezone.now() + context['is_organizer'] = self.is_organizer + + if not self.object.og_image or not self.object.summary: + metadata = generate_opengraph('generated-meta-contest:%d' % self.object.id, + self.object.description, 'contest') + context['meta_description'] = self.object.summary or metadata[0] + context['og_image'] = self.object.og_image or metadata[1] + context['has_moss_api_key'] = settings.MOSS_API_KEY is not None + context['logo_override_image'] = self.object.logo_override_image + if not context['logo_override_image'] and self.object.organizations.count() == 1: + context['logo_override_image'] = self.object.organizations.first().logo_override_image + + return context + + def get_object(self, queryset=None): + contest = super(ContestMixin, self).get_object(queryset) + user = self.request.user + profile = self.request.profile + + if (profile is not None and + ContestParticipation.objects.filter(id=profile.current_contest_id, contest_id=contest.id).exists()): + return contest + + if not contest.is_visible and not user.has_perm('judge.see_private_contest') and ( + not user.has_perm('judge.edit_own_contest') or + not self.check_organizer(contest, user)): + raise Http404() + + if contest.is_private or contest.is_organization_private: + private_contest_error = PrivateContestError(contest.name, contest.is_private, + contest.is_organization_private, contest.organizations.all()) + if profile is None: + raise private_contest_error + if user.has_perm('judge.edit_all_contest'): + return contest + if not (contest.is_organization_private and + contest.organizations.filter(id__in=profile.organizations.all()).exists()) and \ + not (contest.is_private and contest.private_contestants.filter(id=profile.id).exists()): + raise private_contest_error + + return contest + + def dispatch(self, request, *args, **kwargs): + try: + return super(ContestMixin, self).dispatch(request, *args, **kwargs) + except Http404: + key = kwargs.get(self.slug_url_kwarg, None) + if key: + return generic_message(request, _('No such contest'), + _('Could not find a contest with the key "%s".') % key) + else: + return generic_message(request, _('No such contest'), + _('Could not find such contest.')) + except PrivateContestError as e: + return render(request, 'contest/private.html', { + 'error': e, 'title': _('Access to contest "%s" denied') % e.name, + }, status=403) + + +class ContestDetail(ContestMixin, TitleMixin, CommentedDetailView): + template_name = 'contest/contest.html' + + def get_comment_page(self): + return 'c:%s' % self.object.key + + def get_title(self): + return self.object.name + + def get_context_data(self, **kwargs): + context = super(ContestDetail, self).get_context_data(**kwargs) + context['contest_problems'] = Problem.objects.filter(contests__contest=self.object) \ + .order_by('contests__order').defer('description') \ + .annotate(has_public_editorial=Sum(Case(When(solution__is_public=True, then=1), + default=0, output_field=IntegerField()))) \ + .add_i18n_name(self.request.LANGUAGE_CODE) + return context + + +class ContestClone(ContestMixin, PermissionRequiredMixin, TitleMixin, SingleObjectFormView): + title = _('Clone Contest') + template_name = 'contest/clone.html' + form_class = ContestCloneForm + permission_required = 'judge.clone_contest' + + def form_valid(self, form): + contest = self.object + + tags = contest.tags.all() + organizations = contest.organizations.all() + private_contestants = contest.private_contestants.all() + contest_problems = contest.contest_problems.all() + + contest.pk = None + contest.is_visible = False + contest.user_count = 0 + contest.key = form.cleaned_data['key'] + contest.save() + + contest.tags.set(tags) + contest.organizations.set(organizations) + contest.private_contestants.set(private_contestants) + contest.organizers.add(self.request.profile) + + for problem in contest_problems: + problem.contest = contest + problem.pk = None + ContestProblem.objects.bulk_create(contest_problems) + + return HttpResponseRedirect(reverse('admin:judge_contest_change', args=(contest.id,))) + + +class ContestAccessDenied(Exception): + pass + + +class ContestAccessCodeForm(forms.Form): + access_code = forms.CharField(max_length=255) + + def __init__(self, *args, **kwargs): + super(ContestAccessCodeForm, self).__init__(*args, **kwargs) + self.fields['access_code'].widget.attrs.update({'autocomplete': 'off'}) + + +class ContestJoin(LoginRequiredMixin, ContestMixin, BaseDetailView): + def get(self, request, *args, **kwargs): + self.object = self.get_object() + return self.ask_for_access_code() + + def post(self, request, *args, **kwargs): + self.object = self.get_object() + try: + return self.join_contest(request) + except ContestAccessDenied: + if request.POST.get('access_code'): + return self.ask_for_access_code(ContestAccessCodeForm(request.POST)) + else: + return HttpResponseRedirect(request.path) + + def join_contest(self, request, access_code=None): + contest = self.object + + if not contest.can_join and not self.is_organizer: + return generic_message(request, _('Contest not ongoing'), + _('"%s" is not currently ongoing.') % contest.name) + + profile = request.profile + if profile.current_contest is not None: + return generic_message(request, _('Already in contest'), + _('You are already in a contest: "%s".') % profile.current_contest.contest.name) + + if not request.user.is_superuser and contest.banned_users.filter(id=profile.id).exists(): + return generic_message(request, _('Banned from joining'), + _('You have been declared persona non grata for this contest. ' + 'You are permanently barred from joining this contest.')) + + requires_access_code = (not (request.user.is_superuser or self.is_organizer) and + contest.access_code and access_code != contest.access_code) + if contest.ended: + if requires_access_code: + raise ContestAccessDenied() + + while True: + virtual_id = max((ContestParticipation.objects.filter(contest=contest, user=profile) + .aggregate(virtual_id=Max('virtual'))['virtual_id'] or 0) + 1, 1) + try: + participation = ContestParticipation.objects.create( + contest=contest, user=profile, virtual=virtual_id, + real_start=timezone.now(), + ) + # There is obviously a race condition here, so we keep trying until we win the race. + except IntegrityError: + pass + else: + break + else: + try: + participation = ContestParticipation.objects.get( + contest=contest, user=profile, virtual=(-1 if self.is_organizer else 0), + ) + except ContestParticipation.DoesNotExist: + if requires_access_code: + raise ContestAccessDenied() + + participation = ContestParticipation.objects.create( + contest=contest, user=profile, virtual=(-1 if self.is_organizer else 0), + real_start=timezone.now(), + ) + else: + if participation.ended: + participation = ContestParticipation.objects.get_or_create( + contest=contest, user=profile, virtual=-1, + defaults={'real_start': timezone.now()}, + )[0] + + profile.current_contest = participation + profile.save() + contest._updating_stats_only = True + contest.update_user_count() + return HttpResponseRedirect(reverse('problem_list')) + + def ask_for_access_code(self, form=None): + contest = self.object + wrong_code = False + if form: + if form.is_valid(): + if form.cleaned_data['access_code'] == contest.access_code: + return self.join_contest(self.request, form.cleaned_data['access_code']) + wrong_code = True + else: + form = ContestAccessCodeForm() + return render(self.request, 'contest/access_code.html', { + 'form': form, 'wrong_code': wrong_code, + 'title': _('Enter access code for "%s"') % contest.name, + }) + + +class ContestLeave(LoginRequiredMixin, ContestMixin, BaseDetailView): + def post(self, request, *args, **kwargs): + contest = self.get_object() + + profile = request.profile + if profile.current_contest is None or profile.current_contest.contest_id != contest.id: + return generic_message(request, _('No such contest'), + _('You are not in contest "%s".') % contest.key, 404) + + profile.remove_contest() + return HttpResponseRedirect(reverse('contest_view', args=(contest.key,))) + + +ContestDay = namedtuple('ContestDay', 'date weekday is_pad is_today starts ends oneday') + + +class ContestCalendar(TitleMixin, ContestListMixin, TemplateView): + firstweekday = SUNDAY + weekday_classes = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'] + template_name = 'contest/calendar.html' + + def get(self, request, *args, **kwargs): + try: + self.year = int(kwargs['year']) + self.month = int(kwargs['month']) + except (KeyError, ValueError): + raise ImproperlyConfigured(_('ContestCalendar requires integer year and month')) + self.today = timezone.now().date() + return self.render() + + def render(self): + context = self.get_context_data() + return self.render_to_response(context) + + def get_contest_data(self, start, end): + end += timedelta(days=1) + contests = self.get_queryset().filter(Q(start_time__gte=start, start_time__lt=end) | + Q(end_time__gte=start, end_time__lt=end)).defer('description') + starts, ends, oneday = (defaultdict(list) for i in range(3)) + for contest in contests: + start_date = timezone.localtime(contest.start_time).date() + end_date = timezone.localtime(contest.end_time - timedelta(seconds=1)).date() + if start_date == end_date: + oneday[start_date].append(contest) + else: + starts[start_date].append(contest) + ends[end_date].append(contest) + return starts, ends, oneday + + def get_table(self): + calendar = Calendar(self.firstweekday).monthdatescalendar(self.year, self.month) + starts, ends, oneday = self.get_contest_data(make_aware(datetime.combine(calendar[0][0], time.min)), + make_aware(datetime.combine(calendar[-1][-1], time.min))) + return [[ContestDay( + date=date, weekday=self.weekday_classes[weekday], is_pad=date.month != self.month, + is_today=date == self.today, starts=starts[date], ends=ends[date], oneday=oneday[date], + ) for weekday, date in enumerate(week)] for week in calendar] + + def get_context_data(self, **kwargs): + context = super(ContestCalendar, self).get_context_data(**kwargs) + + try: + month = date(self.year, self.month, 1) + except ValueError: + raise Http404() + else: + context['title'] = _('Contests in %(month)s') % {'month': date_filter(month, _("F Y"))} + + dates = Contest.objects.aggregate(min=Min('start_time'), max=Max('end_time')) + min_month = (self.today.year, self.today.month) + if dates['min'] is not None: + min_month = dates['min'].year, dates['min'].month + max_month = (self.today.year, self.today.month) + if dates['max'] is not None: + max_month = max((dates['max'].year, dates['max'].month), (self.today.year, self.today.month)) + + month = (self.year, self.month) + if month < min_month or month > max_month: + # 404 is valid because it merely declares the lack of existence, without any reason + raise Http404() + + context['now'] = timezone.now() + context['calendar'] = self.get_table() + context['curr_month'] = date(self.year, self.month, 1) + + if month > min_month: + context['prev_month'] = date(self.year - (self.month == 1), 12 if self.month == 1 else self.month - 1, 1) + else: + context['prev_month'] = None + + if month < max_month: + context['next_month'] = date(self.year + (self.month == 12), 1 if self.month == 12 else self.month + 1, 1) + else: + context['next_month'] = None + return context + + +class CachedContestCalendar(ContestCalendar): + def render(self): + key = 'contest_cal:%d:%d' % (self.year, self.month) + cached = cache.get(key) + if cached is not None: + return HttpResponse(cached) + response = super(CachedContestCalendar, self).render() + response.render() + cached.set(key, response.content) + return response + + +class ContestStats(TitleMixin, ContestMixin, DetailView): + template_name = 'contest/stats.html' + + def get_title(self): + return _('%s Statistics') % self.object.name + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + + if not (self.object.ended or self.object.is_editable_by(self.request.user)): + raise Http404() + + queryset = Submission.objects.filter(contest_object=self.object) + + ac_count = Count(Case(When(result='AC', then=Value(1)), output_field=IntegerField())) + ac_rate = CombinedExpression(ac_count / Count('problem'), '*', Value(100.0), output_field=FloatField()) + + status_count_queryset = list( + queryset.values('problem__code', 'result').annotate(count=Count('result')) + .values_list('problem__code', 'result', 'count'), + ) + labels, codes = zip( + *self.object.contest_problems.order_by('order').values_list('problem__name', 'problem__code'), + ) + num_problems = len(labels) + status_counts = [[] for i in range(num_problems)] + for problem_code, result, count in status_count_queryset: + if problem_code in codes: + status_counts[codes.index(problem_code)].append((result, count)) + + result_data = defaultdict(partial(list, [0] * num_problems)) + for i in range(num_problems): + for category in _get_result_data(defaultdict(int, status_counts[i]))['categories']: + result_data[category['code']][i] = category['count'] + + stats = { + 'problem_status_count': { + 'labels': labels, + 'datasets': [ + { + 'label': name, + 'backgroundColor': settings.DMOJ_STATS_SUBMISSION_RESULT_COLORS[name], + 'data': data, + } + for name, data in result_data.items() + ], + }, + 'problem_ac_rate': get_bar_chart( + queryset.values('contest__problem__order', 'problem__name').annotate(ac_rate=ac_rate) + .order_by('contest__problem__order').values_list('problem__name', 'ac_rate'), + ), + 'language_count': get_pie_chart( + queryset.values('language__name').annotate(count=Count('language__name')) + .filter(count__gt=0).order_by('-count').values_list('language__name', 'count'), + ), + 'language_ac_rate': get_bar_chart( + queryset.values('language__name').annotate(ac_rate=ac_rate) + .filter(ac_rate__gt=0).values_list('language__name', 'ac_rate'), + ), + } + + context['stats'] = mark_safe(json.dumps(stats)) + + return context + + +ContestRankingProfile = namedtuple( + 'ContestRankingProfile', + 'id user css_class username points cumtime organization participation ' + 'participation_rating problem_cells result_cell', +) + +BestSolutionData = namedtuple('BestSolutionData', 'code points time state is_pretested') + + +def make_contest_ranking_profile(contest, participation, contest_problems): + user = participation.user + return ContestRankingProfile( + id=user.id, + user=user.user, + css_class=user.css_class, + username=user.username, + points=participation.score, + cumtime=participation.cumtime, + organization=user.organization, + participation_rating=participation.rating.rating if hasattr(participation, 'rating') else None, + problem_cells=[contest.format.display_user_problem(participation, contest_problem) + for contest_problem in contest_problems], + result_cell=contest.format.display_participation_result(participation), + participation=participation, + ) + + +def base_contest_ranking_list(contest, problems, queryset): + return [make_contest_ranking_profile(contest, participation, problems) for participation in + queryset.select_related('user__user', 'rating').defer('user__about', 'user__organizations__about')] + + +def contest_ranking_list(contest, problems): + return base_contest_ranking_list(contest, problems, contest.users.filter(virtual=0, user__is_unlisted=False) + .prefetch_related('user__organizations') + .order_by('is_disqualified', '-score', 'cumtime')) + + +def get_contest_ranking_list(request, contest, participation=None, ranking_list=contest_ranking_list, + show_current_virtual=True, ranker=ranker): + problems = list(contest.contest_problems.select_related('problem').defer('problem__description').order_by('order')) + + if contest.hide_scoreboard and contest.is_in_contest(request.user): + return ([(_('???'), make_contest_ranking_profile(contest, request.profile.current_contest, problems))], + problems) + + users = ranker(ranking_list(contest, problems), key=attrgetter('points', 'cumtime')) + + if show_current_virtual: + if participation is None and request.user.is_authenticated: + participation = request.profile.current_contest + if participation is None or participation.contest_id != contest.id: + participation = None + if participation is not None and participation.virtual: + users = chain([('-', make_contest_ranking_profile(contest, participation, problems))], users) + return users, problems + + +def contest_ranking_ajax(request, contest, participation=None): + contest, exists = _find_contest(request, contest) + if not exists: + return HttpResponseBadRequest('Invalid contest', content_type='text/plain') + + if not contest.can_see_scoreboard(request.user): + raise Http404() + + users, problems = get_contest_ranking_list(request, contest, participation) + return render(request, 'contest/ranking-table.html', { + 'users': users, + 'problems': problems, + 'contest': contest, + 'has_rating': contest.ratings.exists(), + }) + + +class ContestRankingBase(ContestMixin, TitleMixin, DetailView): + template_name = 'contest/ranking.html' + tab = None + + def get_title(self): + raise NotImplementedError() + + def get_content_title(self): + return self.object.name + + def get_ranking_list(self): + raise NotImplementedError() + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + + if not self.object.can_see_scoreboard(self.request.user): + raise Http404() + + users, problems = self.get_ranking_list() + context['users'] = users + context['problems'] = problems + context['last_msg'] = event.last() + context['tab'] = self.tab + return context + + +class ContestRanking(ContestRankingBase): + tab = 'ranking' + + def get_title(self): + return _('%s Rankings') % self.object.name + + def get_ranking_list(self): + return get_contest_ranking_list(self.request, self.object) + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context['has_rating'] = self.object.ratings.exists() + return context + + +class ContestParticipationList(LoginRequiredMixin, ContestRankingBase): + tab = 'participation' + + def get_title(self): + if self.profile == self.request.profile: + return _('Your participation in %s') % self.object.name + return _("%s's participation in %s") % (self.profile.username, self.object.name) + + def get_ranking_list(self): + queryset = self.object.users.filter(user=self.profile, virtual__gte=0).order_by('-virtual') + live_link = format_html('{0}', _('Live'), self.profile.username, + reverse('contest_ranking', args=[self.object.key])) + + return get_contest_ranking_list( + self.request, self.object, show_current_virtual=False, + ranking_list=partial(base_contest_ranking_list, queryset=queryset), + ranker=lambda users, key: ((user.participation.virtual or live_link, user) for user in users)) + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context['has_rating'] = False + context['now'] = timezone.now() + context['rank_header'] = _('Participation') + return context + + def get(self, request, *args, **kwargs): + if 'user' in kwargs: + self.profile = get_object_or_404(Profile, user__username=kwargs['user']) + else: + self.profile = self.request.profile + return super().get(request, *args, **kwargs) + + +class ContestParticipationDisqualify(ContestMixin, SingleObjectMixin, View): + def get_object(self, queryset=None): + contest = super().get_object(queryset) + if not contest.is_editable_by(self.request.user): + raise Http404() + return contest + + def post(self, request, *args, **kwargs): + self.object = self.get_object() + + try: + participation = self.object.users.get(pk=request.POST.get('participation')) + except ObjectDoesNotExist: + pass + else: + participation.set_disqualified(not participation.is_disqualified) + return HttpResponseRedirect(reverse('contest_ranking', args=(self.object.key,))) + + +class ContestMossMixin(ContestMixin, PermissionRequiredMixin): + permission_required = 'judge.moss_contest' + + def get_object(self, queryset=None): + contest = super().get_object(queryset) + if settings.MOSS_API_KEY is None: + raise Http404() + if not contest.is_editable_by(self.request.user): + raise Http404() + return contest + + +class ContestMossView(ContestMossMixin, TitleMixin, DetailView): + template_name = 'contest/moss.html' + + def get_title(self): + return _('%s MOSS Results') % self.object.name + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + + problems = list(map(attrgetter('problem'), self.object.contest_problems.order_by('order') + .select_related('problem'))) + languages = list(map(itemgetter(0), ContestMoss.LANG_MAPPING)) + + results = ContestMoss.objects.filter(contest=self.object) + moss_results = defaultdict(list) + for result in results: + moss_results[result.problem].append(result) + + for result_list in moss_results.values(): + result_list.sort(key=lambda x: languages.index(x.language)) + + context['languages'] = languages + context['has_results'] = results.exists() + context['moss_results'] = [(problem, moss_results[problem]) for problem in problems] + + return context + + def post(self, request, *args, **kwargs): + self.object = self.get_object() + status = run_moss.delay(self.object.key) + return redirect_to_task_status( + status, message=_('Running MOSS for %s...') % (self.object.name,), + redirect=reverse('contest_moss', args=(self.object.key,)), + ) + + +class ContestMossDelete(ContestMossMixin, SingleObjectMixin, View): + def post(self, request, *args, **kwargs): + self.object = self.get_object() + ContestMoss.objects.filter(contest=self.object).delete() + return HttpResponseRedirect(reverse('contest_moss', args=(self.object.key,))) + + +class ContestTagDetailAjax(DetailView): + model = ContestTag + slug_field = slug_url_kwarg = 'name' + context_object_name = 'tag' + template_name = 'contest/tag-ajax.html' + + +class ContestTagDetail(TitleMixin, ContestTagDetailAjax): + template_name = 'contest/tag.html' + + def get_title(self): + return _('Contest tag: %s') % self.object.name diff --git a/judge/views/error.py b/judge/views/error.py new file mode 100644 index 0000000..113422d --- /dev/null +++ b/judge/views/error.py @@ -0,0 +1,33 @@ +import traceback + +from django.shortcuts import render +from django.utils.translation import gettext as _ + + +def error(request, context, status): + return render(request, 'error.html', context=context, status=status) + + +def error404(request, exception=None): + # TODO: "panic: go back" + return render(request, 'generic-message.html', { + 'title': _('404 error'), + 'message': _('Could not find page "%s"') % request.path, + }, status=404) + + +def error403(request, exception=None): + return error(request, { + 'id': 'unauthorized_access', + 'description': _('no permission for %s') % request.path, + 'code': 403, + }, 403) + + +def error500(request): + return error(request, { + 'id': 'invalid_state', + 'description': _('corrupt page %s') % request.path, + 'traceback': traceback.format_exc(), + 'code': 500, + }, 500) diff --git a/judge/views/language.py b/judge/views/language.py new file mode 100644 index 0000000..87ab8cb --- /dev/null +++ b/judge/views/language.py @@ -0,0 +1,18 @@ +from django.utils.translation import gettext_lazy +from django.views.generic import ListView + +from judge.models import Language +from judge.utils.views import TitleMixin + + +class LanguageList(TitleMixin, ListView): + model = Language + context_object_name = 'languages' + template_name = 'status/language-list.html' + title = gettext_lazy('Runtimes') + + def get_queryset(self): + queryset = super().get_queryset().prefetch_related('runtimeversion_set') + if not self.request.user.is_superuser and not self.request.user.is_staff: + queryset = queryset.filter(judges__online=True).distinct() + return queryset diff --git a/judge/views/license.py b/judge/views/license.py new file mode 100644 index 0000000..77208e6 --- /dev/null +++ b/judge/views/license.py @@ -0,0 +1,14 @@ +from django.views.generic import DetailView + +from judge.models import License +from judge.utils.views import TitleMixin + + +class LicenseDetail(TitleMixin, DetailView): + model = License + slug_field = slug_url_kwarg = 'key' + context_object_name = 'license' + template_name = 'license.html' + + def get_title(self): + return self.object.name diff --git a/judge/views/mailgun.py b/judge/views/mailgun.py new file mode 100644 index 0000000..3bd8321 --- /dev/null +++ b/judge/views/mailgun.py @@ -0,0 +1,65 @@ +import hashlib +import hmac +import logging +from email.utils import parseaddr + +from django.conf import settings +from django.contrib.auth.models import User +from django.contrib.sites.shortcuts import get_current_site +from django.core.exceptions import PermissionDenied +from django.http import HttpResponse +from django.utils.decorators import method_decorator +from django.views.decorators.csrf import csrf_exempt +from django.views.generic import View +from registration.models import RegistrationProfile + +from judge.utils.unicode import utf8bytes + +logger = logging.getLogger('judge.mail.activate') + + +class MailgunActivationView(View): + if hasattr(settings, 'MAILGUN_ACCESS_KEY'): + def post(self, request, *args, **kwargs): + params = request.POST + timestamp = params.get('timestamp', '') + token = params.get('token', '') + signature = params.get('signature', '') + + logger.debug('Received request: %s', params) + + if signature != hmac.new(key=utf8bytes(settings.MAILGUN_ACCESS_KEY), + msg=utf8bytes('%s%s' % (timestamp, token)), digestmod=hashlib.sha256).hexdigest(): + logger.info('Rejected request: signature: %s, timestamp: %s, token: %s', signature, timestamp, token) + raise PermissionDenied() + _, sender = parseaddr(params.get('from')) + if not sender: + logger.info('Rejected invalid sender: %s', params.get('from')) + return HttpResponse(status=406) + try: + user = User.objects.get(email__iexact=sender) + except (User.DoesNotExist, User.MultipleObjectsReturned): + logger.info('Rejected unknown sender: %s: %s', sender, params.get('from')) + return HttpResponse(status=406) + try: + registration = RegistrationProfile.objects.get(user=user) + except RegistrationProfile.DoesNotExist: + logger.info('Rejected sender without RegistrationProfile: %s: %s', sender, params.get('from')) + return HttpResponse(status=406) + if registration.activated: + logger.info('Rejected activated sender: %s: %s', sender, params.get('from')) + return HttpResponse(status=406) + + key = registration.activation_key + if key in params.get('body-plain', '') or key in params.get('body-html', ''): + if RegistrationProfile.objects.activate_user(key, get_current_site(request)): + logger.info('Activated sender: %s: %s', sender, params.get('from')) + return HttpResponse('Activated', status=200) + logger.info('Failed to activate sender: %s: %s', sender, params.get('from')) + else: + logger.info('Activation key not found: %s: %s', sender, params.get('from')) + return HttpResponse(status=406) + + @method_decorator(csrf_exempt) + def dispatch(self, request, *args, **kwargs): + return super(MailgunActivationView, self).dispatch(request, *args, **kwargs) diff --git a/judge/views/organization.py b/judge/views/organization.py new file mode 100644 index 0000000..a9c1053 --- /dev/null +++ b/judge/views/organization.py @@ -0,0 +1,330 @@ +from django import forms +from django.conf import settings +from django.contrib import messages +from django.contrib.auth.mixins import LoginRequiredMixin +from django.core.cache import cache +from django.core.cache.utils import make_template_fragment_key +from django.core.exceptions import PermissionDenied +from django.db import transaction +from django.db.models import Count, Q +from django.forms import Form, modelformset_factory +from django.http import Http404, HttpResponsePermanentRedirect, HttpResponseRedirect +from django.urls import reverse +from django.utils.translation import gettext as _, gettext_lazy, ungettext +from django.views.generic import DetailView, FormView, ListView, UpdateView, View +from django.views.generic.detail import SingleObjectMixin, SingleObjectTemplateResponseMixin +from reversion import revisions + +from judge.forms import EditOrganizationForm +from judge.models import Organization, OrganizationRequest, Profile +from judge.utils.ranker import ranker +from judge.utils.views import TitleMixin, generic_message + +__all__ = ['OrganizationList', 'OrganizationHome', 'OrganizationUsers', 'OrganizationMembershipChange', + 'JoinOrganization', 'LeaveOrganization', 'EditOrganization', 'RequestJoinOrganization', + 'OrganizationRequestDetail', 'OrganizationRequestView', 'OrganizationRequestLog', + 'KickUserWidgetView'] + + +class OrganizationMixin(object): + context_object_name = 'organization' + model = Organization + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context['logo_override_image'] = self.object.logo_override_image + return context + + def dispatch(self, request, *args, **kwargs): + try: + return super(OrganizationMixin, self).dispatch(request, *args, **kwargs) + except Http404: + key = kwargs.get(self.slug_url_kwarg, None) + if key: + return generic_message(request, _('No such organization'), + _('Could not find an organization with the key "%s".') % key) + else: + return generic_message(request, _('No such organization'), + _('Could not find such organization.')) + + def can_edit_organization(self, org=None): + if org is None: + org = self.object + if not self.request.user.is_authenticated: + return False + profile_id = self.request.profile.id + return org.admins.filter(id=profile_id).exists() or org.registrant_id == profile_id + + +class OrganizationDetailView(OrganizationMixin, DetailView): + def get(self, request, *args, **kwargs): + self.object = self.get_object() + if self.object.slug != kwargs['slug']: + return HttpResponsePermanentRedirect(request.get_full_path().replace(kwargs['slug'], self.object.slug)) + context = self.get_context_data(object=self.object) + return self.render_to_response(context) + + +class OrganizationList(TitleMixin, ListView): + model = Organization + context_object_name = 'organizations' + template_name = 'organization/list.html' + title = gettext_lazy('Organizations') + + def get_queryset(self): + return super(OrganizationList, self).get_queryset().annotate(member_count=Count('member')) + + +class OrganizationHome(OrganizationDetailView): + template_name = 'organization/home.html' + + def get_context_data(self, **kwargs): + context = super(OrganizationHome, self).get_context_data(**kwargs) + context['title'] = self.object.name + context['can_edit'] = self.can_edit_organization() + return context + + +class OrganizationUsers(OrganizationDetailView): + template_name = 'organization/users.html' + + def get_context_data(self, **kwargs): + context = super(OrganizationUsers, self).get_context_data(**kwargs) + context['title'] = _('%s Members') % self.object.name + context['users'] = \ + ranker(self.object.members.filter(is_unlisted=False).order_by('-performance_points', '-problem_count') + .select_related('user').defer('about', 'user_script', 'notes')) + context['partial'] = True + context['is_admin'] = self.can_edit_organization() + context['kick_url'] = reverse('organization_user_kick', args=[self.object.id, self.object.slug]) + return context + + +class OrganizationMembershipChange(LoginRequiredMixin, OrganizationMixin, SingleObjectMixin, View): + def post(self, request, *args, **kwargs): + org = self.get_object() + response = self.handle(request, org, request.profile) + if response is not None: + return response + return HttpResponseRedirect(org.get_absolute_url()) + + def handle(self, request, org, profile): + raise NotImplementedError() + + +class JoinOrganization(OrganizationMembershipChange): + def handle(self, request, org, profile): + if profile.organizations.filter(id=org.id).exists(): + return generic_message(request, _('Joining organization'), _('You are already in the organization.')) + + if not org.is_open: + return generic_message(request, _('Joining organization'), _('This organization is not open.')) + + max_orgs = settings.DMOJ_USER_MAX_ORGANIZATION_COUNT + if profile.organizations.filter(is_open=True).count() >= max_orgs: + return generic_message( + request, _('Joining organization'), + _('You may not be part of more than {count} public organizations.').format(count=max_orgs), + ) + + profile.organizations.add(org) + profile.save() + cache.delete(make_template_fragment_key('org_member_count', (org.id,))) + + +class LeaveOrganization(OrganizationMembershipChange): + def handle(self, request, org, profile): + if not profile.organizations.filter(id=org.id).exists(): + return generic_message(request, _('Leaving organization'), _('You are not in "%s".') % org.short_name) + profile.organizations.remove(org) + cache.delete(make_template_fragment_key('org_member_count', (org.id,))) + + +class OrganizationRequestForm(Form): + reason = forms.CharField(widget=forms.Textarea) + + +class RequestJoinOrganization(LoginRequiredMixin, SingleObjectMixin, FormView): + model = Organization + slug_field = 'key' + slug_url_kwarg = 'key' + template_name = 'organization/requests/request.html' + form_class = OrganizationRequestForm + + def dispatch(self, request, *args, **kwargs): + self.object = self.get_object() + return super(RequestJoinOrganization, self).dispatch(request, *args, **kwargs) + + def get_context_data(self, **kwargs): + context = super(RequestJoinOrganization, self).get_context_data(**kwargs) + if self.object.is_open: + raise Http404() + context['title'] = _('Request to join %s') % self.object.name + return context + + def form_valid(self, form): + request = OrganizationRequest() + request.organization = self.get_object() + request.user = self.request.profile + request.reason = form.cleaned_data['reason'] + request.state = 'P' + request.save() + return HttpResponseRedirect(reverse('request_organization_detail', args=( + request.organization.id, request.organization.slug, request.id, + ))) + + +class OrganizationRequestDetail(LoginRequiredMixin, TitleMixin, DetailView): + model = OrganizationRequest + template_name = 'organization/requests/detail.html' + title = gettext_lazy('Join request detail') + pk_url_kwarg = 'rpk' + + def get_object(self, queryset=None): + object = super(OrganizationRequestDetail, self).get_object(queryset) + profile = self.request.profile + if object.user_id != profile.id and not object.organization.admins.filter(id=profile.id).exists(): + raise PermissionDenied() + return object + + +OrganizationRequestFormSet = modelformset_factory(OrganizationRequest, extra=0, fields=('state',), can_delete=True) + + +class OrganizationRequestBaseView(LoginRequiredMixin, SingleObjectTemplateResponseMixin, SingleObjectMixin, View): + model = Organization + slug_field = 'key' + slug_url_kwarg = 'key' + tab = None + + def get_object(self, queryset=None): + organization = super(OrganizationRequestBaseView, self).get_object(queryset) + if not (organization.admins.filter(id=self.request.profile.id).exists() or + organization.registrant_id == self.request.profile.id): + raise PermissionDenied() + return organization + + def get_context_data(self, **kwargs): + context = super(OrganizationRequestBaseView, self).get_context_data(**kwargs) + context['title'] = _('Managing join requests for %s') % self.object.name + context['tab'] = self.tab + return context + + +class OrganizationRequestView(OrganizationRequestBaseView): + template_name = 'organization/requests/pending.html' + tab = 'pending' + + def get_context_data(self, **kwargs): + context = super(OrganizationRequestView, self).get_context_data(**kwargs) + context['formset'] = self.formset + return context + + def get(self, request, *args, **kwargs): + self.object = self.get_object() + self.formset = OrganizationRequestFormSet( + queryset=OrganizationRequest.objects.filter(state='P', organization=self.object), + ) + context = self.get_context_data(object=self.object) + return self.render_to_response(context) + + def post(self, request, *args, **kwargs): + self.object = organization = self.get_object() + self.formset = formset = OrganizationRequestFormSet(request.POST, request.FILES) + if formset.is_valid(): + if organization.slots is not None: + deleted_set = set(formset.deleted_forms) + to_approve = sum(form.cleaned_data['state'] == 'A' for form in formset.forms if form not in deleted_set) + can_add = organization.slots - organization.members.count() + if to_approve > can_add: + messages.error(request, _('Your organization can only receive %d more members. ' + 'You cannot approve %d users.') % (can_add, to_approve)) + return self.render_to_response(self.get_context_data(object=organization)) + + approved, rejected = 0, 0 + for obj in formset.save(): + if obj.state == 'A': + obj.user.organizations.add(obj.organization) + approved += 1 + elif obj.state == 'R': + rejected += 1 + messages.success(request, + ungettext('Approved %d user.', 'Approved %d users.', approved) % approved + '\n' + + ungettext('Rejected %d user.', 'Rejected %d users.', rejected) % rejected) + cache.delete(make_template_fragment_key('org_member_count', (organization.id,))) + return HttpResponseRedirect(request.get_full_path()) + return self.render_to_response(self.get_context_data(object=organization)) + + put = post + + +class OrganizationRequestLog(OrganizationRequestBaseView): + states = ('A', 'R') + tab = 'log' + template_name = 'organization/requests/log.html' + + def get(self, request, *args, **kwargs): + self.object = self.get_object() + context = self.get_context_data(object=self.object) + return self.render_to_response(context) + + def get_context_data(self, **kwargs): + context = super(OrganizationRequestLog, self).get_context_data(**kwargs) + context['requests'] = self.object.requests.filter(state__in=self.states) + return context + + +class EditOrganization(LoginRequiredMixin, TitleMixin, OrganizationMixin, UpdateView): + template_name = 'organization/edit.html' + model = Organization + form_class = EditOrganizationForm + + def get_title(self): + return _('Editing %s') % self.object.name + + def get_object(self, queryset=None): + object = super(EditOrganization, self).get_object() + if not self.can_edit_organization(object): + raise PermissionDenied() + return object + + def get_form(self, form_class=None): + form = super(EditOrganization, self).get_form(form_class) + form.fields['admins'].queryset = \ + Profile.objects.filter(Q(organizations=self.object) | Q(admin_of=self.object)).distinct() + return form + + def form_valid(self, form): + with transaction.atomic(), revisions.create_revision(): + revisions.set_comment(_('Edited from site')) + revisions.set_user(self.request.user) + return super(EditOrganization, self).form_valid(form) + + def dispatch(self, request, *args, **kwargs): + try: + return super(EditOrganization, self).dispatch(request, *args, **kwargs) + except PermissionDenied: + return generic_message(request, _("Can't edit organization"), + _('You are not allowed to edit this organization.'), status=403) + + +class KickUserWidgetView(LoginRequiredMixin, OrganizationMixin, SingleObjectMixin, View): + def post(self, request, *args, **kwargs): + organization = self.get_object() + if not self.can_edit_organization(organization): + return generic_message(request, _("Can't edit organization"), + _('You are not allowed to kick people from this organization.'), status=403) + + try: + user = Profile.objects.get(id=request.POST.get('user', None)) + except Profile.DoesNotExist: + return generic_message(request, _("Can't kick user"), + _('The user you are trying to kick does not exist!'), status=400) + + if not organization.members.filter(id=user.id).exists(): + return generic_message(request, _("Can't kick user"), + _('The user you are trying to kick is not in organization: %s.') % + organization.name, status=400) + + organization.members.remove(user) + return HttpResponseRedirect(organization.get_users_url()) diff --git a/judge/views/preview.py b/judge/views/preview.py new file mode 100644 index 0000000..5fbd2e8 --- /dev/null +++ b/judge/views/preview.py @@ -0,0 +1,50 @@ +from django.http import HttpResponseBadRequest +from django.views.generic.base import ContextMixin, TemplateResponseMixin, View + + +class MarkdownPreviewView(TemplateResponseMixin, ContextMixin, View): + def post(self, request, *args, **kwargs): + try: + self.preview_data = data = request.POST['preview'] + except KeyError: + return HttpResponseBadRequest('No preview data specified.') + + return self.render_to_response(self.get_context_data( + preview_data=data, + )) + + +class ProblemMarkdownPreviewView(MarkdownPreviewView): + template_name = 'problem/preview.html' + + +class BlogMarkdownPreviewView(MarkdownPreviewView): + template_name = 'blog/preview.html' + + +class ContestMarkdownPreviewView(MarkdownPreviewView): + template_name = 'contest/preview.html' + + +class CommentMarkdownPreviewView(MarkdownPreviewView): + template_name = 'comments/preview.html' + + +class ProfileMarkdownPreviewView(MarkdownPreviewView): + template_name = 'user/preview.html' + + +class OrganizationMarkdownPreviewView(MarkdownPreviewView): + template_name = 'organization/preview.html' + + +class SolutionMarkdownPreviewView(MarkdownPreviewView): + template_name = 'solution-preview.html' + + +class LicenseMarkdownPreviewView(MarkdownPreviewView): + template_name = 'license-preview.html' + + +class TicketMarkdownPreviewView(MarkdownPreviewView): + template_name = 'ticket/preview.html' diff --git a/judge/views/problem.py b/judge/views/problem.py new file mode 100644 index 0000000..07924bb --- /dev/null +++ b/judge/views/problem.py @@ -0,0 +1,674 @@ +import logging +import os +import shutil +from datetime import timedelta +from operator import itemgetter +from random import randrange + +from django.conf import settings +from django.contrib.auth.decorators import login_required +from django.contrib.auth.mixins import PermissionRequiredMixin +from django.core.exceptions import ObjectDoesNotExist, PermissionDenied +from django.db import transaction +from django.db.models import Count, F, Prefetch, Q +from django.db.utils import ProgrammingError +from django.http import Http404, HttpResponse, HttpResponseBadRequest, HttpResponseForbidden, HttpResponseRedirect +from django.shortcuts import get_object_or_404, render +from django.template.loader import get_template +from django.urls import reverse +from django.utils import timezone, translation +from django.utils.functional import cached_property +from django.utils.html import escape, format_html +from django.utils.safestring import mark_safe +from django.utils.translation import gettext as _, gettext_lazy +from django.views.generic import ListView, View +from django.views.generic.base import TemplateResponseMixin +from django.views.generic.detail import SingleObjectMixin + +from judge.comments import CommentedDetailView +from judge.forms import ProblemCloneForm, ProblemSubmitForm +from judge.models import ContestProblem, ContestSubmission, Judge, Language, Problem, ProblemGroup, \ + ProblemTranslation, ProblemType, RuntimeVersion, Solution, Submission, SubmissionSource, \ + TranslatedProblemForeignKeyQuerySet +from judge.pdf_problems import DefaultPdfMaker, HAS_PDF +from judge.utils.diggpaginator import DiggPaginator +from judge.utils.opengraph import generate_opengraph +from judge.utils.problems import contest_attempted_ids, contest_completed_ids, hot_problems, user_attempted_ids, \ + user_completed_ids +from judge.utils.strings import safe_float_or_none, safe_int_or_none +from judge.utils.tickets import own_ticket_filter +from judge.utils.views import QueryStringSortMixin, SingleObjectFormView, TitleMixin, generic_message + + +def get_contest_problem(problem, profile): + try: + return problem.contests.get(contest_id=profile.current_contest.contest_id) + except ObjectDoesNotExist: + return None + + +def get_contest_submission_count(problem, profile, virtual): + return profile.current_contest.submissions.exclude(submission__status__in=['IE']) \ + .filter(problem__problem__code=problem, participation__virtual=virtual).count() + + +class ProblemMixin(object): + model = Problem + slug_url_kwarg = 'problem' + slug_field = 'code' + + def get_object(self, queryset=None): + problem = super(ProblemMixin, self).get_object(queryset) + if not problem.is_accessible_by(self.request.user): + raise Http404() + return problem + + def no_such_problem(self): + code = self.kwargs.get(self.slug_url_kwarg, None) + return generic_message(self.request, _('No such problem'), + _('Could not find a problem with the code "%s".') % code, status=404) + + def get(self, request, *args, **kwargs): + try: + return super(ProblemMixin, self).get(request, *args, **kwargs) + except Http404: + return self.no_such_problem() + + +class SolvedProblemMixin(object): + def get_completed_problems(self): + if self.in_contest: + return contest_completed_ids(self.profile.current_contest) + else: + return user_completed_ids(self.profile) if self.profile is not None else () + + def get_attempted_problems(self): + if self.in_contest: + return contest_attempted_ids(self.profile.current_contest) + else: + return user_attempted_ids(self.profile) if self.profile is not None else () + + @cached_property + def in_contest(self): + return self.profile is not None and self.profile.current_contest is not None + + @cached_property + def contest(self): + return self.request.profile.current_contest.contest + + @cached_property + def profile(self): + if not self.request.user.is_authenticated: + return None + return self.request.profile + + +class ProblemSolution(SolvedProblemMixin, ProblemMixin, TitleMixin, CommentedDetailView): + context_object_name = 'problem' + template_name = 'problem/editorial.html' + + def get_title(self): + return _('Editorial for {0}').format(self.object.name) + + def get_content_title(self): + return format_html(_(u'Editorial for {0}'), self.object.name, + reverse('problem_detail', args=[self.object.code])) + + def get_context_data(self, **kwargs): + context = super(ProblemSolution, self).get_context_data(**kwargs) + + solution = get_object_or_404(Solution, problem=self.object) + + if (not solution.is_public or solution.publish_on > timezone.now()) and \ + not self.request.user.has_perm('judge.see_private_solution') or \ + (self.request.user.is_authenticated and + self.request.profile.current_contest): + raise Http404() + context['solution'] = solution + context['has_solved_problem'] = self.object.id in self.get_completed_problems() + return context + + def get_comment_page(self): + return 's:' + self.object.code + + +class ProblemRaw(ProblemMixin, TitleMixin, TemplateResponseMixin, SingleObjectMixin, View): + context_object_name = 'problem' + template_name = 'problem/raw.html' + + def get_title(self): + return self.object.name + + def get_context_data(self, **kwargs): + context = super(ProblemRaw, self).get_context_data(**kwargs) + context['problem_name'] = self.object.name + context['url'] = self.request.build_absolute_uri() + context['description'] = self.object.description + return context + + def get(self, request, *args, **kwargs): + self.object = self.get_object() + with translation.override(settings.LANGUAGE_CODE): + return self.render_to_response(self.get_context_data( + object=self.object, + )) + + +class ProblemDetail(ProblemMixin, SolvedProblemMixin, CommentedDetailView): + context_object_name = 'problem' + template_name = 'problem/problem.html' + + def get_comment_page(self): + return 'p:%s' % self.object.code + + def get_context_data(self, **kwargs): + context = super(ProblemDetail, self).get_context_data(**kwargs) + user = self.request.user + authed = user.is_authenticated + context['has_submissions'] = authed and Submission.objects.filter(user=user.profile, + problem=self.object).exists() + contest_problem = (None if not authed or user.profile.current_contest is None else + get_contest_problem(self.object, user.profile)) + context['contest_problem'] = contest_problem + if contest_problem: + clarifications = self.object.clarifications + context['has_clarifications'] = clarifications.count() > 0 + context['clarifications'] = clarifications.order_by('-date') + context['submission_limit'] = contest_problem.max_submissions + if contest_problem.max_submissions: + context['submissions_left'] = max(contest_problem.max_submissions - + get_contest_submission_count(self.object.code, user.profile, + user.profile.current_contest.virtual), 0) + + context['available_judges'] = Judge.objects.filter(online=True, problems=self.object) + context['show_languages'] = self.object.allowed_languages.count() != Language.objects.count() + context['has_pdf_render'] = HAS_PDF + context['completed_problem_ids'] = self.get_completed_problems() + context['attempted_problems'] = self.get_attempted_problems() + + can_edit = self.object.is_editable_by(user) + context['can_edit_problem'] = can_edit + if user.is_authenticated: + tickets = self.object.tickets + if not can_edit: + tickets = tickets.filter(own_ticket_filter(user.profile.id)) + context['has_tickets'] = tickets.exists() + context['num_open_tickets'] = tickets.filter(is_open=True).values('id').distinct().count() + + try: + context['editorial'] = Solution.objects.get(problem=self.object) + except ObjectDoesNotExist: + pass + try: + translation = self.object.translations.get(language=self.request.LANGUAGE_CODE) + except ProblemTranslation.DoesNotExist: + context['title'] = self.object.name + context['language'] = settings.LANGUAGE_CODE + context['description'] = self.object.description + context['translated'] = False + else: + context['title'] = translation.name + context['language'] = self.request.LANGUAGE_CODE + context['description'] = translation.description + context['translated'] = True + + if not self.object.og_image or not self.object.summary: + metadata = generate_opengraph('generated-meta-problem:%s:%d' % (context['language'], self.object.id), + context['description'], 'problem') + context['meta_description'] = self.object.summary or metadata[0] + context['og_image'] = self.object.og_image or metadata[1] + return context + + +class LatexError(Exception): + pass + + +class ProblemPdfView(ProblemMixin, SingleObjectMixin, View): + logger = logging.getLogger('judge.problem.pdf') + languages = set(map(itemgetter(0), settings.LANGUAGES)) + + def get(self, request, *args, **kwargs): + if not HAS_PDF: + raise Http404() + + language = kwargs.get('language', self.request.LANGUAGE_CODE) + if language not in self.languages: + raise Http404() + + problem = self.get_object() + try: + trans = problem.translations.get(language=language) + except ProblemTranslation.DoesNotExist: + trans = None + + cache = os.path.join(settings.DMOJ_PDF_PROBLEM_CACHE, '%s.%s.pdf' % (problem.code, language)) + + if not os.path.exists(cache): + self.logger.info('Rendering: %s.%s.pdf', problem.code, language) + with DefaultPdfMaker() as maker, translation.override(language): + problem_name = problem.name if trans is None else trans.name + maker.html = get_template('problem/raw.html').render({ + 'problem': problem, + 'problem_name': problem_name, + 'description': problem.description if trans is None else trans.description, + 'url': request.build_absolute_uri(), + 'math_engine': maker.math_engine, + }).replace('"//', '"https://').replace("'//", "'https://") + maker.title = problem_name + + assets = ['style.css', 'pygment-github.css'] + if maker.math_engine == 'jax': + assets.append('mathjax_config.js') + for file in assets: + maker.load(file, os.path.join(settings.DMOJ_RESOURCES, file)) + maker.make() + if not maker.success: + self.logger.error('Failed to render PDF for %s', problem.code) + return HttpResponse(maker.log, status=500, content_type='text/plain') + shutil.move(maker.pdffile, cache) + + response = HttpResponse() + if hasattr(settings, 'DMOJ_PDF_PROBLEM_INTERNAL') and \ + request.META.get('SERVER_SOFTWARE', '').startswith('nginx/'): + response['X-Accel-Redirect'] = '%s/%s.%s.pdf' % (settings.DMOJ_PDF_PROBLEM_INTERNAL, problem.code, language) + else: + with open(cache, 'rb') as f: + response.content = f.read() + + response['Content-Type'] = 'application/pdf' + response['Content-Disposition'] = 'inline; filename=%s.%s.pdf' % (problem.code, language) + return response + + +class ProblemList(QueryStringSortMixin, TitleMixin, SolvedProblemMixin, ListView): + model = Problem + title = gettext_lazy('Problems') + context_object_name = 'problems' + template_name = 'problem/list.html' + paginate_by = 50 + sql_sort = frozenset(('points', 'ac_rate', 'user_count', 'code')) + manual_sort = frozenset(('name', 'group', 'solved', 'type')) + all_sorts = sql_sort | manual_sort + default_desc = frozenset(('points', 'ac_rate', 'user_count')) + default_sort = 'code' + + def get_paginator(self, queryset, per_page, orphans=0, + allow_empty_first_page=True, **kwargs): + paginator = DiggPaginator(queryset, per_page, body=6, padding=2, orphans=orphans, + allow_empty_first_page=allow_empty_first_page, **kwargs) + if not self.in_contest: + # Get the number of pages and then add in this magic. + # noinspection PyStatementEffect + paginator.num_pages + + queryset = queryset.add_i18n_name(self.request.LANGUAGE_CODE) + sort_key = self.order.lstrip('-') + if sort_key in self.sql_sort: + queryset = queryset.order_by(self.order) + elif sort_key == 'name': + queryset = queryset.order_by(self.order.replace('name', 'i18n_name')) + elif sort_key == 'group': + queryset = queryset.order_by(self.order + '__name') + elif sort_key == 'solved': + if self.request.user.is_authenticated: + profile = self.request.profile + solved = user_completed_ids(profile) + attempted = user_attempted_ids(profile) + + def _solved_sort_order(problem): + if problem.id in solved: + return 1 + if problem.id in attempted: + return 0 + return -1 + + queryset = list(queryset) + queryset.sort(key=_solved_sort_order, reverse=self.order.startswith('-')) + elif sort_key == 'type': + if self.show_types: + queryset = list(queryset) + queryset.sort(key=lambda problem: problem.types_list[0] if problem.types_list else '', + reverse=self.order.startswith('-')) + paginator.object_list = queryset + return paginator + + @cached_property + def profile(self): + if not self.request.user.is_authenticated: + return None + return self.request.profile + + def get_contest_queryset(self): + queryset = self.profile.current_contest.contest.contest_problems.select_related('problem__group') \ + .defer('problem__description').order_by('problem__code') \ + .annotate(user_count=Count('submission__participation', distinct=True)) \ + .order_by('order') + queryset = TranslatedProblemForeignKeyQuerySet.add_problem_i18n_name(queryset, 'i18n_name', + self.request.LANGUAGE_CODE, + 'problem__name') + return [{ + 'id': p['problem_id'], + 'code': p['problem__code'], + 'name': p['problem__name'], + 'i18n_name': p['i18n_name'], + 'group': {'full_name': p['problem__group__full_name']}, + 'points': p['points'], + 'partial': p['partial'], + 'user_count': p['user_count'], + } for p in queryset.values('problem_id', 'problem__code', 'problem__name', 'i18n_name', + 'problem__group__full_name', 'points', 'partial', 'user_count')] + + def get_normal_queryset(self): + filter = Q(is_public=True) + if self.profile is not None: + filter |= Q(authors=self.profile) + filter |= Q(curators=self.profile) + filter |= Q(testers=self.profile) + queryset = Problem.objects.filter(filter).select_related('group').defer('description') + if not self.request.user.has_perm('see_organization_problem'): + filter = Q(is_organization_private=False) + if self.profile is not None: + filter |= Q(organizations__in=self.profile.organizations.all()) + queryset = queryset.filter(filter) + if self.profile is not None and self.hide_solved: + queryset = queryset.exclude(id__in=Submission.objects.filter(user=self.profile, points=F('problem__points')) + .values_list('problem__id', flat=True)) + if self.show_types: + queryset = queryset.prefetch_related('types') + if self.category is not None: + queryset = queryset.filter(group__id=self.category) + if self.selected_types: + queryset = queryset.filter(types__in=self.selected_types) + if 'search' in self.request.GET: + self.search_query = query = ' '.join(self.request.GET.getlist('search')).strip() + if query: + if settings.ENABLE_FTS and self.full_text: + queryset = queryset.search(query, queryset.BOOLEAN).extra(order_by=['-relevance']) + else: + queryset = queryset.filter( + Q(code__icontains=query) | Q(name__icontains=query) | + Q(translations__name__icontains=query, translations__language=self.request.LANGUAGE_CODE)) + self.prepoint_queryset = queryset + if self.point_start is not None: + queryset = queryset.filter(points__gte=self.point_start) + if self.point_end is not None: + queryset = queryset.filter(points__lte=self.point_end) + return queryset.distinct() + + def get_queryset(self): + if self.in_contest: + return self.get_contest_queryset() + else: + return self.get_normal_queryset() + + def get_context_data(self, **kwargs): + context = super(ProblemList, self).get_context_data(**kwargs) + context['hide_solved'] = 0 if self.in_contest else int(self.hide_solved) + context['show_types'] = 0 if self.in_contest else int(self.show_types) + context['full_text'] = 0 if self.in_contest else int(self.full_text) + context['category'] = self.category + context['categories'] = ProblemGroup.objects.all() + if self.show_types: + context['selected_types'] = self.selected_types + context['problem_types'] = ProblemType.objects.all() + context['has_fts'] = settings.ENABLE_FTS + context['search_query'] = self.search_query + context['completed_problem_ids'] = self.get_completed_problems() + context['attempted_problems'] = self.get_attempted_problems() + + context.update(self.get_sort_paginate_context()) + if not self.in_contest: + context.update(self.get_sort_context()) + context['hot_problems'] = hot_problems(timedelta(days=1), 7) + context['point_start'], context['point_end'], context['point_values'] = self.get_noui_slider_points() + else: + context['hot_problems'] = None + context['point_start'], context['point_end'], context['point_values'] = 0, 0, {} + context['hide_contest_scoreboard'] = self.contest.hide_scoreboard + return context + + def get_noui_slider_points(self): + points = sorted(self.prepoint_queryset.values_list('points', flat=True).distinct()) + if not points: + return 0, 0, {} + if len(points) == 1: + return points[0], points[0], { + 'min': points[0] - 1, + 'max': points[0] + 1, + } + + start, end = points[0], points[-1] + if self.point_start is not None: + start = self.point_start + if self.point_end is not None: + end = self.point_end + points_map = {0.0: 'min', 1.0: 'max'} + size = len(points) - 1 + return start, end, {points_map.get(i / size, '%.2f%%' % (100 * i / size,)): j for i, j in enumerate(points)} + + def GET_with_session(self, request, key): + if not request.GET: + return request.session.get(key, False) + return request.GET.get(key, None) == '1' + + def setup_problem_list(self, request): + self.hide_solved = self.GET_with_session(request, 'hide_solved') + self.show_types = self.GET_with_session(request, 'show_types') + self.full_text = self.GET_with_session(request, 'full_text') + + self.search_query = None + self.category = None + self.selected_types = [] + + # This actually copies into the instance dictionary... + self.all_sorts = set(self.all_sorts) + if not self.show_types: + self.all_sorts.discard('type') + + self.category = safe_int_or_none(request.GET.get('category')) + if 'type' in request.GET: + try: + self.selected_types = list(map(int, request.GET.getlist('type'))) + except ValueError: + pass + + self.point_start = safe_float_or_none(request.GET.get('point_start')) + self.point_end = safe_float_or_none(request.GET.get('point_end')) + + def get(self, request, *args, **kwargs): + self.setup_problem_list(request) + + try: + return super(ProblemList, self).get(request, *args, **kwargs) + except ProgrammingError as e: + return generic_message(request, 'FTS syntax error', e.args[1], status=400) + + def post(self, request, *args, **kwargs): + to_update = ('hide_solved', 'show_types', 'full_text') + for key in to_update: + if key in request.GET: + val = request.GET.get(key) == '1' + request.session[key] = val + else: + request.session.pop(key, None) + return HttpResponseRedirect(request.get_full_path()) + + +class LanguageTemplateAjax(View): + def get(self, request, *args, **kwargs): + try: + language = get_object_or_404(Language, id=int(request.GET.get('id', 0))) + except ValueError: + raise Http404() + return HttpResponse(language.template, content_type='text/plain') + + +class RandomProblem(ProblemList): + def get(self, request, *args, **kwargs): + self.setup_problem_list(request) + if self.in_contest: + raise Http404() + + queryset = self.get_normal_queryset() + count = queryset.count() + if not count: + return HttpResponseRedirect('%s%s%s' % (reverse('problem_list'), request.META['QUERY_STRING'] and '?', + request.META['QUERY_STRING'])) + return HttpResponseRedirect(queryset[randrange(count)].get_absolute_url()) + + +user_logger = logging.getLogger('judge.user') + + +@login_required +def problem_submit(request, problem=None, submission=None): + if submission is not None and not request.user.has_perm('judge.resubmit_other') and \ + get_object_or_404(Submission, id=int(submission)).user.user != request.user: + raise PermissionDenied() + + profile = request.profile + if request.method == 'POST': + form = ProblemSubmitForm(request.POST, instance=Submission(user=profile)) + if form.is_valid(): + if (not request.user.has_perm('judge.spam_submission') and + Submission.objects.filter(user=profile, was_rejudged=False) + .exclude(status__in=['D', 'IE', 'CE', 'AB']).count() >= settings.DMOJ_SUBMISSION_LIMIT): + return HttpResponse('

You submitted too many submissions.

', status=429) + if not form.cleaned_data['problem'].allowed_languages.filter( + id=form.cleaned_data['language'].id).exists(): + raise PermissionDenied() + if not form.cleaned_data['problem'].is_accessible_by(request.user): + user_logger.info('Naughty user %s wants to submit to %s without permission', + request.user.username, form.cleaned_data['problem'].code) + return HttpResponseForbidden('

Do you want me to ban you?

') + if not request.user.is_superuser and form.cleaned_data['problem'].banned_users.filter( + id=profile.id).exists(): + return generic_message(request, _('Banned from submitting'), + _('You have been declared persona non grata for this problem. ' + 'You are permanently barred from submitting this problem.')) + + with transaction.atomic(): + if profile.current_contest is not None: + contest_id = profile.current_contest.contest_id + try: + contest_problem = form.cleaned_data['problem'].contests.get(contest_id=contest_id) + except ContestProblem.DoesNotExist: + model = form.save() + else: + max_subs = contest_problem.max_submissions + if max_subs and get_contest_submission_count(problem, profile, + profile.current_contest.virtual) >= max_subs: + return generic_message(request, _('Too many submissions'), + _('You have exceeded the submission limit for this problem.')) + model = form.save() + model.contest_object_id = contest_id + + contest = ContestSubmission(submission=model, problem=contest_problem, + participation=profile.current_contest) + contest.save() + else: + model = form.save() + + # Create the SubmissionSource object + source = SubmissionSource(submission=model, source=form.cleaned_data['source']) + source.save() + profile.update_contest() + + # Save a query + model.source = source + model.judge(rejudge=False) + + return HttpResponseRedirect(reverse('submission_status', args=[str(model.id)])) + else: + form_data = form.cleaned_data + if submission is not None: + sub = get_object_or_404(Submission, id=int(submission)) + + if 'problem' not in form_data: + return HttpResponseBadRequest() + else: + initial = {'language': profile.language} + if problem is not None: + initial['problem'] = get_object_or_404(Problem, code=problem) + problem_object = initial['problem'] + if not problem_object.is_accessible_by(request.user): + raise Http404() + if submission is not None: + try: + sub = get_object_or_404(Submission.objects.select_related('source', 'language'), id=int(submission)) + initial['source'] = sub.source.source + initial['language'] = sub.language + except ValueError: + raise Http404() + form = ProblemSubmitForm(initial=initial) + form_data = initial + if 'problem' in form_data: + form.fields['language'].queryset = ( + form_data['problem'].usable_languages.order_by('name', 'key') + .prefetch_related(Prefetch('runtimeversion_set', RuntimeVersion.objects.order_by('priority'))) + ) + problem_object = form_data['problem'] + if 'language' in form_data: + form.fields['source'].widget.mode = form_data['language'].ace + form.fields['source'].widget.theme = profile.ace_theme + + if submission is not None: + default_lang = sub.language + else: + default_lang = request.profile.language + + submission_limit = submissions_left = None + if profile.current_contest is not None: + try: + submission_limit = problem_object.contests.get(contest=profile.current_contest.contest).max_submissions + except ContestProblem.DoesNotExist: + pass + else: + if submission_limit: + submissions_left = submission_limit - get_contest_submission_count(problem, profile, + profile.current_contest.virtual) + return render(request, 'problem/submit.html', { + 'form': form, + 'title': _('Submit to %(problem)s') % { + 'problem': problem_object.translated_name(request.LANGUAGE_CODE), + }, + 'content_title': mark_safe(escape(_('Submit to %(problem)s')) % { + 'problem': format_html('{1}', + reverse('problem_detail', args=[problem_object.code]), + problem_object.translated_name(request.LANGUAGE_CODE)), + }), + 'langs': Language.objects.all(), + 'no_judges': not form.fields['language'].queryset, + 'submission_limit': submission_limit, + 'submissions_left': submissions_left, + 'ACE_URL': settings.ACE_URL, + + 'default_lang': default_lang, + }) + + +class ProblemClone(ProblemMixin, PermissionRequiredMixin, TitleMixin, SingleObjectFormView): + title = _('Clone Problem') + template_name = 'problem/clone.html' + form_class = ProblemCloneForm + permission_required = 'judge.clone_problem' + + def form_valid(self, form): + problem = self.object + + languages = problem.allowed_languages.all() + language_limits = problem.language_limits.all() + types = problem.types.all() + problem.pk = None + problem.is_public = False + problem.ac_rate = 0 + problem.user_count = 0 + problem.code = form.cleaned_data['code'] + problem.save() + problem.authors.add(self.request.profile) + problem.allowed_languages.set(languages) + problem.language_limits.set(language_limits) + problem.types.set(types) + + return HttpResponseRedirect(reverse('admin:judge_problem_change', args=(problem.id,))) diff --git a/judge/views/problem_data.py b/judge/views/problem_data.py new file mode 100644 index 0000000..0223170 --- /dev/null +++ b/judge/views/problem_data.py @@ -0,0 +1,241 @@ +import json +import mimetypes +import os +from itertools import chain +from zipfile import BadZipfile, ZipFile + +from django.conf import settings +from django.contrib.auth.decorators import login_required +from django.contrib.auth.mixins import LoginRequiredMixin +from django.core.exceptions import ValidationError +from django.forms import BaseModelFormSet, HiddenInput, ModelForm, NumberInput, Select, formset_factory +from django.http import Http404, HttpResponse, HttpResponseRedirect +from django.shortcuts import get_object_or_404, render +from django.urls import reverse +from django.utils.html import escape, format_html +from django.utils.safestring import mark_safe +from django.utils.translation import gettext as _ +from django.views.generic import DetailView + +from judge.highlight_code import highlight_code +from judge.models import Problem, ProblemData, ProblemTestCase, Submission, problem_data_storage +from judge.utils.problem_data import ProblemDataCompiler +from judge.utils.unicode import utf8text +from judge.utils.views import TitleMixin +from judge.views.problem import ProblemMixin + +mimetypes.init() +mimetypes.add_type('application/x-yaml', '.yml') + + +def checker_args_cleaner(self): + data = self.cleaned_data['checker_args'] + if not data or data.isspace(): + return '' + try: + if not isinstance(json.loads(data), dict): + raise ValidationError(_('Checker arguments must be a JSON object')) + except ValueError: + raise ValidationError(_('Checker arguments is invalid JSON')) + return data + + +class ProblemDataForm(ModelForm): + def clean_zipfile(self): + if hasattr(self, 'zip_valid') and not self.zip_valid: + raise ValidationError(_('Your zip file is invalid!')) + return self.cleaned_data['zipfile'] + + clean_checker_args = checker_args_cleaner + + class Meta: + model = ProblemData + fields = ['zipfile', 'generator', 'output_limit', 'output_prefix', 'checker', 'checker_args'] + widgets = { + 'checker_args': HiddenInput, + } + + +class ProblemCaseForm(ModelForm): + clean_checker_args = checker_args_cleaner + + class Meta: + model = ProblemTestCase + fields = ('order', 'type', 'input_file', 'output_file', 'points', + 'is_pretest', 'output_limit', 'output_prefix', 'checker', 'checker_args', 'generator_args') + widgets = { + 'generator_args': HiddenInput, + 'type': Select(attrs={'style': 'width: 100%'}), + 'points': NumberInput(attrs={'style': 'width: 4em'}), + 'output_prefix': NumberInput(attrs={'style': 'width: 4.5em'}), + 'output_limit': NumberInput(attrs={'style': 'width: 6em'}), + 'checker_args': HiddenInput, + } + + +class ProblemCaseFormSet(formset_factory(ProblemCaseForm, formset=BaseModelFormSet, extra=1, max_num=1, + can_delete=True)): + model = ProblemTestCase + + def __init__(self, *args, **kwargs): + self.valid_files = kwargs.pop('valid_files', None) + super(ProblemCaseFormSet, self).__init__(*args, **kwargs) + + def _construct_form(self, i, **kwargs): + form = super(ProblemCaseFormSet, self)._construct_form(i, **kwargs) + form.valid_files = self.valid_files + return form + + +class ProblemManagerMixin(LoginRequiredMixin, ProblemMixin, DetailView): + def get_object(self, queryset=None): + problem = super(ProblemManagerMixin, self).get_object(queryset) + if problem.is_manually_managed: + raise Http404() + if self.request.user.is_superuser or problem.is_editable_by(self.request.user): + return problem + raise Http404() + + +class ProblemSubmissionDiff(TitleMixin, ProblemMixin, DetailView): + template_name = 'problem/submission-diff.html' + + def get_title(self): + return _('Comparing submissions for {0}').format(self.object.name) + + def get_content_title(self): + return format_html(_('Comparing submissions for {0}'), self.object.name, + reverse('problem_detail', args=[self.object.code])) + + def get_object(self, queryset=None): + problem = super(ProblemSubmissionDiff, self).get_object(queryset) + if self.request.user.is_superuser or problem.is_editable_by(self.request.user): + return problem + raise Http404() + + def get_context_data(self, **kwargs): + context = super(ProblemSubmissionDiff, self).get_context_data(**kwargs) + try: + ids = self.request.GET.getlist('id') + subs = Submission.objects.filter(id__in=ids) + except ValueError: + raise Http404 + if not subs: + raise Http404 + + context['submissions'] = subs + + # If we have associated data we can do better than just guess + data = ProblemTestCase.objects.filter(dataset=self.object, type='C') + if data: + num_cases = data.count() + else: + num_cases = subs.first().test_cases.count() + context['num_cases'] = num_cases + return context + + +class ProblemDataView(TitleMixin, ProblemManagerMixin): + template_name = 'problem/data.html' + + def get_title(self): + return _('Editing data for {0}').format(self.object.name) + + def get_content_title(self): + return mark_safe(escape(_('Editing data for %s')) % ( + format_html('{0}', self.object.name, + reverse('problem_detail', args=[self.object.code])))) + + def get_data_form(self, post=False): + return ProblemDataForm(data=self.request.POST if post else None, prefix='problem-data', + files=self.request.FILES if post else None, + instance=ProblemData.objects.get_or_create(problem=self.object)[0]) + + def get_case_formset(self, files, post=False): + return ProblemCaseFormSet(data=self.request.POST if post else None, prefix='cases', valid_files=files, + queryset=ProblemTestCase.objects.filter(dataset_id=self.object.pk).order_by('order')) + + def get_valid_files(self, data, post=False): + try: + if post and 'problem-data-zipfile-clear' in self.request.POST: + return [] + elif post and 'problem-data-zipfile' in self.request.FILES: + return ZipFile(self.request.FILES['problem-data-zipfile']).namelist() + elif data.zipfile: + return ZipFile(data.zipfile.path).namelist() + except BadZipfile: + return [] + return [] + + def get_context_data(self, **kwargs): + context = super(ProblemDataView, self).get_context_data(**kwargs) + if 'data_form' not in context: + context['data_form'] = self.get_data_form() + valid_files = context['valid_files'] = self.get_valid_files(context['data_form'].instance) + context['data_form'].zip_valid = valid_files is not False + context['cases_formset'] = self.get_case_formset(valid_files) + context['valid_files_json'] = mark_safe(json.dumps(context['valid_files'])) + context['valid_files'] = set(context['valid_files']) + context['all_case_forms'] = chain(context['cases_formset'], [context['cases_formset'].empty_form]) + return context + + def post(self, request, *args, **kwargs): + self.object = problem = self.get_object() + data_form = self.get_data_form(post=True) + valid_files = self.get_valid_files(data_form.instance, post=True) + data_form.zip_valid = valid_files is not False + cases_formset = self.get_case_formset(valid_files, post=True) + if data_form.is_valid() and cases_formset.is_valid(): + data = data_form.save() + for case in cases_formset.save(commit=False): + case.dataset_id = problem.id + case.save() + for case in cases_formset.deleted_objects: + case.delete() + ProblemDataCompiler.generate(problem, data, problem.cases.order_by('order'), valid_files) + return HttpResponseRedirect(request.get_full_path()) + return self.render_to_response(self.get_context_data(data_form=data_form, cases_formset=cases_formset, + valid_files=valid_files)) + + put = post + + +@login_required +def problem_data_file(request, problem, path): + object = get_object_or_404(Problem, code=problem) + if not object.is_editable_by(request.user): + raise Http404() + + response = HttpResponse() + if hasattr(settings, 'DMOJ_PROBLEM_DATA_INTERNAL') and request.META.get('SERVER_SOFTWARE', '').startswith('nginx/'): + response['X-Accel-Redirect'] = '%s/%s/%s' % (settings.DMOJ_PROBLEM_DATA_INTERNAL, problem, path) + else: + try: + with problem_data_storage.open(os.path.join(problem, path), 'rb') as f: + response.content = f.read() + except IOError: + raise Http404() + + response['Content-Type'] = 'application/octet-stream' + return response + + +@login_required +def problem_init_view(request, problem): + problem = get_object_or_404(Problem, code=problem) + if not request.user.is_superuser and not problem.is_editable_by(request.user): + raise Http404() + + try: + with problem_data_storage.open(os.path.join(problem.code, 'init.yml'), 'rb') as f: + data = utf8text(f.read()).rstrip('\n') + except IOError: + raise Http404() + + return render(request, 'problem/yaml.html', { + 'raw_source': data, 'highlighted_source': highlight_code(data, 'yaml'), + 'title': _('Generated init.yml for %s') % problem.name, + 'content_title': mark_safe(escape(_('Generated init.yml for %s')) % ( + format_html('{0}', problem.name, + reverse('problem_detail', args=[problem.code])))), + }) diff --git a/judge/views/problem_manage.py b/judge/views/problem_manage.py new file mode 100644 index 0000000..0fe8b1a --- /dev/null +++ b/judge/views/problem_manage.py @@ -0,0 +1,130 @@ +from operator import itemgetter + +from celery.result import AsyncResult +from django.contrib import messages +from django.contrib.auth.mixins import PermissionRequiredMixin +from django.http import Http404, HttpResponse, HttpResponseBadRequest, HttpResponseRedirect +from django.urls import reverse +from django.utils.html import escape, format_html +from django.utils.safestring import mark_safe +from django.utils.translation import gettext as _, ngettext +from django.views.generic import DetailView +from django.views.generic.detail import BaseDetailView + +from judge.models import Language, Submission +from judge.tasks import apply_submission_filter, rejudge_problem_filter, rescore_problem +from judge.utils.celery import redirect_to_task_status +from judge.utils.views import TitleMixin +from judge.views.problem import ProblemMixin + + +class ManageProblemSubmissionMixin(ProblemMixin): + def get_object(self, queryset=None): + problem = super().get_object(queryset) + user = self.request.user + if not problem.is_subs_manageable_by(user): + raise Http404() + return problem + + +class ManageProblemSubmissionActionMixin(ManageProblemSubmissionMixin): + def perform_action(self): + raise NotImplementedError() + + def get(self, request, *args, **kwargs): + raise Http404() + + def post(self, request, *args, **kwargs): + try: + self.object = self.get_object() + except Http404: + return self.no_such_problem() + else: + return self.perform_action() + + +class ManageProblemSubmissionView(TitleMixin, ManageProblemSubmissionMixin, DetailView): + template_name = 'problem/manage_submission.html' + + def get_title(self): + return _('Managing submissions for %s') % (self.object.name,) + + def get_content_title(self): + return mark_safe(escape(_('Managing submissions for %s')) % ( + format_html('{0}', self.object.name, + reverse('problem_detail', args=[self.object.code])))) + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context['submission_count'] = self.object.submission_set.count() + context['languages'] = [(lang_id, short_name or key) for lang_id, key, short_name in + Language.objects.values_list('id', 'key', 'short_name')] + context['results'] = sorted(map(itemgetter(0), Submission.RESULT)) + return context + + +class BaseRejudgeSubmissionsView(PermissionRequiredMixin, ManageProblemSubmissionActionMixin, BaseDetailView): + permission_required = 'judge.rejudge_submission_lot' + + def perform_action(self): + if self.request.POST.get('use_range', 'off') == 'on': + try: + start = int(self.request.POST.get('start')) + end = int(self.request.POST.get('end')) + except (KeyError, ValueError): + return HttpResponseBadRequest() + id_range = (start, end) + else: + id_range = None + + try: + languages = list(map(int, self.request.POST.getlist('language'))) + except ValueError: + return HttpResponseBadRequest() + + return self.generate_response(id_range, languages, self.request.POST.getlist('result')) + + def generate_response(self, id_range, languages, results): + raise NotImplementedError() + + +class RejudgeSubmissionsView(BaseRejudgeSubmissionsView): + def generate_response(self, id_range, languages, results): + status = rejudge_problem_filter.delay(self.object.id, id_range, languages, results) + return redirect_to_task_status( + status, message=_('Rejudging selected submissions for %s...') % (self.object.name,), + redirect=reverse('problem_submissions_rejudge_success', args=[self.object.code, status.id]), + ) + + +class PreviewRejudgeSubmissionsView(BaseRejudgeSubmissionsView): + def generate_response(self, id_range, languages, results): + queryset = apply_submission_filter(self.object.submission_set.all(), id_range, languages, results) + return HttpResponse(str(queryset.count())) + + +class RescoreAllSubmissionsView(ManageProblemSubmissionActionMixin, BaseDetailView): + def perform_action(self): + status = rescore_problem.delay(self.object.id) + return redirect_to_task_status( + status, message=_('Rescoring all submissions for %s...') % (self.object.name,), + redirect=reverse('problem_submissions_rescore_success', args=[self.object.code, status.id]), + ) + + +def rejudge_success(request, problem, task_id): + count = AsyncResult(task_id).result + if not isinstance(count, int): + raise Http404() + messages.success(request, ngettext('Successfully scheduled %d submission for rejudging.', + 'Successfully scheduled %d submissions for rejudging.', count) % (count,)) + return HttpResponseRedirect(reverse('problem_manage_submissions', args=[problem])) + + +def rescore_success(request, problem, task_id): + count = AsyncResult(task_id).result + if not isinstance(count, int): + raise Http404() + messages.success(request, ngettext('%d submission were successfully rescored.', + '%d submissions were successfully rescored.', count) % (count,)) + return HttpResponseRedirect(reverse('problem_manage_submissions', args=[problem])) diff --git a/judge/views/ranked_submission.py b/judge/views/ranked_submission.py new file mode 100644 index 0000000..f368d41 --- /dev/null +++ b/judge/views/ranked_submission.py @@ -0,0 +1,89 @@ +from django.urls import reverse +from django.utils.html import format_html +from django.utils.translation import gettext as _ + +from judge.models import Submission +from judge.utils.problems import get_result_data +from judge.utils.raw_sql import join_sql_subquery +from judge.views.submission import ForceContestMixin, ProblemSubmissions + +__all__ = ['RankedSubmissions', 'ContestRankedSubmission'] + + +class RankedSubmissions(ProblemSubmissions): + tab = 'best_submissions_list' + dynamic_update = False + + def get_queryset(self): + if self.in_contest: + contest_join = '''INNER JOIN judge_contestsubmission AS cs ON (sub.id = cs.submission_id) + INNER JOIN judge_contestparticipation AS cp ON (cs.participation_id = cp.id)''' + points = 'cs.points' + constraint = 'AND cp.contest_id = %s' + else: + contest_join = '' + points = 'sub.points' + constraint = '' + queryset = super(RankedSubmissions, self).get_queryset().filter(user__is_unlisted=False) + join_sql_subquery( + queryset, + subquery=''' + SELECT sub.id AS id + FROM ( + SELECT sub.user_id AS uid, MAX(sub.points) AS points + FROM judge_submission AS sub {contest_join} + WHERE sub.problem_id = %s AND {points} > 0 {constraint} + GROUP BY sub.user_id + ) AS highscore STRAIGHT_JOIN ( + SELECT sub.user_id AS uid, sub.points, MIN(sub.time) as time + FROM judge_submission AS sub {contest_join} + WHERE sub.problem_id = %s AND {points} > 0 {constraint} + GROUP BY sub.user_id, {points} + ) AS fastest ON (highscore.uid = fastest.uid AND highscore.points = fastest.points) + STRAIGHT_JOIN judge_submission AS sub + ON (sub.user_id = fastest.uid AND sub.time = fastest.time) {contest_join} + WHERE sub.problem_id = %s AND {points} > 0 {constraint} + GROUP BY sub.user_id + '''.format(points=points, contest_join=contest_join, constraint=constraint), + params=[self.problem.id, self.contest.id] * 3 if self.in_contest else [self.problem.id] * 3, + alias='best_subs', join_fields=[('id', 'id')], + ) + + if self.in_contest: + return queryset.order_by('-contest__points', 'time') + else: + return queryset.order_by('-points', 'time') + + def get_title(self): + return _('Best solutions for %s') % self.problem_name + + def get_content_title(self): + return format_html(_('Best solutions for {0}'), self.problem_name, + reverse('problem_detail', args=[self.problem.code])) + + def _get_result_data(self): + return get_result_data(super(RankedSubmissions, self).get_queryset().order_by()) + + +class ContestRankedSubmission(ForceContestMixin, RankedSubmissions): + def get_title(self): + if self.problem.is_accessible_by(self.request.user): + return _('Best solutions for %(problem)s in %(contest)s') % { + 'problem': self.problem_name, 'contest': self.contest.name, + } + return _('Best solutions for problem %(number)s in %(contest)s') % { + 'number': self.get_problem_number(self.problem), 'contest': self.contest.name, + } + + def get_content_title(self): + if self.problem.is_accessible_by(self.request.user): + return format_html(_('Best solutions for {0} in {2}'), + self.problem_name, reverse('problem_detail', args=[self.problem.code]), + self.contest.name, reverse('contest_view', args=[self.contest.key])) + return format_html(_('Best solutions for problem {0} in {1}'), + self.get_problem_number(self.problem), self.contest.name, + reverse('contest_view', args=[self.contest.key])) + + def _get_result_data(self): + return get_result_data(Submission.objects.filter( + problem_id=self.problem.id, contest__participation__contest_id=self.contest.id)) diff --git a/judge/views/register.py b/judge/views/register.py new file mode 100644 index 0000000..67c1c4f --- /dev/null +++ b/judge/views/register.py @@ -0,0 +1,108 @@ +# coding=utf-8 +import re + +from django import forms +from django.conf import settings +from django.contrib.auth.models import User +from django.contrib.auth.password_validation import get_default_password_validators +from django.forms import ChoiceField, ModelChoiceField +from django.shortcuts import render +from django.utils.translation import gettext, gettext_lazy as _ +from registration.backends.default.views import (ActivationView as OldActivationView, + RegistrationView as OldRegistrationView) +from registration.forms import RegistrationForm +from sortedm2m.forms import SortedMultipleChoiceField + +from judge.models import Language, Organization, Profile, TIMEZONE +from judge.utils.recaptcha import ReCaptchaField, ReCaptchaWidget +from judge.utils.subscription import Subscription, newsletter_id +from judge.widgets import Select2MultipleWidget, Select2Widget + +valid_id = re.compile(r'^\w+$') +bad_mail_regex = list(map(re.compile, settings.BAD_MAIL_PROVIDER_REGEX)) + + +class CustomRegistrationForm(RegistrationForm): + username = forms.RegexField(regex=r'^\w+$', max_length=30, label=_('Username'), + error_messages={'invalid': _('A username must contain letters, ' + 'numbers, or underscores')}) + timezone = ChoiceField(label=_('Timezone'), choices=TIMEZONE, + widget=Select2Widget(attrs={'style': 'width:100%'})) + language = ModelChoiceField(queryset=Language.objects.all(), label=_('Preferred language'), empty_label=None, + widget=Select2Widget(attrs={'style': 'width:100%'})) + organizations = SortedMultipleChoiceField(queryset=Organization.objects.filter(is_open=True), + label=_('Organizations'), required=False, + widget=Select2MultipleWidget(attrs={'style': 'width:100%'})) + + if newsletter_id is not None: + newsletter = forms.BooleanField(label=_('Subscribe to newsletter?'), initial=True, required=False) + + if ReCaptchaField is not None: + captcha = ReCaptchaField(widget=ReCaptchaWidget()) + + def clean_email(self): + if User.objects.filter(email=self.cleaned_data['email']).exists(): + raise forms.ValidationError(gettext('The email address "%s" is already taken. Only one registration ' + 'is allowed per address.') % self.cleaned_data['email']) + if '@' in self.cleaned_data['email']: + domain = self.cleaned_data['email'].split('@')[-1].lower() + if (domain in settings.BAD_MAIL_PROVIDERS or + any(regex.match(domain) for regex in bad_mail_regex)): + raise forms.ValidationError(gettext('Your email provider is not allowed due to history of abuse. ' + 'Please use a reputable email provider.')) + return self.cleaned_data['email'] + + +class RegistrationView(OldRegistrationView): + title = _('Registration') + form_class = CustomRegistrationForm + template_name = 'registration/registration_form.html' + + def get_context_data(self, **kwargs): + if 'title' not in kwargs: + kwargs['title'] = self.title + tzmap = settings.TIMEZONE_MAP + kwargs['TIMEZONE_MAP'] = tzmap or 'http://momentjs.com/static/img/world.png' + kwargs['TIMEZONE_BG'] = settings.TIMEZONE_BG if tzmap else '#4E7CAD' + kwargs['password_validators'] = get_default_password_validators() + kwargs['tos_url'] = settings.TERMS_OF_SERVICE_URL + return super(RegistrationView, self).get_context_data(**kwargs) + + def register(self, form): + user = super(RegistrationView, self).register(form) + profile, _ = Profile.objects.get_or_create(user=user, defaults={ + 'language': Language.get_python3(), + }) + + cleaned_data = form.cleaned_data + profile.timezone = cleaned_data['timezone'] + profile.language = cleaned_data['language'] + profile.organizations.add(*cleaned_data['organizations']) + profile.save() + + if newsletter_id is not None and cleaned_data['newsletter']: + Subscription(user=user, newsletter_id=newsletter_id, subscribed=True).save() + return user + + def get_initial(self, *args, **kwargs): + initial = super(RegistrationView, self).get_initial(*args, **kwargs) + initial['timezone'] = settings.DEFAULT_USER_TIME_ZONE + initial['language'] = Language.objects.get(key=settings.DEFAULT_USER_LANGUAGE) + return initial + + +class ActivationView(OldActivationView): + title = _('Registration') + template_name = 'registration/activate.html' + + def get_context_data(self, **kwargs): + if 'title' not in kwargs: + kwargs['title'] = self.title + return super(ActivationView, self).get_context_data(**kwargs) + + +def social_auth_error(request): + return render(request, 'generic-message.html', { + 'title': gettext('Authentication failure'), + 'message': request.GET.get('message'), + }) diff --git a/judge/views/select2.py b/judge/views/select2.py new file mode 100644 index 0000000..b58b36b --- /dev/null +++ b/judge/views/select2.py @@ -0,0 +1,138 @@ +from django.db.models import F, Q +from django.http import Http404, JsonResponse +from django.shortcuts import get_object_or_404 +from django.utils.encoding import smart_text +from django.views.generic.list import BaseListView + +from judge.jinja2.gravatar import gravatar +from judge.models import Comment, Contest, Organization, Problem, Profile + + +def _get_user_queryset(term): + qs = Profile.objects + if term.endswith(' '): + qs = qs.filter(user__username=term.strip()) + else: + qs = qs.filter(user__username__icontains=term) + return qs + + +class Select2View(BaseListView): + paginate_by = 20 + + def get(self, request, *args, **kwargs): + self.request = request + self.term = kwargs.get('term', request.GET.get('term', '')) + self.object_list = self.get_queryset() + context = self.get_context_data() + + return JsonResponse({ + 'results': [ + { + 'text': smart_text(self.get_name(obj)), + 'id': obj.pk, + } for obj in context['object_list']], + 'more': context['page_obj'].has_next(), + }) + + def get_name(self, obj): + return str(obj) + + +class UserSelect2View(Select2View): + def get_queryset(self): + return _get_user_queryset(self.term).annotate(username=F('user__username')).only('id') + + def get_name(self, obj): + return obj.username + + +class OrganizationSelect2View(Select2View): + def get_queryset(self): + return Organization.objects.filter(name__icontains=self.term) + + +class ProblemSelect2View(Select2View): + def get_queryset(self): + queryset = Problem.objects.filter(Q(code__icontains=self.term) | Q(name__icontains=self.term)) + if not self.request.user.has_perm('judge.see_private_problem'): + filter = Q(is_public=True) + if self.request.user.is_authenticated: + filter |= Q(authors=self.request.profile) | Q(curators=self.request.profile) + queryset = queryset.filter(filter).distinct() + return queryset.distinct() + + +class ContestSelect2View(Select2View): + def get_queryset(self): + queryset = Contest.objects.filter(Q(key__icontains=self.term) | Q(name__icontains=self.term)) + if not self.request.user.has_perm('judge.see_private_contest'): + queryset = queryset.filter(is_visible=True) + if not self.request.user.has_perm('judge.edit_all_contest'): + q = Q(is_private=False, is_organization_private=False) + if self.request.user.is_authenticated: + q |= Q(is_organization_private=True, + organizations__in=self.request.profile.organizations.all()) + q |= Q(is_private=True, private_contestants=self.request.profile) + queryset = queryset.filter(q) + return queryset + + +class CommentSelect2View(Select2View): + def get_queryset(self): + return Comment.objects.filter(page__icontains=self.term) + + +class UserSearchSelect2View(BaseListView): + paginate_by = 20 + + def get_queryset(self): + return _get_user_queryset(self.term) + + def get(self, request, *args, **kwargs): + self.request = request + self.kwargs = kwargs + self.term = kwargs.get('term', request.GET.get('term', '')) + self.gravatar_size = request.GET.get('gravatar_size', 128) + self.gravatar_default = request.GET.get('gravatar_default', None) + + self.object_list = self.get_queryset().values_list('pk', 'user__username', 'user__email', 'display_rank') + + context = self.get_context_data() + + return JsonResponse({ + 'results': [ + { + 'text': username, + 'id': username, + 'gravatar_url': gravatar(email, self.gravatar_size, self.gravatar_default), + 'display_rank': display_rank, + } for pk, username, email, display_rank in context['object_list']], + 'more': context['page_obj'].has_next(), + }) + + def get_name(self, obj): + return str(obj) + + +class ContestUserSearchSelect2View(UserSearchSelect2View): + def get_queryset(self): + contest = get_object_or_404(Contest, key=self.kwargs['contest']) + if not contest.can_see_scoreboard(self.request.user) or \ + contest.hide_scoreboard and contest.is_in_contest(self.request.user): + raise Http404() + + return Profile.objects.filter(contest_history__contest=contest, + user__username__icontains=self.term).distinct() + + +class TicketUserSelect2View(UserSearchSelect2View): + def get_queryset(self): + return Profile.objects.filter(tickets__isnull=False, + user__username__icontains=self.term).distinct() + + +class AssigneeSelect2View(UserSearchSelect2View): + def get_queryset(self): + return Profile.objects.filter(assigned_tickets__isnull=False, + user__username__icontains=self.term).distinct() diff --git a/judge/views/stats.py b/judge/views/stats.py new file mode 100644 index 0000000..41a852b --- /dev/null +++ b/judge/views/stats.py @@ -0,0 +1,68 @@ +from itertools import chain, repeat +from operator import itemgetter + +from django.conf import settings +from django.db.models import Case, Count, FloatField, IntegerField, Value, When +from django.db.models.expressions import CombinedExpression +from django.http import JsonResponse +from django.shortcuts import render +from django.utils.translation import gettext as _ + +from judge.models import Language, Submission +from judge.utils.stats import chart_colors, get_bar_chart, get_pie_chart, highlight_colors + + +ac_count = Count(Case(When(submission__result='AC', then=Value(1)), output_field=IntegerField())) + + +def repeat_chain(iterable): + return chain.from_iterable(repeat(iterable)) + + +def language_data(request, language_count=Language.objects.annotate(count=Count('submission'))): + languages = language_count.filter(count__gt=0).values('key', 'name', 'count').order_by('-count') + num_languages = min(len(languages), settings.DMOJ_STATS_LANGUAGE_THRESHOLD) + other_count = sum(map(itemgetter('count'), languages[num_languages:])) + + return JsonResponse({ + 'labels': list(map(itemgetter('name'), languages[:num_languages])) + ['Other'], + 'datasets': [ + { + 'backgroundColor': chart_colors[:num_languages] + ['#FDB45C'], + 'highlightBackgroundColor': highlight_colors[:num_languages] + ['#FFC870'], + 'data': list(map(itemgetter('count'), languages[:num_languages])) + [other_count], + }, + ], + }, safe=False) + + +def ac_language_data(request): + return language_data(request, Language.objects.annotate(count=ac_count)) + + +def status_data(request, statuses=None): + if not statuses: + statuses = (Submission.objects.values('result').annotate(count=Count('result')) + .values('result', 'count').order_by('-count')) + data = [] + for status in statuses: + res = status['result'] + if not res: + continue + count = status['count'] + data.append((str(Submission.USER_DISPLAY_CODES[res]), count)) + + return JsonResponse(get_pie_chart(data), safe=False) + + +def ac_rate(request): + rate = CombinedExpression(ac_count / Count('submission'), '*', Value(100.0), output_field=FloatField()) + data = Language.objects.annotate(total=Count('submission'), ac_rate=rate).filter(total__gt=0) \ + .order_by('total').values_list('name', 'ac_rate') + return JsonResponse(get_bar_chart(list(data))) + + +def language(request): + return render(request, 'stats/language.html', { + 'title': _('Language statistics'), 'tab': 'language', + }) diff --git a/judge/views/status.py b/judge/views/status.py new file mode 100644 index 0000000..a7f0b26 --- /dev/null +++ b/judge/views/status.py @@ -0,0 +1,111 @@ +from collections import defaultdict +from functools import partial + +from django.shortcuts import render +from django.utils import six +from django.utils.translation import gettext as _ +from packaging import version + +from judge.models import Judge, Language, RuntimeVersion + +__all__ = ['status_all', 'status_table'] + + +def get_judges(request): + if request.user.is_superuser or request.user.is_staff: + return True, Judge.objects.order_by('-online', 'name') + else: + return False, Judge.objects.filter(online=True) + + +def status_all(request): + see_all, judges = get_judges(request) + return render(request, 'status/judge-status.html', { + 'title': _('Status'), + 'judges': judges, + 'see_all_judges': see_all, + }) + + +def status_table(request): + see_all, judges = get_judges(request) + return render(request, 'status/judge-status-table.html', { + 'judges': judges, + 'see_all_judges': see_all, + }) + + +class LatestList(list): + __slots__ = ('versions', 'is_latest') + + +def compare_version_list(x, y): + if sorted(x.keys()) != sorted(y.keys()): + return False + for k in x.keys(): + if len(x[k]) != len(y[k]): + return False + for a, b in zip(x[k], y[k]): + if a.name != b.name: + return False + if a.version != b.version: + return False + return True + + +def version_matrix(request): + matrix = defaultdict(partial(defaultdict, LatestList)) + latest = defaultdict(list) + groups = defaultdict(list) + + judges = {judge.id: judge.name for judge in Judge.objects.filter(online=True)} + languages = Language.objects.filter(judges__online=True).distinct() + + for runtime in RuntimeVersion.objects.filter(judge__online=True).order_by('priority'): + matrix[runtime.judge_id][runtime.language_id].append(runtime) + + for judge, data in six.iteritems(matrix): + name_tuple = judges[judge].rpartition('.') + groups[name_tuple[0] or name_tuple[-1]].append((judges[judge], data)) + + matrix = {} + for group, data in six.iteritems(groups): + if len(data) == 1: + judge, data = data[0] + matrix[judge] = data + continue + + ds = list(range(len(data))) + size = [1] * len(data) + for i, (p, x) in enumerate(data): + if ds[i] != i: + continue + for j, (q, y) in enumerate(data): + if i != j and compare_version_list(x, y): + ds[j] = i + size[i] += 1 + size[j] = 0 + + rep = max(range(len(data)), key=size.__getitem__) + matrix[group] = data[rep][1] + for i, (j, x) in enumerate(data): + if ds[i] != rep: + matrix[j] = x + + for data in six.itervalues(matrix): + for language, versions in six.iteritems(data): + versions.versions = [version.parse(runtime.version) for runtime in versions] + if versions.versions > latest[language]: + latest[language] = versions.versions + + for data in six.itervalues(matrix): + for language, versions in six.iteritems(data): + versions.is_latest = versions.versions == latest[language] + + languages = sorted(languages, key=lambda lang: version.parse(lang.name)) + return render(request, 'status/versions.html', { + 'title': _('Version matrix'), + 'judges': sorted(matrix.keys()), + 'languages': languages, + 'matrix': matrix, + }) diff --git a/judge/views/submission.py b/judge/views/submission.py new file mode 100644 index 0000000..bb496e6 --- /dev/null +++ b/judge/views/submission.py @@ -0,0 +1,525 @@ +import json +from operator import attrgetter + +from django.conf import settings +from django.contrib.auth.mixins import LoginRequiredMixin +from django.core.cache import cache +from django.core.exceptions import ImproperlyConfigured, ObjectDoesNotExist, PermissionDenied +from django.db.models import Prefetch, Q +from django.http import Http404, HttpResponse, HttpResponseBadRequest, HttpResponseRedirect, JsonResponse +from django.shortcuts import get_object_or_404, render +from django.urls import reverse +from django.utils import timezone +from django.utils.functional import cached_property +from django.utils.html import escape, format_html +from django.utils.safestring import mark_safe +from django.utils.translation import gettext as _, gettext_lazy +from django.views.decorators.http import require_POST +from django.views.generic import DetailView, ListView + +from judge import event_poster as event +from judge.highlight_code import highlight_code +from judge.models import Contest, Language, Problem, ProblemTranslation, Profile, Submission +from judge.utils.problems import get_result_data, user_authored_ids, user_completed_ids, user_editable_ids +from judge.utils.raw_sql import use_straight_join +from judge.utils.views import DiggPaginatorMixin, TitleMixin + + +def submission_related(queryset): + return queryset.select_related('user__user', 'problem', 'language') \ + .only('id', 'user__user__username', 'user__display_rank', 'user__rating', 'problem__name', + 'problem__code', 'problem__is_public', 'language__short_name', 'language__key', 'date', 'time', 'memory', + 'points', 'result', 'status', 'case_points', 'case_total', 'current_testcase', 'contest_object') + + +class SubmissionMixin(object): + model = Submission + context_object_name = 'submission' + pk_url_kwarg = 'submission' + + +class SubmissionDetailBase(LoginRequiredMixin, TitleMixin, SubmissionMixin, DetailView): + def get_object(self, queryset=None): + submission = super(SubmissionDetailBase, self).get_object(queryset) + profile = self.request.profile + problem = submission.problem + if self.request.user.has_perm('judge.view_all_submission'): + return submission + if submission.user_id == profile.id: + return submission + if problem.is_editor(profile): + return submission + if problem.is_public or problem.testers.filter(id=profile.id).exists(): + if Submission.objects.filter(user_id=profile.id, result='AC', problem_id=problem.id, + points=problem.points).exists(): + return submission + raise PermissionDenied() + + def get_title(self): + submission = self.object + return _('Submission of %(problem)s by %(user)s') % { + 'problem': submission.problem.translated_name(self.request.LANGUAGE_CODE), + 'user': submission.user.user.username, + } + + def get_content_title(self): + submission = self.object + return mark_safe(escape(_('Submission of %(problem)s by %(user)s')) % { + 'problem': format_html('{1}', + reverse('problem_detail', args=[submission.problem.code]), + submission.problem.translated_name(self.request.LANGUAGE_CODE)), + 'user': format_html('{1}', + reverse('user_page', args=[submission.user.user.username]), + submission.user.user.username), + }) + + +class SubmissionSource(SubmissionDetailBase): + template_name = 'submission/source.html' + + def get_queryset(self): + return super().get_queryset().select_related('source') + + def get_context_data(self, **kwargs): + context = super(SubmissionSource, self).get_context_data(**kwargs) + submission = self.object + context['raw_source'] = submission.source.source.rstrip('\n') + context['highlighted_source'] = highlight_code(submission.source.source, submission.language.pygments) + return context + + +def make_batch(batch, cases): + result = {'id': batch, 'cases': cases} + if batch: + result['points'] = min(map(attrgetter('points'), cases)) + result['total'] = max(map(attrgetter('total'), cases)) + return result + + +def group_test_cases(cases): + result = [] + buf = [] + last = None + for case in cases: + if case.batch != last and buf: + result.append(make_batch(last, buf)) + buf = [] + buf.append(case) + last = case.batch + if buf: + result.append(make_batch(last, buf)) + return result + + +class SubmissionStatus(SubmissionDetailBase): + template_name = 'submission/status.html' + + def get_context_data(self, **kwargs): + context = super(SubmissionStatus, self).get_context_data(**kwargs) + submission = self.object + context['last_msg'] = event.last() + context['batches'] = group_test_cases(submission.test_cases.all()) + context['time_limit'] = submission.problem.time_limit + try: + lang_limit = submission.problem.language_limits.get(language=submission.language) + except ObjectDoesNotExist: + pass + else: + context['time_limit'] = lang_limit.time_limit + return context + + +class SubmissionTestCaseQuery(SubmissionStatus): + template_name = 'submission/status-testcases.html' + + def get(self, request, *args, **kwargs): + if 'id' not in request.GET or not request.GET['id'].isdigit(): + return HttpResponseBadRequest() + self.kwargs[self.pk_url_kwarg] = kwargs[self.pk_url_kwarg] = int(request.GET['id']) + return super(SubmissionTestCaseQuery, self).get(request, *args, **kwargs) + + +class SubmissionSourceRaw(SubmissionSource): + def get(self, request, *args, **kwargs): + submission = self.get_object() + return HttpResponse(submission.source.source, content_type='text/plain') + + +@require_POST +def abort_submission(request, submission): + submission = get_object_or_404(Submission, id=int(submission)) + if (not request.user.is_authenticated or (submission.was_rejudged or (request.profile != submission.user)) and + not request.user.has_perm('abort_any_submission')): + raise PermissionDenied() + submission.abort() + return HttpResponseRedirect(reverse('submission_status', args=(submission.id,))) + + +class SubmissionsListBase(DiggPaginatorMixin, TitleMixin, ListView): + model = Submission + paginate_by = 50 + show_problem = True + title = gettext_lazy('All submissions') + content_title = gettext_lazy('All submissions') + tab = 'all_submissions_list' + template_name = 'submission/list.html' + context_object_name = 'submissions' + first_page_href = None + + def get_result_data(self): + result = self._get_result_data() + for category in result['categories']: + category['name'] = _(category['name']) + return result + + def _get_result_data(self): + return get_result_data(self.get_queryset().order_by()) + + def access_check(self, request): + pass + + @cached_property + def in_contest(self): + return self.request.user.is_authenticated and self.request.profile.current_contest is not None + + @cached_property + def contest(self): + return self.request.profile.current_contest.contest + + def _get_queryset(self): + queryset = Submission.objects.all() + use_straight_join(queryset) + queryset = submission_related(queryset.order_by('-id')) + if self.show_problem: + queryset = queryset.prefetch_related(Prefetch('problem__translations', + queryset=ProblemTranslation.objects.filter( + language=self.request.LANGUAGE_CODE), to_attr='_trans')) + if self.in_contest: + queryset = queryset.filter(contest__participation__contest_id=self.contest.id) + if self.contest.hide_scoreboard and self.contest.is_in_contest(self.request.user): + queryset = queryset.filter(contest__participation__user=self.request.profile) + else: + queryset = queryset.select_related('contest_object').defer('contest_object__description') + + # This is not technically correct since contest organizers *should* see these, but + # the join would be far too messy + if not self.request.user.has_perm('judge.see_private_contest'): + queryset = queryset.exclude(contest_object_id__in=Contest.objects.filter(hide_scoreboard=True)) + + if self.selected_languages: + queryset = queryset.filter(language_id__in=Language.objects.filter(key__in=self.selected_languages)) + if self.selected_statuses: + queryset = queryset.filter(result__in=self.selected_statuses) + + return queryset + + def get_queryset(self): + queryset = self._get_queryset() + if not self.in_contest: + if not self.request.user.has_perm('judge.see_private_problem'): + queryset = queryset.filter(problem__is_public=True) + if not self.request.user.has_perm('judge.see_organization_problem'): + filter = Q(problem__is_organization_private=False) + if self.request.user.is_authenticated: + filter |= Q(problem__organizations__in=self.request.profile.organizations.all()) + queryset = queryset.filter(filter) + return queryset + + def get_my_submissions_page(self): + return None + + def get_all_submissions_page(self): + return reverse('all_submissions') + + def get_searchable_status_codes(self): + hidden_codes = ['SC'] + if not self.request.user.is_superuser and not self.request.user.is_staff: + hidden_codes += ['IE'] + return [(key, value) for key, value in Submission.RESULT if key not in hidden_codes] + + def get_context_data(self, **kwargs): + context = super(SubmissionsListBase, self).get_context_data(**kwargs) + authenticated = self.request.user.is_authenticated + context['dynamic_update'] = False + context['show_problem'] = self.show_problem + context['completed_problem_ids'] = user_completed_ids(self.request.profile) if authenticated else [] + context['authored_problem_ids'] = user_authored_ids(self.request.profile) if authenticated else [] + context['editable_problem_ids'] = user_editable_ids(self.request.profile) if authenticated else [] + + context['all_languages'] = Language.objects.all().values_list('key', 'name') + context['selected_languages'] = self.selected_languages + + context['all_statuses'] = self.get_searchable_status_codes() + context['selected_statuses'] = self.selected_statuses + + context['results_json'] = mark_safe(json.dumps(self.get_result_data())) + context['results_colors_json'] = mark_safe(json.dumps(settings.DMOJ_STATS_SUBMISSION_RESULT_COLORS)) + + context['page_suffix'] = suffix = ('?' + self.request.GET.urlencode()) if self.request.GET else '' + context['first_page_href'] = (self.first_page_href or '.') + suffix + context['my_submissions_link'] = self.get_my_submissions_page() + context['all_submissions_link'] = self.get_all_submissions_page() + context['tab'] = self.tab + return context + + def get(self, request, *args, **kwargs): + check = self.access_check(request) + if check is not None: + return check + + self.selected_languages = set(request.GET.getlist('language')) + self.selected_statuses = set(request.GET.getlist('status')) + + if 'results' in request.GET: + return JsonResponse(self.get_result_data()) + + return super(SubmissionsListBase, self).get(request, *args, **kwargs) + + +class UserMixin(object): + def get(self, request, *args, **kwargs): + if 'user' not in kwargs: + raise ImproperlyConfigured('Must pass a user') + self.profile = get_object_or_404(Profile, user__username=kwargs['user']) + self.username = kwargs['user'] + return super(UserMixin, self).get(request, *args, **kwargs) + + +class ConditionalUserTabMixin(object): + def get_context_data(self, **kwargs): + context = super(ConditionalUserTabMixin, self).get_context_data(**kwargs) + if self.request.user.is_authenticated and self.request.profile == self.profile: + context['tab'] = 'my_submissions_tab' + else: + context['tab'] = 'user_submissions_tab' + context['tab_username'] = self.profile.user.username + return context + + +class AllUserSubmissions(ConditionalUserTabMixin, UserMixin, SubmissionsListBase): + def get_queryset(self): + return super(AllUserSubmissions, self).get_queryset().filter(user_id=self.profile.id) + + def get_title(self): + if self.request.user.is_authenticated and self.request.profile == self.profile: + return _('All my submissions') + return _('All submissions by %s') % self.username + + def get_content_title(self): + if self.request.user.is_authenticated and self.request.profile == self.profile: + return format_html('All my submissions') + return format_html('All submissions by {0}', self.username, + reverse('user_page', args=[self.username])) + + def get_my_submissions_page(self): + if self.request.user.is_authenticated: + return reverse('all_user_submissions', kwargs={'user': self.request.user.username}) + + def get_context_data(self, **kwargs): + context = super(AllUserSubmissions, self).get_context_data(**kwargs) + context['dynamic_update'] = context['page_obj'].number == 1 + context['dynamic_user_id'] = self.profile.id + context['last_msg'] = event.last() + return context + + +class ProblemSubmissionsBase(SubmissionsListBase): + show_problem = False + dynamic_update = True + check_contest_in_access_check = True + + def get_queryset(self): + if self.in_contest and not self.contest.contest_problems.filter(problem_id=self.problem.id).exists(): + raise Http404() + return super(ProblemSubmissionsBase, self)._get_queryset().filter(problem_id=self.problem.id) + + def get_title(self): + return _('All submissions for %s') % self.problem_name + + def get_content_title(self): + return format_html('All submissions for {0}', self.problem_name, + reverse('problem_detail', args=[self.problem.code])) + + def access_check_contest(self, request): + if self.in_contest and not self.contest.can_see_scoreboard(request.user): + raise Http404() + + def access_check(self, request): + if not self.problem.is_accessible_by(request.user): + raise Http404() + + if self.check_contest_in_access_check: + self.access_check_contest(request) + + def get(self, request, *args, **kwargs): + if 'problem' not in kwargs: + raise ImproperlyConfigured(_('Must pass a problem')) + self.problem = get_object_or_404(Problem, code=kwargs['problem']) + self.problem_name = self.problem.translated_name(self.request.LANGUAGE_CODE) + return super(ProblemSubmissionsBase, self).get(request, *args, **kwargs) + + def get_all_submissions_page(self): + return reverse('chronological_submissions', kwargs={'problem': self.problem.code}) + + def get_context_data(self, **kwargs): + context = super(ProblemSubmissionsBase, self).get_context_data(**kwargs) + if self.dynamic_update: + context['dynamic_update'] = context['page_obj'].number == 1 + context['dynamic_problem_id'] = self.problem.id + context['last_msg'] = event.last() + context['best_submissions_link'] = reverse('ranked_submissions', kwargs={'problem': self.problem.code}) + return context + + +class ProblemSubmissions(ProblemSubmissionsBase): + def get_my_submissions_page(self): + if self.request.user.is_authenticated: + return reverse('user_submissions', kwargs={'problem': self.problem.code, + 'user': self.request.user.username}) + + +class UserProblemSubmissions(ConditionalUserTabMixin, UserMixin, ProblemSubmissions): + check_contest_in_access_check = False + + @cached_property + def is_own(self): + return self.request.user.is_authenticated and self.request.profile == self.profile + + def access_check(self, request): + super(UserProblemSubmissions, self).access_check(request) + + if not self.is_own: + self.access_check_contest(request) + + def get_queryset(self): + return super(UserProblemSubmissions, self).get_queryset().filter(user_id=self.profile.id) + + def get_title(self): + if self.is_own: + return _("My submissions for %(problem)s") % {'problem': self.problem_name} + return _("%(user)s's submissions for %(problem)s") % {'user': self.username, 'problem': self.problem_name} + + def get_content_title(self): + if self.request.user.is_authenticated and self.request.profile == self.profile: + return format_html('''My submissions for {2}''', + self.username, reverse('user_page', args=[self.username]), + self.problem_name, reverse('problem_detail', args=[self.problem.code])) + return format_html('''{0}'s submissions for {2}''', + self.username, reverse('user_page', args=[self.username]), + self.problem_name, reverse('problem_detail', args=[self.problem.code])) + + def get_context_data(self, **kwargs): + context = super(UserProblemSubmissions, self).get_context_data(**kwargs) + context['dynamic_user_id'] = self.profile.id + return context + + +def single_submission(request, submission_id, show_problem=True): + request.no_profile_update = True + authenticated = request.user.is_authenticated + submission = get_object_or_404(submission_related(Submission.objects.all()), id=int(submission_id)) + + if not submission.problem.is_accessible_by(request.user): + raise Http404() + + return render(request, 'submission/row.html', { + 'submission': submission, + 'authored_problem_ids': user_authored_ids(request.profile) if authenticated else [], + 'completed_problem_ids': user_completed_ids(request.profile) if authenticated else [], + 'editable_problem_ids': user_editable_ids(request.profile) if authenticated else [], + 'show_problem': show_problem, + 'problem_name': show_problem and submission.problem.translated_name(request.LANGUAGE_CODE), + 'profile_id': request.profile.id if authenticated else 0, + }) + + +def single_submission_query(request): + request.no_profile_update = True + if 'id' not in request.GET or not request.GET['id'].isdigit(): + return HttpResponseBadRequest() + try: + show_problem = int(request.GET.get('show_problem', '1')) + except ValueError: + return HttpResponseBadRequest() + return single_submission(request, int(request.GET['id']), bool(show_problem)) + + +class AllSubmissions(SubmissionsListBase): + stats_update_interval = 3600 + + def get_my_submissions_page(self): + if self.request.user.is_authenticated: + return reverse('all_user_submissions', kwargs={'user': self.request.user.username}) + + def get_context_data(self, **kwargs): + context = super(AllSubmissions, self).get_context_data(**kwargs) + context['dynamic_update'] = context['page_obj'].number == 1 + context['last_msg'] = event.last() + context['stats_update_interval'] = self.stats_update_interval + return context + + def _get_result_data(self): + if self.in_contest or self.selected_languages or self.selected_statuses: + return super(AllSubmissions, self)._get_result_data() + + key = 'global_submission_result_data' + result = cache.get(key) + if result: + return result + result = super(AllSubmissions, self)._get_result_data() + cache.set(key, result, self.stats_update_interval) + return result + + +class ForceContestMixin(object): + @property + def in_contest(self): + return True + + @property + def contest(self): + return self._contest + + def access_check(self, request): + super(ForceContestMixin, self).access_check(request) + + if not request.user.has_perm('judge.see_private_contest'): + if not self.contest.is_visible: + raise Http404() + if self.contest.start_time is not None and self.contest.start_time > timezone.now(): + raise Http404() + + def get_problem_number(self, problem): + return self.contest.contest_problems.select_related('problem').get(problem=problem).order + + def get(self, request, *args, **kwargs): + if 'contest' not in kwargs: + raise ImproperlyConfigured(_('Must pass a contest')) + self._contest = get_object_or_404(Contest, key=kwargs['contest']) + return super(ForceContestMixin, self).get(request, *args, **kwargs) + + +class UserContestSubmissions(ForceContestMixin, UserProblemSubmissions): + def get_title(self): + if self.problem.is_accessible_by(self.request.user): + return "%s's submissions for %s in %s" % (self.username, self.problem_name, self.contest.name) + return "%s's submissions for problem %s in %s" % ( + self.username, self.get_problem_number(self.problem), self.contest.name) + + def access_check(self, request): + super(UserContestSubmissions, self).access_check(request) + if not self.contest.users.filter(user_id=self.profile.id).exists(): + raise Http404() + + def get_content_title(self): + if self.problem.is_accessible_by(self.request.user): + return format_html(_('{0}\'s submissions for ' + '{2} in {4}'), + self.username, reverse('user_page', args=[self.username]), + self.problem_name, reverse('problem_detail', args=[self.problem.code]), + self.contest.name, reverse('contest_view', args=[self.contest.key])) + return format_html(_('{0}\'s submissions for ' + 'problem {2} in {3}'), + self.username, reverse('user_page', args=[self.username]), + self.get_problem_number(self.problem), + self.contest.name, reverse('contest_view', args=[self.contest.key])) diff --git a/judge/views/tasks.py b/judge/views/tasks.py new file mode 100644 index 0000000..42e123f --- /dev/null +++ b/judge/views/tasks.py @@ -0,0 +1,66 @@ +import json +from functools import partial +from uuid import UUID + +from celery.result import AsyncResult +from django.core.exceptions import PermissionDenied +from django.http import Http404, HttpResponseBadRequest, HttpResponseRedirect, JsonResponse +from django.shortcuts import render +from django.urls import reverse +from django.utils.http import is_safe_url + +from judge.tasks import failure, progress, success +from judge.utils.celery import redirect_to_task_status +from judge.utils.views import short_circuit_middleware + + +def get_task_status(task_id): + result = AsyncResult(task_id) + info = result.result + if result.state == 'PROGRESS': + return {'code': 'PROGRESS', 'done': info['done'], 'total': info['total'], 'stage': info['stage']} + elif result.state == 'SUCCESS': + return {'code': 'SUCCESS'} + elif result.state == 'FAILURE': + return {'code': 'FAILURE', 'error': str(info)} + else: + return {'code': 'WORKING'} + + +def task_status(request, task_id): + try: + UUID(task_id) + except ValueError: + raise Http404() + + redirect = request.GET.get('redirect') + if not is_safe_url(redirect, allowed_hosts={request.get_host()}): + redirect = None + + status = get_task_status(task_id) + if status['code'] == 'SUCCESS' and redirect: + return HttpResponseRedirect(redirect) + + return render(request, 'task_status.html', { + 'task_id': task_id, 'task_status': json.dumps(status), + 'message': request.GET.get('message', ''), 'redirect': redirect or '', + }) + + +@short_circuit_middleware +def task_status_ajax(request): + if 'id' not in request.GET: + return HttpResponseBadRequest('Need to pass GET parameter "id"', content_type='text/plain') + return JsonResponse(get_task_status(request.GET['id'])) + + +def demo_task(request, task, message): + if not request.user.is_superuser: + raise PermissionDenied() + result = task.delay() + return redirect_to_task_status(result, message=message, redirect=reverse('home')) + + +demo_success = partial(demo_task, task=success, message='Running example task that succeeds...') +demo_failure = partial(demo_task, task=failure, message='Running example task that fails...') +demo_progress = partial(demo_task, task=progress, message='Running example task that waits 10 seconds...') diff --git a/judge/views/ticket.py b/judge/views/ticket.py new file mode 100644 index 0000000..85538b4 --- /dev/null +++ b/judge/views/ticket.py @@ -0,0 +1,326 @@ +import json + +from django import forms +from django.contrib.auth.mixins import LoginRequiredMixin +from django.core.exceptions import ImproperlyConfigured, PermissionDenied, ValidationError +from django.http import Http404, HttpResponse, HttpResponseBadRequest, HttpResponseRedirect, JsonResponse +from django.shortcuts import get_object_or_404 +from django.template.defaultfilters import truncatechars +from django.template.loader import get_template +from django.urls import reverse, reverse_lazy +from django.utils.functional import cached_property +from django.utils.html import escape, format_html, linebreaks +from django.utils.safestring import mark_safe +from django.utils.translation import gettext as _, gettext_lazy +from django.views import View +from django.views.generic import ListView +from django.views.generic.detail import SingleObjectMixin + +from judge import event_poster as event +from judge.models import Problem, Profile, Ticket, TicketMessage +from judge.utils.diggpaginator import DiggPaginator +from judge.utils.tickets import filter_visible_tickets, own_ticket_filter +from judge.utils.views import SingleObjectFormView, TitleMixin, paginate_query_context +from judge.views.problem import ProblemMixin +from judge.widgets import HeavyPreviewPageDownWidget + +ticket_widget = (forms.Textarea() if HeavyPreviewPageDownWidget is None else + HeavyPreviewPageDownWidget(preview=reverse_lazy('ticket_preview'), + preview_timeout=1000, hide_preview_button=True)) + + +class TicketForm(forms.Form): + title = forms.CharField(max_length=100, label=gettext_lazy('Ticket title')) + body = forms.CharField(widget=ticket_widget) + + def __init__(self, request, *args, **kwargs): + self.request = request + super(TicketForm, self).__init__(*args, **kwargs) + self.fields['title'].widget.attrs.update({'placeholder': _('Ticket title')}) + self.fields['body'].widget.attrs.update({'placeholder': _('Issue description')}) + + def clean(self): + if self.request is not None and self.request.user.is_authenticated: + profile = self.request.profile + if profile.mute: + raise ValidationError(_('Your part is silent, little toad.')) + return super(TicketForm, self).clean() + + +class NewTicketView(LoginRequiredMixin, SingleObjectFormView): + form_class = TicketForm + template_name = 'ticket/new.html' + + def get_assignees(self): + return [] + + def get_form_kwargs(self): + kwargs = super(NewTicketView, self).get_form_kwargs() + kwargs['request'] = self.request + return kwargs + + def form_valid(self, form): + ticket = Ticket(user=self.request.profile, title=form.cleaned_data['title']) + ticket.linked_item = self.object + ticket.save() + message = TicketMessage(ticket=ticket, user=ticket.user, body=form.cleaned_data['body']) + message.save() + ticket.assignees.set(self.get_assignees()) + if event.real: + event.post('tickets', { + 'type': 'new-ticket', 'id': ticket.id, + 'message': message.id, 'user': ticket.user_id, + 'assignees': list(ticket.assignees.values_list('id', flat=True)), + }) + return HttpResponseRedirect(reverse('ticket', args=[ticket.id])) + + +class NewProblemTicketView(ProblemMixin, TitleMixin, NewTicketView): + template_name = 'ticket/new_problem.html' + + def get_assignees(self): + return self.object.authors.all() + + def get_title(self): + return _('New ticket for %s') % self.object.name + + def get_content_title(self): + return mark_safe(escape(_('New ticket for %s')) % + format_html('{1}', reverse('problem_detail', args=[self.object.code]), + self.object.translated_name(self.request.LANGUAGE_CODE))) + + def form_valid(self, form): + if not self.object.is_accessible_by(self.request.user): + raise Http404() + return super().form_valid(form) + + +class TicketCommentForm(forms.Form): + body = forms.CharField(widget=ticket_widget) + + +class TicketMixin(object): + model = Ticket + + def get_object(self, queryset=None): + ticket = super(TicketMixin, self).get_object(queryset) + profile_id = self.request.profile.id + if self.request.user.has_perm('judge.change_ticket'): + return ticket + if ticket.user_id == profile_id: + return ticket + if ticket.assignees.filter(id=profile_id).exists(): + return ticket + linked = ticket.linked_item + if isinstance(linked, Problem) and linked.is_editable_by(self.request.user): + return ticket + raise PermissionDenied() + + +class TicketView(TitleMixin, LoginRequiredMixin, TicketMixin, SingleObjectFormView): + form_class = TicketCommentForm + template_name = 'ticket/ticket.html' + context_object_name = 'ticket' + + def form_valid(self, form): + message = TicketMessage(user=self.request.profile, + body=form.cleaned_data['body'], + ticket=self.object) + message.save() + if event.real: + event.post('tickets', { + 'type': 'ticket-message', 'id': self.object.id, + 'message': message.id, 'user': self.object.user_id, + 'assignees': list(self.object.assignees.values_list('id', flat=True)), + }) + event.post('ticket-%d' % self.object.id, { + 'type': 'ticket-message', 'message': message.id, + }) + return HttpResponseRedirect('%s#message-%d' % (reverse('ticket', args=[self.object.id]), message.id)) + + def get_title(self): + return _('%(title)s - Ticket %(id)d') % {'title': self.object.title, 'id': self.object.id} + + def get_context_data(self, **kwargs): + context = super(TicketView, self).get_context_data(**kwargs) + context['ticket_messages'] = self.object.messages.select_related('user__user') + context['assignees'] = self.object.assignees.select_related('user') + context['last_msg'] = event.last() + return context + + +class TicketStatusChangeView(LoginRequiredMixin, TicketMixin, SingleObjectMixin, View): + open = None + + def post(self, request, *args, **kwargs): + if self.open is None: + raise ImproperlyConfigured('Need to define open') + ticket = self.get_object() + if ticket.is_open != self.open: + ticket.is_open = self.open + ticket.save() + if event.real: + event.post('tickets', { + 'type': 'ticket-status', 'id': ticket.id, + 'open': self.open, 'user': ticket.user_id, + 'assignees': list(ticket.assignees.values_list('id', flat=True)), + 'title': ticket.title, + }) + event.post('ticket-%d' % ticket.id, { + 'type': 'ticket-status', 'open': self.open, + }) + return HttpResponse(status=204) + + +class TicketNotesForm(forms.Form): + notes = forms.CharField(widget=forms.Textarea(), required=False) + + +class TicketNotesEditView(LoginRequiredMixin, TicketMixin, SingleObjectFormView): + template_name = 'ticket/edit-notes.html' + form_class = TicketNotesForm + context_object_name = 'ticket' + + def get_initial(self): + return {'notes': self.get_object().notes} + + def form_valid(self, form): + ticket = self.get_object() + ticket.notes = notes = form.cleaned_data['notes'] + ticket.save() + if notes: + return HttpResponse(linebreaks(notes, autoescape=True)) + else: + return HttpResponse() + + def form_invalid(self, form): + return HttpResponseBadRequest() + + +class TicketList(LoginRequiredMixin, ListView): + model = Ticket + template_name = 'ticket/list.html' + context_object_name = 'tickets' + paginate_by = 50 + paginator_class = DiggPaginator + + @cached_property + def user(self): + return self.request.user + + @cached_property + def profile(self): + return self.user.profile + + @cached_property + def can_edit_all(self): + return self.request.user.has_perm('judge.change_ticket') + + @cached_property + def filter_users(self): + return self.request.GET.getlist('user') + + @cached_property + def filter_assignees(self): + return self.request.GET.getlist('assignee') + + def GET_with_session(self, key): + if not self.request.GET: + return self.request.session.get(key, False) + return self.request.GET.get(key, None) == '1' + + def _get_queryset(self): + return Ticket.objects.select_related('user__user').prefetch_related('assignees__user').order_by('-id') + + def get_queryset(self): + queryset = self._get_queryset() + if self.GET_with_session('own'): + queryset = queryset.filter(own_ticket_filter(self.profile.id)) + elif not self.can_edit_all: + queryset = filter_visible_tickets(queryset, self.user, self.profile) + if self.filter_assignees: + queryset = queryset.filter(assignees__user__username__in=self.filter_assignees) + if self.filter_users: + queryset = queryset.filter(user__user__username__in=self.filter_users) + return queryset.distinct() + + def get_context_data(self, **kwargs): + context = super(TicketList, self).get_context_data(**kwargs) + + page = context['page_obj'] + context['title'] = _('Tickets - Page %(number)d of %(total)d') % { + 'number': page.number, + 'total': page.paginator.num_pages, + } + context['can_edit_all'] = self.can_edit_all + context['filter_status'] = { + 'own': self.GET_with_session('own'), 'user': self.filter_users, 'assignee': self.filter_assignees, + 'user_id': json.dumps(list(Profile.objects.filter(user__username__in=self.filter_users) + .values_list('id', flat=True))), + 'assignee_id': json.dumps(list(Profile.objects.filter(user__username__in=self.filter_assignees) + .values_list('id', flat=True))), + 'own_id': self.profile.id if self.GET_with_session('own') else 'null', + } + context['last_msg'] = event.last() + context.update(paginate_query_context(self.request)) + return context + + def post(self, request, *args, **kwargs): + to_update = ('own',) + for key in to_update: + if key in request.GET: + val = request.GET.get(key) == '1' + request.session[key] = val + else: + request.session.pop(key, None) + return HttpResponseRedirect(request.get_full_path()) + + +class ProblemTicketListView(TicketList): + def _get_queryset(self): + problem = get_object_or_404(Problem, code=self.kwargs.get('problem')) + if problem.is_editable_by(self.request.user): + return problem.tickets.order_by('-id') + elif problem.is_accessible_by(self.request.user): + return problem.tickets.filter(own_ticket_filter(self.profile.id)).order_by('-id') + raise Http404() + + +class TicketListDataAjax(TicketMixin, SingleObjectMixin, View): + def get(self, request, *args, **kwargs): + try: + self.kwargs['pk'] = request.GET['id'] + except KeyError: + return HttpResponseBadRequest() + ticket = self.get_object() + message = ticket.messages.first() + return JsonResponse({ + 'row': get_template('ticket/row.html').render({'ticket': ticket}, request), + 'notification': { + 'title': _('New Ticket: %s') % ticket.title, + 'body': '%s\n%s' % (_('#%(id)d, assigned to: %(users)s') % { + 'id': ticket.id, + 'users': (_(', ').join(ticket.assignees.values_list('user__username', flat=True)) or _('no one')), + }, truncatechars(message.body, 200)), + }, + }) + + +class TicketMessageDataAjax(TicketMixin, SingleObjectMixin, View): + def get(self, request, *args, **kwargs): + try: + message_id = request.GET['message'] + except KeyError: + return HttpResponseBadRequest() + ticket = self.get_object() + try: + message = ticket.messages.get(id=message_id) + except TicketMessage.DoesNotExist: + return HttpResponseBadRequest() + return JsonResponse({ + 'message': get_template('ticket/message.html').render({'message': message}, request), + 'notification': { + 'title': _('New Ticket Message For: %s') % ticket.title, + 'body': truncatechars(message.body, 200), + }, + }) diff --git a/judge/views/totp.py b/judge/views/totp.py new file mode 100644 index 0000000..097137f --- /dev/null +++ b/judge/views/totp.py @@ -0,0 +1,122 @@ +import base64 +from io import BytesIO + +import pyotp +import qrcode +from django.conf import settings +from django.contrib.auth.mixins import LoginRequiredMixin +from django.contrib.auth.views import SuccessURLAllowedHostsMixin +from django.http import HttpResponseBadRequest, HttpResponseRedirect +from django.urls import reverse +from django.utils.http import is_safe_url +from django.utils.translation import gettext as _ +from django.views.generic import FormView + +from judge.forms import TOTPForm +from judge.utils.views import TitleMixin + + +class TOTPView(TitleMixin, LoginRequiredMixin, FormView): + form_class = TOTPForm + + def get_form_kwargs(self): + result = super(TOTPView, self).get_form_kwargs() + result['totp_key'] = self.profile.totp_key + return result + + def dispatch(self, request, *args, **kwargs): + if request.user.is_authenticated: + self.profile = request.profile + if self.check_skip(): + return self.next_page() + return super(TOTPView, self).dispatch(request, *args, **kwargs) + + def check_skip(self): + raise NotImplementedError() + + def next_page(self): + return HttpResponseRedirect(reverse('user_edit_profile')) + + +class TOTPEnableView(TOTPView): + title = _('Enable Two Factor Authentication') + template_name = 'registration/totp_enable.html' + + def get(self, request, *args, **kwargs): + profile = self.profile + if not profile.totp_key: + profile.totp_key = pyotp.random_base32(length=32) + profile.save() + return self.render_to_response(self.get_context_data()) + + def check_skip(self): + return self.profile.is_totp_enabled + + def post(self, request, *args, **kwargs): + if not self.profile.totp_key: + return HttpResponseBadRequest('No TOTP key generated on server side?') + return super(TOTPEnableView, self).post(request, *args, **kwargs) + + def get_context_data(self, **kwargs): + context = super(TOTPEnableView, self).get_context_data(**kwargs) + context['totp_key'] = self.profile.totp_key + context['qr_code'] = self.render_qr_code(self.request.user.username, self.profile.totp_key) + return context + + def form_valid(self, form): + self.profile.is_totp_enabled = True + self.profile.save() + # Make sure users don't get prompted to enter code right after enabling: + self.request.session['2fa_passed'] = True + return self.next_page() + + @classmethod + def render_qr_code(cls, username, key): + totp = pyotp.TOTP(key) + uri = totp.provisioning_uri(username, settings.SITE_NAME) + + qr = qrcode.QRCode(box_size=1) + qr.add_data(uri) + qr.make(fit=True) + + image = qr.make_image(fill_color='black', back_color='white') + buf = BytesIO() + image.save(buf, format='PNG') + return 'data:image/png;base64,' + base64.b64encode(buf.getvalue()).decode('ascii') + + +class TOTPDisableView(TOTPView): + title = _('Disable Two Factor Authentication') + template_name = 'registration/totp_disable.html' + + def check_skip(self): + if not self.profile.is_totp_enabled: + return True + return settings.DMOJ_REQUIRE_STAFF_2FA and self.request.user.is_staff + + def form_valid(self, form): + self.profile.is_totp_enabled = False + self.profile.totp_key = None + self.profile.save() + return self.next_page() + + +class TOTPLoginView(SuccessURLAllowedHostsMixin, TOTPView): + title = _('Perform Two Factor Authentication') + template_name = 'registration/totp_auth.html' + + def check_skip(self): + return not self.profile.is_totp_enabled or self.request.session.get('2fa_passed', False) + + def next_page(self): + redirect_to = self.request.GET.get('next', '') + url_is_safe = is_safe_url( + url=redirect_to, + allowed_hosts=self.get_success_url_allowed_hosts(), + require_https=self.request.is_secure(), + ) + return HttpResponseRedirect((redirect_to if url_is_safe else '') or reverse('user_page')) + + def form_valid(self, form): + self.request.session['2fa_passed'] = True + return self.next_page() diff --git a/judge/views/user.py b/judge/views/user.py new file mode 100644 index 0000000..36bdd83 --- /dev/null +++ b/judge/views/user.py @@ -0,0 +1,324 @@ +import itertools +import json +from datetime import datetime +from operator import itemgetter + +from django.conf import settings +from django.contrib.auth import logout as auth_logout +from django.contrib.auth.decorators import login_required +from django.contrib.auth.models import Permission +from django.contrib.auth.views import redirect_to_login +from django.contrib.contenttypes.models import ContentType +from django.db import transaction +from django.db.models import Count, Max, Min +from django.http import Http404, HttpResponseRedirect, JsonResponse +from django.shortcuts import get_object_or_404, render +from django.urls import reverse +from django.utils import timezone +from django.utils.formats import date_format +from django.utils.functional import cached_property +from django.utils.safestring import mark_safe +from django.utils.translation import gettext as _, gettext_lazy +from django.views.generic import DetailView, ListView, TemplateView +from reversion import revisions + +from judge.forms import ProfileForm, newsletter_id +from judge.models import Profile, Rating, Submission +from judge.performance_points import get_pp_breakdown +from judge.ratings import rating_class, rating_progress +from judge.utils.problems import contest_completed_ids, user_completed_ids +from judge.utils.ranker import ranker +from judge.utils.subscription import Subscription +from judge.utils.unicode import utf8text +from judge.utils.views import DiggPaginatorMixin, QueryStringSortMixin, TitleMixin, generic_message +from .contests import ContestRanking + +__all__ = ['UserPage', 'UserAboutPage', 'UserProblemsPage', 'users', 'edit_profile'] + + +def remap_keys(iterable, mapping): + return [dict((mapping.get(k, k), v) for k, v in item.items()) for item in iterable] + + +class UserMixin(object): + model = Profile + slug_field = 'user__username' + slug_url_kwarg = 'user' + context_object_name = 'user' + + def render_to_response(self, context, **response_kwargs): + return super(UserMixin, self).render_to_response(context, **response_kwargs) + + +class UserPage(TitleMixin, UserMixin, DetailView): + template_name = 'user/user-base.html' + + def get_object(self, queryset=None): + if self.kwargs.get(self.slug_url_kwarg, None) is None: + return self.request.profile + return super(UserPage, self).get_object(queryset) + + def dispatch(self, request, *args, **kwargs): + if self.kwargs.get(self.slug_url_kwarg, None) is None: + if not self.request.user.is_authenticated: + return redirect_to_login(self.request.get_full_path()) + try: + return super(UserPage, self).dispatch(request, *args, **kwargs) + except Http404: + return generic_message(request, _('No such user'), _('No user handle "%s".') % + self.kwargs.get(self.slug_url_kwarg, None)) + + def get_title(self): + return (_('My account') if self.request.user == self.object.user else + _('User %s') % self.object.user.username) + + # TODO: the same code exists in problem.py, maybe move to problems.py? + @cached_property + def profile(self): + if not self.request.user.is_authenticated: + return None + return self.request.profile + + @cached_property + def in_contest(self): + return self.profile is not None and self.profile.current_contest is not None + + def get_completed_problems(self): + if self.in_contest: + return contest_completed_ids(self.profile.current_contest) + else: + return user_completed_ids(self.profile) if self.profile is not None else () + + def get_context_data(self, **kwargs): + context = super(UserPage, self).get_context_data(**kwargs) + + context['hide_solved'] = int(self.hide_solved) + context['authored'] = self.object.authored_problems.filter(is_public=True, is_organization_private=False) \ + .order_by('code') + rating = self.object.ratings.order_by('-contest__end_time')[:1] + context['rating'] = rating[0] if rating else None + + context['rank'] = Profile.objects.filter( + is_unlisted=False, performance_points__gt=self.object.performance_points, + ).count() + 1 + + if rating: + context['rating_rank'] = Profile.objects.filter( + is_unlisted=False, rating__gt=self.object.rating, + ).count() + 1 + context['rated_users'] = Profile.objects.filter(is_unlisted=False, rating__isnull=False).count() + context.update(self.object.ratings.aggregate(min_rating=Min('rating'), max_rating=Max('rating'), + contests=Count('contest'))) + return context + + def get(self, request, *args, **kwargs): + self.hide_solved = request.GET.get('hide_solved') == '1' if 'hide_solved' in request.GET else False + return super(UserPage, self).get(request, *args, **kwargs) + + +EPOCH = datetime(1970, 1, 1, tzinfo=timezone.utc) + + +class UserAboutPage(UserPage): + template_name = 'user/user-about.html' + + def get_context_data(self, **kwargs): + context = super(UserAboutPage, self).get_context_data(**kwargs) + ratings = context['ratings'] = self.object.ratings.order_by('-contest__end_time').select_related('contest') \ + .defer('contest__description') + + context['rating_data'] = mark_safe(json.dumps([{ + 'label': rating.contest.name, + 'rating': rating.rating, + 'ranking': rating.rank, + 'link': reverse('contest_ranking', args=(rating.contest.key,)), + 'timestamp': (rating.contest.end_time - EPOCH).total_seconds() * 1000, + 'date': date_format(rating.contest.end_time, _('M j, Y, G:i')), + 'class': rating_class(rating.rating), + 'height': '%.3fem' % rating_progress(rating.rating), + } for rating in ratings])) + + if ratings: + user_data = self.object.ratings.aggregate(Min('rating'), Max('rating')) + global_data = Rating.objects.aggregate(Min('rating'), Max('rating')) + min_ever, max_ever = global_data['rating__min'], global_data['rating__max'] + min_user, max_user = user_data['rating__min'], user_data['rating__max'] + delta = max_user - min_user + ratio = (max_ever - max_user) / (max_ever - min_ever) if max_ever != min_ever else 1.0 + context['max_graph'] = max_user + ratio * delta + context['min_graph'] = min_user + ratio * delta - delta + return context + + +class UserProblemsPage(UserPage): + template_name = 'user/user-problems.html' + + def get_context_data(self, **kwargs): + context = super(UserProblemsPage, self).get_context_data(**kwargs) + + result = Submission.objects.filter(user=self.object, points__gt=0, problem__is_public=True, + problem__is_organization_private=False) \ + .exclude(problem__in=self.get_completed_problems() if self.hide_solved else []) \ + .values('problem__id', 'problem__code', 'problem__name', 'problem__points', 'problem__group__full_name') \ + .distinct().annotate(points=Max('points')).order_by('problem__group__full_name', 'problem__code') + + def process_group(group, problems_iter): + problems = list(problems_iter) + points = sum(map(itemgetter('points'), problems)) + return {'name': group, 'problems': problems, 'points': points} + + context['best_submissions'] = [ + process_group(group, problems) for group, problems in itertools.groupby( + remap_keys(result, { + 'problem__code': 'code', 'problem__name': 'name', 'problem__points': 'total', + 'problem__group__full_name': 'group', + }), itemgetter('group')) + ] + breakdown, has_more = get_pp_breakdown(self.object, start=0, end=10) + context['pp_breakdown'] = breakdown + context['pp_has_more'] = has_more + + return context + + +class UserPerformancePointsAjax(UserProblemsPage): + template_name = 'user/pp-table-body.html' + + def get_context_data(self, **kwargs): + context = super(UserPerformancePointsAjax, self).get_context_data(**kwargs) + try: + start = int(self.request.GET.get('start', 0)) + end = int(self.request.GET.get('end', settings.DMOJ_PP_ENTRIES)) + if start < 0 or end < 0 or start > end: + raise ValueError + except ValueError: + start, end = 0, 100 + breakdown, self.has_more = get_pp_breakdown(self.object, start=start, end=end) + context['pp_breakdown'] = breakdown + return context + + def get(self, request, *args, **kwargs): + httpresp = super(UserPerformancePointsAjax, self).get(request, *args, **kwargs) + httpresp.render() + + return JsonResponse({ + 'results': utf8text(httpresp.content), + 'has_more': self.has_more, + }) + + +@login_required +def edit_profile(request): + profile = Profile.objects.get(user=request.user) + if profile.mute: + raise Http404() + if request.method == 'POST': + form = ProfileForm(request.POST, instance=profile, user=request.user) + if form.is_valid(): + with transaction.atomic(), revisions.create_revision(): + form.save() + revisions.set_user(request.user) + revisions.set_comment(_('Updated on site')) + + if newsletter_id is not None: + try: + subscription = Subscription.objects.get(user=request.user, newsletter_id=newsletter_id) + except Subscription.DoesNotExist: + if form.cleaned_data['newsletter']: + Subscription(user=request.user, newsletter_id=newsletter_id, subscribed=True).save() + else: + if subscription.subscribed != form.cleaned_data['newsletter']: + subscription.update(('unsubscribe', 'subscribe')[form.cleaned_data['newsletter']]) + + perm = Permission.objects.get(codename='test_site', content_type=ContentType.objects.get_for_model(Profile)) + if form.cleaned_data['test_site']: + request.user.user_permissions.add(perm) + else: + request.user.user_permissions.remove(perm) + + return HttpResponseRedirect(request.path) + else: + form = ProfileForm(instance=profile, user=request.user) + if newsletter_id is not None: + try: + subscription = Subscription.objects.get(user=request.user, newsletter_id=newsletter_id) + except Subscription.DoesNotExist: + form.fields['newsletter'].initial = False + else: + form.fields['newsletter'].initial = subscription.subscribed + form.fields['test_site'].initial = request.user.has_perm('judge.test_site') + + tzmap = settings.TIMEZONE_MAP + return render(request, 'user/edit-profile.html', { + 'require_staff_2fa': settings.DMOJ_REQUIRE_STAFF_2FA, + 'form': form, 'title': _('Edit profile'), 'profile': profile, + 'has_math_config': bool(settings.MATHOID_URL), + 'TIMEZONE_MAP': tzmap or 'http://momentjs.com/static/img/world.png', + 'TIMEZONE_BG': settings.TIMEZONE_BG if tzmap else '#4E7CAD', + }) + + +class UserList(QueryStringSortMixin, DiggPaginatorMixin, TitleMixin, ListView): + model = Profile + title = gettext_lazy('Leaderboard') + context_object_name = 'users' + template_name = 'user/list.html' + paginate_by = 100 + all_sorts = frozenset(('points', 'problem_count', 'rating', 'performance_points')) + default_desc = all_sorts + default_sort = '-performance_points' + + def get_queryset(self): + return (Profile.objects.filter(is_unlisted=False).order_by(self.order, 'id').select_related('user') + .only('display_rank', 'user__username', 'points', 'rating', 'performance_points', + 'problem_count')) + + def get_context_data(self, **kwargs): + context = super(UserList, self).get_context_data(**kwargs) + context['users'] = ranker(context['users'], rank=self.paginate_by * (context['page_obj'].number - 1)) + context['first_page_href'] = '.' + context.update(self.get_sort_context()) + context.update(self.get_sort_paginate_context()) + return context + + +user_list_view = UserList.as_view() + + +class FixedContestRanking(ContestRanking): + contest = None + + def get_object(self, queryset=None): + return self.contest + + +def users(request): + if request.user.is_authenticated: + participation = request.profile.current_contest + if participation is not None: + contest = participation.contest + return FixedContestRanking.as_view(contest=contest)(request, contest=contest.key) + return user_list_view(request) + + +def user_ranking_redirect(request): + try: + username = request.GET['handle'] + except KeyError: + raise Http404() + user = get_object_or_404(Profile, user__username=username) + rank = Profile.objects.filter(is_unlisted=False, performance_points__gt=user.performance_points).count() + rank += Profile.objects.filter( + is_unlisted=False, performance_points__exact=user.performance_points, id__lt=user.id, + ).count() + page = rank // UserList.paginate_by + return HttpResponseRedirect('%s%s#!%s' % (reverse('user_list'), '?page=%d' % (page + 1) if page else '', username)) + + +class UserLogoutView(TitleMixin, TemplateView): + template_name = 'registration/logout.html' + title = 'You have been successfully logged out.' + + def post(self, request, *args, **kwargs): + auth_logout(request) + return HttpResponseRedirect(request.get_full_path()) diff --git a/judge/views/widgets.py b/judge/views/widgets.py new file mode 100644 index 0000000..57fe15b --- /dev/null +++ b/judge/views/widgets.py @@ -0,0 +1,72 @@ +import requests +from django.conf import settings +from django.contrib.auth.decorators import login_required +from django.core.exceptions import ImproperlyConfigured +from django.http import Http404, HttpResponse, HttpResponseBadRequest, HttpResponseForbidden, HttpResponseRedirect +from django.utils.translation import gettext as _ +from django.views.generic import View + +from judge.models import Submission + +__all__ = ['rejudge_submission', 'DetectTimezone'] + + +@login_required +def rejudge_submission(request): + if request.method != 'POST' or not request.user.has_perm('judge.rejudge_submission') or \ + not request.user.has_perm('judge.edit_own_problem'): + return HttpResponseForbidden() + + if 'id' not in request.POST or not request.POST['id'].isdigit(): + return HttpResponseBadRequest() + + try: + submission = Submission.objects.get(id=request.POST['id']) + except Submission.DoesNotExist: + return HttpResponseBadRequest() + + if not request.user.has_perm('judge.edit_all_problem') and \ + not submission.problem.is_editor(request.profile): + return HttpResponseForbidden() + + submission.judge(rejudge=True) + + redirect = request.POST.get('path', None) + + return HttpResponseRedirect(redirect) if redirect else HttpResponse('success', content_type='text/plain') + + +class DetectTimezone(View): + def askgeo(self, lat, long): + if not hasattr(settings, 'ASKGEO_ACCOUNT_ID') or not hasattr(settings, 'ASKGEO_ACCOUNT_API_KEY'): + raise ImproperlyConfigured() + data = requests.get('http://api.askgeo.com/v1/%s/%s/query.json?databases=TimeZone&points=%f,%f' % + (settings.ASKGEO_ACCOUNT_ID, settings.ASKGEO_ACCOUNT_API_KEY, lat, long)).json() + try: + return HttpResponse(data['data'][0]['TimeZone']['TimeZoneId'], content_type='text/plain') + except (IndexError, KeyError): + return HttpResponse(_('Invalid upstream data: %s') % data, content_type='text/plain', status=500) + + def geonames(self, lat, long): + if not hasattr(settings, 'GEONAMES_USERNAME'): + raise ImproperlyConfigured() + data = requests.get('http://api.geonames.org/timezoneJSON?lat=%f&lng=%f&username=%s' % + (lat, long, settings.GEONAMES_USERNAME)).json() + try: + return HttpResponse(data['timezoneId'], content_type='text/plain') + except KeyError: + return HttpResponse(_('Invalid upstream data: %s') % data, content_type='text/plain', status=500) + + def default(self, lat, long): + raise Http404() + + def get(self, request, *args, **kwargs): + backend = settings.TIMEZONE_DETECT_BACKEND + try: + lat, long = float(request.GET['lat']), float(request.GET['long']) + except (ValueError, KeyError): + return HttpResponse(_('Bad latitude or longitude'), content_type='text/plain', status=404) + return { + 'askgeo': self.askgeo, + 'geonames': self.geonames, + }.get(backend, self.default)(lat, long) diff --git a/judge/widgets/__init__.py b/judge/widgets/__init__.py new file mode 100644 index 0000000..51983a9 --- /dev/null +++ b/judge/widgets/__init__.py @@ -0,0 +1,4 @@ +from judge.widgets.checkbox import CheckboxSelectMultipleWithSelectAll +from judge.widgets.mixins import CompressorWidgetMixin +from judge.widgets.pagedown import * +from judge.widgets.select2 import * diff --git a/judge/widgets/checkbox.py b/judge/widgets/checkbox.py new file mode 100644 index 0000000..0a7eebf --- /dev/null +++ b/judge/widgets/checkbox.py @@ -0,0 +1,22 @@ +from django import forms +from django.core.exceptions import FieldError +from django.template.loader import get_template +from django.utils.safestring import mark_safe + + +class CheckboxSelectMultipleWithSelectAll(forms.CheckboxSelectMultiple): + def render(self, name, value, attrs=None, renderer=None): + if 'id' not in attrs: + raise FieldError('id required') + + select_all_id = attrs['id'] + '_all' + select_all_name = name + '_all' + original = super(CheckboxSelectMultipleWithSelectAll, self).render(name, value, attrs, renderer) + template = get_template('widgets/select_all.html') + return mark_safe(template.render({ + 'original_widget': original, + 'select_all_id': select_all_id, + 'select_all_name': select_all_name, + 'all_selected': all(choice[0] in value for choice in self.choices) if value else False, + 'empty': not self.choices, + })) diff --git a/judge/widgets/mixins.py b/judge/widgets/mixins.py new file mode 100644 index 0000000..0270276 --- /dev/null +++ b/judge/widgets/mixins.py @@ -0,0 +1,47 @@ +from textwrap import dedent + +from django import forms +from django.conf import settings +from django.template import Context, Template +from lxml import html + + +class CompressorWidgetMixin(object): + __template_css = dedent('''\ + {% compress css %} + {{ media.css }} + {% endcompress %} + ''') + + __template_js = dedent('''\ + {% compress js %} + {{ media.js }} + {% endcompress %} + ''') + + __templates = { + (False, False): Template(''), + (True, False): Template('{% load compress %}' + __template_css), + (False, True): Template('{% load compress %}' + __template_js), + (True, True): Template('{% load compress %}' + __template_js + __template_css), + } + + compress_css = False + compress_js = False + + try: + import compressor + except ImportError: + pass + else: + if getattr(settings, 'COMPRESS_ENABLED', not settings.DEBUG): + @property + def media(self): + media = super().media + template = self.__templates[self.compress_css, self.compress_js] + result = html.fromstring(template.render(Context({'media': media}))) + + return forms.Media( + css={'all': [result.find('.//link').get('href')]} if self.compress_css else media._css, + js=[result.find('.//script').get('src')] if self.compress_js else media._js, + ) diff --git a/judge/widgets/pagedown.py b/judge/widgets/pagedown.py new file mode 100644 index 0000000..d8d4de9 --- /dev/null +++ b/judge/widgets/pagedown.py @@ -0,0 +1,96 @@ +from django.contrib.admin import widgets as admin_widgets +from django.forms.utils import flatatt +from django.template.loader import get_template +from django.utils.encoding import force_text +from django.utils.html import conditional_escape + +from judge.widgets.mixins import CompressorWidgetMixin + +__all__ = ['PagedownWidget', 'AdminPagedownWidget', + 'MathJaxPagedownWidget', 'MathJaxAdminPagedownWidget', + 'HeavyPreviewPageDownWidget', 'HeavyPreviewAdminPageDownWidget'] + +try: + from pagedown.widgets import PagedownWidget as OldPagedownWidget +except ImportError: + PagedownWidget = None + AdminPagedownWidget = None + MathJaxPagedownWidget = None + MathJaxAdminPagedownWidget = None + HeavyPreviewPageDownWidget = None + HeavyPreviewAdminPageDownWidget = None +else: + class PagedownWidget(CompressorWidgetMixin, OldPagedownWidget): + # The goal here is to compress all the pagedown JS into one file. + # We do not want any further compress down the chain, because + # 1. we'll creating multiple large JS files to download. + # 2. this is not a problem here because all the pagedown JS files will be used together. + compress_js = True + + def __init__(self, *args, **kwargs): + kwargs.setdefault('css', ('pagedown_widget.css',)) + super(PagedownWidget, self).__init__(*args, **kwargs) + + + class AdminPagedownWidget(PagedownWidget, admin_widgets.AdminTextareaWidget): + class Media: + css = {'all': [ + 'content-description.css', + 'admin/css/pagedown.css', + ]} + js = ['admin/js/pagedown.js'] + + + class MathJaxPagedownWidget(PagedownWidget): + class Media: + js = [ + 'mathjax_config.js', + 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML', + 'pagedown_math.js', + ] + + + class MathJaxAdminPagedownWidget(AdminPagedownWidget, MathJaxPagedownWidget): + pass + + + class HeavyPreviewPageDownWidget(PagedownWidget): + def __init__(self, *args, **kwargs): + kwargs.setdefault('template', 'pagedown.html') + self.preview_url = kwargs.pop('preview') + self.preview_timeout = kwargs.pop('preview_timeout', None) + self.hide_preview_button = kwargs.pop('hide_preview_button', False) + super(HeavyPreviewPageDownWidget, self).__init__(*args, **kwargs) + + def render(self, name, value, attrs=None, renderer=None): + if value is None: + value = '' + final_attrs = self.build_attrs(attrs, {'name': name}) + if 'class' not in final_attrs: + final_attrs['class'] = '' + final_attrs['class'] += ' wmd-input' + return get_template(self.template).render(self.get_template_context(final_attrs, value)) + + def get_template_context(self, attrs, value): + return { + 'attrs': flatatt(attrs), + 'body': conditional_escape(force_text(value)), + 'id': attrs['id'], + 'show_preview': self.show_preview, + 'preview_url': self.preview_url, + 'preview_timeout': self.preview_timeout, + 'extra_classes': 'dmmd-no-button' if self.hide_preview_button else None, + } + + class Media: + css = {'all': ['dmmd-preview.css']} + js = ['dmmd-preview.js'] + + + class HeavyPreviewAdminPageDownWidget(AdminPagedownWidget, HeavyPreviewPageDownWidget): + class Media: + css = {'all': [ + 'pygment-github.css', + 'table.css', + 'ranks.css', + ]} diff --git a/judge/widgets/select2.py b/judge/widgets/select2.py new file mode 100644 index 0000000..af4843b --- /dev/null +++ b/judge/widgets/select2.py @@ -0,0 +1,272 @@ +# -*- coding: utf-8 -*- +""" +Select2 Widgets based on https://github.com/applegrew/django-select2. + +These components are responsible for rendering +the necessary HTML data markups. Since this whole +package is to render choices using Select2 JavaScript +library, hence these components are meant to be used +with choice fields. + +Widgets are generally of two types: + + 1. **Light** -- + They are not meant to be used when there + are too many options, say, in thousands. + This is because all those options would + have to be pre-rendered onto the page + and JavaScript would be used to search + through them. Said that, they are also one + the most easiest to use. They are a + drop-in-replacement for Django's default + select widgets. + + 2. **Heavy** -- + They are suited for scenarios when the number of options + are large and need complex queries (from maybe different + sources) to get the options. + This dynamic fetching of options undoubtedly requires + Ajax communication with the server. Django-Select2 includes + a helper JS file which is included automatically, + so you need not worry about writing any Ajax related JS code. + Although on the server side you do need to create a view + specifically to respond to the queries. + +Heavy widgets have the word 'Heavy' in their name. +Light widgets are normally named, i.e. there is no +'Light' word in their names. + +""" +from copy import copy +from itertools import chain + +from django import forms +from django.conf import settings +from django.core import signing +from django.forms.models import ModelChoiceIterator +from django.urls import reverse_lazy + +DEFAULT_SELECT2_JS = '//cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/js/select2.min.js' +DEFAULT_SELECT2_CSS = '//cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/css/select2.min.css' + +__all__ = ['Select2Widget', 'Select2MultipleWidget', 'Select2TagWidget', + 'HeavySelect2Widget', 'HeavySelect2MultipleWidget', 'HeavySelect2TagWidget', + 'AdminSelect2Widget', 'AdminSelect2MultipleWidget', 'AdminHeavySelect2Widget', + 'AdminHeavySelect2MultipleWidget'] + + +class Select2Mixin(object): + """ + The base mixin of all Select2 widgets. + + This mixin is responsible for rendering the necessary + data attributes for select2 as well as adding the static + form media. + """ + + def build_attrs(self, base_attrs, extra_attrs=None): + """Add select2 data attributes.""" + attrs = super(Select2Mixin, self).build_attrs(base_attrs, extra_attrs) + if self.is_required: + attrs.setdefault('data-allow-clear', 'false') + else: + attrs.setdefault('data-allow-clear', 'true') + attrs.setdefault('data-placeholder', '') + + attrs.setdefault('data-minimum-input-length', 0) + if 'class' in attrs: + attrs['class'] += ' django-select2' + else: + attrs['class'] = 'django-select2' + return attrs + + def optgroups(self, name, value, attrs=None): + """Add empty option for clearable selects.""" + if not self.is_required and not self.allow_multiple_selected: + self.choices = list(chain([('', '')], self.choices)) + return super(Select2Mixin, self).optgroups(name, value, attrs=attrs) + + @property + def media(self): + """ + Construct Media as a dynamic property. + + .. Note:: For more information visit + https://docs.djangoproject.com/en/1.8/topics/forms/media/#media-as-a-dynamic-property + """ + return forms.Media( + js=[settings.SELECT2_JS_URL, 'django_select2.js'], + css={'screen': [settings.SELECT2_CSS_URL]}, + ) + + +class AdminSelect2Mixin(Select2Mixin): + @property + def media(self): + return forms.Media( + js=['admin/js/jquery.init.js', settings.SELECT2_JS_URL, 'django_select2.js'], + css={'screen': [settings.SELECT2_CSS_URL]}, + ) + + +class Select2TagMixin(object): + """Mixin to add select2 tag functionality.""" + + def build_attrs(self, base_attrs, extra_attrs=None): + """Add select2's tag attributes.""" + extra_attrs = extra_attrs or {} + extra_attrs.setdefault('data-minimum-input-length', 1) + extra_attrs.setdefault('data-tags', 'true') + extra_attrs.setdefault('data-token-separators', [",", " "]) + return super(Select2TagMixin, self).build_attrs(base_attrs, extra_attrs) + + +class Select2Widget(Select2Mixin, forms.Select): + """ + Select2 drop in widget. + + Example usage:: + + class MyModelForm(forms.ModelForm): + class Meta: + model = MyModel + fields = ('my_field', ) + widgets = { + 'my_field': Select2Widget + } + + or:: + + class MyForm(forms.Form): + my_choice = forms.ChoiceField(widget=Select2Widget) + + """ + + pass + + +class Select2MultipleWidget(Select2Mixin, forms.SelectMultiple): + """ + Select2 drop in widget for multiple select. + + Works just like :class:`.Select2Widget` but for multi select. + """ + + pass + + +class Select2TagWidget(Select2TagMixin, Select2Mixin, forms.SelectMultiple): + """ + Select2 drop in widget for for tagging. + + Example for :class:`.django.contrib.postgres.fields.ArrayField`:: + + class MyWidget(Select2TagWidget): + + def value_from_datadict(self, data, files, name): + values = super(MyWidget, self).value_from_datadict(data, files, name): + return ",".join(values) + + """ + + pass + + +class HeavySelect2Mixin(Select2Mixin): + """Mixin that adds select2's ajax options.""" + + def __init__(self, attrs=None, choices=(), **kwargs): + self.choices = choices + if attrs is not None: + self.attrs = attrs.copy() + else: + self.attrs = {} + + self.data_view = kwargs.pop('data_view', None) + self.data_url = kwargs.pop('data_url', None) + + if not (self.data_view or self.data_url): + raise ValueError('You must ether specify "data_view" or "data_url".') + + def get_url(self): + """Return url from instance or by reversing :attr:`.data_view`.""" + if self.data_url: + return self.data_url + return reverse_lazy(self.data_view) + + def build_attrs(self, base_attrs, extra_attrs=None): + """Set select2's ajax attributes.""" + attrs = super(HeavySelect2Mixin, self).build_attrs(base_attrs, extra_attrs) + + # encrypt instance Id + self.widget_id = signing.dumps(id(self)) + + attrs['data-field_id'] = self.widget_id + attrs.setdefault('data-ajax--url', self.get_url()) + attrs.setdefault('data-ajax--cache', "true") + attrs.setdefault('data-ajax--type', "GET") + attrs.setdefault('data-minimum-input-length', 2) + + attrs['class'] += ' django-select2-heavy' + return attrs + + def format_value(self, value): + result = super(HeavySelect2Mixin, self).format_value(value) + if isinstance(self.choices, ModelChoiceIterator): + chosen = copy(self.choices) + chosen.queryset = chosen.queryset.filter(pk__in=[ + int(i) for i in result if isinstance(i, int) or i.isdigit() + ]) + self.choices = set(chosen) + return result + + +class HeavySelect2Widget(HeavySelect2Mixin, forms.Select): + """ + Select2 widget with AJAX support. + + Usage example:: + + class MyWidget(HeavySelectWidget): + data_view = 'my_view_name' + + or:: + + class MyForm(forms.Form): + my_field = forms.ChoicesField( + widget=HeavySelectWidget( + data_url='/url/to/json/response' + ) + ) + + """ + + pass + + +class HeavySelect2MultipleWidget(HeavySelect2Mixin, forms.SelectMultiple): + """Select2 multi select widget similar to :class:`.HeavySelect2Widget`.""" + + pass + + +class HeavySelect2TagWidget(Select2TagMixin, HeavySelect2MultipleWidget): + """Select2 tag widget.""" + + pass + + +class AdminSelect2Widget(AdminSelect2Mixin, Select2Widget): + pass + + +class AdminSelect2MultipleWidget(AdminSelect2Mixin, Select2MultipleWidget): + pass + + +class AdminHeavySelect2Widget(AdminSelect2Mixin, HeavySelect2Widget): + pass + + +class AdminHeavySelect2MultipleWidget(AdminSelect2Mixin, HeavySelect2MultipleWidget): + pass diff --git a/locale/ar/LC_MESSAGES/django.po b/locale/ar/LC_MESSAGES/django.po new file mode 100644 index 0000000..0a8ca5d --- /dev/null +++ b/locale/ar/LC_MESSAGES/django.po @@ -0,0 +1,4619 @@ +msgid "" +msgstr "" +"Project-Id-Version: dmoj\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-11-11 21:54+0000\n" +"PO-Revision-Date: 2019-11-11 22:05\n" +"Last-Translator: Icyene\n" +"Language-Team: Arabic, Saudi Arabia\n" +"Language: ar_SA\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=6; plural=(n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5);\n" +"X-Generator: crowdin.com\n" +"X-Crowdin-Project: dmoj\n" +"X-Crowdin-Language: ar-SA\n" +"X-Crowdin-File: django.po\n" + +#: dmoj/settings.py:337 +msgid "German" +msgstr "" + +#: dmoj/settings.py:338 +msgid "English" +msgstr "" + +#: dmoj/settings.py:339 +msgid "Spanish" +msgstr "" + +#: dmoj/settings.py:340 +msgid "French" +msgstr "" + +#: dmoj/settings.py:341 +msgid "Croatian" +msgstr "" + +#: dmoj/settings.py:342 +msgid "Hungarian" +msgstr "" + +#: dmoj/settings.py:343 +msgid "Japanese" +msgstr "" + +#: dmoj/settings.py:344 +msgid "Korean" +msgstr "" + +#: dmoj/settings.py:345 +msgid "Brazilian Portuguese" +msgstr "" + +#: dmoj/settings.py:346 +msgid "Romanian" +msgstr "" + +#: dmoj/settings.py:347 +msgid "Russian" +msgstr "" + +#: dmoj/settings.py:348 +msgid "Serbian (Latin)" +msgstr "" + +#: dmoj/settings.py:349 +msgid "Turkish" +msgstr "" + +#: dmoj/settings.py:350 +msgid "Vietnamese" +msgstr "" + +#: dmoj/settings.py:351 +msgid "Simplified Chinese" +msgstr "" + +#: dmoj/urls.py:54 +msgid "Login" +msgstr "" + +#: dmoj/urls.py:102 templates/base.html:190 +msgid "Home" +msgstr "" + +#: judge/admin/comments.py:40 +#, python-format +msgid "%d comment successfully hidden." +msgid_plural "%d comments successfully hidden." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: judge/admin/comments.py:43 +msgid "Hide comments" +msgstr "" + +#: 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[3] "" +msgstr[4] "" +msgstr[5] "" + +#: judge/admin/comments.py:50 +msgid "Unhide comments" +msgstr "" + +#: judge/admin/comments.py:58 +msgid "Associated page" +msgstr "" + +#: judge/admin/contest.py:29 +msgid "Included contests" +msgstr "" + +#: judge/admin/contest.py:65 templates/contest/contest.html:83 +#: templates/contest/moss.html:43 templates/problem/list.html:206 +#: templates/problem/list.html:221 templates/user/user-problems.html:56 +#: templates/user/user-problems.html:98 +msgid "Problem" +msgstr "" + +#: judge/admin/contest.py:113 +msgid "Settings" +msgstr "" + +#: judge/admin/contest.py:115 +msgid "Scheduling" +msgstr "" + +#: judge/admin/contest.py:116 +msgid "Details" +msgstr "" + +#: judge/admin/contest.py:117 +msgid "Format" +msgstr "" + +#: judge/admin/contest.py:118 templates/contest/ranking-table.html:5 +msgid "Rating" +msgstr "" + +#: judge/admin/contest.py:119 +msgid "Access" +msgstr "" + +#: judge/admin/contest.py:121 judge/admin/problem.py:131 +msgid "Justice" +msgstr "" + +#: judge/admin/contest.py:159 +#, python-format +msgid "%d contest successfully marked as visible." +msgid_plural "%d contests successfully marked as visible." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: judge/admin/contest.py:162 +msgid "Mark contests as visible" +msgstr "" + +#: judge/admin/contest.py:166 +#, 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[4] "" +msgstr[5] "" + +#: judge/admin/contest.py:169 +msgid "Mark contests as hidden" +msgstr "" + +#: judge/admin/contest.py:180 judge/admin/submission.py:149 +#: judge/admin/submission.py:171 +msgid "You do not have the permission to rejudge submissions." +msgstr "" + +#: judge/admin/contest.py:187 judge/admin/submission.py:155 +msgid "You do not have the permission to rejudge THAT many submissions." +msgstr "" + +#: judge/admin/contest.py:194 judge/admin/submission.py:164 +#, 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[4] "" +msgstr[5] "" + +#: judge/admin/contest.py:265 +#, python-format +msgid "%d participation recalculated." +msgid_plural "%d participations recalculated." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: judge/admin/contest.py:268 +msgid "Recalculate results" +msgstr "" + +#: judge/admin/contest.py:272 judge/admin/organization.py:65 +msgid "username" +msgstr "" + +#: judge/admin/contest.py:277 templates/base.html:258 +msgid "virtual" +msgstr "" + +#: judge/admin/interface.py:28 judge/models/interface.py:46 +msgid "link path" +msgstr "" + +#: judge/admin/interface.py:62 +msgid "Content" +msgstr "" + +#: judge/admin/interface.py:63 +msgid "Summary" +msgstr "" + +#: judge/admin/interface.py:107 judge/models/contest.py:251 +#: judge/models/contest.py:355 judge/models/profile.py:189 +msgid "user" +msgstr "" + +#: judge/admin/interface.py:148 +msgid "object" +msgstr "" + +#: judge/admin/organization.py:34 judge/admin/problem.py:171 +#: judge/admin/profile.py:78 +msgid "View on site" +msgstr "" + +#: judge/admin/problem.py:28 +msgid "Describe the changes you made (optional)" +msgstr "" + +#: judge/admin/problem.py:126 +msgid "Social Media" +msgstr "" + +#: judge/admin/problem.py:127 +msgid "Taxonomy" +msgstr "" + +#: judge/admin/problem.py:128 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:58 +msgid "Points" +msgstr "" + +#: judge/admin/problem.py:129 +msgid "Limits" +msgstr "" + +#: judge/admin/problem.py:130 judge/admin/submission.py:232 +#: templates/stats/base.html:14 templates/submission/list.html:328 +msgid "Language" +msgstr "" + +#: judge/admin/problem.py:132 +msgid "History" +msgstr "" + +#: judge/admin/problem.py:168 +msgid "Authors" +msgstr "" + +#: judge/admin/problem.py:183 +#, python-format +msgid "%d problem successfully marked as public." +msgid_plural "%d problems successfully marked as public." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: judge/admin/problem.py:187 +msgid "Mark problems as public" +msgstr "" + +#: judge/admin/problem.py:193 +#, python-format +msgid "%d problem successfully marked as private." +msgid_plural "%d problems successfully marked as private." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: judge/admin/problem.py:197 +msgid "Mark problems as private" +msgstr "" + +#: judge/admin/profile.py:32 +msgid "timezone" +msgstr "" + +#: judge/admin/profile.py:84 judge/admin/submission.py:211 +#: templates/organization/requests/log.html:9 +#: templates/organization/requests/pending.html:12 +#: templates/ticket/list.html:263 +msgid "User" +msgstr "" + +#: judge/admin/profile.py:89 templates/registration/registration_form.html:145 +msgid "Email" +msgstr "" + +#: judge/admin/profile.py:94 judge/views/register.py:29 +#: templates/registration/registration_form.html:173 +#: templates/user/edit-profile.html:99 +msgid "Timezone" +msgstr "" + +#: judge/admin/profile.py:99 +msgid "date joined" +msgstr "" + +#: judge/admin/profile.py:106 +#, python-format +msgid "%d user have scores recalculated." +msgid_plural "%d users have scores recalculated." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: judge/admin/profile.py:109 +msgid "Recalculate scores" +msgstr "" + +#: judge/admin/runtime.py:19 +msgid "Disallowed problems" +msgstr "" + +#: judge/admin/runtime.py:22 +msgid "These problems are NOT allowed to be submitted in this language" +msgstr "" + +#: judge/admin/runtime.py:83 +msgid "Description" +msgstr "" + +#: judge/admin/runtime.py:84 +msgid "Information" +msgstr "" + +#: judge/admin/runtime.py:85 +msgid "Capabilities" +msgstr "" + +#: judge/admin/submission.py:23 judge/admin/submission.py:42 +#: judge/admin/submission.py:221 +msgid "None" +msgstr "" + +#: judge/admin/submission.py:23 +msgid "Not done" +msgstr "" + +#: judge/admin/submission.py:23 +msgid "Exceptional" +msgstr "" + +#: judge/admin/submission.py:42 +msgid "Unaccepted" +msgstr "" + +#: judge/admin/submission.py:89 +#, python-format +msgctxt "contest problem" +msgid "%(problem)s in %(contest)s" +msgstr "" + +#: judge/admin/submission.py:167 +msgid "Rejudge the selected submissions" +msgstr "" + +#: judge/admin/submission.py:193 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] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: judge/admin/submission.py:196 +msgid "Rescore the selected submissions" +msgstr "" + +#: judge/admin/submission.py:200 +msgid "Problem code" +msgstr "" + +#: judge/admin/submission.py:205 +msgid "Problem name" +msgstr "" + +#: judge/admin/submission.py:215 templates/organization/requests/log.html:10 +#: templates/organization/requests/pending.html:13 +msgid "Time" +msgstr "" + +#: judge/admin/submission.py:223 +#, python-format +msgid "%d KB" +msgstr "" + +#: judge/admin/submission.py:225 +#, python-format +msgid "%.2f MB" +msgstr "" + +#: judge/admin/submission.py:227 +msgid "Memory" +msgstr "" + +#: judge/admin/taxon.py:11 judge/admin/taxon.py:34 +msgid "Included problems" +msgstr "" + +#: judge/admin/taxon.py:14 +msgid "These problems are included in this group of problems" +msgstr "" + +#: judge/admin/taxon.py:37 +msgid "These problems are included in this type of problems" +msgstr "" + +#: judge/apps.py:8 +msgid "Online Judge" +msgstr "" + +#: judge/comments.py:41 +msgid "Comment body" +msgstr "" + +#: judge/comments.py:47 judge/views/ticket.py:46 +msgid "Your part is silent, little toad." +msgstr "" + +#: judge/comments.py:50 templates/comments/list.html:131 +msgid "You need to have solved at least one problem before your voice can be heard." +msgstr "" + +#: judge/comments.py:92 +msgid "Posted comment" +msgstr "" + +#: judge/contest_format/atcoder.py:19 +msgid "AtCoder" +msgstr "" + +#: judge/contest_format/default.py:18 +msgid "Default" +msgstr "" + +#: judge/contest_format/ecoo.py:19 +msgid "ECOO" +msgstr "" + +#: judge/contest_format/ioi.py:19 +msgid "IOI" +msgstr "" + +#: judge/forms.py:27 +msgid "Subscribe to contest updates" +msgstr "" + +#: judge/forms.py:28 +msgid "Enable experimental features" +msgstr "" + +#: judge/forms.py:57 judge/views/organization.py:127 +#, python-brace-format +msgid "You may not be part of more than {count} public organizations." +msgstr "" + +#: judge/forms.py:107 judge/views/register.py:26 +#: templates/registration/registration_form.html:139 +#: templates/user/base-users-table.html:5 +msgid "Username" +msgstr "" + +#: judge/forms.py:108 templates/registration/registration_form.html:151 +#: templates/registration/registration_form.html:165 +msgid "Password" +msgstr "" + +#: judge/forms.py:130 +msgid "Two Factor Authentication tokens must be 6 decimal digits." +msgstr "" + +#: judge/forms.py:139 templates/registration/totp_auth.html:32 +msgid "Invalid Two Factor Authentication token." +msgstr "" + +#: judge/forms.py:143 judge/models/problem.py:97 +msgid "Problem code must be ^[a-z0-9]+$" +msgstr "" + +#: judge/forms.py:148 +msgid "Problem with code already exists." +msgstr "" + +#: judge/forms.py:153 judge/models/contest.py:51 +msgid "Contest id must be ^[a-z0-9]+$" +msgstr "" + +#: judge/forms.py:158 +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:59 +msgid "Leave as LaTeX" +msgstr "" + +#: judge/models/choices.py:60 +msgid "SVG with PNG fallback" +msgstr "" + +#: judge/models/choices.py:61 +msgid "MathML only" +msgstr "" + +#: judge/models/choices.py:62 +msgid "MathJax with SVG/PNG fallback" +msgstr "" + +#: judge/models/choices.py:63 +msgid "Detect best quality" +msgstr "" + +#: judge/models/comment.py:25 +msgid "Page code must be ^[pcs]:[a-z0-9]+$|^b:\\d+$" +msgstr "" + +#: judge/models/comment.py:41 +msgid "commenter" +msgstr "" + +#: judge/models/comment.py:42 +msgid "posted time" +msgstr "" + +#: judge/models/comment.py:43 judge/models/comment.py:176 +msgid "associated page" +msgstr "" + +#: judge/models/comment.py:45 +msgid "votes" +msgstr "" + +#: judge/models/comment.py:46 +msgid "body of comment" +msgstr "" + +#: judge/models/comment.py:47 +msgid "hide the comment" +msgstr "" + +#: judge/models/comment.py:48 +msgid "parent" +msgstr "" + +#: judge/models/comment.py:53 +msgid "comment" +msgstr "" + +#: judge/models/comment.py:54 +msgid "comments" +msgstr "" + +#: judge/models/comment.py:136 judge/models/problem.py:406 +#, python-format +msgid "Editorial for %s" +msgstr "" + +#: judge/models/comment.py:171 +msgid "comment vote" +msgstr "" + +#: judge/models/comment.py:172 +msgid "comment votes" +msgstr "" + +#: judge/models/comment.py:181 +msgid "Override comment lock" +msgstr "" + +#: judge/models/contest.py:21 +msgid "Invalid colour." +msgstr "" + +#: judge/models/contest.py:23 +msgid "tag name" +msgstr "" + +#: judge/models/contest.py:24 +msgid "Lowercase letters and hyphens only." +msgstr "" + +#: judge/models/contest.py:25 +msgid "tag colour" +msgstr "" + +#: judge/models/contest.py:26 +msgid "tag description" +msgstr "" + +#: judge/models/contest.py:45 +msgid "contest tag" +msgstr "" + +#: judge/models/contest.py:46 judge/models/contest.py:100 +msgid "contest tags" +msgstr "" + +#: judge/models/contest.py:50 +msgid "contest id" +msgstr "" + +#: judge/models/contest.py:52 +msgid "contest name" +msgstr "" + +#: judge/models/contest.py:53 +msgid "These people will be able to edit the contest." +msgstr "" + +#: judge/models/contest.py:55 judge/models/runtime.py:124 +#: src/dmoj-wpadmin/test_project/apps/books/admin.py:20 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:27 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:27 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:27 +msgid "description" +msgstr "" + +#: judge/models/contest.py:56 judge/models/problem.py:353 +#: judge/models/runtime.py:126 +msgid "problems" +msgstr "" + +#: judge/models/contest.py:57 judge/models/contest.py:252 +msgid "start time" +msgstr "" + +#: judge/models/contest.py:58 +msgid "end time" +msgstr "" + +#: judge/models/contest.py:59 judge/models/problem.py:118 +#: judge/models/problem.py:377 +msgid "time limit" +msgstr "" + +#: judge/models/contest.py:60 judge/models/problem.py:136 +msgid "publicly visible" +msgstr "" + +#: judge/models/contest.py:61 +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:64 +msgid "contest rated" +msgstr "" + +#: judge/models/contest.py:64 +msgid "Whether this contest can be rated." +msgstr "" + +#: judge/models/contest.py:66 +msgid "hide scoreboard" +msgstr "" + +#: judge/models/contest.py:67 +msgid "Whether the scoreboard should remain hidden for the duration of the contest." +msgstr "" + +#: judge/models/contest.py:70 +msgid "no comments" +msgstr "" + +#: judge/models/contest.py:71 +msgid "Use clarification system instead of comments." +msgstr "" + +#: judge/models/contest.py:73 +msgid "Rating floor for contest" +msgstr "" + +#: judge/models/contest.py:75 +msgid "Rating ceiling for contest" +msgstr "" + +#: judge/models/contest.py:77 +msgid "rate all" +msgstr "" + +#: judge/models/contest.py:77 +msgid "Rate all users who joined." +msgstr "" + +#: judge/models/contest.py:78 +msgid "exclude from ratings" +msgstr "" + +#: judge/models/contest.py:80 +msgid "private to specific users" +msgstr "" + +#: judge/models/contest.py:81 +msgid "private contestants" +msgstr "" + +#: judge/models/contest.py:82 +msgid "If private, only these users may see the contest" +msgstr "" + +#: judge/models/contest.py:84 +msgid "hide problem tags" +msgstr "" + +#: judge/models/contest.py:85 +msgid "Whether problem tags should be hidden by default." +msgstr "" + +#: judge/models/contest.py:87 +msgid "run pretests only" +msgstr "" + +#: judge/models/contest.py:88 +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:92 judge/models/problem.py:157 +msgid "private to organizations" +msgstr "" + +#: judge/models/contest.py:93 judge/models/problem.py:155 +#: judge/models/profile.py:76 +msgid "organizations" +msgstr "" + +#: judge/models/contest.py:94 +msgid "If private, only these organizations may see the contest" +msgstr "" + +#: judge/models/contest.py:95 judge/models/problem.py:145 +msgid "OpenGraph image" +msgstr "" + +#: judge/models/contest.py:96 judge/models/profile.py:47 +msgid "Logo override image" +msgstr "" + +#: judge/models/contest.py:98 +msgid "This image will replace the default site logo for users inside the contest." +msgstr "" + +#: judge/models/contest.py:101 +msgid "the amount of live participants" +msgstr "" + +#: judge/models/contest.py:102 +msgid "contest summary" +msgstr "" + +#: judge/models/contest.py:103 judge/models/problem.py:147 +msgid "Plain-text, shown in meta description tag, e.g. for social media." +msgstr "" + +#: judge/models/contest.py:104 judge/models/profile.py:46 +msgid "access code" +msgstr "" + +#: judge/models/contest.py:105 +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:107 judge/models/problem.py:141 +msgid "personae non gratae" +msgstr "" + +#: judge/models/contest.py:108 +msgid "Bans the selected users from joining this contest." +msgstr "" + +#: judge/models/contest.py:109 +msgid "contest format" +msgstr "" + +#: judge/models/contest.py:110 +msgid "The contest format module to use." +msgstr "" + +#: judge/models/contest.py:111 +msgid "contest format configuration" +msgstr "" + +#: judge/models/contest.py:112 +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:233 +msgid "See private contests" +msgstr "" + +#: judge/models/contest.py:234 +msgid "Edit own contests" +msgstr "" + +#: judge/models/contest.py:235 +msgid "Edit all contests" +msgstr "" + +#: judge/models/contest.py:236 +msgid "Clone contest" +msgstr "" + +#: judge/models/contest.py:237 templates/contest/moss.html:74 +msgid "MOSS contest" +msgstr "" + +#: judge/models/contest.py:238 +msgid "Rate contests" +msgstr "" + +#: judge/models/contest.py:239 +msgid "Contest access codes" +msgstr "" + +#: judge/models/contest.py:240 +msgid "Create private contests" +msgstr "" + +#: judge/models/contest.py:242 judge/models/contest.py:320 +#: judge/models/contest.py:356 judge/models/contest.py:378 +#: judge/models/submission.py:83 +msgid "contest" +msgstr "" + +#: judge/models/contest.py:243 +msgid "contests" +msgstr "" + +#: judge/models/contest.py:250 +msgid "associated contest" +msgstr "" + +#: judge/models/contest.py:253 +msgid "score" +msgstr "" + +#: judge/models/contest.py:254 +msgid "cumulative time" +msgstr "" + +#: judge/models/contest.py:255 +msgid "virtual participation id" +msgstr "" + +#: judge/models/contest.py:256 +msgid "0 means non-virtual, otherwise the n-th virtual participation" +msgstr "" + +#: judge/models/contest.py:257 +msgid "contest format specific data" +msgstr "" + +#: judge/models/contest.py:306 +#, python-format +msgid "%s spectating in %s" +msgstr "" + +#: judge/models/contest.py:308 +#, python-format +msgid "%s in %s, v%d" +msgstr "" + +#: judge/models/contest.py:309 +#, python-format +msgid "%s in %s" +msgstr "" + +#: judge/models/contest.py:312 +msgid "contest participation" +msgstr "" + +#: judge/models/contest.py:313 +msgid "contest participations" +msgstr "" + +#: judge/models/contest.py:319 judge/models/contest.py:340 +#: judge/models/contest.py:379 judge/models/problem.py:352 +#: judge/models/problem.py:357 judge/models/problem.py:375 +#: judge/models/problem_data.py:35 +msgid "problem" +msgstr "" + +#: judge/models/contest.py:321 judge/models/contest.py:344 +#: judge/models/problem.py:129 +msgid "points" +msgstr "" + +#: judge/models/contest.py:322 +msgid "partial" +msgstr "" + +#: judge/models/contest.py:323 judge/models/contest.py:345 +msgid "is pretested" +msgstr "" + +#: judge/models/contest.py:324 judge/models/interface.py:43 +msgid "order" +msgstr "" + +#: judge/models/contest.py:325 +msgid "output prefix length override" +msgstr "" + +#: judge/models/contest.py:326 +msgid "Maximum number of submissions for this problem, or 0 for no limit." +msgstr "" + +#: judge/models/contest.py:328 +msgid "Why include a problem you can't submit to?" +msgstr "" + +#: judge/models/contest.py:333 +msgid "contest problem" +msgstr "" + +#: judge/models/contest.py:334 +msgid "contest problems" +msgstr "" + +#: judge/models/contest.py:338 judge/models/submission.py:181 +msgid "submission" +msgstr "" + +#: judge/models/contest.py:342 judge/models/contest.py:357 +msgid "participation" +msgstr "" + +#: judge/models/contest.py:346 +msgid "Whether this submission was ran only on pretests." +msgstr "" + +#: judge/models/contest.py:350 +msgid "contest submission" +msgstr "" + +#: judge/models/contest.py:351 +msgid "contest submissions" +msgstr "" + +#: judge/models/contest.py:359 +msgid "rank" +msgstr "" + +#: judge/models/contest.py:360 +msgid "rating" +msgstr "" + +#: judge/models/contest.py:361 +msgid "volatility" +msgstr "" + +#: judge/models/contest.py:362 +msgid "last rated" +msgstr "" + +#: judge/models/contest.py:366 +msgid "contest rating" +msgstr "" + +#: judge/models/contest.py:367 +msgid "contest ratings" +msgstr "" + +#: judge/models/contest.py:386 +msgid "contest moss result" +msgstr "" + +#: judge/models/contest.py:387 +msgid "contest moss results" +msgstr "" + +#: judge/models/interface.py:24 +msgid "configuration item" +msgstr "" + +#: judge/models/interface.py:25 +msgid "miscellaneous configuration" +msgstr "" + +#: judge/models/interface.py:37 +msgid "navigation item" +msgstr "" + +#: judge/models/interface.py:38 +msgid "navigation bar" +msgstr "" + +#: judge/models/interface.py:44 +msgid "identifier" +msgstr "" + +#: judge/models/interface.py:45 +msgid "label" +msgstr "" + +#: judge/models/interface.py:47 +msgid "highlight regex" +msgstr "" + +#: judge/models/interface.py:48 +msgid "parent item" +msgstr "" + +#: judge/models/interface.py:66 +msgid "post title" +msgstr "" + +#: judge/models/interface.py:67 judge/models/problem.py:395 +msgid "authors" +msgstr "" + +#: judge/models/interface.py:68 +msgid "slug" +msgstr "" + +#: judge/models/interface.py:69 judge/models/problem.py:393 +msgid "public visibility" +msgstr "" + +#: judge/models/interface.py:70 +msgid "sticky" +msgstr "" + +#: judge/models/interface.py:71 +msgid "publish after" +msgstr "" + +#: judge/models/interface.py:72 +msgid "post content" +msgstr "" + +#: judge/models/interface.py:73 +msgid "post summary" +msgstr "" + +#: judge/models/interface.py:74 +msgid "openGraph image" +msgstr "" + +#: judge/models/interface.py:91 +msgid "Edit all posts" +msgstr "" + +#: judge/models/interface.py:93 +msgid "blog post" +msgstr "" + +#: judge/models/interface.py:94 +msgid "blog posts" +msgstr "" + +#: judge/models/message.py:11 +msgid "message title" +msgstr "" + +#: judge/models/message.py:12 judge/models/ticket.py:29 +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:26 +msgid "problem category ID" +msgstr "" + +#: judge/models/problem.py:27 +msgid "problem category name" +msgstr "" + +#: judge/models/problem.py:34 +msgid "problem type" +msgstr "" + +#: judge/models/problem.py:35 judge/models/problem.py:113 +msgid "problem types" +msgstr "" + +#: judge/models/problem.py:39 +msgid "problem group ID" +msgstr "" + +#: judge/models/problem.py:40 +msgid "problem group name" +msgstr "" + +#: judge/models/problem.py:47 judge/models/problem.py:116 +msgid "problem group" +msgstr "" + +#: judge/models/problem.py:48 +msgid "problem groups" +msgstr "" + +#: judge/models/problem.py:52 +msgid "key" +msgstr "" + +#: judge/models/problem.py:54 +msgid "link" +msgstr "" + +#: judge/models/problem.py:55 +msgid "full name" +msgstr "" + +#: judge/models/problem.py:56 judge/models/profile.py:32 +#: judge/models/runtime.py:23 +msgid "short name" +msgstr "" + +#: judge/models/problem.py:57 +msgid "Displayed on pages under this license" +msgstr "" + +#: judge/models/problem.py:58 +msgid "icon" +msgstr "" + +#: judge/models/problem.py:58 +msgid "URL to the icon" +msgstr "" + +#: judge/models/problem.py:59 +msgid "license text" +msgstr "" + +#: judge/models/problem.py:68 +msgid "license" +msgstr "" + +#: judge/models/problem.py:69 +msgid "licenses" +msgstr "" + +#: judge/models/problem.py:96 +msgid "problem code" +msgstr "" + +#: judge/models/problem.py:98 +msgid "A short, unique code for the problem, used in the url after /problem/" +msgstr "" + +#: judge/models/problem.py:100 +msgid "problem name" +msgstr "" + +#: judge/models/problem.py:101 +msgid "The full name of the problem, as shown in the problem list." +msgstr "" + +#: judge/models/problem.py:103 +msgid "problem body" +msgstr "" + +#: judge/models/problem.py:104 +msgid "creators" +msgstr "" + +#: judge/models/problem.py:105 +msgid "These users will be able to edit the problem, and be listed as authors." +msgstr "" + +#: judge/models/problem.py:107 +msgid "curators" +msgstr "" + +#: judge/models/problem.py:108 +msgid "These users will be able to edit the problem, but not be listed as authors." +msgstr "" + +#: judge/models/problem.py:110 +msgid "testers" +msgstr "" + +#: judge/models/problem.py:112 +msgid "These users will be able to view the private problem, but not edit it." +msgstr "" + +#: judge/models/problem.py:114 +msgid "The type of problem, as shown on the problem's page." +msgstr "" + +#: judge/models/problem.py:117 +msgid "The group of problem, shown under Category in the problem list." +msgstr "" + +#: judge/models/problem.py:119 +msgid "The time limit for this problem, in seconds. Fractional seconds (e.g. 1.5) are supported." +msgstr "" + +#: judge/models/problem.py:123 judge/models/problem.py:380 +msgid "memory limit" +msgstr "" + +#: judge/models/problem.py:124 +msgid "The memory limit for this problem, in kilobytes (e.g. 64mb = 65536 kilobytes)." +msgstr "" + +#: judge/models/problem.py:130 +msgid "Points awarded for problem completion. Points are displayed with a 'p' suffix if partial." +msgstr "" + +#: judge/models/problem.py:133 +msgid "allows partial points" +msgstr "" + +#: judge/models/problem.py:134 +msgid "allowed languages" +msgstr "" + +#: judge/models/problem.py:135 +msgid "List of allowed submission languages." +msgstr "" + +#: judge/models/problem.py:137 +msgid "manually managed" +msgstr "" + +#: judge/models/problem.py:138 +msgid "Whether judges should be allowed to manage data or not." +msgstr "" + +#: judge/models/problem.py:139 +msgid "date of publishing" +msgstr "" + +#: judge/models/problem.py:140 +msgid "Doesn't have magic ability to auto-publish due to backward compatibility" +msgstr "" + +#: judge/models/problem.py:142 +msgid "Bans the selected users from submitting to this problem." +msgstr "" + +#: judge/models/problem.py:144 +msgid "The license under which this problem is published." +msgstr "" + +#: judge/models/problem.py:146 +msgid "problem summary" +msgstr "" + +#: judge/models/problem.py:148 +msgid "number of users" +msgstr "" + +#: judge/models/problem.py:149 +msgid "The number of users who solved the problem." +msgstr "" + +#: judge/models/problem.py:150 +msgid "solve rate" +msgstr "" + +#: judge/models/problem.py:156 +msgid "If private, only these organizations may see the problem." +msgstr "" + +#: judge/models/problem.py:358 judge/models/problem.py:376 +#: judge/models/runtime.py:99 +msgid "language" +msgstr "" + +#: judge/models/problem.py:359 +msgid "translated name" +msgstr "" + +#: judge/models/problem.py:360 +msgid "translated description" +msgstr "" + +#: judge/models/problem.py:364 +msgid "problem translation" +msgstr "" + +#: judge/models/problem.py:365 +msgid "problem translations" +msgstr "" + +#: judge/models/problem.py:369 +msgid "clarified problem" +msgstr "" + +#: judge/models/problem.py:370 +msgid "clarification body" +msgstr "" + +#: judge/models/problem.py:371 +msgid "clarification timestamp" +msgstr "" + +#: judge/models/problem.py:386 +msgid "language-specific resource limit" +msgstr "" + +#: judge/models/problem.py:387 +msgid "language-specific resource limits" +msgstr "" + +#: judge/models/problem.py:391 +msgid "associated problem" +msgstr "" + +#: judge/models/problem.py:394 +msgid "publish date" +msgstr "" + +#: judge/models/problem.py:396 +msgid "editorial content" +msgstr "" + +#: judge/models/problem.py:412 +msgid "solution" +msgstr "" + +#: judge/models/problem.py:413 +msgid "solutions" +msgstr "" + +#: judge/models/problem_data.py:23 +msgid "Standard" +msgstr "" + +#: judge/models/problem_data.py:24 +msgid "Floats" +msgstr "" + +#: judge/models/problem_data.py:25 +msgid "Floats (absolute)" +msgstr "" + +#: judge/models/problem_data.py:26 +msgid "Floats (relative)" +msgstr "" + +#: judge/models/problem_data.py:27 +msgid "Non-trailing spaces" +msgstr "" + +#: judge/models/problem_data.py:28 +msgid "Unordered" +msgstr "" + +#: judge/models/problem_data.py:29 +msgid "Byte identical" +msgstr "" + +#: 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:39 +msgid "generator file" +msgstr "" + +#: judge/models/problem_data.py:41 judge/models/problem_data.py:90 +msgid "output prefix length" +msgstr "" + +#: judge/models/problem_data.py:42 judge/models/problem_data.py:91 +msgid "output limit length" +msgstr "" + +#: judge/models/problem_data.py:43 +msgid "init.yml generation feedback" +msgstr "" + +#: judge/models/problem_data.py:44 judge/models/problem_data.py:92 +msgid "checker" +msgstr "" + +#: judge/models/problem_data.py:45 judge/models/problem_data.py:93 +msgid "checker arguments" +msgstr "" + +#: 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:77 +msgid "problem data set" +msgstr "" + +#: judge/models/problem_data.py:79 +msgid "case position" +msgstr "" + +#: judge/models/problem_data.py:80 +msgid "case type" +msgstr "" + +#: judge/models/problem_data.py:81 +msgid "Normal case" +msgstr "" + +#: judge/models/problem_data.py:82 +msgid "Batch start" +msgstr "" + +#: judge/models/problem_data.py:83 +msgid "Batch end" +msgstr "" + +#: judge/models/problem_data.py:85 +msgid "input file name" +msgstr "" + +#: judge/models/problem_data.py:86 +msgid "output file name" +msgstr "" + +#: judge/models/problem_data.py:87 +msgid "generator arguments" +msgstr "" + +#: judge/models/problem_data.py:88 +msgid "point value" +msgstr "" + +#: judge/models/problem_data.py:89 +msgid "case is pretest?" +msgstr "" + +#: judge/models/profile.py:29 +msgid "organization title" +msgstr "" + +#: judge/models/profile.py:30 +msgid "organization slug" +msgstr "" + +#: judge/models/profile.py:31 +msgid "Organization name shown in URL" +msgstr "" + +#: judge/models/profile.py:33 +msgid "Displayed beside user name during contests" +msgstr "" + +#: judge/models/profile.py:34 +msgid "organization description" +msgstr "" + +#: judge/models/profile.py:35 +msgid "registrant" +msgstr "" + +#: judge/models/profile.py:36 +msgid "User who registered this organization" +msgstr "" + +#: judge/models/profile.py:37 +msgid "administrators" +msgstr "" + +#: judge/models/profile.py:38 +msgid "Those who can edit this organization" +msgstr "" + +#: judge/models/profile.py:39 +msgid "creation date" +msgstr "" + +#: judge/models/profile.py:40 +msgid "is open organization?" +msgstr "" + +#: judge/models/profile.py:41 +msgid "Allow joining organization" +msgstr "" + +#: judge/models/profile.py:42 +msgid "maximum size" +msgstr "" + +#: judge/models/profile.py:43 +msgid "Maximum amount of users in this organization, only applicable to private organizations" +msgstr "" + +#: judge/models/profile.py:45 +msgid "Student access code" +msgstr "" + +#: judge/models/profile.py:49 +msgid "This image will replace the default site logo for users viewing the organization." +msgstr "" + +#: judge/models/profile.py:75 judge/models/profile.py:91 +#: judge/models/profile.py:190 +msgid "organization" +msgstr "" + +#: judge/models/profile.py:80 +msgid "user associated" +msgstr "" + +#: judge/models/profile.py:81 +msgid "self-description" +msgstr "" + +#: judge/models/profile.py:82 +msgid "location" +msgstr "" + +#: judge/models/profile.py:84 +msgid "preferred language" +msgstr "" + +#: judge/models/profile.py:89 +msgid "last access time" +msgstr "" + +#: judge/models/profile.py:90 +msgid "last IP" +msgstr "" + +#: judge/models/profile.py:93 +msgid "display rank" +msgstr "" + +#: judge/models/profile.py:95 +msgid "comment mute" +msgstr "" + +#: judge/models/profile.py:95 +msgid "Some users are at their best when silent." +msgstr "" + +#: judge/models/profile.py:97 +msgid "unlisted user" +msgstr "" + +#: judge/models/profile.py:97 +msgid "User will not be ranked." +msgstr "" + +#: judge/models/profile.py:100 +msgid "user script" +msgstr "" + +#: judge/models/profile.py:101 +msgid "User-defined JavaScript for site customization." +msgstr "" + +#: judge/models/profile.py:102 +msgid "current contest" +msgstr "" + +#: judge/models/profile.py:104 +msgid "math engine" +msgstr "" + +#: judge/models/profile.py:106 +msgid "the rendering engine used to render math" +msgstr "" + +#: judge/models/profile.py:107 +msgid "2FA enabled" +msgstr "" + +#: judge/models/profile.py:108 +msgid "check to enable TOTP-based two factor authentication" +msgstr "" + +#: judge/models/profile.py:109 +msgid "TOTP key" +msgstr "" + +#: judge/models/profile.py:110 +msgid "32 character base32-encoded key for TOTP" +msgstr "" + +#: judge/models/profile.py:112 +msgid "TOTP key must be empty or base32" +msgstr "" + +#: judge/models/profile.py:113 +msgid "internal notes" +msgstr "" + +#: judge/models/profile.py:114 +msgid "Notes for administrators regarding this user." +msgstr "" + +#: judge/models/profile.py:184 +msgid "user profile" +msgstr "" + +#: judge/models/profile.py:185 +msgid "user profiles" +msgstr "" + +#: judge/models/profile.py:192 +msgid "request time" +msgstr "" + +#: judge/models/profile.py:193 +msgid "state" +msgstr "" + +#: judge/models/profile.py:198 +msgid "reason" +msgstr "" + +#: judge/models/profile.py:201 +msgid "organization join request" +msgstr "" + +#: judge/models/profile.py:202 +msgid "organization join requests" +msgstr "" + +#: judge/models/runtime.py:18 +msgid "short identifier" +msgstr "" + +#: judge/models/runtime.py:19 +msgid "The identifier for this language; the same as its executor id for judges." +msgstr "" + +#: judge/models/runtime.py:21 +msgid "long name" +msgstr "" + +#: judge/models/runtime.py:22 +msgid "Longer name for the language, e.g. \"Python 2\" or \"C++11\"." +msgstr "" + +#: judge/models/runtime.py:24 +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:28 +msgid "common name" +msgstr "" + +#: judge/models/runtime.py:29 +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:31 +msgid "ace mode name" +msgstr "" + +#: judge/models/runtime.py:32 +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:34 +msgid "pygments name" +msgstr "" + +#: judge/models/runtime.py:35 +msgid "Language ID for Pygments highlighting in source windows." +msgstr "" + +#: judge/models/runtime.py:36 +msgid "code template" +msgstr "" + +#: judge/models/runtime.py:37 +msgid "Code template to display in submission editor." +msgstr "" + +#: judge/models/runtime.py:38 +msgid "runtime info override" +msgstr "" + +#: judge/models/runtime.py:39 +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:41 +msgid "language description" +msgstr "" + +#: judge/models/runtime.py:42 +msgid "Use field this to inform users of quirks with your environment, additional restrictions, etc." +msgstr "" + +#: judge/models/runtime.py:44 +msgid "extension" +msgstr "" + +#: judge/models/runtime.py:45 +msgid "The extension of source files, e.g., \"py\" or \"cpp\"." +msgstr "" + +#: judge/models/runtime.py:100 +msgid "languages" +msgstr "" + +#: judge/models/runtime.py:104 +msgid "language to which this runtime belongs" +msgstr "" + +#: judge/models/runtime.py:105 +msgid "judge on which this runtime exists" +msgstr "" + +#: judge/models/runtime.py:106 +msgid "runtime name" +msgstr "" + +#: judge/models/runtime.py:107 +msgid "runtime version" +msgstr "" + +#: judge/models/runtime.py:108 +msgid "order in which to display this runtime" +msgstr "" + +#: judge/models/runtime.py:112 +msgid "Server name, hostname-style" +msgstr "" + +#: judge/models/runtime.py:113 +msgid "time of creation" +msgstr "" + +#: judge/models/runtime.py:114 +msgid "A key to authenticated this judge" +msgstr "" + +#: judge/models/runtime.py:115 +msgid "authentication key" +msgstr "" + +#: judge/models/runtime.py:116 +msgid "block judge" +msgstr "" + +#: judge/models/runtime.py:117 +msgid "Whether this judge should be blocked from connecting, even if its key is correct." +msgstr "" + +#: judge/models/runtime.py:119 +msgid "judge online status" +msgstr "" + +#: judge/models/runtime.py:120 +msgid "judge start time" +msgstr "" + +#: judge/models/runtime.py:121 +msgid "response time" +msgstr "" + +#: judge/models/runtime.py:122 +msgid "system load" +msgstr "" + +#: judge/models/runtime.py:123 +msgid "Load for the last minute, divided by processors to be fair." +msgstr "" + +#: judge/models/runtime.py:127 judge/models/runtime.py:167 +msgid "judges" +msgstr "" + +#: judge/models/runtime.py:166 +msgid "judge" +msgstr "" + +#: judge/models/submission.py:20 judge/models/submission.py:47 +#: judge/utils/problems.py:86 +msgid "Accepted" +msgstr "" + +#: judge/models/submission.py:21 judge/models/submission.py:48 +msgid "Wrong Answer" +msgstr "" + +#: judge/models/submission.py:22 judge/models/submission.py:50 +msgid "Time Limit Exceeded" +msgstr "" + +#: judge/models/submission.py:23 judge/models/submission.py:51 +msgid "Memory Limit Exceeded" +msgstr "" + +#: judge/models/submission.py:24 judge/models/submission.py:52 +msgid "Output Limit Exceeded" +msgstr "" + +#: judge/models/submission.py:25 judge/models/submission.py:53 +msgid "Invalid Return" +msgstr "" + +#: judge/models/submission.py:26 judge/models/submission.py:54 +msgid "Runtime Error" +msgstr "" + +#: judge/models/submission.py:27 judge/models/submission.py:41 +#: judge/models/submission.py:55 judge/utils/problems.py:88 +msgid "Compile Error" +msgstr "" + +#: judge/models/submission.py:28 judge/models/submission.py:40 +msgid "Internal Error" +msgstr "" + +#: judge/models/submission.py:29 +msgid "Short circuit" +msgstr "" + +#: judge/models/submission.py:30 judge/models/submission.py:42 +#: judge/models/submission.py:61 +msgid "Aborted" +msgstr "" + +#: judge/models/submission.py:36 judge/models/submission.py:57 +msgid "Queued" +msgstr "" + +#: judge/models/submission.py:37 judge/models/submission.py:58 +msgid "Processing" +msgstr "" + +#: judge/models/submission.py:38 judge/models/submission.py:59 +msgid "Grading" +msgstr "" + +#: judge/models/submission.py:39 judge/models/submission.py:60 +msgid "Completed" +msgstr "" + +#: judge/models/submission.py:56 +msgid "Internal Error (judging server error)" +msgstr "" + +#: judge/models/submission.py:66 +msgid "submission time" +msgstr "" + +#: judge/models/submission.py:67 judge/models/submission.py:201 +msgid "execution time" +msgstr "" + +#: judge/models/submission.py:68 judge/models/submission.py:202 +msgid "memory usage" +msgstr "" + +#: judge/models/submission.py:69 judge/models/submission.py:203 +msgid "points granted" +msgstr "" + +#: judge/models/submission.py:70 +msgid "submission language" +msgstr "" + +#: judge/models/submission.py:71 +msgid "status" +msgstr "" + +#: judge/models/submission.py:72 +msgid "result" +msgstr "" + +#: judge/models/submission.py:74 +msgid "compile errors" +msgstr "" + +#: judge/models/submission.py:76 +msgid "batched cases" +msgstr "" + +#: judge/models/submission.py:77 +msgid "test case points" +msgstr "" + +#: judge/models/submission.py:78 +msgid "test case total points" +msgstr "" + +#: judge/models/submission.py:79 +msgid "judged on" +msgstr "" + +#: judge/models/submission.py:81 +msgid "was rejudged by admin" +msgstr "" + +#: judge/models/submission.py:82 +msgid "was ran on pretests only" +msgstr "" + +#: judge/models/submission.py:182 templates/contest/moss.html:58 +msgid "submissions" +msgstr "" + +#: judge/models/submission.py:186 judge/models/submission.py:197 +msgid "associated submission" +msgstr "" + +#: judge/models/submission.py:188 +msgid "source code" +msgstr "" + +#: judge/models/submission.py:199 +msgid "test case ID" +msgstr "" + +#: judge/models/submission.py:200 +msgid "status flag" +msgstr "" + +#: judge/models/submission.py:204 +msgid "points possible" +msgstr "" + +#: judge/models/submission.py:205 +msgid "batch number" +msgstr "" + +#: judge/models/submission.py:206 +msgid "judging feedback" +msgstr "" + +#: judge/models/submission.py:207 +msgid "extended judging feedback" +msgstr "" + +#: judge/models/submission.py:208 +msgid "program output" +msgstr "" + +#: judge/models/submission.py:216 +msgid "submission test case" +msgstr "" + +#: judge/models/submission.py:217 +msgid "submission test cases" +msgstr "" + +#: judge/models/ticket.py:10 +msgid "ticket title" +msgstr "" + +#: judge/models/ticket.py:11 +msgid "ticket creator" +msgstr "" + +#: judge/models/ticket.py:13 +msgid "creation time" +msgstr "" + +#: judge/models/ticket.py:14 +msgid "assignees" +msgstr "" + +#: judge/models/ticket.py:15 +msgid "quick notes" +msgstr "" + +#: judge/models/ticket.py:16 +msgid "Staff notes for this issue to aid in processing." +msgstr "" + +#: judge/models/ticket.py:17 +msgid "linked item type" +msgstr "" + +#: judge/models/ticket.py:19 +msgid "linked item ID" +msgstr "" + +#: judge/models/ticket.py:21 +msgid "is ticket open?" +msgstr "" + +#: judge/models/ticket.py:25 +msgid "ticket" +msgstr "" + +#: judge/models/ticket.py:27 +msgid "poster" +msgstr "" + +#: judge/models/ticket.py:30 +msgid "message time" +msgstr "" + +#: judge/pdf_problems.py:134 judge/pdf_problems.py:186 +#: judge/pdf_problems.py:246 +msgid "Page [page] of [topage]" +msgstr "" + +#: judge/tasks/moss.py:25 +msgid "Running MOSS" +msgstr "" + +#: judge/tasks/submission.py:43 +msgid "Modifying submissions" +msgstr "" + +#: judge/tasks/submission.py:56 +msgid "Recalculating user points" +msgstr "" + +#: judge/utils/problem_data.py:63 +msgid "Empty batches not allowed." +msgstr "" + +#: 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 +#, python-format +msgid "Input file for case %d does not exist: %s" +msgstr "" + +#: 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 +#, python-format +msgid "Batch start case #%d requires points." +msgstr "" + +#: 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 +msgid "How did you corrupt the zip path?" +msgstr "" + +#: judge/utils/problem_data.py:160 +msgid "How did you corrupt the generator path?" +msgstr "" + +#: judge/utils/problems.py:76 +msgid "Can't pass both queryset and keyword filters" +msgstr "" + +#: judge/utils/problems.py:87 +msgid "Wrong" +msgstr "" + +#: judge/utils/problems.py:89 +msgid "Timeout" +msgstr "" + +#: judge/utils/problems.py:90 +msgid "Error" +msgstr "" + +#: 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/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] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: 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] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: judge/utils/timedelta.py:61 +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: judge/utils/timedelta.py:63 +msgctxt "hours and minutes" +msgid "%h:%m" +msgstr "" + +#: judge/views/blog.py:38 +#, python-format +msgid "Page %d of Posts" +msgstr "" + +#: judge/views/comment.py:27 +msgid "Messing around, are we?" +msgstr "" + +#: judge/views/comment.py:36 +msgid "You must solve at least one problem before you can vote." +msgstr "" + +#: judge/views/comment.py:63 +msgid "You already voted." +msgstr "" + +#: judge/views/comment.py:120 judge/views/organization.py:299 +msgid "Edited from site" +msgstr "" + +#: judge/views/comment.py:141 +msgid "Editing comment" +msgstr "" + +#: judge/views/contests.py:49 judge/views/contests.py:211 +#: judge/views/contests.py:214 judge/views/contests.py:385 +msgid "No such contest" +msgstr "" + +#: judge/views/contests.py:50 judge/views/contests.py:212 +#, python-format +msgid "Could not find a contest with the key \"%s\"." +msgstr "" + +#: judge/views/contests.py:75 +msgid "Contests" +msgstr "" + +#: judge/views/contests.py:215 +msgid "Could not find such contest." +msgstr "" + +#: judge/views/contests.py:218 +#, python-format +msgid "Access to contest \"%s\" denied" +msgstr "" + +#: judge/views/contests.py:242 +msgid "Clone Contest" +msgstr "" + +#: judge/views/contests.py:305 +msgid "Contest not ongoing" +msgstr "" + +#: judge/views/contests.py:306 +#, python-format +msgid "\"%s\" is not currently ongoing." +msgstr "" + +#: judge/views/contests.py:310 +msgid "Already in contest" +msgstr "" + +#: judge/views/contests.py:311 +#, python-format +msgid "You are already in a contest: \"%s\"." +msgstr "" + +#: judge/views/contests.py:314 +msgid "Banned from joining" +msgstr "" + +#: judge/views/contests.py:315 +msgid "You have been declared persona non grata for this contest. You are permanently barred from joining this contest." +msgstr "" + +#: judge/views/contests.py:375 +#, python-format +msgid "Enter access code for \"%s\"" +msgstr "" + +#: judge/views/contests.py:386 +#, python-format +msgid "You are not in contest \"%s\"." +msgstr "" + +#: judge/views/contests.py:405 +msgid "ContestCalendar requires integer year and month" +msgstr "" + +#: judge/views/contests.py:445 +#, python-format +msgid "Contests in %(month)s" +msgstr "" + +#: judge/views/contests.py:445 +msgid "F Y" +msgstr "" + +#: judge/views/contests.py:531 +msgid "???" +msgstr "" + +#: judge/views/contests.py:594 +#, python-format +msgid "%s Rankings" +msgstr "" + +#: judge/views/contests.py:610 +#, python-format +msgid "Your participation in %s" +msgstr "" + +#: judge/views/contests.py:611 +#, python-format +msgid "%s's participation in %s" +msgstr "" + +#: judge/views/contests.py:615 +msgid "Live" +msgstr "" + +#: judge/views/contests.py:627 templates/contest/contest-tabs.html:13 +msgid "Participation" +msgstr "" + +#: judge/views/contests.py:654 +#, python-format +msgid "%s MOSS Results" +msgstr "" + +#: judge/views/contests.py:681 +#, python-format +msgid "Running MOSS for %s..." +msgstr "" + +#: judge/views/contests.py:704 +#, python-format +msgid "Contest tag: %s" +msgstr "" + +#: judge/views/error.py:14 +msgid "404 error" +msgstr "" + +#: judge/views/error.py:15 +#, python-format +msgid "Could not find page \"%s\"" +msgstr "" + +#: judge/views/error.py:22 +#, python-format +msgid "no permission for %s" +msgstr "" + +#: 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 +msgid "Runtimes" +msgstr "" + +#: judge/views/organization.py:44 judge/views/organization.py:47 +msgid "No such organization" +msgstr "" + +#: judge/views/organization.py:45 +#, python-format +msgid "Could not find an organization with the key \"%s\"." +msgstr "" + +#: judge/views/organization.py:48 +msgid "Could not find such organization." +msgstr "" + +#: judge/views/organization.py:72 judge/views/register.py:34 +#: templates/organization/list.html:15 templates/user/user-list-tabs.html:5 +msgid "Organizations" +msgstr "" + +#: judge/views/organization.py:93 +#, python-format +msgid "%s Members" +msgstr "" + +#: judge/views/organization.py:118 judge/views/organization.py:121 +#: judge/views/organization.py:126 +msgid "Joining organization" +msgstr "" + +#: judge/views/organization.py:118 +msgid "You are already in the organization." +msgstr "" + +#: judge/views/organization.py:121 +msgid "This organization is not open." +msgstr "" + +#: judge/views/organization.py:138 +msgid "Leaving organization" +msgstr "" + +#: judge/views/organization.py:138 +#, python-format +msgid "You are not in \"%s\"." +msgstr "" + +#: judge/views/organization.py:162 +#, python-format +msgid "Request to join %s" +msgstr "" + +#: judge/views/organization.py:180 +msgid "Join request detail" +msgstr "" + +#: judge/views/organization.py:209 +#, python-format +msgid "Managing join requests for %s" +msgstr "" + +#: judge/views/organization.py:240 +#, python-format +msgid "Your organization can only receive %d more members. You cannot approve %d users." +msgstr "" + +#: judge/views/organization.py:252 +#, python-format +msgid "Approved %d user." +msgid_plural "Approved %d users." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: judge/views/organization.py:253 +#, python-format +msgid "Rejected %d user." +msgid_plural "Rejected %d users." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: judge/views/organization.py:283 +#, python-format +msgid "Editing %s" +msgstr "" + +#: judge/views/organization.py:307 judge/views/organization.py:315 +msgid "Can't edit organization" +msgstr "" + +#: judge/views/organization.py:308 +msgid "You are not allowed to edit this organization." +msgstr "" + +#: judge/views/organization.py:316 +msgid "You are not allowed to kick people from this organization." +msgstr "" + +#: judge/views/organization.py:321 judge/views/organization.py:325 +msgid "Can't kick user" +msgstr "" + +#: judge/views/organization.py:322 +msgid "The user you are trying to kick does not exist!" +msgstr "" + +#: judge/views/organization.py:326 +#, python-format +msgid "The user you are trying to kick is not in organization: %s." +msgstr "" + +#: judge/views/problem.py:68 +msgid "No such problem" +msgstr "" + +#: judge/views/problem.py:69 +#, python-format +msgid "Could not find a problem with the code \"%s\"." +msgstr "" + +#: judge/views/problem.py:111 +#, python-brace-format +msgid "Editorial for {0}" +msgstr "" + +#: judge/views/problem.py:114 +#, python-brace-format +msgid "Editorial for {0}" +msgstr "" + +#: judge/views/problem.py:285 templates/contest/contest.html:79 +#: templates/user/user-tabs.html:5 templates/user/users-table.html:23 +msgid "Problems" +msgstr "" + +#: judge/views/problem.py:546 +msgid "Banned from submitting" +msgstr "" + +#: judge/views/problem.py:547 +msgid "You have been declared persona non grata for this problem. You are permanently barred from submitting this problem." +msgstr "" + +#: judge/views/problem.py:560 +msgid "Too many submissions" +msgstr "" + +#: judge/views/problem.py:561 +msgid "You have exceeded the submission limit for this problem." +msgstr "" + +#: judge/views/problem.py:627 judge/views/problem.py:630 +#, python-format +msgid "Submit to %(problem)s" +msgstr "" + +#: judge/views/problem.py:646 +msgid "Clone Problem" +msgstr "" + +#: judge/views/problem_data.py:37 +msgid "Checker arguments must be a JSON object" +msgstr "" + +#: judge/views/problem_data.py:39 +msgid "Checker arguments is invalid JSON" +msgstr "" + +#: judge/views/problem_data.py:46 +msgid "Your zip file is invalid!" +msgstr "" + +#: judge/views/problem_data.py:104 +#, python-brace-format +msgid "Comparing submissions for {0}" +msgstr "" + +#: judge/views/problem_data.py:107 +#, python-brace-format +msgid "Comparing submissions for {0}" +msgstr "" + +#: judge/views/problem_data.py:142 +#, python-brace-format +msgid "Editing data for {0}" +msgstr "" + +#: judge/views/problem_data.py:145 +#, python-format +msgid "Editing data for %s" +msgstr "" + +#: judge/views/problem_data.py:237 judge/views/problem_data.py:238 +#, python-format +msgid "Generated init.yml for %s" +msgstr "" + +#: 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] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: judge/views/ranked_submission.py:58 +#, python-format +msgid "Best solutions for %s" +msgstr "" + +#: judge/views/ranked_submission.py:61 +#, python-brace-format +msgid "Best solutions for {0}" +msgstr "" + +#: judge/views/ranked_submission.py:71 +#, python-format +msgid "Best solutions for %(problem)s in %(contest)s" +msgstr "" + +#: judge/views/ranked_submission.py:74 +#, python-format +msgid "Best solutions for problem %(number)s in %(contest)s" +msgstr "" + +#: judge/views/ranked_submission.py:80 +#, python-brace-format +msgid "Best solutions for {0} in {2}" +msgstr "" + +#: judge/views/ranked_submission.py:83 +#, python-brace-format +msgid "Best solutions for problem {0} in {1}" +msgstr "" + +#: judge/views/register.py:27 +msgid "A username must contain letters, numbers, or underscores" +msgstr "" + +#: judge/views/register.py:31 templates/user/edit-profile.html:103 +msgid "Preferred language" +msgstr "" + +#: judge/views/register.py:38 +msgid "Subscribe to newsletter?" +msgstr "" + +#: judge/views/register.py:45 +#, python-format +msgid "The email address \"%s\" is already taken. Only one registration is allowed per address." +msgstr "" + +#: judge/views/register.py:51 +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 +msgid "Registration" +msgstr "" + +#: judge/views/register.py:106 +msgid "Authentication failure" +msgstr "" + +#: judge/views/stats.py:105 +msgid "Language statistics" +msgstr "" + +#: judge/views/status.py:24 templates/submission/list.html:319 +msgid "Status" +msgstr "" + +#: judge/views/status.py:108 +msgid "Version matrix" +msgstr "" + +#: judge/views/submission.py:59 judge/views/submission.py:66 +#, python-format +msgid "Submission of %(problem)s by %(user)s" +msgstr "" + +#: judge/views/submission.py:161 judge/views/submission.py:162 +#: templates/problem/problem.html:127 +msgid "All submissions" +msgstr "" + +#: judge/views/submission.py:303 +msgid "All my submissions" +msgstr "" + +#: judge/views/submission.py:304 +#, python-format +msgid "All submissions by %s" +msgstr "" + +#: judge/views/submission.py:335 +#, python-format +msgid "All submissions for %s" +msgstr "" + +#: judge/views/submission.py:354 +msgid "Must pass a problem" +msgstr "" + +#: judge/views/submission.py:397 +#, python-format +msgid "My submissions for %(problem)s" +msgstr "" + +#: judge/views/submission.py:398 +#, python-format +msgid "%(user)s's submissions for %(problem)s" +msgstr "" + +#: judge/views/submission.py:495 +msgid "Must pass a contest" +msgstr "" + +#: judge/views/submission.py:514 +#, python-brace-format +msgid "{0}'s submissions for {2} in {4}" +msgstr "" + +#: judge/views/submission.py:519 +#, 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 "" + +#: judge/views/ticket.py:40 +msgid "Issue description" +msgstr "" + +#: judge/views/ticket.py:85 judge/views/ticket.py:88 +#, python-format +msgid "New ticket for %s" +msgstr "" + +#: judge/views/ticket.py:139 +#, python-format +msgid "%(title)s - Ticket %(id)d" +msgstr "" + +#: judge/views/ticket.py:248 +#, python-format +msgid "Tickets - Page %(number)d of %(total)d" +msgstr "" + +#: judge/views/ticket.py:297 +#, python-format +msgid "New Ticket: %s" +msgstr "" + +#: judge/views/ticket.py:298 +#, python-format +msgid "#%(id)d, assigned to: %(users)s" +msgstr "" + +#: judge/views/ticket.py:300 +msgid ", " +msgstr "" + +#: judge/views/ticket.py:300 +msgid "no one" +msgstr "" + +#: judge/views/totp.py:42 templates/registration/totp_enable.html:86 +msgid "Enable Two Factor Authentication" +msgstr "" + +#: judge/views/totp.py:89 templates/registration/totp_disable.html:48 +msgid "Disable Two Factor Authentication" +msgstr "" + +#: judge/views/totp.py:103 +msgid "Perform Two Factor Authentication" +msgstr "" + +#: judge/views/user.py:68 +msgid "No such user" +msgstr "" + +#: judge/views/user.py:68 +#, python-format +msgid "No user handle \"%s\"." +msgstr "" + +#: judge/views/user.py:72 +msgid "My account" +msgstr "" + +#: judge/views/user.py:73 +#, python-format +msgid "User %s" +msgstr "" + +#: judge/views/user.py:136 +msgid "M j, Y, G:i" +msgstr "" + +#: judge/views/user.py:221 +msgid "Updated on site" +msgstr "" + +#: judge/views/user.py:253 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:10 +msgid "Edit profile" +msgstr "" + +#: judge/views/user.py:262 templates/user/user-list-tabs.html:4 +msgid "Leaderboard" +msgstr "" + +#: judge/views/widgets.py:48 judge/views/widgets.py:58 +#, python-format +msgid "Invalid upstream data: %s" +msgstr "" + +#: judge/views/widgets.py:68 +msgid "Bad latitude or longitude" +msgstr "" + +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:13 +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:27 +msgid "Photo" +msgstr "" + +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:14 +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:28 +msgid "Photos" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:9 +msgid "first name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:10 +msgid "last name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:11 +msgid "biography" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/admin.py:24 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:30 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:30 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:30 +msgid "owner" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:12 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:12 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:12 +msgid "name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:19 +msgid "Category of Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:20 +msgid "Categories of Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:26 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:26 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:26 +msgid "title" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:28 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:28 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:28 +msgid "category" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:29 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:29 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:29 +msgid "author" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:31 +msgid "publication date" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:37 +msgid "Book" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:38 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:136 +msgid "Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:19 +msgid "Category of CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:20 +msgid "Categories of CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:36 +msgid "CD" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:37 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:141 +msgid "CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:19 +msgid "Category of DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:20 +msgid "Categories of DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:36 +msgid "DVD" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:37 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:146 +msgid "DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/templates/admin/base_site.html:7 +msgid "Django administration" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/forms.py:12 +#, python-format +msgid "Please enter the correct %(username)s and password for an admin account. Note that both fields may be case-sensitive." +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/forms.py:32 +#, python-format +msgid "Please enter the correct %(username)s and password for an user account. Note that both fields may be case-sensitive." +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:27 +msgid "Site" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:38 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:41 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:130 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:133 +msgid "Dashboard" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:48 +msgid "Applications" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:53 +msgid "Administration" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:64 +msgid "Color theme" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:66 +msgid "Change color theme" +msgstr "" + +#: 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 +msgid "Rate all ratable contests" +msgstr "" + +#: 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 +msgid "Rejudge" +msgstr "" + +#: templates/base.html:214 +#, python-format +msgid "Hello, %(username)s." +msgstr "" + +#: templates/base.html:220 templates/comments/list.html:89 +#: templates/contest/contest-list-tabs.html:24 +#: templates/problem/problem-list-tabs.html:6 +#: templates/submission/info-base.html:12 +#: templates/submission/submission-list-tabs.html:15 +msgid "Admin" +msgstr "" + +#: templates/base.html:229 +msgid "Log out" +msgstr "" + +#: templates/base.html:238 +#: templates/registration/password_reset_complete.html:4 +msgid "Log in" +msgstr "" + +#: templates/base.html:239 templates/registration/registration_form.html:177 +msgid "or" +msgstr "" + +#: templates/base.html:240 +msgid "Sign up" +msgstr "" + +#: templates/base.html:252 +msgid "spectating" +msgstr "" + +#: 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:20 +#: 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 +msgid "Edit" +msgstr "" + +#: templates/blog/content.html:27 +#, python-format +msgid "\n" +" posted on %(time)s\n" +" " +msgstr "" + +#: templates/blog/dashboard.html:21 +#, python-format +msgid "\n" +" on %(time)s\n" +" " +msgstr "" + +#: templates/blog/list.html:85 +msgid "Blog" +msgstr "" + +#: templates/blog/list.html:87 +msgid "Events" +msgstr "" + +#: templates/blog/list.html:92 +msgid "News" +msgstr "" + +#: templates/blog/list.html:106 +#, python-brace-format +msgid "posted on {time}" +msgstr "" + +#: templates/blog/list.html:130 templates/problem/problem.html:310 +msgid "Clarifications" +msgstr "" + +#: templates/blog/list.html:146 templates/problem/problem.html:321 +msgid "No clarifications have been made at this time." +msgstr "" + +#: templates/blog/list.html:154 +msgid "Ongoing contests" +msgstr "" + +#: templates/blog/list.html:172 +msgid "Upcoming contests" +msgstr "" + +#: templates/blog/list.html:189 +msgid "Comment stream" +msgstr "" + +#: templates/blog/list.html:208 +msgid "New problems" +msgstr "" + +#: templates/blog/list.html:225 +msgid "My open tickets" +msgstr "" + +#: templates/blog/list.html:246 +msgid "New tickets" +msgstr "" + +#: templates/comments/list.html:2 +msgid "Comments" +msgstr "" + +#: templates/comments/list.html:18 templates/comments/list.html:27 +msgid "Please login to vote" +msgstr "" + +#: templates/comments/list.html:40 +#, python-brace-format +msgid "commented on {time}" +msgstr "" + +#: templates/comments/list.html:49 +#, python-format +msgid "edit %(edits)s" +msgstr "" + +#: templates/comments/list.html:51 templates/comments/media-js.html:77 +msgid "edited" +msgstr "" + +#: templates/comments/list.html:60 +msgid "Link" +msgstr "" + +#: templates/comments/list.html:73 templates/comments/list.html:80 +msgid "Reply" +msgstr "" + +#: templates/comments/list.html:86 +msgid "Hide" +msgstr "" + +#: templates/comments/list.html:101 +#, 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:120 +msgid "There are no comments at the moment." +msgstr "" + +#: templates/comments/list.html:126 +msgid "New comment" +msgstr "" + +#: templates/comments/list.html:140 +msgid "Invalid comment body." +msgstr "" + +#: templates/comments/list.html:148 +msgid "Post!" +msgstr "" + +#: templates/comments/list.html:156 +msgid "Comments are disabled on this page." +msgstr "" + +#: templates/comments/media-js.html:72 +#, python-brace-format +msgid "edit {edits}" +msgstr "" + +#: templates/comments/media-js.html:75 +msgid "original" +msgstr "" + +#: templates/contest/access_code.html:26 +msgid "Invalid access code." +msgstr "" + +#: templates/contest/access_code.html:29 +msgid "Please enter your access code:" +msgstr "" + +#: templates/contest/access_code.html:32 +msgid "Join Contest" +msgstr "" + +#: templates/contest/calendar.html:12 +msgid "Sunday" +msgstr "" + +#: templates/contest/calendar.html:13 +msgid "Monday" +msgstr "" + +#: templates/contest/calendar.html:14 +msgid "Tuesday" +msgstr "" + +#: templates/contest/calendar.html:15 +msgid "Wednesday" +msgstr "" + +#: templates/contest/calendar.html:16 +msgid "Thursday" +msgstr "" + +#: templates/contest/calendar.html:17 +msgid "Friday" +msgstr "" + +#: templates/contest/calendar.html:18 +msgid "Saturday" +msgstr "" + +#: 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 +msgid "Today" +msgstr "" + +#: templates/contest/contest-list-tabs.html:13 +msgid "Next" +msgstr "" + +#: templates/contest/contest-list-tabs.html:21 +#: templates/problem/problem-list-tabs.html:5 +msgid "List" +msgstr "" + +#: templates/contest/contest-list-tabs.html:22 +msgid "Calendar" +msgstr "" + +#: templates/contest/contest-tabs.html:4 +msgid "Info" +msgstr "" + +#: templates/contest/contest-tabs.html:8 +msgid "Rankings" +msgstr "" + +#: templates/contest/contest-tabs.html:10 +msgid "Hidden Rankings" +msgstr "" + +#: templates/contest/contest-tabs.html:18 +msgid "MOSS" +msgstr "" + +#: templates/contest/contest-tabs.html:23 +msgid "Clone" +msgstr "" + +#: templates/contest/contest-tabs.html:34 +#: templates/contest/contest-tabs.html:54 +msgid "Leave contest" +msgstr "" + +#: templates/contest/contest-tabs.html:41 templates/contest/list.html:293 +msgid "Virtual join" +msgstr "" + +#: templates/contest/contest-tabs.html:52 +msgid "Stop spectating" +msgstr "" + +#: templates/contest/contest-tabs.html:61 +msgid "Spectate contest" +msgstr "" + +#: templates/contest/contest-tabs.html:67 +#: templates/contest/contest-tabs.html:73 +msgid "Join contest" +msgstr "" + +#: templates/contest/contest-tabs.html:82 +msgid "Login to participate" +msgstr "" + +#: templates/contest/contest.html:37 +msgid "Participating virtually." +msgstr "" + +#: templates/contest/contest.html:43 +msgid "Contest is over." +msgstr "" + +#: templates/contest/contest.html:59 templates/contest/contest.html:63 +msgid "F j, Y, G:i T" +msgstr "" + +#: 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 +#, python-format +msgid "%(length)s long starting on %(start_time)s" +msgstr "" + +#: templates/contest/contest.html:85 +msgid "AC Rate" +msgstr "" + +#: templates/contest/contest.html:86 templates/contest/list.html:153 +#: templates/contest/list.html:195 templates/contest/list.html:271 +#: templates/problem/list.html:212 templates/problem/list.html:238 +msgid "Users" +msgstr "" + +#: templates/contest/contest.html:111 +msgid "Editorial" +msgstr "" + +#: templates/contest/list.html:31 templates/contest/media-js.html:9 +msgid "Are you sure you want to join?" +msgstr "" + +#: 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:65 +msgid "hidden" +msgstr "" + +#: templates/contest/list.html:70 +msgid "private" +msgstr "" + +#: templates/contest/list.html:84 +msgid "rated" +msgstr "" + +#: templates/contest/list.html:132 +msgid "Spectate" +msgstr "" + +#: templates/contest/list.html:138 +msgid "Join" +msgstr "" + +#: templates/contest/list.html:148 +msgid "Active Contests" +msgstr "" + +#: templates/contest/list.html:152 templates/contest/list.html:194 +#: templates/contest/list.html:232 templates/contest/list.html:270 +msgid "Contest" +msgstr "" + +#: templates/contest/list.html:190 +msgid "Ongoing Contests" +msgstr "" + +#: templates/contest/list.html:227 +msgid "Upcoming Contests" +msgstr "" + +#: templates/contest/list.html:255 +msgid "There are no scheduled contests at this time." +msgstr "" + +#: templates/contest/list.html:261 +msgid "Past Contests" +msgstr "" + +#: templates/contest/media-js.html:4 +msgid "Are you sure you want to leave?" +msgstr "" + +#: 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 +msgid "Joining a contest starts your timer, after which it becomes unstoppable." +msgstr "" + +#: 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:7 +msgid "Organization" +msgstr "" + +#: templates/contest/ranking-table.html:27 +#, python-brace-format +msgid "Started on {time}" +msgstr "" + +#: templates/contest/ranking-table.html:30 +msgid "Participation ended." +msgstr "" + +#: templates/contest/ranking.html:232 +msgid "View user participation" +msgstr "" + +#: templates/contest/ranking.html:236 +msgid "Show organizations" +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 +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 +msgid "activate" +msgstr "" + +#: 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 +msgid "Newsletter unsubscribe" +msgstr "" + +#: 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 +msgid "Do you want to unsubscribe from this newsletter?" +msgstr "" + +#: 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 +msgid "Newsletter update" +msgstr "" + +#: 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 +msgid "Update subscription" +msgstr "" + +#: templates/newsletter/subscription_update_activated.html:8 +msgid "Your subscription has successfully been updated." +msgstr "" + +#: 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:34 +#: templates/ticket/edit-notes.html:4 +msgid "Update" +msgstr "" + +#: 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:29 +msgid "Join organization" +msgstr "" + +#: templates/organization/home.html:33 +msgid "Request membership" +msgstr "" + +#: templates/organization/home.html:39 +msgid "Edit organization" +msgstr "" + +#: templates/organization/home.html:43 +msgid "View requests" +msgstr "" + +#: templates/organization/home.html:50 +msgid "Admin organization" +msgstr "" + +#: templates/organization/home.html:55 +msgid "View members" +msgstr "" + +#: templates/organization/list.html:23 templates/status/language-list.html:34 +msgid "Name" +msgstr "" + +#: templates/organization/list.html:24 +msgid "Members" +msgstr "" + +#: templates/organization/new.html:10 templates/ticket/new.html:38 +msgid "Create" +msgstr "" + +#: templates/organization/requests/detail.html:13 +msgid "User:" +msgstr "" + +#: templates/organization/requests/detail.html:17 +msgid "Organization:" +msgstr "" + +#: templates/organization/requests/detail.html:25 +msgid "Time:" +msgstr "" + +#: templates/organization/requests/detail.html:29 +msgid "Reason:" +msgstr "" + +#: 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:15 +msgid "Reason" +msgstr "" + +#: 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:17 +#: templates/problem/data.html:401 +msgid "Delete?" +msgstr "" + +#: templates/organization/requests/request.html:18 +msgid "Your reason for joining:" +msgstr "" + +#: templates/organization/requests/request.html:20 +msgid "Request" +msgstr "" + +#: templates/organization/requests/tabs.html:4 +msgid "Pending" +msgstr "" + +#: templates/organization/requests/tabs.html:7 +msgid "Log" +msgstr "" + +#: templates/organization/requests/tabs.html:10 +msgid "Approved" +msgstr "" + +#: templates/organization/requests/tabs.html:13 +msgid "Rejected" +msgstr "" + +#: templates/organization/users-table.html:15 +msgid "Kick" +msgstr "" + +#: templates/problem/clone.html:37 +msgid "Enter a new code for the cloned problem:" +msgstr "" + +#: templates/problem/data.html:353 +msgid "View YAML" +msgstr "" + +#: templates/problem/data.html:369 +msgid "Show columns:" +msgstr "" + +#: templates/problem/data.html:372 templates/problem/data.html:396 +msgid "Output prefix" +msgstr "" + +#: templates/problem/data.html:376 templates/problem/data.html:397 +msgid "Output limit" +msgstr "" + +#: templates/problem/data.html:380 templates/problem/data.html:398 +msgid "Checker" +msgstr "" + +#: templates/problem/data.html:384 templates/problem/data.html:399 +msgid "Generator args" +msgstr "" + +#: templates/problem/data.html:391 +msgid "Type" +msgstr "" + +#: templates/problem/data.html:392 +msgid "Input file" +msgstr "" + +#: templates/problem/data.html:393 +msgid "Output file" +msgstr "" + +#: templates/problem/data.html:395 +msgid "Pretest?" +msgstr "" + +#: templates/problem/data.html:447 templates/problem/submit.html:252 +msgid "Submit!" +msgstr "" + +#: templates/problem/data.html:448 +msgid "Add new case" +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 editorialist.

Submitting an official solution before solving the problem yourself is a bannable offence." +msgstr "" + +#: templates/problem/list.html:62 +msgid "Filter by type..." +msgstr "" + +#: templates/problem/list.html:185 +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:57 +msgid "Category" +msgstr "" + +#: templates/problem/list.html:209 templates/problem/list.html:228 +msgid "Types" +msgstr "" + +#: templates/problem/list.html:235 +#, python-format +msgid "AC %%" +msgstr "" + +#: 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:142 +msgid "Filter by result:" +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:101 templates/problem/problem.html:111 +#: templates/problem/problem.html:116 +msgid "Submit solution" +msgstr "" + +#: templates/problem/problem.html:104 +#, python-format +msgid "%(counter)s submission left" +msgid_plural "%(counter)s submissions left" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: templates/problem/problem.html:112 +msgid "0 submissions left" +msgstr "" + +#: templates/problem/problem.html:124 +msgid "My submissions" +msgstr "" + +#: templates/problem/problem.html:128 +msgid "Best submissions" +msgstr "" + +#: templates/problem/problem.html:132 +msgid "Read editorial" +msgstr "" + +#: templates/problem/problem.html:137 +msgid "Manage tickets" +msgstr "" + +#: templates/problem/problem.html:141 +msgid "Edit problem" +msgstr "" + +#: templates/problem/problem.html:143 +msgid "Edit test data" +msgstr "" + +#: templates/problem/problem.html:148 +msgid "My tickets" +msgstr "" + +#: templates/problem/problem.html:156 +msgid "Manage submissions" +msgstr "" + +#: templates/problem/problem.html:162 +msgid "Clone problem" +msgstr "" + +#: templates/problem/problem.html:169 +msgid "Points:" +msgstr "" + +#: templates/problem/problem.html:172 templates/problem/problem.html:174 +msgid "(partial)" +msgstr "" + +#: templates/problem/problem.html:179 +msgid "Time limit:" +msgstr "" + +#: templates/problem/problem.html:191 +msgid "Memory limit:" +msgstr "" + +#: templates/problem/problem.html:210 +msgid "Author:" +msgid_plural "Authors:" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: templates/problem/problem.html:225 +msgid "Problem type" +msgid_plural "Problem types" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: templates/problem/problem.html:238 +msgid "Allowed languages" +msgstr "" + +#: templates/problem/problem.html:246 +#, python-format +msgid "No %(lang)s judge online" +msgstr "" + +#: templates/problem/problem.html:257 +msgid "Judge:" +msgid_plural "Judges:" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: templates/problem/problem.html:274 +msgid "none available" +msgstr "" + +#: templates/problem/problem.html:299 +msgid "Request clarification" +msgstr "" + +#: templates/problem/problem.html:301 +msgid "Report an issue" +msgstr "" + +#: 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 +msgid "Search problems..." +msgstr "" + +#: templates/problem/search-form.html:14 +msgid "Full text search" +msgstr "" + +#: templates/problem/search-form.html:21 +msgid "Hide solved problems" +msgstr "" + +#: 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 +msgid "All" +msgstr "" + +#: templates/problem/search-form.html:46 +msgid "Problem types" +msgstr "" + +#: templates/problem/search-form.html:57 +msgid "Point range" +msgstr "" + +#: templates/problem/search-form.html:63 templates/submission/list.html:337 +#: templates/ticket/list.html:248 +msgid "Go" +msgstr "" + +#: templates/problem/search-form.html:64 +msgid "Random" +msgstr "" + +#: templates/problem/submit.html:192 +#, python-format +msgid "Warning! Your default language, %(default_language)s, is unavailable for this problem and has been deselected." +msgstr "" + +#: templates/problem/submit.html:203 +#, python-format +msgid "\n" +" You have %(left)s submission left\n" +" " +msgid_plural "\n" +" You have %(left)s submissions left\n" +" " +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: templates/problem/submit.html:212 +msgid "You have 0 submissions left" +msgstr "" + +#: templates/problem/submit.html:250 +msgid "No judge is available for this problem." +msgstr "" + +#: templates/registration/activate.html:3 +#, python-format +msgid "%(key)s is an invalid activation key." +msgstr "" + +#: templates/registration/activation_complete.html:3 +msgid "Your account has been successfully activated." +msgstr "" + +#: templates/registration/login.html:43 +msgid "Invalid username or password." +msgstr "" + +#: templates/registration/login.html:61 +#: templates/registration/totp_auth.html:39 +msgid "Login!" +msgstr "" + +#: templates/registration/login.html:64 +msgid "Forgot your password?" +msgstr "" + +#: templates/registration/login.html:67 +msgid "Or log in with..." +msgstr "" + +#: templates/registration/logout.html:3 +msgid "See you later!" +msgstr "" + +#: templates/registration/password_change_done.html:3 +msgid "Your password was sucessfully changed." +msgstr "" + +#: templates/registration/password_change_form.html:8 +msgid "Change Password" +msgstr "" + +#: templates/registration/password_reset.html:7 +msgid "Send Reset Email" +msgstr "" + +#: 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_confirm.html:9 +msgid "Reset Password" +msgstr "" + +#: 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 +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 +#, 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 +msgid "Please go to the following page and choose a new password:" +msgstr "" + +#: templates/registration/password_reset_email.txt:7 +msgid "Your username, in case you've forgotten:" +msgstr "" + +#: templates/registration/password_reset_email.txt:9 +msgid "Thanks for using our site!" +msgstr "" + +#: templates/registration/password_reset_email.txt:11 +#, python-format +msgid "The %(site_name)s team" +msgstr "" + +#: 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 +msgid "Continue >" +msgstr "" + +#: 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:166 +msgid "(again, for confirmation)" +msgstr "" + +#: templates/registration/registration_form.html:173 +msgid "(select your closest major city)" +msgstr "" + +#: templates/registration/registration_form.html:178 +msgid "pick from map" +msgstr "" + +#: templates/registration/registration_form.html:183 +msgid "Default language" +msgstr "" + +#: templates/registration/registration_form.html:186 +#: templates/user/edit-profile.html:162 +msgid "Affiliated organizations" +msgstr "" + +#: templates/registration/registration_form.html:192 +#: templates/user/edit-profile.html:121 +msgid "Notify me about upcoming contests" +msgstr "" + +#: templates/registration/registration_form.html:206 +msgid "By registering, you agree to our" +msgstr "" + +#: templates/registration/registration_form.html:207 +msgid "Terms & Conditions" +msgstr "" + +#: templates/registration/registration_form.html:210 +msgid "Register!" +msgstr "" + +#: templates/registration/totp_auth.html:36 +#: templates/registration/totp_disable.html:45 +#: templates/registration/totp_enable.html:83 +msgid "Enter the 6-digit code generated by your app:" +msgstr "" + +#: templates/registration/totp_auth.html:41 +#, python-format +msgid "If you lost your authentication device, please contact us at %(email)s." +msgstr "" + +#: templates/registration/totp_disable.html:38 +msgid "To protect your account, you must first authenticate before you can disable Two Factor Authentication." +msgstr "" + +#: templates/registration/totp_enable.html:71 +msgid "Scan this code with your authenticator app:" +msgstr "" + +#: templates/registration/totp_enable.html:72 +msgid "QR code" +msgstr "" + +#: templates/registration/totp_enable.html:73 +msgid "Or enter this code manually:" +msgstr "" + +#: templates/stats/base.html:9 templates/submission/list.html:345 +msgid "Statistics" +msgstr "" + +#: templates/stats/language.html:11 +msgid "Submission Statistics" +msgstr "" + +#: templates/stats/language.html:16 +msgid "Submissions by Language" +msgstr "" + +#: templates/stats/language.html:21 +msgid "AC Submissions by Language" +msgstr "" + +#: templates/stats/language.html:26 +msgid "Language AC Rate" +msgstr "" + +#: templates/status/judge-status-table.html:2 +msgid "Judge" +msgstr "" + +#: templates/status/judge-status-table.html:4 +msgid "Online" +msgstr "" + +#: templates/status/judge-status-table.html:6 +msgid "Uptime" +msgstr "" + +#: templates/status/judge-status-table.html:7 +msgid "Ping" +msgstr "" + +#: 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 +msgid "N/A" +msgstr "" + +#: templates/status/judge-status-table.html:64 +msgid "There are no judges available at this time." +msgstr "" + +#: templates/status/language-list.html:33 templates/ticket/list.html:261 +msgid "ID" +msgstr "" + +#: templates/status/language-list.html:35 +msgid "Runtime Info" +msgstr "" + +#: templates/status/status-tabs.html:4 +msgid "Judges" +msgstr "" + +#: templates/status/status-tabs.html:6 +msgid "Version Matrix" +msgstr "" + +#: templates/submission/internal-error-message.html:8 +msgid "An internal error occurred while grading." +msgstr "" + +#: templates/submission/internal-error-message.html:15 +msgid "Error information" +msgstr "" + +#: templates/submission/list.html:76 +msgid "Filter by status..." +msgstr "" + +#: templates/submission/list.html:82 +msgid "Filter by language..." +msgstr "" + +#: templates/submission/list.html:315 +msgid "Filter submissions" +msgstr "" + +#: templates/submission/list.html:351 +msgid "Total:" +msgstr "" + +#: templates/submission/list.html:361 +msgid "You were disconnected. Refresh to show latest updates." +msgstr "" + +#: templates/submission/row.html:39 +#, python-format +msgid "Case #%(case)s" +msgstr "" + +#: templates/submission/row.html:49 +msgid "view" +msgstr "" + +#: templates/submission/row.html:53 +msgid "rejudge" +msgstr "" + +#: templates/submission/row.html:58 +msgid "admin" +msgstr "" + +#: templates/submission/source.html:25 +msgid "View status" +msgstr "" + +#: templates/submission/source.html:26 +msgid "View raw source" +msgstr "" + +#: templates/submission/source.html:28 templates/submission/status.html:61 +msgid "Resubmit" +msgstr "" + +#: 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 +msgid "Your submission is being processed..." +msgstr "" + +#: templates/submission/status-testcases.html:14 +msgid "Compilation Error" +msgstr "" + +#: templates/submission/status-testcases.html:18 +msgid "Compilation Warnings" +msgstr "" + +#: templates/submission/status-testcases.html:23 +msgid "Pretest Execution Results" +msgstr "" + +#: templates/submission/status-testcases.html:25 +msgid "Execution Results" +msgstr "" + +#: templates/submission/status-testcases.html:31 +msgid "Batch " +msgstr "" + +#: templates/submission/status-testcases.html:43 +msgid "Case" +msgstr "" + +#: templates/submission/status-testcases.html:45 +msgid "Pretest" +msgstr "" + +#: templates/submission/status-testcases.html:47 +msgid "Test case" +msgstr "" + +#: templates/submission/status-testcases.html:79 +msgid "Your output (clipped)" +msgstr "" + +#: templates/submission/status-testcases.html:90 +msgid "Judge feedback" +msgstr "" + +#: templates/submission/status-testcases.html:106 +msgid "Resources:" +msgstr "" + +#: templates/submission/status-testcases.html:115 +msgid "Final pretest score:" +msgstr "" + +#: templates/submission/status-testcases.html:117 +msgid "Final score:" +msgstr "" + +#: templates/submission/status-testcases.html:131 +msgid "Passing pretests does not guarantee a full score on system tests." +msgstr "" + +#: templates/submission/status-testcases.html:134 +msgid "Submission aborted!" +msgstr "" + +#: templates/submission/status.html:59 +msgid "View source" +msgstr "" + +#: templates/submission/status.html:88 +msgid "Abort" +msgstr "" + +#: templates/submission/submission-list-tabs.html:6 +msgid "Mine" +msgstr "" + +#: templates/submission/submission-list-tabs.html:9 +msgid "Best" +msgstr "" + +#: templates/submission/submission-list-tabs.html:12 +#, python-format +msgid "%(user)s's" +msgstr "" + +#: templates/ticket/list.html:135 templates/ticket/ticket.html:257 +msgid "Reopened: " +msgstr "" + +#: templates/ticket/list.html:138 templates/ticket/ticket.html:258 +msgid "Closed: " +msgstr "" + +#: templates/ticket/list.html:221 +msgid "Use desktop notification" +msgstr "" + +#: templates/ticket/list.html:227 +msgid "Show my tickets only" +msgstr "" + +#: templates/ticket/list.html:231 +msgid "Filing user" +msgstr "" + +#: templates/ticket/list.html:240 +msgid "Assignee" +msgstr "" + +#: templates/ticket/list.html:262 +msgid "Title" +msgstr "" + +#: templates/ticket/list.html:264 templates/ticket/ticket.html:304 +msgid "Assignees" +msgstr "" + +#: templates/ticket/new_problem.html:7 +msgid "Thanks for opening a ticket!" +msgstr "" + +#: 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 +msgid "Associated object" +msgstr "" + +#: templates/ticket/ticket.html:309 +msgid "No one is assigned." +msgstr "" + +#: templates/ticket/ticket.html:315 +msgid "Close ticket" +msgstr "" + +#: templates/ticket/ticket.html:317 +msgid "Reopen ticket" +msgstr "" + +#: templates/ticket/ticket.html:321 +msgid "Assignee notes" +msgstr "" + +#: templates/ticket/ticket.html:328 templates/widgets/select_all.html:4 +msgid "Nothing here." +msgstr "" + +#: templates/ticket/ticket.html:378 +msgid "Post" +msgstr "" + +#: templates/user/base-users-table.html:3 +msgid "Rank" +msgstr "" + +#: templates/user/base-users.html:14 templates/user/base-users.html:69 +msgid "Search by handle..." +msgstr "" + +#: templates/user/edit-profile.html:90 +msgid "Self-description" +msgstr "" + +#: templates/user/edit-profile.html:98 +msgid "Select your closest major city" +msgstr "" + +#: templates/user/edit-profile.html:107 +msgid "Editor theme" +msgstr "" + +#: templates/user/edit-profile.html:112 +msgid "Math engine" +msgstr "" + +#: templates/user/edit-profile.html:136 templates/user/edit-profile.html:137 +msgid "Change your avatar" +msgstr "" + +#: templates/user/edit-profile.html:143 +msgid "Change your password" +msgstr "" + +#: templates/user/edit-profile.html:150 +msgid "Two Factor Authentication is enabled." +msgstr "" + +#: templates/user/edit-profile.html:153 +msgid "Two Factor Authentication is disabled." +msgstr "" + +#: templates/user/edit-profile.html:170 +msgid "User-script" +msgstr "" + +#: templates/user/edit-profile.html:174 +msgid "Update profile" +msgstr "" + +#: templates/user/pp-row.html:22 +#, python-format +msgid "\n" +" weighted %(weight)s%%\n" +" " +msgstr "" + +#: templates/user/pp-row.html:27 +#, python-format +msgid "%(pp).1fpp" +msgstr "" + +#: templates/user/pp-row.html:29 +#, python-format +msgid "%(pp).0fpp" +msgstr "" + +#: templates/user/user-about.html:14 +msgid "From" +msgstr "" + +#: 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:40 +msgid "You have not shared any information." +msgstr "" + +#: templates/user/user-about.html:42 +msgid "This user has not shared any information." +msgstr "" + +#: templates/user/user-base.html:42 +#, python-format +msgid "%(counter)s problem solved" +msgid_plural "%(counter)s problems solved" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: templates/user/user-base.html:50 +msgid "Rank by points:" +msgstr "" + +#: templates/user/user-base.html:53 +msgid "Total points:" +msgstr "" + +#: templates/user/user-base.html:68 +msgid "Rank by rating:" +msgstr "" + +#: templates/user/user-base.html:70 +msgid "Rating:" +msgstr "" + +#: templates/user/user-base.html:71 +msgid "Volatility:" +msgstr "" + +#: templates/user/user-base.html:72 +msgid "Min. rating:" +msgstr "" + +#: templates/user/user-base.html:73 +msgid "Max rating:" +msgstr "" + +#: templates/user/user-problems.html:35 +msgid "Points Breakdown" +msgstr "" + +#: templates/user/user-problems.html:41 +msgid "Load more..." +msgstr "" + +#: templates/user/user-problems.html:45 +msgid "This user has not yet solved any problems." +msgstr "" + +#: templates/user/user-problems.html:51 +msgid "Authored Problems" +msgstr "" + +#: templates/user/user-problems.html:83 +msgid "Hide problems I've solved" +msgstr "" + +#: templates/user/user-problems.html:93 +#, python-format +msgid "%(points).1f points" +msgstr "" + +#: templates/user/user-problems.html:99 +msgid "Score" +msgstr "" + +#: templates/user/user-problems.html:110 +#, python-format +msgid "%(points)s / %(total)s" +msgstr "" + +#: templates/user/user-tabs.html:7 +msgid "Impersonate" +msgstr "" + +#: templates/user/user-tabs.html:13 +msgid "Admin User" +msgstr "" + +#: templates/user/user-tabs.html:16 +msgid "Admin Profile" +msgstr "" + +#: templates/widgets/select_all.html:8 +msgid "Check all" +msgstr "" + diff --git a/locale/ar/LC_MESSAGES/djangojs.po b/locale/ar/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..e2a3d5f --- /dev/null +++ b/locale/ar/LC_MESSAGES/djangojs.po @@ -0,0 +1,34 @@ +msgid "" +msgstr "" +"Project-Id-Version: dmoj\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-10-01 23:12+0000\n" +"PO-Revision-Date: 2019-11-11 22:05\n" +"Last-Translator: Icyene\n" +"Language-Team: Arabic, Saudi Arabia\n" +"Language: ar_SA\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=6; plural=(n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5);\n" +"X-Generator: crowdin.com\n" +"X-Crowdin-Project: dmoj\n" +"X-Crowdin-Language: ar-SA\n" +"X-Crowdin-File: djangojs.po\n" + +#: 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] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: resources/common.js:210 +msgctxt "time format without day" +msgid "%h:%m:%s" +msgstr "" + diff --git a/locale/de/LC_MESSAGES/django.po b/locale/de/LC_MESSAGES/django.po new file mode 100644 index 0000000..37d77aa --- /dev/null +++ b/locale/de/LC_MESSAGES/django.po @@ -0,0 +1,4531 @@ +msgid "" +msgstr "" +"Project-Id-Version: dmoj\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-11-11 21:54+0000\n" +"PO-Revision-Date: 2019-11-11 22:05\n" +"Last-Translator: Icyene\n" +"Language-Team: German\n" +"Language: de_DE\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: crowdin.com\n" +"X-Crowdin-Project: dmoj\n" +"X-Crowdin-Language: de\n" +"X-Crowdin-File: django.po\n" + +#: dmoj/settings.py:337 +msgid "German" +msgstr "Deutsch" + +#: dmoj/settings.py:338 +msgid "English" +msgstr "Englisch" + +#: dmoj/settings.py:339 +msgid "Spanish" +msgstr "" + +#: dmoj/settings.py:340 +msgid "French" +msgstr "Französisch" + +#: dmoj/settings.py:341 +msgid "Croatian" +msgstr "" + +#: dmoj/settings.py:342 +msgid "Hungarian" +msgstr "" + +#: dmoj/settings.py:343 +msgid "Japanese" +msgstr "" + +#: dmoj/settings.py:344 +msgid "Korean" +msgstr "" + +#: dmoj/settings.py:345 +msgid "Brazilian Portuguese" +msgstr "" + +#: dmoj/settings.py:346 +msgid "Romanian" +msgstr "Rumänisch" + +#: dmoj/settings.py:347 +msgid "Russian" +msgstr "Russisch" + +#: dmoj/settings.py:348 +msgid "Serbian (Latin)" +msgstr "" + +#: dmoj/settings.py:349 +msgid "Turkish" +msgstr "" + +#: dmoj/settings.py:350 +msgid "Vietnamese" +msgstr "" + +#: dmoj/settings.py:351 +msgid "Simplified Chinese" +msgstr "Chinesisch (vereinfacht)" + +#: dmoj/urls.py:54 +msgid "Login" +msgstr "" + +#: dmoj/urls.py:102 templates/base.html:190 +msgid "Home" +msgstr "" + +#: 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 +msgid "Hide comments" +msgstr "" + +#: 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 +msgid "Unhide comments" +msgstr "" + +#: judge/admin/comments.py:58 +msgid "Associated page" +msgstr "" + +#: judge/admin/contest.py:29 +msgid "Included contests" +msgstr "" + +#: judge/admin/contest.py:65 templates/contest/contest.html:83 +#: templates/contest/moss.html:43 templates/problem/list.html:206 +#: templates/problem/list.html:221 templates/user/user-problems.html:56 +#: templates/user/user-problems.html:98 +msgid "Problem" +msgstr "" + +#: judge/admin/contest.py:113 +msgid "Settings" +msgstr "" + +#: judge/admin/contest.py:115 +msgid "Scheduling" +msgstr "" + +#: judge/admin/contest.py:116 +msgid "Details" +msgstr "" + +#: judge/admin/contest.py:117 +msgid "Format" +msgstr "" + +#: judge/admin/contest.py:118 templates/contest/ranking-table.html:5 +msgid "Rating" +msgstr "" + +#: judge/admin/contest.py:119 +msgid "Access" +msgstr "" + +#: judge/admin/contest.py:121 judge/admin/problem.py:131 +msgid "Justice" +msgstr "" + +#: judge/admin/contest.py:159 +#, 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:162 +msgid "Mark contests as visible" +msgstr "" + +#: judge/admin/contest.py:166 +#, 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:169 +msgid "Mark contests as hidden" +msgstr "" + +#: judge/admin/contest.py:180 judge/admin/submission.py:149 +#: judge/admin/submission.py:171 +msgid "You do not have the permission to rejudge submissions." +msgstr "" + +#: judge/admin/contest.py:187 judge/admin/submission.py:155 +msgid "You do not have the permission to rejudge THAT many submissions." +msgstr "" + +#: judge/admin/contest.py:194 judge/admin/submission.py:164 +#, 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:265 +#, python-format +msgid "%d participation recalculated." +msgid_plural "%d participations recalculated." +msgstr[0] "" +msgstr[1] "" + +#: judge/admin/contest.py:268 +msgid "Recalculate results" +msgstr "" + +#: judge/admin/contest.py:272 judge/admin/organization.py:65 +msgid "username" +msgstr "" + +#: judge/admin/contest.py:277 templates/base.html:258 +msgid "virtual" +msgstr "" + +#: judge/admin/interface.py:28 judge/models/interface.py:46 +msgid "link path" +msgstr "" + +#: judge/admin/interface.py:62 +msgid "Content" +msgstr "" + +#: judge/admin/interface.py:63 +msgid "Summary" +msgstr "" + +#: judge/admin/interface.py:107 judge/models/contest.py:251 +#: judge/models/contest.py:355 judge/models/profile.py:189 +msgid "user" +msgstr "" + +#: judge/admin/interface.py:148 +msgid "object" +msgstr "" + +#: judge/admin/organization.py:34 judge/admin/problem.py:171 +#: judge/admin/profile.py:78 +msgid "View on site" +msgstr "" + +#: judge/admin/problem.py:28 +msgid "Describe the changes you made (optional)" +msgstr "" + +#: judge/admin/problem.py:126 +msgid "Social Media" +msgstr "" + +#: judge/admin/problem.py:127 +msgid "Taxonomy" +msgstr "Systematik" + +#: judge/admin/problem.py:128 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:58 +msgid "Points" +msgstr "" + +#: judge/admin/problem.py:129 +msgid "Limits" +msgstr "Grenzen" + +#: judge/admin/problem.py:130 judge/admin/submission.py:232 +#: templates/stats/base.html:14 templates/submission/list.html:328 +msgid "Language" +msgstr "Programmiersprache" + +#: judge/admin/problem.py:132 +msgid "History" +msgstr "" + +#: judge/admin/problem.py:168 +msgid "Authors" +msgstr "Autoren" + +#: judge/admin/problem.py:183 +#, 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:187 +msgid "Mark problems as public" +msgstr "" + +#: judge/admin/problem.py:193 +#, 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:197 +msgid "Mark problems as private" +msgstr "" + +#: judge/admin/profile.py:32 +msgid "timezone" +msgstr "" + +#: judge/admin/profile.py:84 judge/admin/submission.py:211 +#: templates/organization/requests/log.html:9 +#: templates/organization/requests/pending.html:12 +#: templates/ticket/list.html:263 +msgid "User" +msgstr "" + +#: judge/admin/profile.py:89 templates/registration/registration_form.html:145 +msgid "Email" +msgstr "" + +#: judge/admin/profile.py:94 judge/views/register.py:29 +#: templates/registration/registration_form.html:173 +#: templates/user/edit-profile.html:99 +msgid "Timezone" +msgstr "" + +#: judge/admin/profile.py:99 +msgid "date joined" +msgstr "" + +#: judge/admin/profile.py:106 +#, python-format +msgid "%d user have scores recalculated." +msgid_plural "%d users have scores recalculated." +msgstr[0] "" +msgstr[1] "" + +#: judge/admin/profile.py:109 +msgid "Recalculate scores" +msgstr "" + +#: judge/admin/runtime.py:19 +msgid "Disallowed problems" +msgstr "" + +#: judge/admin/runtime.py:22 +msgid "These problems are NOT allowed to be submitted in this language" +msgstr "" + +#: judge/admin/runtime.py:83 +msgid "Description" +msgstr "" + +#: judge/admin/runtime.py:84 +msgid "Information" +msgstr "" + +#: judge/admin/runtime.py:85 +msgid "Capabilities" +msgstr "" + +#: judge/admin/submission.py:23 judge/admin/submission.py:42 +#: judge/admin/submission.py:221 +msgid "None" +msgstr "Nicht" + +#: judge/admin/submission.py:23 +msgid "Not done" +msgstr "" + +#: judge/admin/submission.py:23 +msgid "Exceptional" +msgstr "" + +#: judge/admin/submission.py:42 +msgid "Unaccepted" +msgstr "" + +#: judge/admin/submission.py:89 +#, python-format +msgctxt "contest problem" +msgid "%(problem)s in %(contest)s" +msgstr "" + +#: judge/admin/submission.py:167 +msgid "Rejudge the selected submissions" +msgstr "" + +#: judge/admin/submission.py:193 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:196 +msgid "Rescore the selected submissions" +msgstr "" + +#: judge/admin/submission.py:200 +msgid "Problem code" +msgstr "" + +#: judge/admin/submission.py:205 +msgid "Problem name" +msgstr "" + +#: judge/admin/submission.py:215 templates/organization/requests/log.html:10 +#: templates/organization/requests/pending.html:13 +msgid "Time" +msgstr "" + +#: judge/admin/submission.py:223 +#, python-format +msgid "%d KB" +msgstr "" + +#: judge/admin/submission.py:225 +#, python-format +msgid "%.2f MB" +msgstr "" + +#: judge/admin/submission.py:227 +msgid "Memory" +msgstr "" + +#: judge/admin/taxon.py:11 judge/admin/taxon.py:34 +msgid "Included problems" +msgstr "" + +#: judge/admin/taxon.py:14 +msgid "These problems are included in this group of problems" +msgstr "" + +#: judge/admin/taxon.py:37 +msgid "These problems are included in this type of problems" +msgstr "" + +#: judge/apps.py:8 +msgid "Online Judge" +msgstr "" + +#: judge/comments.py:41 +msgid "Comment body" +msgstr "" + +#: judge/comments.py:47 judge/views/ticket.py:46 +msgid "Your part is silent, little toad." +msgstr "" + +#: judge/comments.py:50 templates/comments/list.html:131 +msgid "You need to have solved at least one problem before your voice can be heard." +msgstr "" + +#: judge/comments.py:92 +msgid "Posted comment" +msgstr "" + +#: judge/contest_format/atcoder.py:19 +msgid "AtCoder" +msgstr "" + +#: judge/contest_format/default.py:18 +msgid "Default" +msgstr "" + +#: judge/contest_format/ecoo.py:19 +msgid "ECOO" +msgstr "" + +#: judge/contest_format/ioi.py:19 +msgid "IOI" +msgstr "" + +#: judge/forms.py:27 +msgid "Subscribe to contest updates" +msgstr "" + +#: judge/forms.py:28 +msgid "Enable experimental features" +msgstr "" + +#: judge/forms.py:57 judge/views/organization.py:127 +#, python-brace-format +msgid "You may not be part of more than {count} public organizations." +msgstr "" + +#: judge/forms.py:107 judge/views/register.py:26 +#: templates/registration/registration_form.html:139 +#: templates/user/base-users-table.html:5 +msgid "Username" +msgstr "" + +#: judge/forms.py:108 templates/registration/registration_form.html:151 +#: templates/registration/registration_form.html:165 +msgid "Password" +msgstr "" + +#: judge/forms.py:130 +msgid "Two Factor Authentication tokens must be 6 decimal digits." +msgstr "" + +#: judge/forms.py:139 templates/registration/totp_auth.html:32 +msgid "Invalid Two Factor Authentication token." +msgstr "" + +#: judge/forms.py:143 judge/models/problem.py:97 +msgid "Problem code must be ^[a-z0-9]+$" +msgstr "" + +#: judge/forms.py:148 +msgid "Problem with code already exists." +msgstr "" + +#: judge/forms.py:153 judge/models/contest.py:51 +msgid "Contest id must be ^[a-z0-9]+$" +msgstr "" + +#: judge/forms.py:158 +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:59 +msgid "Leave as LaTeX" +msgstr "" + +#: judge/models/choices.py:60 +msgid "SVG with PNG fallback" +msgstr "" + +#: judge/models/choices.py:61 +msgid "MathML only" +msgstr "" + +#: judge/models/choices.py:62 +msgid "MathJax with SVG/PNG fallback" +msgstr "" + +#: judge/models/choices.py:63 +msgid "Detect best quality" +msgstr "" + +#: judge/models/comment.py:25 +msgid "Page code must be ^[pcs]:[a-z0-9]+$|^b:\\d+$" +msgstr "" + +#: judge/models/comment.py:41 +msgid "commenter" +msgstr "" + +#: judge/models/comment.py:42 +msgid "posted time" +msgstr "" + +#: judge/models/comment.py:43 judge/models/comment.py:176 +msgid "associated page" +msgstr "" + +#: judge/models/comment.py:45 +msgid "votes" +msgstr "" + +#: judge/models/comment.py:46 +msgid "body of comment" +msgstr "" + +#: judge/models/comment.py:47 +msgid "hide the comment" +msgstr "" + +#: judge/models/comment.py:48 +msgid "parent" +msgstr "" + +#: judge/models/comment.py:53 +msgid "comment" +msgstr "" + +#: judge/models/comment.py:54 +msgid "comments" +msgstr "" + +#: judge/models/comment.py:136 judge/models/problem.py:406 +#, python-format +msgid "Editorial for %s" +msgstr "" + +#: judge/models/comment.py:171 +msgid "comment vote" +msgstr "" + +#: judge/models/comment.py:172 +msgid "comment votes" +msgstr "" + +#: judge/models/comment.py:181 +msgid "Override comment lock" +msgstr "" + +#: judge/models/contest.py:21 +msgid "Invalid colour." +msgstr "" + +#: judge/models/contest.py:23 +msgid "tag name" +msgstr "" + +#: judge/models/contest.py:24 +msgid "Lowercase letters and hyphens only." +msgstr "" + +#: judge/models/contest.py:25 +msgid "tag colour" +msgstr "" + +#: judge/models/contest.py:26 +msgid "tag description" +msgstr "" + +#: judge/models/contest.py:45 +msgid "contest tag" +msgstr "" + +#: judge/models/contest.py:46 judge/models/contest.py:100 +msgid "contest tags" +msgstr "" + +#: judge/models/contest.py:50 +msgid "contest id" +msgstr "" + +#: judge/models/contest.py:52 +msgid "contest name" +msgstr "" + +#: judge/models/contest.py:53 +msgid "These people will be able to edit the contest." +msgstr "" + +#: judge/models/contest.py:55 judge/models/runtime.py:124 +#: src/dmoj-wpadmin/test_project/apps/books/admin.py:20 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:27 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:27 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:27 +msgid "description" +msgstr "" + +#: judge/models/contest.py:56 judge/models/problem.py:353 +#: judge/models/runtime.py:126 +msgid "problems" +msgstr "" + +#: judge/models/contest.py:57 judge/models/contest.py:252 +msgid "start time" +msgstr "" + +#: judge/models/contest.py:58 +msgid "end time" +msgstr "" + +#: judge/models/contest.py:59 judge/models/problem.py:118 +#: judge/models/problem.py:377 +msgid "time limit" +msgstr "" + +#: judge/models/contest.py:60 judge/models/problem.py:136 +msgid "publicly visible" +msgstr "" + +#: judge/models/contest.py:61 +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:64 +msgid "contest rated" +msgstr "" + +#: judge/models/contest.py:64 +msgid "Whether this contest can be rated." +msgstr "" + +#: judge/models/contest.py:66 +msgid "hide scoreboard" +msgstr "" + +#: judge/models/contest.py:67 +msgid "Whether the scoreboard should remain hidden for the duration of the contest." +msgstr "" + +#: judge/models/contest.py:70 +msgid "no comments" +msgstr "" + +#: judge/models/contest.py:71 +msgid "Use clarification system instead of comments." +msgstr "" + +#: judge/models/contest.py:73 +msgid "Rating floor for contest" +msgstr "" + +#: judge/models/contest.py:75 +msgid "Rating ceiling for contest" +msgstr "" + +#: judge/models/contest.py:77 +msgid "rate all" +msgstr "" + +#: judge/models/contest.py:77 +msgid "Rate all users who joined." +msgstr "" + +#: judge/models/contest.py:78 +msgid "exclude from ratings" +msgstr "" + +#: judge/models/contest.py:80 +msgid "private to specific users" +msgstr "" + +#: judge/models/contest.py:81 +msgid "private contestants" +msgstr "" + +#: judge/models/contest.py:82 +msgid "If private, only these users may see the contest" +msgstr "" + +#: judge/models/contest.py:84 +msgid "hide problem tags" +msgstr "" + +#: judge/models/contest.py:85 +msgid "Whether problem tags should be hidden by default." +msgstr "" + +#: judge/models/contest.py:87 +msgid "run pretests only" +msgstr "" + +#: judge/models/contest.py:88 +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:92 judge/models/problem.py:157 +msgid "private to organizations" +msgstr "" + +#: judge/models/contest.py:93 judge/models/problem.py:155 +#: judge/models/profile.py:76 +msgid "organizations" +msgstr "" + +#: judge/models/contest.py:94 +msgid "If private, only these organizations may see the contest" +msgstr "" + +#: judge/models/contest.py:95 judge/models/problem.py:145 +msgid "OpenGraph image" +msgstr "" + +#: judge/models/contest.py:96 judge/models/profile.py:47 +msgid "Logo override image" +msgstr "" + +#: judge/models/contest.py:98 +msgid "This image will replace the default site logo for users inside the contest." +msgstr "" + +#: judge/models/contest.py:101 +msgid "the amount of live participants" +msgstr "" + +#: judge/models/contest.py:102 +msgid "contest summary" +msgstr "" + +#: judge/models/contest.py:103 judge/models/problem.py:147 +msgid "Plain-text, shown in meta description tag, e.g. for social media." +msgstr "" + +#: judge/models/contest.py:104 judge/models/profile.py:46 +msgid "access code" +msgstr "" + +#: judge/models/contest.py:105 +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:107 judge/models/problem.py:141 +msgid "personae non gratae" +msgstr "" + +#: judge/models/contest.py:108 +msgid "Bans the selected users from joining this contest." +msgstr "" + +#: judge/models/contest.py:109 +msgid "contest format" +msgstr "" + +#: judge/models/contest.py:110 +msgid "The contest format module to use." +msgstr "" + +#: judge/models/contest.py:111 +msgid "contest format configuration" +msgstr "" + +#: judge/models/contest.py:112 +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:233 +msgid "See private contests" +msgstr "" + +#: judge/models/contest.py:234 +msgid "Edit own contests" +msgstr "" + +#: judge/models/contest.py:235 +msgid "Edit all contests" +msgstr "" + +#: judge/models/contest.py:236 +msgid "Clone contest" +msgstr "" + +#: judge/models/contest.py:237 templates/contest/moss.html:74 +msgid "MOSS contest" +msgstr "" + +#: judge/models/contest.py:238 +msgid "Rate contests" +msgstr "" + +#: judge/models/contest.py:239 +msgid "Contest access codes" +msgstr "" + +#: judge/models/contest.py:240 +msgid "Create private contests" +msgstr "" + +#: judge/models/contest.py:242 judge/models/contest.py:320 +#: judge/models/contest.py:356 judge/models/contest.py:378 +#: judge/models/submission.py:83 +msgid "contest" +msgstr "" + +#: judge/models/contest.py:243 +msgid "contests" +msgstr "" + +#: judge/models/contest.py:250 +msgid "associated contest" +msgstr "" + +#: judge/models/contest.py:253 +msgid "score" +msgstr "" + +#: judge/models/contest.py:254 +msgid "cumulative time" +msgstr "" + +#: judge/models/contest.py:255 +msgid "virtual participation id" +msgstr "" + +#: judge/models/contest.py:256 +msgid "0 means non-virtual, otherwise the n-th virtual participation" +msgstr "" + +#: judge/models/contest.py:257 +msgid "contest format specific data" +msgstr "" + +#: judge/models/contest.py:306 +#, python-format +msgid "%s spectating in %s" +msgstr "" + +#: judge/models/contest.py:308 +#, python-format +msgid "%s in %s, v%d" +msgstr "" + +#: judge/models/contest.py:309 +#, python-format +msgid "%s in %s" +msgstr "" + +#: judge/models/contest.py:312 +msgid "contest participation" +msgstr "" + +#: judge/models/contest.py:313 +msgid "contest participations" +msgstr "" + +#: judge/models/contest.py:319 judge/models/contest.py:340 +#: judge/models/contest.py:379 judge/models/problem.py:352 +#: judge/models/problem.py:357 judge/models/problem.py:375 +#: judge/models/problem_data.py:35 +msgid "problem" +msgstr "" + +#: judge/models/contest.py:321 judge/models/contest.py:344 +#: judge/models/problem.py:129 +msgid "points" +msgstr "" + +#: judge/models/contest.py:322 +msgid "partial" +msgstr "" + +#: judge/models/contest.py:323 judge/models/contest.py:345 +msgid "is pretested" +msgstr "" + +#: judge/models/contest.py:324 judge/models/interface.py:43 +msgid "order" +msgstr "" + +#: judge/models/contest.py:325 +msgid "output prefix length override" +msgstr "" + +#: judge/models/contest.py:326 +msgid "Maximum number of submissions for this problem, or 0 for no limit." +msgstr "" + +#: judge/models/contest.py:328 +msgid "Why include a problem you can't submit to?" +msgstr "" + +#: judge/models/contest.py:333 +msgid "contest problem" +msgstr "" + +#: judge/models/contest.py:334 +msgid "contest problems" +msgstr "" + +#: judge/models/contest.py:338 judge/models/submission.py:181 +msgid "submission" +msgstr "" + +#: judge/models/contest.py:342 judge/models/contest.py:357 +msgid "participation" +msgstr "" + +#: judge/models/contest.py:346 +msgid "Whether this submission was ran only on pretests." +msgstr "" + +#: judge/models/contest.py:350 +msgid "contest submission" +msgstr "" + +#: judge/models/contest.py:351 +msgid "contest submissions" +msgstr "" + +#: judge/models/contest.py:359 +msgid "rank" +msgstr "" + +#: judge/models/contest.py:360 +msgid "rating" +msgstr "" + +#: judge/models/contest.py:361 +msgid "volatility" +msgstr "" + +#: judge/models/contest.py:362 +msgid "last rated" +msgstr "" + +#: judge/models/contest.py:366 +msgid "contest rating" +msgstr "" + +#: judge/models/contest.py:367 +msgid "contest ratings" +msgstr "" + +#: judge/models/contest.py:386 +msgid "contest moss result" +msgstr "" + +#: judge/models/contest.py:387 +msgid "contest moss results" +msgstr "" + +#: judge/models/interface.py:24 +msgid "configuration item" +msgstr "" + +#: judge/models/interface.py:25 +msgid "miscellaneous configuration" +msgstr "" + +#: judge/models/interface.py:37 +msgid "navigation item" +msgstr "" + +#: judge/models/interface.py:38 +msgid "navigation bar" +msgstr "" + +#: judge/models/interface.py:44 +msgid "identifier" +msgstr "" + +#: judge/models/interface.py:45 +msgid "label" +msgstr "" + +#: judge/models/interface.py:47 +msgid "highlight regex" +msgstr "" + +#: judge/models/interface.py:48 +msgid "parent item" +msgstr "" + +#: judge/models/interface.py:66 +msgid "post title" +msgstr "" + +#: judge/models/interface.py:67 judge/models/problem.py:395 +msgid "authors" +msgstr "" + +#: judge/models/interface.py:68 +msgid "slug" +msgstr "" + +#: judge/models/interface.py:69 judge/models/problem.py:393 +msgid "public visibility" +msgstr "" + +#: judge/models/interface.py:70 +msgid "sticky" +msgstr "" + +#: judge/models/interface.py:71 +msgid "publish after" +msgstr "" + +#: judge/models/interface.py:72 +msgid "post content" +msgstr "" + +#: judge/models/interface.py:73 +msgid "post summary" +msgstr "" + +#: judge/models/interface.py:74 +msgid "openGraph image" +msgstr "" + +#: judge/models/interface.py:91 +msgid "Edit all posts" +msgstr "" + +#: judge/models/interface.py:93 +msgid "blog post" +msgstr "" + +#: judge/models/interface.py:94 +msgid "blog posts" +msgstr "" + +#: judge/models/message.py:11 +msgid "message title" +msgstr "" + +#: judge/models/message.py:12 judge/models/ticket.py:29 +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:26 +msgid "problem category ID" +msgstr "" + +#: judge/models/problem.py:27 +msgid "problem category name" +msgstr "" + +#: judge/models/problem.py:34 +msgid "problem type" +msgstr "" + +#: judge/models/problem.py:35 judge/models/problem.py:113 +msgid "problem types" +msgstr "" + +#: judge/models/problem.py:39 +msgid "problem group ID" +msgstr "" + +#: judge/models/problem.py:40 +msgid "problem group name" +msgstr "" + +#: judge/models/problem.py:47 judge/models/problem.py:116 +msgid "problem group" +msgstr "" + +#: judge/models/problem.py:48 +msgid "problem groups" +msgstr "" + +#: judge/models/problem.py:52 +msgid "key" +msgstr "" + +#: judge/models/problem.py:54 +msgid "link" +msgstr "" + +#: judge/models/problem.py:55 +msgid "full name" +msgstr "" + +#: judge/models/problem.py:56 judge/models/profile.py:32 +#: judge/models/runtime.py:23 +msgid "short name" +msgstr "" + +#: judge/models/problem.py:57 +msgid "Displayed on pages under this license" +msgstr "" + +#: judge/models/problem.py:58 +msgid "icon" +msgstr "" + +#: judge/models/problem.py:58 +msgid "URL to the icon" +msgstr "" + +#: judge/models/problem.py:59 +msgid "license text" +msgstr "" + +#: judge/models/problem.py:68 +msgid "license" +msgstr "" + +#: judge/models/problem.py:69 +msgid "licenses" +msgstr "" + +#: judge/models/problem.py:96 +msgid "problem code" +msgstr "" + +#: judge/models/problem.py:98 +msgid "A short, unique code for the problem, used in the url after /problem/" +msgstr "" + +#: judge/models/problem.py:100 +msgid "problem name" +msgstr "" + +#: judge/models/problem.py:101 +msgid "The full name of the problem, as shown in the problem list." +msgstr "" + +#: judge/models/problem.py:103 +msgid "problem body" +msgstr "" + +#: judge/models/problem.py:104 +msgid "creators" +msgstr "" + +#: judge/models/problem.py:105 +msgid "These users will be able to edit the problem, and be listed as authors." +msgstr "" + +#: judge/models/problem.py:107 +msgid "curators" +msgstr "" + +#: judge/models/problem.py:108 +msgid "These users will be able to edit the problem, but not be listed as authors." +msgstr "" + +#: judge/models/problem.py:110 +msgid "testers" +msgstr "" + +#: judge/models/problem.py:112 +msgid "These users will be able to view the private problem, but not edit it." +msgstr "" + +#: judge/models/problem.py:114 +msgid "The type of problem, as shown on the problem's page." +msgstr "" + +#: judge/models/problem.py:117 +msgid "The group of problem, shown under Category in the problem list." +msgstr "" + +#: judge/models/problem.py:119 +msgid "The time limit for this problem, in seconds. Fractional seconds (e.g. 1.5) are supported." +msgstr "" + +#: judge/models/problem.py:123 judge/models/problem.py:380 +msgid "memory limit" +msgstr "" + +#: judge/models/problem.py:124 +msgid "The memory limit for this problem, in kilobytes (e.g. 64mb = 65536 kilobytes)." +msgstr "" + +#: judge/models/problem.py:130 +msgid "Points awarded for problem completion. Points are displayed with a 'p' suffix if partial." +msgstr "" + +#: judge/models/problem.py:133 +msgid "allows partial points" +msgstr "" + +#: judge/models/problem.py:134 +msgid "allowed languages" +msgstr "" + +#: judge/models/problem.py:135 +msgid "List of allowed submission languages." +msgstr "" + +#: judge/models/problem.py:137 +msgid "manually managed" +msgstr "" + +#: judge/models/problem.py:138 +msgid "Whether judges should be allowed to manage data or not." +msgstr "" + +#: judge/models/problem.py:139 +msgid "date of publishing" +msgstr "" + +#: judge/models/problem.py:140 +msgid "Doesn't have magic ability to auto-publish due to backward compatibility" +msgstr "" + +#: judge/models/problem.py:142 +msgid "Bans the selected users from submitting to this problem." +msgstr "" + +#: judge/models/problem.py:144 +msgid "The license under which this problem is published." +msgstr "" + +#: judge/models/problem.py:146 +msgid "problem summary" +msgstr "" + +#: judge/models/problem.py:148 +msgid "number of users" +msgstr "" + +#: judge/models/problem.py:149 +msgid "The number of users who solved the problem." +msgstr "" + +#: judge/models/problem.py:150 +msgid "solve rate" +msgstr "" + +#: judge/models/problem.py:156 +msgid "If private, only these organizations may see the problem." +msgstr "" + +#: judge/models/problem.py:358 judge/models/problem.py:376 +#: judge/models/runtime.py:99 +msgid "language" +msgstr "" + +#: judge/models/problem.py:359 +msgid "translated name" +msgstr "" + +#: judge/models/problem.py:360 +msgid "translated description" +msgstr "" + +#: judge/models/problem.py:364 +msgid "problem translation" +msgstr "" + +#: judge/models/problem.py:365 +msgid "problem translations" +msgstr "" + +#: judge/models/problem.py:369 +msgid "clarified problem" +msgstr "" + +#: judge/models/problem.py:370 +msgid "clarification body" +msgstr "" + +#: judge/models/problem.py:371 +msgid "clarification timestamp" +msgstr "" + +#: judge/models/problem.py:386 +msgid "language-specific resource limit" +msgstr "" + +#: judge/models/problem.py:387 +msgid "language-specific resource limits" +msgstr "" + +#: judge/models/problem.py:391 +msgid "associated problem" +msgstr "" + +#: judge/models/problem.py:394 +msgid "publish date" +msgstr "" + +#: judge/models/problem.py:396 +msgid "editorial content" +msgstr "" + +#: judge/models/problem.py:412 +msgid "solution" +msgstr "" + +#: judge/models/problem.py:413 +msgid "solutions" +msgstr "" + +#: judge/models/problem_data.py:23 +msgid "Standard" +msgstr "" + +#: judge/models/problem_data.py:24 +msgid "Floats" +msgstr "" + +#: judge/models/problem_data.py:25 +msgid "Floats (absolute)" +msgstr "" + +#: judge/models/problem_data.py:26 +msgid "Floats (relative)" +msgstr "" + +#: judge/models/problem_data.py:27 +msgid "Non-trailing spaces" +msgstr "" + +#: judge/models/problem_data.py:28 +msgid "Unordered" +msgstr "" + +#: judge/models/problem_data.py:29 +msgid "Byte identical" +msgstr "" + +#: 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:39 +msgid "generator file" +msgstr "" + +#: judge/models/problem_data.py:41 judge/models/problem_data.py:90 +msgid "output prefix length" +msgstr "" + +#: judge/models/problem_data.py:42 judge/models/problem_data.py:91 +msgid "output limit length" +msgstr "" + +#: judge/models/problem_data.py:43 +msgid "init.yml generation feedback" +msgstr "" + +#: judge/models/problem_data.py:44 judge/models/problem_data.py:92 +msgid "checker" +msgstr "" + +#: judge/models/problem_data.py:45 judge/models/problem_data.py:93 +msgid "checker arguments" +msgstr "" + +#: 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:77 +msgid "problem data set" +msgstr "" + +#: judge/models/problem_data.py:79 +msgid "case position" +msgstr "" + +#: judge/models/problem_data.py:80 +msgid "case type" +msgstr "" + +#: judge/models/problem_data.py:81 +msgid "Normal case" +msgstr "" + +#: judge/models/problem_data.py:82 +msgid "Batch start" +msgstr "" + +#: judge/models/problem_data.py:83 +msgid "Batch end" +msgstr "" + +#: judge/models/problem_data.py:85 +msgid "input file name" +msgstr "" + +#: judge/models/problem_data.py:86 +msgid "output file name" +msgstr "" + +#: judge/models/problem_data.py:87 +msgid "generator arguments" +msgstr "" + +#: judge/models/problem_data.py:88 +msgid "point value" +msgstr "" + +#: judge/models/problem_data.py:89 +msgid "case is pretest?" +msgstr "" + +#: judge/models/profile.py:29 +msgid "organization title" +msgstr "" + +#: judge/models/profile.py:30 +msgid "organization slug" +msgstr "" + +#: judge/models/profile.py:31 +msgid "Organization name shown in URL" +msgstr "" + +#: judge/models/profile.py:33 +msgid "Displayed beside user name during contests" +msgstr "" + +#: judge/models/profile.py:34 +msgid "organization description" +msgstr "" + +#: judge/models/profile.py:35 +msgid "registrant" +msgstr "" + +#: judge/models/profile.py:36 +msgid "User who registered this organization" +msgstr "" + +#: judge/models/profile.py:37 +msgid "administrators" +msgstr "" + +#: judge/models/profile.py:38 +msgid "Those who can edit this organization" +msgstr "" + +#: judge/models/profile.py:39 +msgid "creation date" +msgstr "" + +#: judge/models/profile.py:40 +msgid "is open organization?" +msgstr "" + +#: judge/models/profile.py:41 +msgid "Allow joining organization" +msgstr "" + +#: judge/models/profile.py:42 +msgid "maximum size" +msgstr "" + +#: judge/models/profile.py:43 +msgid "Maximum amount of users in this organization, only applicable to private organizations" +msgstr "" + +#: judge/models/profile.py:45 +msgid "Student access code" +msgstr "" + +#: judge/models/profile.py:49 +msgid "This image will replace the default site logo for users viewing the organization." +msgstr "" + +#: judge/models/profile.py:75 judge/models/profile.py:91 +#: judge/models/profile.py:190 +msgid "organization" +msgstr "" + +#: judge/models/profile.py:80 +msgid "user associated" +msgstr "" + +#: judge/models/profile.py:81 +msgid "self-description" +msgstr "" + +#: judge/models/profile.py:82 +msgid "location" +msgstr "" + +#: judge/models/profile.py:84 +msgid "preferred language" +msgstr "" + +#: judge/models/profile.py:89 +msgid "last access time" +msgstr "" + +#: judge/models/profile.py:90 +msgid "last IP" +msgstr "" + +#: judge/models/profile.py:93 +msgid "display rank" +msgstr "" + +#: judge/models/profile.py:95 +msgid "comment mute" +msgstr "" + +#: judge/models/profile.py:95 +msgid "Some users are at their best when silent." +msgstr "" + +#: judge/models/profile.py:97 +msgid "unlisted user" +msgstr "" + +#: judge/models/profile.py:97 +msgid "User will not be ranked." +msgstr "" + +#: judge/models/profile.py:100 +msgid "user script" +msgstr "" + +#: judge/models/profile.py:101 +msgid "User-defined JavaScript for site customization." +msgstr "" + +#: judge/models/profile.py:102 +msgid "current contest" +msgstr "" + +#: judge/models/profile.py:104 +msgid "math engine" +msgstr "" + +#: judge/models/profile.py:106 +msgid "the rendering engine used to render math" +msgstr "" + +#: judge/models/profile.py:107 +msgid "2FA enabled" +msgstr "" + +#: judge/models/profile.py:108 +msgid "check to enable TOTP-based two factor authentication" +msgstr "" + +#: judge/models/profile.py:109 +msgid "TOTP key" +msgstr "" + +#: judge/models/profile.py:110 +msgid "32 character base32-encoded key for TOTP" +msgstr "" + +#: judge/models/profile.py:112 +msgid "TOTP key must be empty or base32" +msgstr "" + +#: judge/models/profile.py:113 +msgid "internal notes" +msgstr "" + +#: judge/models/profile.py:114 +msgid "Notes for administrators regarding this user." +msgstr "" + +#: judge/models/profile.py:184 +msgid "user profile" +msgstr "" + +#: judge/models/profile.py:185 +msgid "user profiles" +msgstr "" + +#: judge/models/profile.py:192 +msgid "request time" +msgstr "" + +#: judge/models/profile.py:193 +msgid "state" +msgstr "" + +#: judge/models/profile.py:198 +msgid "reason" +msgstr "" + +#: judge/models/profile.py:201 +msgid "organization join request" +msgstr "" + +#: judge/models/profile.py:202 +msgid "organization join requests" +msgstr "" + +#: judge/models/runtime.py:18 +msgid "short identifier" +msgstr "" + +#: judge/models/runtime.py:19 +msgid "The identifier for this language; the same as its executor id for judges." +msgstr "" + +#: judge/models/runtime.py:21 +msgid "long name" +msgstr "" + +#: judge/models/runtime.py:22 +msgid "Longer name for the language, e.g. \"Python 2\" or \"C++11\"." +msgstr "" + +#: judge/models/runtime.py:24 +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:28 +msgid "common name" +msgstr "" + +#: judge/models/runtime.py:29 +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:31 +msgid "ace mode name" +msgstr "" + +#: judge/models/runtime.py:32 +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:34 +msgid "pygments name" +msgstr "" + +#: judge/models/runtime.py:35 +msgid "Language ID for Pygments highlighting in source windows." +msgstr "" + +#: judge/models/runtime.py:36 +msgid "code template" +msgstr "" + +#: judge/models/runtime.py:37 +msgid "Code template to display in submission editor." +msgstr "" + +#: judge/models/runtime.py:38 +msgid "runtime info override" +msgstr "" + +#: judge/models/runtime.py:39 +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:41 +msgid "language description" +msgstr "" + +#: judge/models/runtime.py:42 +msgid "Use field this to inform users of quirks with your environment, additional restrictions, etc." +msgstr "" + +#: judge/models/runtime.py:44 +msgid "extension" +msgstr "" + +#: judge/models/runtime.py:45 +msgid "The extension of source files, e.g., \"py\" or \"cpp\"." +msgstr "" + +#: judge/models/runtime.py:100 +msgid "languages" +msgstr "" + +#: judge/models/runtime.py:104 +msgid "language to which this runtime belongs" +msgstr "" + +#: judge/models/runtime.py:105 +msgid "judge on which this runtime exists" +msgstr "" + +#: judge/models/runtime.py:106 +msgid "runtime name" +msgstr "" + +#: judge/models/runtime.py:107 +msgid "runtime version" +msgstr "" + +#: judge/models/runtime.py:108 +msgid "order in which to display this runtime" +msgstr "" + +#: judge/models/runtime.py:112 +msgid "Server name, hostname-style" +msgstr "" + +#: judge/models/runtime.py:113 +msgid "time of creation" +msgstr "" + +#: judge/models/runtime.py:114 +msgid "A key to authenticated this judge" +msgstr "" + +#: judge/models/runtime.py:115 +msgid "authentication key" +msgstr "" + +#: judge/models/runtime.py:116 +msgid "block judge" +msgstr "" + +#: judge/models/runtime.py:117 +msgid "Whether this judge should be blocked from connecting, even if its key is correct." +msgstr "" + +#: judge/models/runtime.py:119 +msgid "judge online status" +msgstr "" + +#: judge/models/runtime.py:120 +msgid "judge start time" +msgstr "" + +#: judge/models/runtime.py:121 +msgid "response time" +msgstr "" + +#: judge/models/runtime.py:122 +msgid "system load" +msgstr "" + +#: judge/models/runtime.py:123 +msgid "Load for the last minute, divided by processors to be fair." +msgstr "" + +#: judge/models/runtime.py:127 judge/models/runtime.py:167 +msgid "judges" +msgstr "" + +#: judge/models/runtime.py:166 +msgid "judge" +msgstr "" + +#: judge/models/submission.py:20 judge/models/submission.py:47 +#: judge/utils/problems.py:86 +msgid "Accepted" +msgstr "" + +#: judge/models/submission.py:21 judge/models/submission.py:48 +msgid "Wrong Answer" +msgstr "" + +#: judge/models/submission.py:22 judge/models/submission.py:50 +msgid "Time Limit Exceeded" +msgstr "" + +#: judge/models/submission.py:23 judge/models/submission.py:51 +msgid "Memory Limit Exceeded" +msgstr "" + +#: judge/models/submission.py:24 judge/models/submission.py:52 +msgid "Output Limit Exceeded" +msgstr "" + +#: judge/models/submission.py:25 judge/models/submission.py:53 +msgid "Invalid Return" +msgstr "" + +#: judge/models/submission.py:26 judge/models/submission.py:54 +msgid "Runtime Error" +msgstr "" + +#: judge/models/submission.py:27 judge/models/submission.py:41 +#: judge/models/submission.py:55 judge/utils/problems.py:88 +msgid "Compile Error" +msgstr "" + +#: judge/models/submission.py:28 judge/models/submission.py:40 +msgid "Internal Error" +msgstr "" + +#: judge/models/submission.py:29 +msgid "Short circuit" +msgstr "" + +#: judge/models/submission.py:30 judge/models/submission.py:42 +#: judge/models/submission.py:61 +msgid "Aborted" +msgstr "" + +#: judge/models/submission.py:36 judge/models/submission.py:57 +msgid "Queued" +msgstr "" + +#: judge/models/submission.py:37 judge/models/submission.py:58 +msgid "Processing" +msgstr "" + +#: judge/models/submission.py:38 judge/models/submission.py:59 +msgid "Grading" +msgstr "" + +#: judge/models/submission.py:39 judge/models/submission.py:60 +msgid "Completed" +msgstr "" + +#: judge/models/submission.py:56 +msgid "Internal Error (judging server error)" +msgstr "" + +#: judge/models/submission.py:66 +msgid "submission time" +msgstr "" + +#: judge/models/submission.py:67 judge/models/submission.py:201 +msgid "execution time" +msgstr "" + +#: judge/models/submission.py:68 judge/models/submission.py:202 +msgid "memory usage" +msgstr "" + +#: judge/models/submission.py:69 judge/models/submission.py:203 +msgid "points granted" +msgstr "" + +#: judge/models/submission.py:70 +msgid "submission language" +msgstr "" + +#: judge/models/submission.py:71 +msgid "status" +msgstr "" + +#: judge/models/submission.py:72 +msgid "result" +msgstr "" + +#: judge/models/submission.py:74 +msgid "compile errors" +msgstr "" + +#: judge/models/submission.py:76 +msgid "batched cases" +msgstr "" + +#: judge/models/submission.py:77 +msgid "test case points" +msgstr "" + +#: judge/models/submission.py:78 +msgid "test case total points" +msgstr "" + +#: judge/models/submission.py:79 +msgid "judged on" +msgstr "" + +#: judge/models/submission.py:81 +msgid "was rejudged by admin" +msgstr "" + +#: judge/models/submission.py:82 +msgid "was ran on pretests only" +msgstr "" + +#: judge/models/submission.py:182 templates/contest/moss.html:58 +msgid "submissions" +msgstr "" + +#: judge/models/submission.py:186 judge/models/submission.py:197 +msgid "associated submission" +msgstr "" + +#: judge/models/submission.py:188 +msgid "source code" +msgstr "" + +#: judge/models/submission.py:199 +msgid "test case ID" +msgstr "" + +#: judge/models/submission.py:200 +msgid "status flag" +msgstr "" + +#: judge/models/submission.py:204 +msgid "points possible" +msgstr "" + +#: judge/models/submission.py:205 +msgid "batch number" +msgstr "" + +#: judge/models/submission.py:206 +msgid "judging feedback" +msgstr "" + +#: judge/models/submission.py:207 +msgid "extended judging feedback" +msgstr "" + +#: judge/models/submission.py:208 +msgid "program output" +msgstr "" + +#: judge/models/submission.py:216 +msgid "submission test case" +msgstr "" + +#: judge/models/submission.py:217 +msgid "submission test cases" +msgstr "" + +#: judge/models/ticket.py:10 +msgid "ticket title" +msgstr "" + +#: judge/models/ticket.py:11 +msgid "ticket creator" +msgstr "" + +#: judge/models/ticket.py:13 +msgid "creation time" +msgstr "" + +#: judge/models/ticket.py:14 +msgid "assignees" +msgstr "" + +#: judge/models/ticket.py:15 +msgid "quick notes" +msgstr "" + +#: judge/models/ticket.py:16 +msgid "Staff notes for this issue to aid in processing." +msgstr "" + +#: judge/models/ticket.py:17 +msgid "linked item type" +msgstr "" + +#: judge/models/ticket.py:19 +msgid "linked item ID" +msgstr "" + +#: judge/models/ticket.py:21 +msgid "is ticket open?" +msgstr "" + +#: judge/models/ticket.py:25 +msgid "ticket" +msgstr "" + +#: judge/models/ticket.py:27 +msgid "poster" +msgstr "" + +#: judge/models/ticket.py:30 +msgid "message time" +msgstr "" + +#: judge/pdf_problems.py:134 judge/pdf_problems.py:186 +#: judge/pdf_problems.py:246 +msgid "Page [page] of [topage]" +msgstr "" + +#: judge/tasks/moss.py:25 +msgid "Running MOSS" +msgstr "" + +#: judge/tasks/submission.py:43 +msgid "Modifying submissions" +msgstr "" + +#: judge/tasks/submission.py:56 +msgid "Recalculating user points" +msgstr "" + +#: judge/utils/problem_data.py:63 +msgid "Empty batches not allowed." +msgstr "" + +#: 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 +#, python-format +msgid "Input file for case %d does not exist: %s" +msgstr "" + +#: 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 +#, python-format +msgid "Batch start case #%d requires points." +msgstr "" + +#: 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 +msgid "How did you corrupt the zip path?" +msgstr "" + +#: judge/utils/problem_data.py:160 +msgid "How did you corrupt the generator path?" +msgstr "" + +#: judge/utils/problems.py:76 +msgid "Can't pass both queryset and keyword filters" +msgstr "" + +#: judge/utils/problems.py:87 +msgid "Wrong" +msgstr "" + +#: judge/utils/problems.py:89 +msgid "Timeout" +msgstr "" + +#: judge/utils/problems.py:90 +msgid "Error" +msgstr "" + +#: 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/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:38 +#, python-format +msgid "Page %d of Posts" +msgstr "" + +#: judge/views/comment.py:27 +msgid "Messing around, are we?" +msgstr "" + +#: judge/views/comment.py:36 +msgid "You must solve at least one problem before you can vote." +msgstr "" + +#: judge/views/comment.py:63 +msgid "You already voted." +msgstr "" + +#: judge/views/comment.py:120 judge/views/organization.py:299 +msgid "Edited from site" +msgstr "" + +#: judge/views/comment.py:141 +msgid "Editing comment" +msgstr "" + +#: judge/views/contests.py:49 judge/views/contests.py:211 +#: judge/views/contests.py:214 judge/views/contests.py:385 +msgid "No such contest" +msgstr "" + +#: judge/views/contests.py:50 judge/views/contests.py:212 +#, python-format +msgid "Could not find a contest with the key \"%s\"." +msgstr "" + +#: judge/views/contests.py:75 +msgid "Contests" +msgstr "" + +#: judge/views/contests.py:215 +msgid "Could not find such contest." +msgstr "" + +#: judge/views/contests.py:218 +#, python-format +msgid "Access to contest \"%s\" denied" +msgstr "" + +#: judge/views/contests.py:242 +msgid "Clone Contest" +msgstr "" + +#: judge/views/contests.py:305 +msgid "Contest not ongoing" +msgstr "" + +#: judge/views/contests.py:306 +#, python-format +msgid "\"%s\" is not currently ongoing." +msgstr "" + +#: judge/views/contests.py:310 +msgid "Already in contest" +msgstr "" + +#: judge/views/contests.py:311 +#, python-format +msgid "You are already in a contest: \"%s\"." +msgstr "" + +#: judge/views/contests.py:314 +msgid "Banned from joining" +msgstr "" + +#: judge/views/contests.py:315 +msgid "You have been declared persona non grata for this contest. You are permanently barred from joining this contest." +msgstr "" + +#: judge/views/contests.py:375 +#, python-format +msgid "Enter access code for \"%s\"" +msgstr "" + +#: judge/views/contests.py:386 +#, python-format +msgid "You are not in contest \"%s\"." +msgstr "" + +#: judge/views/contests.py:405 +msgid "ContestCalendar requires integer year and month" +msgstr "" + +#: judge/views/contests.py:445 +#, python-format +msgid "Contests in %(month)s" +msgstr "" + +#: judge/views/contests.py:445 +msgid "F Y" +msgstr "" + +#: judge/views/contests.py:531 +msgid "???" +msgstr "" + +#: judge/views/contests.py:594 +#, python-format +msgid "%s Rankings" +msgstr "" + +#: judge/views/contests.py:610 +#, python-format +msgid "Your participation in %s" +msgstr "" + +#: judge/views/contests.py:611 +#, python-format +msgid "%s's participation in %s" +msgstr "" + +#: judge/views/contests.py:615 +msgid "Live" +msgstr "" + +#: judge/views/contests.py:627 templates/contest/contest-tabs.html:13 +msgid "Participation" +msgstr "" + +#: judge/views/contests.py:654 +#, python-format +msgid "%s MOSS Results" +msgstr "" + +#: judge/views/contests.py:681 +#, python-format +msgid "Running MOSS for %s..." +msgstr "" + +#: judge/views/contests.py:704 +#, python-format +msgid "Contest tag: %s" +msgstr "" + +#: judge/views/error.py:14 +msgid "404 error" +msgstr "" + +#: judge/views/error.py:15 +#, python-format +msgid "Could not find page \"%s\"" +msgstr "" + +#: judge/views/error.py:22 +#, python-format +msgid "no permission for %s" +msgstr "" + +#: 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 +msgid "Runtimes" +msgstr "" + +#: judge/views/organization.py:44 judge/views/organization.py:47 +msgid "No such organization" +msgstr "" + +#: judge/views/organization.py:45 +#, python-format +msgid "Could not find an organization with the key \"%s\"." +msgstr "" + +#: judge/views/organization.py:48 +msgid "Could not find such organization." +msgstr "" + +#: judge/views/organization.py:72 judge/views/register.py:34 +#: templates/organization/list.html:15 templates/user/user-list-tabs.html:5 +msgid "Organizations" +msgstr "" + +#: judge/views/organization.py:93 +#, python-format +msgid "%s Members" +msgstr "" + +#: judge/views/organization.py:118 judge/views/organization.py:121 +#: judge/views/organization.py:126 +msgid "Joining organization" +msgstr "" + +#: judge/views/organization.py:118 +msgid "You are already in the organization." +msgstr "" + +#: judge/views/organization.py:121 +msgid "This organization is not open." +msgstr "" + +#: judge/views/organization.py:138 +msgid "Leaving organization" +msgstr "" + +#: judge/views/organization.py:138 +#, python-format +msgid "You are not in \"%s\"." +msgstr "" + +#: judge/views/organization.py:162 +#, python-format +msgid "Request to join %s" +msgstr "" + +#: judge/views/organization.py:180 +msgid "Join request detail" +msgstr "" + +#: judge/views/organization.py:209 +#, python-format +msgid "Managing join requests for %s" +msgstr "" + +#: judge/views/organization.py:240 +#, python-format +msgid "Your organization can only receive %d more members. You cannot approve %d users." +msgstr "" + +#: judge/views/organization.py:252 +#, python-format +msgid "Approved %d user." +msgid_plural "Approved %d users." +msgstr[0] "" +msgstr[1] "" + +#: judge/views/organization.py:253 +#, python-format +msgid "Rejected %d user." +msgid_plural "Rejected %d users." +msgstr[0] "" +msgstr[1] "" + +#: judge/views/organization.py:283 +#, python-format +msgid "Editing %s" +msgstr "" + +#: judge/views/organization.py:307 judge/views/organization.py:315 +msgid "Can't edit organization" +msgstr "" + +#: judge/views/organization.py:308 +msgid "You are not allowed to edit this organization." +msgstr "" + +#: judge/views/organization.py:316 +msgid "You are not allowed to kick people from this organization." +msgstr "" + +#: judge/views/organization.py:321 judge/views/organization.py:325 +msgid "Can't kick user" +msgstr "" + +#: judge/views/organization.py:322 +msgid "The user you are trying to kick does not exist!" +msgstr "" + +#: judge/views/organization.py:326 +#, python-format +msgid "The user you are trying to kick is not in organization: %s." +msgstr "" + +#: judge/views/problem.py:68 +msgid "No such problem" +msgstr "" + +#: judge/views/problem.py:69 +#, python-format +msgid "Could not find a problem with the code \"%s\"." +msgstr "" + +#: judge/views/problem.py:111 +#, python-brace-format +msgid "Editorial for {0}" +msgstr "" + +#: judge/views/problem.py:114 +#, python-brace-format +msgid "Editorial for {0}" +msgstr "" + +#: judge/views/problem.py:285 templates/contest/contest.html:79 +#: templates/user/user-tabs.html:5 templates/user/users-table.html:23 +msgid "Problems" +msgstr "" + +#: judge/views/problem.py:546 +msgid "Banned from submitting" +msgstr "" + +#: judge/views/problem.py:547 +msgid "You have been declared persona non grata for this problem. You are permanently barred from submitting this problem." +msgstr "" + +#: judge/views/problem.py:560 +msgid "Too many submissions" +msgstr "" + +#: judge/views/problem.py:561 +msgid "You have exceeded the submission limit for this problem." +msgstr "" + +#: judge/views/problem.py:627 judge/views/problem.py:630 +#, python-format +msgid "Submit to %(problem)s" +msgstr "" + +#: judge/views/problem.py:646 +msgid "Clone Problem" +msgstr "" + +#: judge/views/problem_data.py:37 +msgid "Checker arguments must be a JSON object" +msgstr "" + +#: judge/views/problem_data.py:39 +msgid "Checker arguments is invalid JSON" +msgstr "" + +#: judge/views/problem_data.py:46 +msgid "Your zip file is invalid!" +msgstr "" + +#: judge/views/problem_data.py:104 +#, python-brace-format +msgid "Comparing submissions for {0}" +msgstr "" + +#: judge/views/problem_data.py:107 +#, python-brace-format +msgid "Comparing submissions for {0}" +msgstr "" + +#: judge/views/problem_data.py:142 +#, python-brace-format +msgid "Editing data for {0}" +msgstr "" + +#: judge/views/problem_data.py:145 +#, python-format +msgid "Editing data for %s" +msgstr "" + +#: judge/views/problem_data.py:237 judge/views/problem_data.py:238 +#, python-format +msgid "Generated init.yml for %s" +msgstr "" + +#: 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:58 +#, python-format +msgid "Best solutions for %s" +msgstr "" + +#: judge/views/ranked_submission.py:61 +#, python-brace-format +msgid "Best solutions for {0}" +msgstr "" + +#: judge/views/ranked_submission.py:71 +#, python-format +msgid "Best solutions for %(problem)s in %(contest)s" +msgstr "" + +#: judge/views/ranked_submission.py:74 +#, python-format +msgid "Best solutions for problem %(number)s in %(contest)s" +msgstr "" + +#: judge/views/ranked_submission.py:80 +#, python-brace-format +msgid "Best solutions for {0} in {2}" +msgstr "" + +#: judge/views/ranked_submission.py:83 +#, python-brace-format +msgid "Best solutions for problem {0} in {1}" +msgstr "" + +#: judge/views/register.py:27 +msgid "A username must contain letters, numbers, or underscores" +msgstr "" + +#: judge/views/register.py:31 templates/user/edit-profile.html:103 +msgid "Preferred language" +msgstr "" + +#: judge/views/register.py:38 +msgid "Subscribe to newsletter?" +msgstr "" + +#: judge/views/register.py:45 +#, python-format +msgid "The email address \"%s\" is already taken. Only one registration is allowed per address." +msgstr "" + +#: judge/views/register.py:51 +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 +msgid "Registration" +msgstr "" + +#: judge/views/register.py:106 +msgid "Authentication failure" +msgstr "" + +#: judge/views/stats.py:105 +msgid "Language statistics" +msgstr "" + +#: judge/views/status.py:24 templates/submission/list.html:319 +msgid "Status" +msgstr "" + +#: judge/views/status.py:108 +msgid "Version matrix" +msgstr "" + +#: judge/views/submission.py:59 judge/views/submission.py:66 +#, python-format +msgid "Submission of %(problem)s by %(user)s" +msgstr "" + +#: judge/views/submission.py:161 judge/views/submission.py:162 +#: templates/problem/problem.html:127 +msgid "All submissions" +msgstr "" + +#: judge/views/submission.py:303 +msgid "All my submissions" +msgstr "" + +#: judge/views/submission.py:304 +#, python-format +msgid "All submissions by %s" +msgstr "" + +#: judge/views/submission.py:335 +#, python-format +msgid "All submissions for %s" +msgstr "" + +#: judge/views/submission.py:354 +msgid "Must pass a problem" +msgstr "" + +#: judge/views/submission.py:397 +#, python-format +msgid "My submissions for %(problem)s" +msgstr "" + +#: judge/views/submission.py:398 +#, python-format +msgid "%(user)s's submissions for %(problem)s" +msgstr "" + +#: judge/views/submission.py:495 +msgid "Must pass a contest" +msgstr "" + +#: judge/views/submission.py:514 +#, python-brace-format +msgid "{0}'s submissions for {2} in {4}" +msgstr "" + +#: judge/views/submission.py:519 +#, 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 "" + +#: judge/views/ticket.py:40 +msgid "Issue description" +msgstr "" + +#: judge/views/ticket.py:85 judge/views/ticket.py:88 +#, python-format +msgid "New ticket for %s" +msgstr "" + +#: judge/views/ticket.py:139 +#, python-format +msgid "%(title)s - Ticket %(id)d" +msgstr "" + +#: judge/views/ticket.py:248 +#, python-format +msgid "Tickets - Page %(number)d of %(total)d" +msgstr "" + +#: judge/views/ticket.py:297 +#, python-format +msgid "New Ticket: %s" +msgstr "" + +#: judge/views/ticket.py:298 +#, python-format +msgid "#%(id)d, assigned to: %(users)s" +msgstr "" + +#: judge/views/ticket.py:300 +msgid ", " +msgstr "" + +#: judge/views/ticket.py:300 +msgid "no one" +msgstr "" + +#: judge/views/totp.py:42 templates/registration/totp_enable.html:86 +msgid "Enable Two Factor Authentication" +msgstr "" + +#: judge/views/totp.py:89 templates/registration/totp_disable.html:48 +msgid "Disable Two Factor Authentication" +msgstr "" + +#: judge/views/totp.py:103 +msgid "Perform Two Factor Authentication" +msgstr "" + +#: judge/views/user.py:68 +msgid "No such user" +msgstr "" + +#: judge/views/user.py:68 +#, python-format +msgid "No user handle \"%s\"." +msgstr "" + +#: judge/views/user.py:72 +msgid "My account" +msgstr "" + +#: judge/views/user.py:73 +#, python-format +msgid "User %s" +msgstr "" + +#: judge/views/user.py:136 +msgid "M j, Y, G:i" +msgstr "" + +#: judge/views/user.py:221 +msgid "Updated on site" +msgstr "" + +#: judge/views/user.py:253 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:10 +msgid "Edit profile" +msgstr "" + +#: judge/views/user.py:262 templates/user/user-list-tabs.html:4 +msgid "Leaderboard" +msgstr "" + +#: judge/views/widgets.py:48 judge/views/widgets.py:58 +#, python-format +msgid "Invalid upstream data: %s" +msgstr "" + +#: judge/views/widgets.py:68 +msgid "Bad latitude or longitude" +msgstr "" + +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:13 +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:27 +msgid "Photo" +msgstr "" + +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:14 +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:28 +msgid "Photos" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:9 +msgid "first name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:10 +msgid "last name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:11 +msgid "biography" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/admin.py:24 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:30 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:30 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:30 +msgid "owner" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:12 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:12 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:12 +msgid "name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:19 +msgid "Category of Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:20 +msgid "Categories of Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:26 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:26 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:26 +msgid "title" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:28 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:28 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:28 +msgid "category" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:29 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:29 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:29 +msgid "author" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:31 +msgid "publication date" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:37 +msgid "Book" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:38 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:136 +msgid "Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:19 +msgid "Category of CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:20 +msgid "Categories of CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:36 +msgid "CD" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:37 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:141 +msgid "CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:19 +msgid "Category of DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:20 +msgid "Categories of DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:36 +msgid "DVD" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:37 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:146 +msgid "DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/templates/admin/base_site.html:7 +msgid "Django administration" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/forms.py:12 +#, python-format +msgid "Please enter the correct %(username)s and password for an admin account. Note that both fields may be case-sensitive." +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/forms.py:32 +#, python-format +msgid "Please enter the correct %(username)s and password for an user account. Note that both fields may be case-sensitive." +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:27 +msgid "Site" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:38 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:41 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:130 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:133 +msgid "Dashboard" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:48 +msgid "Applications" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:53 +msgid "Administration" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:64 +msgid "Color theme" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:66 +msgid "Change color theme" +msgstr "" + +#: 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 +msgid "Rate all ratable contests" +msgstr "" + +#: 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 +msgid "Rejudge" +msgstr "" + +#: templates/base.html:214 +#, python-format +msgid "Hello, %(username)s." +msgstr "" + +#: templates/base.html:220 templates/comments/list.html:89 +#: templates/contest/contest-list-tabs.html:24 +#: templates/problem/problem-list-tabs.html:6 +#: templates/submission/info-base.html:12 +#: templates/submission/submission-list-tabs.html:15 +msgid "Admin" +msgstr "" + +#: templates/base.html:229 +msgid "Log out" +msgstr "" + +#: templates/base.html:238 +#: templates/registration/password_reset_complete.html:4 +msgid "Log in" +msgstr "" + +#: templates/base.html:239 templates/registration/registration_form.html:177 +msgid "or" +msgstr "" + +#: templates/base.html:240 +msgid "Sign up" +msgstr "" + +#: templates/base.html:252 +msgid "spectating" +msgstr "" + +#: 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:20 +#: 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 +msgid "Edit" +msgstr "" + +#: templates/blog/content.html:27 +#, python-format +msgid "\n" +" posted on %(time)s\n" +" " +msgstr "" + +#: templates/blog/dashboard.html:21 +#, python-format +msgid "\n" +" on %(time)s\n" +" " +msgstr "" + +#: templates/blog/list.html:85 +msgid "Blog" +msgstr "" + +#: templates/blog/list.html:87 +msgid "Events" +msgstr "" + +#: templates/blog/list.html:92 +msgid "News" +msgstr "" + +#: templates/blog/list.html:106 +#, python-brace-format +msgid "posted on {time}" +msgstr "" + +#: templates/blog/list.html:130 templates/problem/problem.html:310 +msgid "Clarifications" +msgstr "" + +#: templates/blog/list.html:146 templates/problem/problem.html:321 +msgid "No clarifications have been made at this time." +msgstr "" + +#: templates/blog/list.html:154 +msgid "Ongoing contests" +msgstr "" + +#: templates/blog/list.html:172 +msgid "Upcoming contests" +msgstr "" + +#: templates/blog/list.html:189 +msgid "Comment stream" +msgstr "" + +#: templates/blog/list.html:208 +msgid "New problems" +msgstr "" + +#: templates/blog/list.html:225 +msgid "My open tickets" +msgstr "" + +#: templates/blog/list.html:246 +msgid "New tickets" +msgstr "" + +#: templates/comments/list.html:2 +msgid "Comments" +msgstr "" + +#: templates/comments/list.html:18 templates/comments/list.html:27 +msgid "Please login to vote" +msgstr "" + +#: templates/comments/list.html:40 +#, python-brace-format +msgid "commented on {time}" +msgstr "" + +#: templates/comments/list.html:49 +#, python-format +msgid "edit %(edits)s" +msgstr "" + +#: templates/comments/list.html:51 templates/comments/media-js.html:77 +msgid "edited" +msgstr "" + +#: templates/comments/list.html:60 +msgid "Link" +msgstr "" + +#: templates/comments/list.html:73 templates/comments/list.html:80 +msgid "Reply" +msgstr "" + +#: templates/comments/list.html:86 +msgid "Hide" +msgstr "" + +#: templates/comments/list.html:101 +#, 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:120 +msgid "There are no comments at the moment." +msgstr "" + +#: templates/comments/list.html:126 +msgid "New comment" +msgstr "" + +#: templates/comments/list.html:140 +msgid "Invalid comment body." +msgstr "" + +#: templates/comments/list.html:148 +msgid "Post!" +msgstr "" + +#: templates/comments/list.html:156 +msgid "Comments are disabled on this page." +msgstr "" + +#: templates/comments/media-js.html:72 +#, python-brace-format +msgid "edit {edits}" +msgstr "" + +#: templates/comments/media-js.html:75 +msgid "original" +msgstr "" + +#: templates/contest/access_code.html:26 +msgid "Invalid access code." +msgstr "" + +#: templates/contest/access_code.html:29 +msgid "Please enter your access code:" +msgstr "" + +#: templates/contest/access_code.html:32 +msgid "Join Contest" +msgstr "" + +#: templates/contest/calendar.html:12 +msgid "Sunday" +msgstr "" + +#: templates/contest/calendar.html:13 +msgid "Monday" +msgstr "" + +#: templates/contest/calendar.html:14 +msgid "Tuesday" +msgstr "" + +#: templates/contest/calendar.html:15 +msgid "Wednesday" +msgstr "" + +#: templates/contest/calendar.html:16 +msgid "Thursday" +msgstr "" + +#: templates/contest/calendar.html:17 +msgid "Friday" +msgstr "" + +#: templates/contest/calendar.html:18 +msgid "Saturday" +msgstr "" + +#: 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 +msgid "Today" +msgstr "" + +#: templates/contest/contest-list-tabs.html:13 +msgid "Next" +msgstr "" + +#: templates/contest/contest-list-tabs.html:21 +#: templates/problem/problem-list-tabs.html:5 +msgid "List" +msgstr "" + +#: templates/contest/contest-list-tabs.html:22 +msgid "Calendar" +msgstr "" + +#: templates/contest/contest-tabs.html:4 +msgid "Info" +msgstr "" + +#: templates/contest/contest-tabs.html:8 +msgid "Rankings" +msgstr "" + +#: templates/contest/contest-tabs.html:10 +msgid "Hidden Rankings" +msgstr "" + +#: templates/contest/contest-tabs.html:18 +msgid "MOSS" +msgstr "" + +#: templates/contest/contest-tabs.html:23 +msgid "Clone" +msgstr "" + +#: templates/contest/contest-tabs.html:34 +#: templates/contest/contest-tabs.html:54 +msgid "Leave contest" +msgstr "" + +#: templates/contest/contest-tabs.html:41 templates/contest/list.html:293 +msgid "Virtual join" +msgstr "" + +#: templates/contest/contest-tabs.html:52 +msgid "Stop spectating" +msgstr "" + +#: templates/contest/contest-tabs.html:61 +msgid "Spectate contest" +msgstr "" + +#: templates/contest/contest-tabs.html:67 +#: templates/contest/contest-tabs.html:73 +msgid "Join contest" +msgstr "" + +#: templates/contest/contest-tabs.html:82 +msgid "Login to participate" +msgstr "" + +#: templates/contest/contest.html:37 +msgid "Participating virtually." +msgstr "" + +#: templates/contest/contest.html:43 +msgid "Contest is over." +msgstr "" + +#: templates/contest/contest.html:59 templates/contest/contest.html:63 +msgid "F j, Y, G:i T" +msgstr "" + +#: 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 +#, python-format +msgid "%(length)s long starting on %(start_time)s" +msgstr "" + +#: templates/contest/contest.html:85 +msgid "AC Rate" +msgstr "" + +#: templates/contest/contest.html:86 templates/contest/list.html:153 +#: templates/contest/list.html:195 templates/contest/list.html:271 +#: templates/problem/list.html:212 templates/problem/list.html:238 +msgid "Users" +msgstr "" + +#: templates/contest/contest.html:111 +msgid "Editorial" +msgstr "" + +#: templates/contest/list.html:31 templates/contest/media-js.html:9 +msgid "Are you sure you want to join?" +msgstr "" + +#: 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:65 +msgid "hidden" +msgstr "" + +#: templates/contest/list.html:70 +msgid "private" +msgstr "" + +#: templates/contest/list.html:84 +msgid "rated" +msgstr "" + +#: templates/contest/list.html:132 +msgid "Spectate" +msgstr "" + +#: templates/contest/list.html:138 +msgid "Join" +msgstr "" + +#: templates/contest/list.html:148 +msgid "Active Contests" +msgstr "" + +#: templates/contest/list.html:152 templates/contest/list.html:194 +#: templates/contest/list.html:232 templates/contest/list.html:270 +msgid "Contest" +msgstr "" + +#: templates/contest/list.html:190 +msgid "Ongoing Contests" +msgstr "" + +#: templates/contest/list.html:227 +msgid "Upcoming Contests" +msgstr "" + +#: templates/contest/list.html:255 +msgid "There are no scheduled contests at this time." +msgstr "" + +#: templates/contest/list.html:261 +msgid "Past Contests" +msgstr "" + +#: templates/contest/media-js.html:4 +msgid "Are you sure you want to leave?" +msgstr "" + +#: 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 +msgid "Joining a contest starts your timer, after which it becomes unstoppable." +msgstr "" + +#: 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:7 +msgid "Organization" +msgstr "" + +#: templates/contest/ranking-table.html:27 +#, python-brace-format +msgid "Started on {time}" +msgstr "" + +#: templates/contest/ranking-table.html:30 +msgid "Participation ended." +msgstr "" + +#: templates/contest/ranking.html:232 +msgid "View user participation" +msgstr "" + +#: templates/contest/ranking.html:236 +msgid "Show organizations" +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 +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 +msgid "activate" +msgstr "" + +#: 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 +msgid "Newsletter unsubscribe" +msgstr "" + +#: 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 +msgid "Do you want to unsubscribe from this newsletter?" +msgstr "" + +#: 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 +msgid "Newsletter update" +msgstr "" + +#: 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 +msgid "Update subscription" +msgstr "" + +#: templates/newsletter/subscription_update_activated.html:8 +msgid "Your subscription has successfully been updated." +msgstr "" + +#: 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:34 +#: templates/ticket/edit-notes.html:4 +msgid "Update" +msgstr "" + +#: 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:29 +msgid "Join organization" +msgstr "" + +#: templates/organization/home.html:33 +msgid "Request membership" +msgstr "" + +#: templates/organization/home.html:39 +msgid "Edit organization" +msgstr "" + +#: templates/organization/home.html:43 +msgid "View requests" +msgstr "" + +#: templates/organization/home.html:50 +msgid "Admin organization" +msgstr "" + +#: templates/organization/home.html:55 +msgid "View members" +msgstr "" + +#: templates/organization/list.html:23 templates/status/language-list.html:34 +msgid "Name" +msgstr "" + +#: templates/organization/list.html:24 +msgid "Members" +msgstr "" + +#: templates/organization/new.html:10 templates/ticket/new.html:38 +msgid "Create" +msgstr "" + +#: templates/organization/requests/detail.html:13 +msgid "User:" +msgstr "" + +#: templates/organization/requests/detail.html:17 +msgid "Organization:" +msgstr "" + +#: templates/organization/requests/detail.html:25 +msgid "Time:" +msgstr "" + +#: templates/organization/requests/detail.html:29 +msgid "Reason:" +msgstr "" + +#: 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:15 +msgid "Reason" +msgstr "" + +#: 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:17 +#: templates/problem/data.html:401 +msgid "Delete?" +msgstr "" + +#: templates/organization/requests/request.html:18 +msgid "Your reason for joining:" +msgstr "" + +#: templates/organization/requests/request.html:20 +msgid "Request" +msgstr "" + +#: templates/organization/requests/tabs.html:4 +msgid "Pending" +msgstr "" + +#: templates/organization/requests/tabs.html:7 +msgid "Log" +msgstr "" + +#: templates/organization/requests/tabs.html:10 +msgid "Approved" +msgstr "" + +#: templates/organization/requests/tabs.html:13 +msgid "Rejected" +msgstr "" + +#: templates/organization/users-table.html:15 +msgid "Kick" +msgstr "" + +#: templates/problem/clone.html:37 +msgid "Enter a new code for the cloned problem:" +msgstr "" + +#: templates/problem/data.html:353 +msgid "View YAML" +msgstr "" + +#: templates/problem/data.html:369 +msgid "Show columns:" +msgstr "" + +#: templates/problem/data.html:372 templates/problem/data.html:396 +msgid "Output prefix" +msgstr "" + +#: templates/problem/data.html:376 templates/problem/data.html:397 +msgid "Output limit" +msgstr "" + +#: templates/problem/data.html:380 templates/problem/data.html:398 +msgid "Checker" +msgstr "" + +#: templates/problem/data.html:384 templates/problem/data.html:399 +msgid "Generator args" +msgstr "" + +#: templates/problem/data.html:391 +msgid "Type" +msgstr "" + +#: templates/problem/data.html:392 +msgid "Input file" +msgstr "" + +#: templates/problem/data.html:393 +msgid "Output file" +msgstr "" + +#: templates/problem/data.html:395 +msgid "Pretest?" +msgstr "" + +#: templates/problem/data.html:447 templates/problem/submit.html:252 +msgid "Submit!" +msgstr "" + +#: templates/problem/data.html:448 +msgid "Add new case" +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 editorialist.

Submitting an official solution before solving the problem yourself is a bannable offence." +msgstr "" + +#: templates/problem/list.html:62 +msgid "Filter by type..." +msgstr "" + +#: templates/problem/list.html:185 +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:57 +msgid "Category" +msgstr "" + +#: templates/problem/list.html:209 templates/problem/list.html:228 +msgid "Types" +msgstr "" + +#: templates/problem/list.html:235 +#, python-format +msgid "AC %%" +msgstr "" + +#: 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:142 +msgid "Filter by result:" +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:101 templates/problem/problem.html:111 +#: templates/problem/problem.html:116 +msgid "Submit solution" +msgstr "" + +#: 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:112 +msgid "0 submissions left" +msgstr "" + +#: templates/problem/problem.html:124 +msgid "My submissions" +msgstr "" + +#: templates/problem/problem.html:128 +msgid "Best submissions" +msgstr "" + +#: templates/problem/problem.html:132 +msgid "Read editorial" +msgstr "" + +#: templates/problem/problem.html:137 +msgid "Manage tickets" +msgstr "" + +#: templates/problem/problem.html:141 +msgid "Edit problem" +msgstr "" + +#: templates/problem/problem.html:143 +msgid "Edit test data" +msgstr "" + +#: templates/problem/problem.html:148 +msgid "My tickets" +msgstr "" + +#: templates/problem/problem.html:156 +msgid "Manage submissions" +msgstr "" + +#: templates/problem/problem.html:162 +msgid "Clone problem" +msgstr "" + +#: templates/problem/problem.html:169 +msgid "Points:" +msgstr "" + +#: templates/problem/problem.html:172 templates/problem/problem.html:174 +msgid "(partial)" +msgstr "" + +#: templates/problem/problem.html:179 +msgid "Time limit:" +msgstr "" + +#: templates/problem/problem.html:191 +msgid "Memory limit:" +msgstr "" + +#: templates/problem/problem.html:210 +msgid "Author:" +msgid_plural "Authors:" +msgstr[0] "" +msgstr[1] "" + +#: templates/problem/problem.html:225 +msgid "Problem type" +msgid_plural "Problem types" +msgstr[0] "" +msgstr[1] "" + +#: templates/problem/problem.html:238 +msgid "Allowed languages" +msgstr "" + +#: templates/problem/problem.html:246 +#, python-format +msgid "No %(lang)s judge online" +msgstr "" + +#: templates/problem/problem.html:257 +msgid "Judge:" +msgid_plural "Judges:" +msgstr[0] "" +msgstr[1] "" + +#: templates/problem/problem.html:274 +msgid "none available" +msgstr "" + +#: templates/problem/problem.html:299 +msgid "Request clarification" +msgstr "" + +#: templates/problem/problem.html:301 +msgid "Report an issue" +msgstr "" + +#: 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 +msgid "Search problems..." +msgstr "" + +#: templates/problem/search-form.html:14 +msgid "Full text search" +msgstr "" + +#: templates/problem/search-form.html:21 +msgid "Hide solved problems" +msgstr "" + +#: 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 +msgid "All" +msgstr "" + +#: templates/problem/search-form.html:46 +msgid "Problem types" +msgstr "" + +#: templates/problem/search-form.html:57 +msgid "Point range" +msgstr "" + +#: templates/problem/search-form.html:63 templates/submission/list.html:337 +#: templates/ticket/list.html:248 +msgid "Go" +msgstr "" + +#: templates/problem/search-form.html:64 +msgid "Random" +msgstr "" + +#: templates/problem/submit.html:192 +#, python-format +msgid "Warning! Your default language, %(default_language)s, is unavailable for this problem and has been deselected." +msgstr "" + +#: templates/problem/submit.html:203 +#, python-format +msgid "\n" +" You have %(left)s submission left\n" +" " +msgid_plural "\n" +" You have %(left)s submissions left\n" +" " +msgstr[0] "" +msgstr[1] "" + +#: templates/problem/submit.html:212 +msgid "You have 0 submissions left" +msgstr "" + +#: templates/problem/submit.html:250 +msgid "No judge is available for this problem." +msgstr "" + +#: templates/registration/activate.html:3 +#, python-format +msgid "%(key)s is an invalid activation key." +msgstr "" + +#: templates/registration/activation_complete.html:3 +msgid "Your account has been successfully activated." +msgstr "" + +#: templates/registration/login.html:43 +msgid "Invalid username or password." +msgstr "" + +#: templates/registration/login.html:61 +#: templates/registration/totp_auth.html:39 +msgid "Login!" +msgstr "" + +#: templates/registration/login.html:64 +msgid "Forgot your password?" +msgstr "" + +#: templates/registration/login.html:67 +msgid "Or log in with..." +msgstr "" + +#: templates/registration/logout.html:3 +msgid "See you later!" +msgstr "" + +#: templates/registration/password_change_done.html:3 +msgid "Your password was sucessfully changed." +msgstr "" + +#: templates/registration/password_change_form.html:8 +msgid "Change Password" +msgstr "" + +#: templates/registration/password_reset.html:7 +msgid "Send Reset Email" +msgstr "" + +#: 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_confirm.html:9 +msgid "Reset Password" +msgstr "" + +#: 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 +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 +#, 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 +msgid "Please go to the following page and choose a new password:" +msgstr "" + +#: templates/registration/password_reset_email.txt:7 +msgid "Your username, in case you've forgotten:" +msgstr "" + +#: templates/registration/password_reset_email.txt:9 +msgid "Thanks for using our site!" +msgstr "" + +#: templates/registration/password_reset_email.txt:11 +#, python-format +msgid "The %(site_name)s team" +msgstr "" + +#: 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 +msgid "Continue >" +msgstr "" + +#: 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:166 +msgid "(again, for confirmation)" +msgstr "" + +#: templates/registration/registration_form.html:173 +msgid "(select your closest major city)" +msgstr "" + +#: templates/registration/registration_form.html:178 +msgid "pick from map" +msgstr "" + +#: templates/registration/registration_form.html:183 +msgid "Default language" +msgstr "" + +#: templates/registration/registration_form.html:186 +#: templates/user/edit-profile.html:162 +msgid "Affiliated organizations" +msgstr "" + +#: templates/registration/registration_form.html:192 +#: templates/user/edit-profile.html:121 +msgid "Notify me about upcoming contests" +msgstr "" + +#: templates/registration/registration_form.html:206 +msgid "By registering, you agree to our" +msgstr "" + +#: templates/registration/registration_form.html:207 +msgid "Terms & Conditions" +msgstr "" + +#: templates/registration/registration_form.html:210 +msgid "Register!" +msgstr "" + +#: templates/registration/totp_auth.html:36 +#: templates/registration/totp_disable.html:45 +#: templates/registration/totp_enable.html:83 +msgid "Enter the 6-digit code generated by your app:" +msgstr "" + +#: templates/registration/totp_auth.html:41 +#, python-format +msgid "If you lost your authentication device, please contact us at %(email)s." +msgstr "" + +#: templates/registration/totp_disable.html:38 +msgid "To protect your account, you must first authenticate before you can disable Two Factor Authentication." +msgstr "" + +#: templates/registration/totp_enable.html:71 +msgid "Scan this code with your authenticator app:" +msgstr "" + +#: templates/registration/totp_enable.html:72 +msgid "QR code" +msgstr "" + +#: templates/registration/totp_enable.html:73 +msgid "Or enter this code manually:" +msgstr "" + +#: templates/stats/base.html:9 templates/submission/list.html:345 +msgid "Statistics" +msgstr "" + +#: templates/stats/language.html:11 +msgid "Submission Statistics" +msgstr "" + +#: templates/stats/language.html:16 +msgid "Submissions by Language" +msgstr "" + +#: templates/stats/language.html:21 +msgid "AC Submissions by Language" +msgstr "" + +#: templates/stats/language.html:26 +msgid "Language AC Rate" +msgstr "" + +#: templates/status/judge-status-table.html:2 +msgid "Judge" +msgstr "" + +#: templates/status/judge-status-table.html:4 +msgid "Online" +msgstr "Online" + +#: templates/status/judge-status-table.html:6 +msgid "Uptime" +msgstr "" + +#: templates/status/judge-status-table.html:7 +msgid "Ping" +msgstr "" + +#: 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 +msgid "N/A" +msgstr "" + +#: templates/status/judge-status-table.html:64 +msgid "There are no judges available at this time." +msgstr "" + +#: templates/status/language-list.html:33 templates/ticket/list.html:261 +msgid "ID" +msgstr "" + +#: templates/status/language-list.html:35 +msgid "Runtime Info" +msgstr "" + +#: templates/status/status-tabs.html:4 +msgid "Judges" +msgstr "" + +#: templates/status/status-tabs.html:6 +msgid "Version Matrix" +msgstr "" + +#: templates/submission/internal-error-message.html:8 +msgid "An internal error occurred while grading." +msgstr "" + +#: templates/submission/internal-error-message.html:15 +msgid "Error information" +msgstr "" + +#: templates/submission/list.html:76 +msgid "Filter by status..." +msgstr "" + +#: templates/submission/list.html:82 +msgid "Filter by language..." +msgstr "" + +#: templates/submission/list.html:315 +msgid "Filter submissions" +msgstr "" + +#: templates/submission/list.html:351 +msgid "Total:" +msgstr "" + +#: templates/submission/list.html:361 +msgid "You were disconnected. Refresh to show latest updates." +msgstr "" + +#: templates/submission/row.html:39 +#, python-format +msgid "Case #%(case)s" +msgstr "" + +#: templates/submission/row.html:49 +msgid "view" +msgstr "" + +#: templates/submission/row.html:53 +msgid "rejudge" +msgstr "" + +#: templates/submission/row.html:58 +msgid "admin" +msgstr "" + +#: templates/submission/source.html:25 +msgid "View status" +msgstr "" + +#: templates/submission/source.html:26 +msgid "View raw source" +msgstr "" + +#: templates/submission/source.html:28 templates/submission/status.html:61 +msgid "Resubmit" +msgstr "" + +#: 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 +msgid "Your submission is being processed..." +msgstr "" + +#: templates/submission/status-testcases.html:14 +msgid "Compilation Error" +msgstr "" + +#: templates/submission/status-testcases.html:18 +msgid "Compilation Warnings" +msgstr "" + +#: templates/submission/status-testcases.html:23 +msgid "Pretest Execution Results" +msgstr "" + +#: templates/submission/status-testcases.html:25 +msgid "Execution Results" +msgstr "" + +#: templates/submission/status-testcases.html:31 +msgid "Batch " +msgstr "" + +#: templates/submission/status-testcases.html:43 +msgid "Case" +msgstr "" + +#: templates/submission/status-testcases.html:45 +msgid "Pretest" +msgstr "" + +#: templates/submission/status-testcases.html:47 +msgid "Test case" +msgstr "" + +#: templates/submission/status-testcases.html:79 +msgid "Your output (clipped)" +msgstr "" + +#: templates/submission/status-testcases.html:90 +msgid "Judge feedback" +msgstr "" + +#: templates/submission/status-testcases.html:106 +msgid "Resources:" +msgstr "" + +#: templates/submission/status-testcases.html:115 +msgid "Final pretest score:" +msgstr "" + +#: templates/submission/status-testcases.html:117 +msgid "Final score:" +msgstr "" + +#: templates/submission/status-testcases.html:131 +msgid "Passing pretests does not guarantee a full score on system tests." +msgstr "" + +#: templates/submission/status-testcases.html:134 +msgid "Submission aborted!" +msgstr "" + +#: templates/submission/status.html:59 +msgid "View source" +msgstr "" + +#: templates/submission/status.html:88 +msgid "Abort" +msgstr "" + +#: templates/submission/submission-list-tabs.html:6 +msgid "Mine" +msgstr "" + +#: templates/submission/submission-list-tabs.html:9 +msgid "Best" +msgstr "" + +#: templates/submission/submission-list-tabs.html:12 +#, python-format +msgid "%(user)s's" +msgstr "" + +#: templates/ticket/list.html:135 templates/ticket/ticket.html:257 +msgid "Reopened: " +msgstr "" + +#: templates/ticket/list.html:138 templates/ticket/ticket.html:258 +msgid "Closed: " +msgstr "" + +#: templates/ticket/list.html:221 +msgid "Use desktop notification" +msgstr "" + +#: templates/ticket/list.html:227 +msgid "Show my tickets only" +msgstr "" + +#: templates/ticket/list.html:231 +msgid "Filing user" +msgstr "" + +#: templates/ticket/list.html:240 +msgid "Assignee" +msgstr "" + +#: templates/ticket/list.html:262 +msgid "Title" +msgstr "" + +#: templates/ticket/list.html:264 templates/ticket/ticket.html:304 +msgid "Assignees" +msgstr "" + +#: templates/ticket/new_problem.html:7 +msgid "Thanks for opening a ticket!" +msgstr "" + +#: 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 +msgid "Associated object" +msgstr "" + +#: templates/ticket/ticket.html:309 +msgid "No one is assigned." +msgstr "" + +#: templates/ticket/ticket.html:315 +msgid "Close ticket" +msgstr "" + +#: templates/ticket/ticket.html:317 +msgid "Reopen ticket" +msgstr "" + +#: templates/ticket/ticket.html:321 +msgid "Assignee notes" +msgstr "" + +#: templates/ticket/ticket.html:328 templates/widgets/select_all.html:4 +msgid "Nothing here." +msgstr "" + +#: templates/ticket/ticket.html:378 +msgid "Post" +msgstr "" + +#: templates/user/base-users-table.html:3 +msgid "Rank" +msgstr "" + +#: templates/user/base-users.html:14 templates/user/base-users.html:69 +msgid "Search by handle..." +msgstr "" + +#: templates/user/edit-profile.html:90 +msgid "Self-description" +msgstr "" + +#: templates/user/edit-profile.html:98 +msgid "Select your closest major city" +msgstr "" + +#: templates/user/edit-profile.html:107 +msgid "Editor theme" +msgstr "" + +#: templates/user/edit-profile.html:112 +msgid "Math engine" +msgstr "" + +#: templates/user/edit-profile.html:136 templates/user/edit-profile.html:137 +msgid "Change your avatar" +msgstr "" + +#: templates/user/edit-profile.html:143 +msgid "Change your password" +msgstr "" + +#: templates/user/edit-profile.html:150 +msgid "Two Factor Authentication is enabled." +msgstr "" + +#: templates/user/edit-profile.html:153 +msgid "Two Factor Authentication is disabled." +msgstr "" + +#: templates/user/edit-profile.html:170 +msgid "User-script" +msgstr "" + +#: templates/user/edit-profile.html:174 +msgid "Update profile" +msgstr "" + +#: templates/user/pp-row.html:22 +#, python-format +msgid "\n" +" weighted %(weight)s%%\n" +" " +msgstr "" + +#: templates/user/pp-row.html:27 +#, python-format +msgid "%(pp).1fpp" +msgstr "" + +#: templates/user/pp-row.html:29 +#, python-format +msgid "%(pp).0fpp" +msgstr "" + +#: templates/user/user-about.html:14 +msgid "From" +msgstr "" + +#: 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:40 +msgid "You have not shared any information." +msgstr "" + +#: templates/user/user-about.html:42 +msgid "This user has not shared any information." +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:53 +msgid "Total points:" +msgstr "" + +#: templates/user/user-base.html:68 +msgid "Rank by rating:" +msgstr "" + +#: templates/user/user-base.html:70 +msgid "Rating:" +msgstr "" + +#: templates/user/user-base.html:71 +msgid "Volatility:" +msgstr "" + +#: templates/user/user-base.html:72 +msgid "Min. rating:" +msgstr "" + +#: templates/user/user-base.html:73 +msgid "Max rating:" +msgstr "" + +#: templates/user/user-problems.html:35 +msgid "Points Breakdown" +msgstr "" + +#: templates/user/user-problems.html:41 +msgid "Load more..." +msgstr "" + +#: templates/user/user-problems.html:45 +msgid "This user has not yet solved any problems." +msgstr "" + +#: templates/user/user-problems.html:51 +msgid "Authored Problems" +msgstr "" + +#: templates/user/user-problems.html:83 +msgid "Hide problems I've solved" +msgstr "" + +#: templates/user/user-problems.html:93 +#, python-format +msgid "%(points).1f points" +msgstr "" + +#: templates/user/user-problems.html:99 +msgid "Score" +msgstr "" + +#: templates/user/user-problems.html:110 +#, python-format +msgid "%(points)s / %(total)s" +msgstr "" + +#: templates/user/user-tabs.html:7 +msgid "Impersonate" +msgstr "" + +#: templates/user/user-tabs.html:13 +msgid "Admin User" +msgstr "" + +#: templates/user/user-tabs.html:16 +msgid "Admin Profile" +msgstr "" + +#: templates/widgets/select_all.html:8 +msgid "Check all" +msgstr "" + diff --git a/locale/de/LC_MESSAGES/djangojs.po b/locale/de/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..e064196 --- /dev/null +++ b/locale/de/LC_MESSAGES/djangojs.po @@ -0,0 +1,30 @@ +msgid "" +msgstr "" +"Project-Id-Version: dmoj\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-10-01 23:12+0000\n" +"PO-Revision-Date: 2019-11-11 22:05\n" +"Last-Translator: Icyene\n" +"Language-Team: German\n" +"Language: de_DE\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: crowdin.com\n" +"X-Crowdin-Project: dmoj\n" +"X-Crowdin-Language: de\n" +"X-Crowdin-File: djangojs.po\n" + +#: 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:210 +msgctxt "time format without day" +msgid "%h:%m:%s" +msgstr "" + diff --git a/locale/en/LC_MESSAGES/django.po b/locale/en/LC_MESSAGES/django.po new file mode 100644 index 0000000..ff23748 --- /dev/null +++ b/locale/en/LC_MESSAGES/django.po @@ -0,0 +1,3905 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-08-21 17:54-0400\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: .\dmoj\settings.py:247 +msgid "German" +msgstr "" + +#: .\dmoj\settings.py:248 +msgid "English" +msgstr "" + +#: .\dmoj\settings.py:249 +msgid "Spanish" +msgstr "" + +#: .\dmoj\settings.py:250 +msgid "French" +msgstr "" + +#: .\dmoj\settings.py:251 +msgid "Croatian" +msgstr "" + +#: .\dmoj\settings.py:252 +msgid "Hungarian" +msgstr "" + +#: .\dmoj\settings.py:253 +msgid "Korean" +msgstr "" + +#: .\dmoj\settings.py:254 +msgid "Romanian" +msgstr "" + +#: .\dmoj\settings.py:255 +msgid "Russian" +msgstr "" + +#: .\dmoj\settings.py:256 +msgid "Serbian (Latin)" +msgstr "" + +#: .\dmoj\settings.py:257 +msgid "Turkish" +msgstr "" + +#: .\dmoj\settings.py:258 +msgid "Vietnamese" +msgstr "" + +#: .\dmoj\settings.py:259 +msgid "Simplified Chinese" +msgstr "" + +#: .\dmoj\urls.py:51 .\templates\base.html:234 +msgid "Login" +msgstr "" + +#: .\dmoj\urls.py:92 .\templates\base.html:185 +msgid "Home" +msgstr "" + +#: .\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 +msgid "Hide comments" +msgstr "" + +#: .\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 +msgid "Unhide comments" +msgstr "" + +#: .\judge\admin\comments.py:58 +msgid "Associated page" +msgstr "" + +#: .\judge\admin\contest.py:27 +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 +msgid "Problem" +msgstr "" + +#: .\judge\admin\contest.py:91 +msgid "Scheduling" +msgstr "" + +#: .\judge\admin\contest.py:92 +msgid "Details" +msgstr "" + +#: .\judge\admin\contest.py:93 .\templates\contest\ranking-table.html:5 +msgid "Rating" +msgstr "" + +#: .\judge\admin\contest.py:94 .\templates\contest\ranking-table.html:7 +msgid "Organization" +msgstr "" + +#: .\judge\admin\contest.py:130 +#, python-format +msgid "%d contest successfully marked as public." +msgid_plural "%d contests successfully marked as public." +msgstr[0] "" +msgstr[1] "" + +#: .\judge\admin\contest.py:133 +msgid "Mark contests as public" +msgstr "" + +#: .\judge\admin\contest.py:137 +#, python-format +msgid "%d contest successfully marked as private." +msgid_plural "%d contests successfully marked as private." +msgstr[0] "" +msgstr[1] "" + +#: .\judge\admin\contest.py:140 +msgid "Mark contests as private" +msgstr "" + +#: .\judge\admin\contest.py:211 +#, python-format +msgid "%d participation have scores recalculated." +msgid_plural "%d participations have scores recalculated." +msgstr[0] "" +msgstr[1] "" + +#: .\judge\admin\contest.py:214 .\judge\admin\profile.py:90 +msgid "Recalculate scores" +msgstr "" + +#: .\judge\admin\contest.py:221 +#, python-format +msgid "%d participation have times recalculated." +msgid_plural "%d participations have times recalculated." +msgstr[0] "" +msgstr[1] "" + +#: .\judge\admin\contest.py:224 +msgid "Recalculate cumulative time" +msgstr "" + +#: .\judge\admin\contest.py:228 .\judge\admin\organization.py:63 +msgid "username" +msgstr "" + +#: .\judge\admin\contest.py:233 .\templates\base.html:253 +msgid "virtual" +msgstr "" + +#: .\judge\admin\interface.py:27 .\judge\models\interface.py:46 +msgid "link path" +msgstr "" + +#: .\judge\admin\interface.py:61 +msgid "Content" +msgstr "" + +#: .\judge\admin\interface.py:62 +msgid "Summary" +msgstr "" + +#: .\judge\admin\organization.py:32 .\judge\admin\problem.py:168 +#: .\judge\admin\profile.py:59 +msgid "View on site" +msgstr "" + +#: .\judge\admin\problem.py:28 +msgid "Describe the changes you made (optional)" +msgstr "" + +#: .\judge\admin\problem.py:123 +msgid "Social Media" +msgstr "" + +#: .\judge\admin\problem.py:124 +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 +msgid "Points" +msgstr "" + +#: .\judge\admin\problem.py:126 +msgid "Limits" +msgstr "" + +#: .\judge\admin\problem.py:127 .\templates\stats\base.html:16 +#: .\templates\submission\list.html:231 +msgid "Language" +msgstr "" + +#: .\judge\admin\problem.py:128 +msgid "Justice" +msgstr "" + +#: .\judge\admin\problem.py:129 +msgid "History" +msgstr "" + +#: .\judge\admin\problem.py:165 +msgid "Authors" +msgstr "" + +#: .\judge\admin\problem.py:203 +#, 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 +msgid "Mark problems as public" +msgstr "" + +#: .\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 +msgid "Mark problems as private" +msgstr "" + +#: .\judge\admin\profile.py:32 +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 +msgid "User" +msgstr "" + +#: .\judge\admin\profile.py:70 +#: .\templates\registration\registration_form.html:141 +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 +msgid "Timezone" +msgstr "" + +#: .\judge\admin\profile.py:80 +msgid "date joined" +msgstr "" + +#: .\judge\admin\profile.py:87 +#, python-format +msgid "%d user have scores recalculated." +msgid_plural "%d users have scores recalculated." +msgstr[0] "" +msgstr[1] "" + +#: .\judge\admin\runtime.py:15 +msgid "Disallowed problems" +msgstr "" + +#: .\judge\admin\runtime.py:18 +msgid "These problems are NOT allowed to be submitted in this language" +msgstr "" + +#: .\judge\admin\runtime.py:81 +msgid "Description" +msgstr "" + +#: .\judge\admin\runtime.py:82 +msgid "Information" +msgstr "" + +#: .\judge\admin\runtime.py:83 +msgid "Capabilities" +msgstr "" + +#: .\judge\admin\submission.py:21 .\judge\admin\submission.py:40 +#: .\judge\admin\submission.py:207 +msgid "None" +msgstr "" + +#: .\judge\admin\submission.py:21 +msgid "Not done" +msgstr "" + +#: .\judge\admin\submission.py:21 +msgid "Exceptional" +msgstr "" + +#: .\judge\admin\submission.py:40 +msgid "Unaccepted" +msgstr "" + +#: .\judge\admin\submission.py:83 +#, python-format +msgctxt "contest problem" +msgid "%(problem)s in %(contest)s" +msgstr "" + +#: .\judge\admin\submission.py:127 .\judge\admin\submission.py:148 +msgid "You do not have the permission to rejudge submissions." +msgstr "" + +#: .\judge\admin\submission.py:132 +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 +msgid "Rejudge the selected submissions" +msgstr "" + +#: .\judge\admin\submission.py:177 +#, python-format +msgid "%d submission were successfully rescored." +msgid_plural "%d submissions were successfully rescored." +msgstr[0] "" +msgstr[1] "" + +#: .\judge\admin\submission.py:180 +msgid "Rescore the selected submissions" +msgstr "" + +#: .\judge\admin\submission.py:184 +msgid "Problem code" +msgstr "" + +#: .\judge\admin\submission.py:189 +msgid "Problem name" +msgstr "" + +#: .\judge\admin\submission.py:201 +#: .\templates\organization\requests\log.html:10 +#: .\templates\organization\requests\pending.html:20 +msgid "Time" +msgstr "" + +#: .\judge\admin\submission.py:209 +#, python-format +msgid "%d KB" +msgstr "" + +#: .\judge\admin\submission.py:211 +#, python-format +msgid "%.2f MB" +msgstr "" + +#: .\judge\admin\submission.py:213 +msgid "Memory" +msgstr "" + +#: .\judge\admin\taxon.py:11 .\judge\admin\taxon.py:34 +msgid "Included problems" +msgstr "" + +#: .\judge\admin\taxon.py:14 +msgid "These problems are included in this group of problems" +msgstr "" + +#: .\judge\admin\taxon.py:37 +msgid "These problems are included in this type of problems" +msgstr "" + +#: .\judge\apps.py:8 +msgid "Online Judge" +msgstr "" + +#: .\judge\comments.py:40 +msgid "Comment title" +msgstr "" + +#: .\judge\comments.py:41 +msgid "Comment body" +msgstr "" + +#: .\judge\comments.py:47 .\judge\views\ticket.py:50 +msgid "Your part is silent, little toad." +msgstr "" + +#: .\judge\comments.py:50 .\templates\comments\list.html:122 +msgid "" +"You need to have solved at least one problem before your voice can be heard." +msgstr "" + +#: .\judge\comments.py:75 +msgid "Posted comment" +msgstr "" + +#: .\judge\forms.py:25 +msgid "Subscribe to contest updates" +msgstr "" + +#: .\judge\forms.py:26 +msgid "Enable experimental features" +msgstr "" + +#: .\judge\forms.py:51 +#, 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 +msgid "Username" +msgstr "" + +#: .\judge\forms.py:110 .\templates\registration\registration_form.html:147 +#: .\templates\registration\registration_form.html:161 +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" +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\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\jinja2\timedelta.py:56 +msgctxt "time format without day" +msgid "%h:%m:%s" +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\jinja2\timedelta.py:64 +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "" +msgstr[1] "" + +#: .\judge\jinja2\timedelta.py:66 +msgctxt "hours and minutes" +msgid "%h:%m" +msgstr "" + +#: .\judge\models\choices.py:60 +msgid "Leave as LaTeX" +msgstr "" + +#: .\judge\models\choices.py:61 +msgid "SVG with PNG fallback" +msgstr "" + +#: .\judge\models\choices.py:62 +msgid "MathML only" +msgstr "" + +#: .\judge\models\choices.py:63 +msgid "MathJax with SVG/PNG fallback" +msgstr "" + +#: .\judge\models\choices.py:64 +msgid "Detect best quality" +msgstr "" + +#: .\judge\models\comment.py:36 +msgid "commenter" +msgstr "" + +#: .\judge\models\comment.py:37 +msgid "posted time" +msgstr "" + +#: .\judge\models\comment.py:38 +msgid "associated Page" +msgstr "" + +#: .\judge\models\comment.py:40 +msgid "Page code must be ^[pc]:[a-z0-9]+$|^b:\\d+$" +msgstr "" + +#: .\judge\models\comment.py:41 +msgid "votes" +msgstr "" + +#: .\judge\models\comment.py:42 +msgid "title of comment" +msgstr "" + +#: .\judge\models\comment.py:43 +msgid "body of comment" +msgstr "" + +#: .\judge\models\comment.py:44 +msgid "hide the comment" +msgstr "" + +#: .\judge\models\comment.py:45 +msgid "parent" +msgstr "" + +#: .\judge\models\comment.py:49 +msgid "comment" +msgstr "" + +#: .\judge\models\comment.py:50 +msgid "comments" +msgstr "" + +#: .\judge\models\comment.py:115 .\judge\models\problem.py:353 +#, python-format +msgid "Editorial for %s" +msgstr "" + +#: .\judge\models\comment.py:146 +msgid "comment vote" +msgstr "" + +#: .\judge\models\comment.py:147 +msgid "comment votes" +msgstr "" + +#: .\judge\models\contest.py:20 +msgid "Invalid colour." +msgstr "" + +#: .\judge\models\contest.py:22 +msgid "tag name" +msgstr "" + +#: .\judge\models\contest.py:23 +msgid "Lowercase letters and hyphens only." +msgstr "" + +#: .\judge\models\contest.py:24 +msgid "tag colour" +msgstr "" + +#: .\judge\models\contest.py:25 +msgid "tag description" +msgstr "" + +#: .\judge\models\contest.py:44 +msgid "contest tag" +msgstr "" + +#: .\judge\models\contest.py:45 .\judge\models\contest.py:87 +msgid "contest tags" +msgstr "" + +#: .\judge\models\contest.py:49 +msgid "contest id" +msgstr "" + +#: .\judge\models\contest.py:50 +msgid "Contest id must be ^[a-z0-9]+$" +msgstr "" + +#: .\judge\models\contest.py:51 +msgid "contest name" +msgstr "" + +#: .\judge\models\contest.py:52 +msgid "These people will be able to edit the contest." +msgstr "" + +#: .\judge\models\contest.py:54 .\judge\models\runtime.py:118 +msgid "description" +msgstr "" + +#: .\judge\models\contest.py:55 .\judge\models\problem.py:304 +#: .\judge\models\runtime.py:120 +msgid "problems" +msgstr "" + +#: .\judge\models\contest.py:56 .\judge\models\contest.py:182 +msgid "start time" +msgstr "" + +#: .\judge\models\contest.py:57 +msgid "end time" +msgstr "" + +#: .\judge\models\contest.py:58 .\judge\models\problem.py:109 +#: .\judge\models\problem.py:328 +msgid "time limit" +msgstr "" + +#: .\judge\models\contest.py:59 .\judge\models\problem.py:115 +msgid "publicly visible" +msgstr "" + +#: .\judge\models\contest.py:60 +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 +msgid "contest rated" +msgstr "" + +#: .\judge\models\contest.py:63 +msgid "Whether this contest can be rated." +msgstr "" + +#: .\judge\models\contest.py:65 +msgid "hide scoreboard" +msgstr "" + +#: .\judge\models\contest.py:66 +msgid "" +"Whether the scoreboard should remain hidden for the duration of the contest." +msgstr "" + +#: .\judge\models\contest.py:69 +msgid "no comments" +msgstr "" + +#: .\judge\models\contest.py:70 +msgid "Use clarification system instead of comments." +msgstr "" + +#: .\judge\models\contest.py:72 +msgid "rate all" +msgstr "" + +#: .\judge\models\contest.py:72 +msgid "Rate all users who joined." +msgstr "" + +#: .\judge\models\contest.py:73 +msgid "exclude from ratings" +msgstr "" + +#: .\judge\models\contest.py:75 +msgid "private to organizations" +msgstr "" + +#: .\judge\models\contest.py:76 +msgid "hide problem tags" +msgstr "" + +#: .\judge\models\contest.py:77 +msgid "Whether problem tags should be hidden by default." +msgstr "" + +#: .\judge\models\contest.py:79 +msgid "run pretests only" +msgstr "" + +#: .\judge\models\contest.py:80 +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 +msgid "organizations" +msgstr "" + +#: .\judge\models\contest.py:85 +msgid "If private, only these organizations may see the contest" +msgstr "" + +#: .\judge\models\contest.py:86 .\judge\models\problem.py:123 +msgid "OpenGraph image" +msgstr "" + +#: .\judge\models\contest.py:88 +msgid "the amount of live participants" +msgstr "" + +#: .\judge\models\contest.py:89 +msgid "contest summary" +msgstr "" + +#: .\judge\models\contest.py:90 .\judge\models\problem.py:125 +msgid "Plain-text, shown in meta description tag, e.g. for social media." +msgstr "" + +#: .\judge\models\contest.py:91 .\judge\models\profile.py:41 +msgid "access code" +msgstr "" + +#: .\judge\models\contest.py:92 +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 +msgid "See private contests" +msgstr "" + +#: .\judge\models\contest.py:170 +msgid "Edit own contests" +msgstr "" + +#: .\judge\models\contest.py:171 +msgid "Edit all contests" +msgstr "" + +#: .\judge\models\contest.py:172 +msgid "Rate contests" +msgstr "" + +#: .\judge\models\contest.py:173 +msgid "Contest access codes" +msgstr "" + +#: .\judge\models\contest.py:175 .\judge\models\contest.py:263 +#: .\judge\models\contest.py:298 +msgid "contest" +msgstr "" + +#: .\judge\models\contest.py:176 +msgid "contests" +msgstr "" + +#: .\judge\models\contest.py:180 +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 +msgid "score" +msgstr "" + +#: .\judge\models\contest.py:184 +msgid "cumulative time" +msgstr "" + +#: .\judge\models\contest.py:185 +msgid "virtual participation id" +msgstr "" + +#: .\judge\models\contest.py:186 +msgid "0 means non-virtual, otherwise the n-th virtual participation" +msgstr "" + +#: .\judge\models\contest.py:249 +#, python-format +msgid "%s spectating in %s" +msgstr "" + +#: .\judge\models\contest.py:251 +#, python-format +msgid "%s in %s, v%d" +msgstr "" + +#: .\judge\models\contest.py:252 +#, python-format +msgid "%s in %s" +msgstr "" + +#: .\judge\models\contest.py:255 +msgid "contest participation" +msgstr "" + +#: .\judge\models\contest.py:256 +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 +msgid "problem" +msgstr "" + +#: .\judge\models\contest.py:264 .\judge\models\contest.py:286 +#: .\judge\models\problem.py:112 +msgid "points" +msgstr "" + +#: .\judge\models\contest.py:265 +msgid "partial" +msgstr "" + +#: .\judge\models\contest.py:266 .\judge\models\contest.py:287 +msgid "is pretested" +msgstr "" + +#: .\judge\models\contest.py:267 .\judge\models\interface.py:43 +msgid "order" +msgstr "" + +#: .\judge\models\contest.py:268 +msgid "output prefix length override" +msgstr "" + +#: .\judge\models\contest.py:269 +msgid "Maximum number of submissions for this problem, or 0 for no limit." +msgstr "" + +#: .\judge\models\contest.py:271 +msgid "Why include a problem you can't submit to?" +msgstr "" + +#: .\judge\models\contest.py:276 +msgid "contest problem" +msgstr "" + +#: .\judge\models\contest.py:277 +msgid "contest problems" +msgstr "" + +#: .\judge\models\contest.py:281 .\judge\models\submission.py:149 +msgid "submission" +msgstr "" + +#: .\judge\models\contest.py:284 .\judge\models\contest.py:299 +msgid "participation" +msgstr "" + +#: .\judge\models\contest.py:288 +msgid "Whether this submission was ran only on pretests." +msgstr "" + +#: .\judge\models\contest.py:292 +msgid "contest submission" +msgstr "" + +#: .\judge\models\contest.py:293 +msgid "contest submissions" +msgstr "" + +#: .\judge\models\contest.py:300 +msgid "rank" +msgstr "" + +#: .\judge\models\contest.py:301 +msgid "rating" +msgstr "" + +#: .\judge\models\contest.py:302 +msgid "volatility" +msgstr "" + +#: .\judge\models\contest.py:303 +msgid "last rated" +msgstr "" + +#: .\judge\models\contest.py:307 +msgid "contest rating" +msgstr "" + +#: .\judge\models\contest.py:308 +msgid "contest ratings" +msgstr "" + +#: .\judge\models\interface.py:24 +msgid "configuration item" +msgstr "" + +#: .\judge\models\interface.py:25 +msgid "miscellaneous configuration" +msgstr "" + +#: .\judge\models\interface.py:37 +msgid "navigation item" +msgstr "" + +#: .\judge\models\interface.py:38 +msgid "navigation bar" +msgstr "" + +#: .\judge\models\interface.py:44 .\judge\models\profile.py:22 +msgid "identifier" +msgstr "" + +#: .\judge\models\interface.py:45 +msgid "label" +msgstr "" + +#: .\judge\models\interface.py:47 +msgid "highlight regex" +msgstr "" + +#: .\judge\models\interface.py:48 +msgid "parent item" +msgstr "" + +#: .\judge\models\interface.py:65 +msgid "post title" +msgstr "" + +#: .\judge\models\interface.py:66 .\judge\models\problem.py:342 +msgid "authors" +msgstr "" + +#: .\judge\models\interface.py:67 +msgid "slug" +msgstr "" + +#: .\judge\models\interface.py:68 .\judge\models\problem.py:340 +msgid "public visibility" +msgstr "" + +#: .\judge\models\interface.py:69 +msgid "sticky" +msgstr "" + +#: .\judge\models\interface.py:70 +msgid "publish after" +msgstr "" + +#: .\judge\models\interface.py:71 +msgid "post content" +msgstr "" + +#: .\judge\models\interface.py:72 +msgid "post summary" +msgstr "" + +#: .\judge\models\interface.py:73 +msgid "openGraph image" +msgstr "" + +#: .\judge\models\interface.py:90 +msgid "Edit all posts" +msgstr "" + +#: .\judge\models\interface.py:92 +msgid "blog post" +msgstr "" + +#: .\judge\models\interface.py:93 +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" +msgstr "" + +#: .\judge\models\problem.py:26 +msgid "problem category ID" +msgstr "" + +#: .\judge\models\problem.py:27 +msgid "problem category name" +msgstr "" + +#: .\judge\models\problem.py:34 +msgid "problem type" +msgstr "" + +#: .\judge\models\problem.py:35 .\judge\models\problem.py:107 +msgid "problem types" +msgstr "" + +#: .\judge\models\problem.py:39 +msgid "problem group ID" +msgstr "" + +#: .\judge\models\problem.py:40 +msgid "problem group name" +msgstr "" + +#: .\judge\models\problem.py:47 .\judge\models\problem.py:108 +msgid "problem group" +msgstr "" + +#: .\judge\models\problem.py:48 +msgid "problem groups" +msgstr "" + +#: .\judge\models\problem.py:52 +msgid "key" +msgstr "" + +#: .\judge\models\problem.py:54 +msgid "link" +msgstr "" + +#: .\judge\models\problem.py:55 +msgid "full name" +msgstr "" + +#: .\judge\models\problem.py:56 .\judge\models\profile.py:26 +#: .\judge\models\runtime.py:20 +msgid "short name" +msgstr "" + +#: .\judge\models\problem.py:57 +msgid "Displayed on pages under this license" +msgstr "" + +#: .\judge\models\problem.py:58 +msgid "icon" +msgstr "" + +#: .\judge\models\problem.py:58 +msgid "URL to the icon" +msgstr "" + +#: .\judge\models\problem.py:59 +msgid "license text" +msgstr "" + +#: .\judge\models\problem.py:68 +msgid "license" +msgstr "" + +#: .\judge\models\problem.py:69 +msgid "licenses" +msgstr "" + +#: .\judge\models\problem.py:96 +msgid "problem code" +msgstr "" + +#: .\judge\models\problem.py:97 +msgid "Problem code must be ^[a-z0-9]+$" +msgstr "" + +#: .\judge\models\problem.py:98 +msgid "problem name" +msgstr "" + +#: .\judge\models\problem.py:99 +msgid "problem body" +msgstr "" + +#: .\judge\models\problem.py:100 +msgid "creators" +msgstr "" + +#: .\judge\models\problem.py:101 +msgid "curators" +msgstr "" + +#: .\judge\models\problem.py:102 +msgid "" +"These users will be able to edit a problem, but not be publicly shown as an " +"author." +msgstr "" + +#: .\judge\models\problem.py:104 +msgid "testers" +msgstr "" + +#: .\judge\models\problem.py:106 +msgid "These users will be able to view a private problem, but not edit it." +msgstr "" + +#: .\judge\models\problem.py:109 +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 +msgid "memory limit" +msgstr "" + +#: .\judge\models\problem.py:110 +msgid "" +"The memory limit for this problem, in kilobytes (e.g. 64mb = 65536 " +"kilobytes)." +msgstr "" + +#: .\judge\models\problem.py:113 +msgid "allows partial points" +msgstr "" + +#: .\judge\models\problem.py:114 +msgid "allowed languages" +msgstr "" + +#: .\judge\models\problem.py:116 +msgid "manually managed" +msgstr "" + +#: .\judge\models\problem.py:117 +msgid "Whether judges should be allowed to manage data or not" +msgstr "" + +#: .\judge\models\problem.py:118 +msgid "date of publishing" +msgstr "" + +#: .\judge\models\problem.py:119 +msgid "" +"Doesn't have magic ability to auto-publish due to backward compatibility" +msgstr "" + +#: .\judge\models\problem.py:120 +msgid "personae non gratae" +msgstr "" + +#: .\judge\models\problem.py:121 +msgid "Bans the selected users from submitting to this problem" +msgstr "" + +#: .\judge\models\problem.py:124 +msgid "problem summary" +msgstr "" + +#: .\judge\models\problem.py:126 +msgid "amount of users" +msgstr "" + +#: .\judge\models\problem.py:127 +msgid "The amount of users on the best solutions page." +msgstr "" + +#: .\judge\models\problem.py:128 +msgid "rate of AC submissions" +msgstr "" + +#: .\judge\models\problem.py:309 .\judge\models\problem.py:327 +#: .\judge\models\runtime.py:96 +msgid "language" +msgstr "" + +#: .\judge\models\problem.py:310 +msgid "translated name" +msgstr "" + +#: .\judge\models\problem.py:311 +msgid "translated description" +msgstr "" + +#: .\judge\models\problem.py:315 +msgid "problem translation" +msgstr "" + +#: .\judge\models\problem.py:316 +msgid "problem translations" +msgstr "" + +#: .\judge\models\problem.py:320 +msgid "clarified problem" +msgstr "" + +#: .\judge\models\problem.py:321 +msgid "clarification body" +msgstr "" + +#: .\judge\models\problem.py:322 +msgid "clarification timestamp" +msgstr "" + +#: .\judge\models\problem.py:333 +msgid "language-specific resource limit" +msgstr "" + +#: .\judge\models\problem.py:334 +msgid "language-specific resource limits" +msgstr "" + +#: .\judge\models\problem.py:338 +msgid "associated problem" +msgstr "" + +#: .\judge\models\problem.py:341 +msgid "publish date" +msgstr "" + +#: .\judge\models\problem.py:343 +msgid "editorial content" +msgstr "" + +#: .\judge\models\problem.py:359 +msgid "solution" +msgstr "" + +#: .\judge\models\problem.py:360 +msgid "solutions" +msgstr "" + +#: .\judge\models\problem_data.py:23 +msgid "Standard" +msgstr "" + +#: .\judge\models\problem_data.py:24 +msgid "Floats" +msgstr "" + +#: .\judge\models\problem_data.py:25 +msgid "Floats (absolute)" +msgstr "" + +#: .\judge\models\problem_data.py:26 +msgid "Floats (relative)" +msgstr "" + +#: .\judge\models\problem_data.py:27 +msgid "Non-trailing spaces" +msgstr "" + +#: .\judge\models\problem_data.py:28 +msgid "Unordered" +msgstr "" + +#: .\judge\models\problem_data.py:29 +msgid "Byte identical" +msgstr "" + +#: .\judge\models\problem_data.py:35 +msgid "data zip file" +msgstr "" + +#: .\judge\models\problem_data.py:37 +msgid "generator file" +msgstr "" + +#: .\judge\models\problem_data.py:39 .\judge\models\problem_data.py:87 +msgid "output prefix length" +msgstr "" + +#: .\judge\models\problem_data.py:40 .\judge\models\problem_data.py:88 +msgid "output limit length" +msgstr "" + +#: .\judge\models\problem_data.py:41 +msgid "init.yml generation feedback" +msgstr "" + +#: .\judge\models\problem_data.py:42 .\judge\models\problem_data.py:89 +msgid "checker" +msgstr "" + +#: .\judge\models\problem_data.py:43 .\judge\models\problem_data.py:90 +msgid "checker arguments" +msgstr "" + +#: .\judge\models\problem_data.py:44 .\judge\models\problem_data.py:91 +msgid "checker arguments as a JSON object" +msgstr "" + +#: .\judge\models\problem_data.py:75 +msgid "problem data set" +msgstr "" + +#: .\judge\models\problem_data.py:76 +msgid "case position" +msgstr "" + +#: .\judge\models\problem_data.py:77 +msgid "case type" +msgstr "" + +#: .\judge\models\problem_data.py:78 +msgid "Normal case" +msgstr "" + +#: .\judge\models\problem_data.py:79 +msgid "Batch start" +msgstr "" + +#: .\judge\models\problem_data.py:80 +msgid "Batch end" +msgstr "" + +#: .\judge\models\problem_data.py:82 +msgid "input file name" +msgstr "" + +#: .\judge\models\problem_data.py:83 +msgid "output file name" +msgstr "" + +#: .\judge\models\problem_data.py:84 +msgid "generator arguments" +msgstr "" + +#: .\judge\models\problem_data.py:85 +msgid "point value" +msgstr "" + +#: .\judge\models\problem_data.py:86 +msgid "case is pretest?" +msgstr "" + +#: .\judge\models\profile.py:21 +msgid "organization title" +msgstr "" + +#: .\judge\models\profile.py:23 +msgid "Organization name shows in URL" +msgstr "" + +#: .\judge\models\profile.py:27 +msgid "Displayed beside user name during contests" +msgstr "" + +#: .\judge\models\profile.py:28 +msgid "organization description" +msgstr "" + +#: .\judge\models\profile.py:29 +msgid "registrant" +msgstr "" + +#: .\judge\models\profile.py:31 +msgid "User who registered this organization" +msgstr "" + +#: .\judge\models\profile.py:32 +msgid "administrators" +msgstr "" + +#: .\judge\models\profile.py:33 +msgid "Those who can edit this organization" +msgstr "" + +#: .\judge\models\profile.py:34 +msgid "creation date" +msgstr "" + +#: .\judge\models\profile.py:35 +msgid "is open organization?" +msgstr "" + +#: .\judge\models\profile.py:36 +msgid "Allow joining organization" +msgstr "" + +#: .\judge\models\profile.py:37 +msgid "maximum size" +msgstr "" + +#: .\judge\models\profile.py:38 +msgid "" +"Maximum amount of users in this organization, only applicable to private " +"organizations" +msgstr "" + +#: .\judge\models\profile.py:40 +msgid "Student access code" +msgstr "" + +#: .\judge\models\profile.py:63 .\judge\models\profile.py:80 +#: .\judge\models\profile.py:174 +msgid "organization" +msgstr "" + +#: .\judge\models\profile.py:68 +msgid "user associated" +msgstr "" + +#: .\judge\models\profile.py:69 +msgid "display name" +msgstr "" + +#: .\judge\models\profile.py:70 +msgid "self-description" +msgstr "" + +#: .\judge\models\profile.py:71 +msgid "location" +msgstr "" + +#: .\judge\models\profile.py:73 +msgid "preferred language" +msgstr "" + +#: .\judge\models\profile.py:78 +msgid "last access time" +msgstr "" + +#: .\judge\models\profile.py:79 +msgid "last IP" +msgstr "" + +#: .\judge\models\profile.py:82 +msgid "display rank" +msgstr "" + +#: .\judge\models\profile.py:84 +msgid "comment mute" +msgstr "" + +#: .\judge\models\profile.py:84 +msgid "Some users are at their best when silent." +msgstr "" + +#: .\judge\models\profile.py:87 +msgid "user script" +msgstr "" + +#: .\judge\models\profile.py:88 +msgid "User-defined JavaScript for site customization." +msgstr "" + +#: .\judge\models\profile.py:89 +msgid "current contest" +msgstr "" + +#: .\judge\models\profile.py:91 +msgid "math engine" +msgstr "" + +#: .\judge\models\profile.py:93 +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)" +msgstr "" + +#: .\judge\models\profile.py:168 +msgid "user profile" +msgstr "" + +#: .\judge\models\profile.py:169 +msgid "user profiles" +msgstr "" + +#: .\judge\models\profile.py:175 +msgid "request time" +msgstr "" + +#: .\judge\models\profile.py:176 +msgid "state" +msgstr "" + +#: .\judge\models\profile.py:181 +msgid "reason" +msgstr "" + +#: .\judge\models\profile.py:184 +msgid "organization join request" +msgstr "" + +#: .\judge\models\profile.py:185 +msgid "organization join requests" +msgstr "" + +#: .\judge\models\runtime.py:15 +msgid "short identifier" +msgstr "" + +#: .\judge\models\runtime.py:16 +msgid "" +"The identifier for this language; the same as its executor id for judges." +msgstr "" + +#: .\judge\models\runtime.py:18 +msgid "long name" +msgstr "" + +#: .\judge\models\runtime.py:19 +msgid "Longer name for the language, e.g. \"Python 2\" or \"C++11\"." +msgstr "" + +#: .\judge\models\runtime.py:21 +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 +msgid "common name" +msgstr "" + +#: .\judge\models\runtime.py:26 +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 +msgid "ace mode name" +msgstr "" + +#: .\judge\models\runtime.py:29 +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 +msgid "pygments name" +msgstr "" + +#: .\judge\models\runtime.py:32 +msgid "Language ID for Pygments highlighting in source windows." +msgstr "" + +#: .\judge\models\runtime.py:33 +msgid "code template" +msgstr "" + +#: .\judge\models\runtime.py:34 +msgid "Code template to display in submission editor." +msgstr "" + +#: .\judge\models\runtime.py:35 +msgid "runtime info override" +msgstr "" + +#: .\judge\models\runtime.py:36 +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 +msgid "language description" +msgstr "" + +#: .\judge\models\runtime.py:39 +msgid "" +"Use field this to inform users of quirks with your environment, additional " +"restrictions, etc." +msgstr "" + +#: .\judge\models\runtime.py:41 +msgid "extension" +msgstr "" + +#: .\judge\models\runtime.py:42 +msgid "The extension of source files, e.g., \"py\" or \"cpp\"." +msgstr "" + +#: .\judge\models\runtime.py:97 +msgid "languages" +msgstr "" + +#: .\judge\models\runtime.py:101 +msgid "language to which this runtime belongs" +msgstr "" + +#: .\judge\models\runtime.py:102 +msgid "judge on which this runtime exists" +msgstr "" + +#: .\judge\models\runtime.py:103 +msgid "runtime name" +msgstr "" + +#: .\judge\models\runtime.py:104 +msgid "runtime version" +msgstr "" + +#: .\judge\models\runtime.py:105 +msgid "order in which to display this runtime" +msgstr "" + +#: .\judge\models\runtime.py:109 +msgid "Server name, hostname-style" +msgstr "" + +#: .\judge\models\runtime.py:110 +msgid "time of creation" +msgstr "" + +#: .\judge\models\runtime.py:111 +msgid "A key to authenticated this judge" +msgstr "" + +#: .\judge\models\runtime.py:112 +msgid "authentication key" +msgstr "" + +#: .\judge\models\runtime.py:113 +msgid "judge online status" +msgstr "" + +#: .\judge\models\runtime.py:114 +msgid "judge start time" +msgstr "" + +#: .\judge\models\runtime.py:115 +msgid "response time" +msgstr "" + +#: .\judge\models\runtime.py:116 +msgid "system load" +msgstr "" + +#: .\judge\models\runtime.py:117 +msgid "Load for the last minute, divided by processors to be fair." +msgstr "" + +#: .\judge\models\runtime.py:121 .\judge\models\runtime.py:156 +msgid "judges" +msgstr "" + +#: .\judge\models\runtime.py:155 +msgid "judge" +msgstr "" + +#: .\judge\models\submission.py:15 .\judge\models\submission.py:41 +#: .\judge\utils\problems.py:81 +msgid "Accepted" +msgstr "" + +#: .\judge\models\submission.py:16 .\judge\models\submission.py:42 +#: .\judge\utils\problems.py:82 +msgid "Wrong Answer" +msgstr "" + +#: .\judge\models\submission.py:17 .\judge\models\submission.py:44 +#: .\judge\utils\problems.py:84 +msgid "Time Limit Exceeded" +msgstr "" + +#: .\judge\models\submission.py:18 .\judge\models\submission.py:45 +#: .\judge\utils\problems.py:85 +msgid "Memory Limit Exceeded" +msgstr "" + +#: .\judge\models\submission.py:19 .\judge\models\submission.py:46 +msgid "Output Limit Exceeded" +msgstr "" + +#: .\judge\models\submission.py:20 .\judge\models\submission.py:47 +msgid "Invalid Return" +msgstr "" + +#: .\judge\models\submission.py:21 .\judge\models\submission.py:48 +msgid "Runtime Error" +msgstr "" + +#: .\judge\models\submission.py:22 .\judge\models\submission.py:36 +#: .\judge\models\submission.py:49 .\judge\utils\problems.py:83 +msgid "Compile Error" +msgstr "" + +#: .\judge\models\submission.py:23 .\judge\models\submission.py:35 +msgid "Internal Error" +msgstr "" + +#: .\judge\models\submission.py:24 +msgid "Short circuit" +msgstr "" + +#: .\judge\models\submission.py:25 .\judge\models\submission.py:37 +#: .\judge\models\submission.py:55 +msgid "Aborted" +msgstr "" + +#: .\judge\models\submission.py:31 .\judge\models\submission.py:51 +msgid "Queued" +msgstr "" + +#: .\judge\models\submission.py:32 .\judge\models\submission.py:52 +msgid "Processing" +msgstr "" + +#: .\judge\models\submission.py:33 .\judge\models\submission.py:53 +msgid "Grading" +msgstr "" + +#: .\judge\models\submission.py:34 .\judge\models\submission.py:54 +msgid "Completed" +msgstr "" + +#: .\judge\models\submission.py:50 +msgid "Internal Error (judging server error)" +msgstr "" + +#: .\judge\models\submission.py:60 +msgid "submission time" +msgstr "" + +#: .\judge\models\submission.py:61 .\judge\models\submission.py:159 +msgid "execution time" +msgstr "" + +#: .\judge\models\submission.py:62 .\judge\models\submission.py:160 +msgid "memory usage" +msgstr "" + +#: .\judge\models\submission.py:63 .\judge\models\submission.py:161 +msgid "points granted" +msgstr "" + +#: .\judge\models\submission.py:64 +msgid "submission language" +msgstr "" + +#: .\judge\models\submission.py:65 +msgid "source code" +msgstr "" + +#: .\judge\models\submission.py:66 +msgid "status" +msgstr "" + +#: .\judge\models\submission.py:67 +msgid "result" +msgstr "" + +#: .\judge\models\submission.py:69 +msgid "compile errors" +msgstr "" + +#: .\judge\models\submission.py:71 +msgid "batched cases" +msgstr "" + +#: .\judge\models\submission.py:72 +msgid "test case points" +msgstr "" + +#: .\judge\models\submission.py:73 +msgid "test case total points" +msgstr "" + +#: .\judge\models\submission.py:74 +msgid "judged on" +msgstr "" + +#: .\judge\models\submission.py:76 +msgid "was rejudged by admin" +msgstr "" + +#: .\judge\models\submission.py:77 +msgid "was ran on pretests only" +msgstr "" + +#: .\judge\models\submission.py:150 +msgid "submissions" +msgstr "" + +#: .\judge\models\submission.py:156 +msgid "associated submission" +msgstr "" + +#: .\judge\models\submission.py:157 +msgid "test case ID" +msgstr "" + +#: .\judge\models\submission.py:158 +msgid "status flag" +msgstr "" + +#: .\judge\models\submission.py:162 +msgid "points possible" +msgstr "" + +#: .\judge\models\submission.py:163 +msgid "batch number" +msgstr "" + +#: .\judge\models\submission.py:164 +msgid "judging feedback" +msgstr "" + +#: .\judge\models\submission.py:165 +msgid "program output" +msgstr "" + +#: .\judge\models\submission.py:172 +msgid "submission test case" +msgstr "" + +#: .\judge\models\submission.py:173 +msgid "submission test cases" +msgstr "" + +#: .\judge\models\ticket.py:10 +msgid "ticket title" +msgstr "" + +#: .\judge\models\ticket.py:11 +msgid "ticket creator" +msgstr "" + +#: .\judge\models\ticket.py:12 +msgid "creation time" +msgstr "" + +#: .\judge\models\ticket.py:13 +msgid "assignees" +msgstr "" + +#: .\judge\models\ticket.py:14 +msgid "quick notes" +msgstr "" + +#: .\judge\models\ticket.py:15 +msgid "Staff notes for this issue to aid in processing." +msgstr "" + +#: .\judge\models\ticket.py:16 +msgid "linked item type" +msgstr "" + +#: .\judge\models\ticket.py:18 +msgid "linked item ID" +msgstr "" + +#: .\judge\models\ticket.py:20 +msgid "is ticket open?" +msgstr "" + +#: .\judge\models\ticket.py:24 +msgid "ticket" +msgstr "" + +#: .\judge\models\ticket.py:26 +msgid "poster" +msgstr "" + +#: .\judge\models\ticket.py:28 +msgid "message time" +msgstr "" + +#: .\judge\pdf_problems.py:111 +msgid "Page [page] of [topage]" +msgstr "" + +#: .\judge\utils\problem_data.py:63 +msgid "Empty batches not allowed." +msgstr "" + +#: .\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 +#, python-format +msgid "Input file for case %d does not exist: %s" +msgstr "" + +#: .\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 +#, python-format +msgid "Batch start case #%d requires points." +msgstr "" + +#: .\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 +msgid "How did you corrupt the zip path?" +msgstr "" + +#: .\judge\utils\problem_data.py:160 +msgid "How did you corrupt the generator path?" +msgstr "" + +#: .\judge\utils\problems.py:76 +msgid "Can't pass both queryset and keyword filters" +msgstr "" + +#: .\judge\utils\problems.py:86 +msgid "Other" +msgstr "" + +#: .\judge\utils\problems.py:87 +msgid "Total" +msgstr "" + +#: .\judge\views\blog.py:36 +#, python-format +msgid "Page %d of Posts" +msgstr "" + +#: .\judge\views\comment.py:27 +msgid "Messing around, are we?" +msgstr "" + +#: .\judge\views\comment.py:59 +msgid "You already voted." +msgstr "" + +#: .\judge\views\comment.py:116 .\judge\views\organization.py:282 +msgid "Edited from site" +msgstr "" + +#: .\judge\views\comment.py:137 +msgid "Editing comment" +msgstr "" + +#: .\judge\views\contests.py:48 .\judge\views\contests.py:178 +#: .\judge\views\contests.py:181 .\judge\views\contests.py:308 +msgid "No such contest" +msgstr "" + +#: .\judge\views\contests.py:49 .\judge\views\contests.py:179 +#, python-format +msgid "Could not find a contest with the key \"%s\"." +msgstr "" + +#: .\judge\views\contests.py:72 .\judge\views\contests.py:322 +msgid "Contests" +msgstr "" + +#: .\judge\views\contests.py:182 +msgid "Could not find such contest." +msgstr "" + +#: .\judge\views\contests.py:185 +#, python-format +msgid "Access to contest \"%s\" denied" +msgstr "" + +#: .\judge\views\contests.py:236 +msgid "Contest not ongoing" +msgstr "" + +#: .\judge\views\contests.py:237 +#, python-format +msgid "\"%s\" is not currently ongoing." +msgstr "" + +#: .\judge\views\contests.py:241 +msgid "Already in contest" +msgstr "" + +#: .\judge\views\contests.py:242 +#, python-format +msgid "You are already in a contest: \"%s\"." +msgstr "" + +#: .\judge\views\contests.py:298 +#, python-format +msgid "Enter access code for \"%s\"" +msgstr "" + +#: .\judge\views\contests.py:309 +#, python-format +msgid "You are not in contest \"%s\"." +msgstr "" + +#: .\judge\views\contests.py:329 +msgid "ContestCalender requires integer year and month" +msgstr "" + +#: .\judge\views\contests.py:504 +msgid "???" +msgstr "" + +#: .\judge\views\contests.py:540 +#, python-format +msgid "%s Rankings" +msgstr "" + +#: .\judge\views\contests.py:592 +msgid "Live" +msgstr "" + +#: .\judge\views\contests.py:600 +#, python-format +msgid "Your participation in %s" +msgstr "" + +#: .\judge\views\contests.py:601 +#, python-format +msgid "%s's participation in %s" +msgstr "" + +#: .\judge\views\contests.py:610 .\templates\contest\contest-tabs.html:13 +msgid "Participation" +msgstr "" + +#: .\judge\views\contests.py:635 +#, python-format +msgid "Contest tag: %s" +msgstr "" + +#: .\judge\views\error.py:14 +msgid "404 error" +msgstr "" + +#: .\judge\views\error.py:15 +#, python-format +msgid "Could not find page \"%s\"" +msgstr "" + +#: .\judge\views\error.py:21 +#, python-format +msgid "no permission for %s" +msgstr "" + +#: .\judge\views\error.py:27 +#, 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 +msgid "Runtimes" +msgstr "" + +#: .\judge\views\organization.py:43 .\judge\views\organization.py:46 +msgid "No such organization" +msgstr "" + +#: .\judge\views\organization.py:44 +#, python-format +msgid "Could not find an organization with the key \"%s\"." +msgstr "" + +#: .\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 +msgid "Organizations" +msgstr "" + +#: .\judge\views\organization.py:83 +#, python-format +msgid "%s Members" +msgstr "" + +#: .\judge\views\organization.py:113 .\judge\views\organization.py:115 +msgid "Joining organization" +msgstr "" + +#: .\judge\views\organization.py:113 +msgid "You are already in the organization." +msgstr "" + +#: .\judge\views\organization.py:115 +msgid "This organization is not open." +msgstr "" + +#: .\judge\views\organization.py:124 +msgid "Leaving organization" +msgstr "" + +#: .\judge\views\organization.py:124 +#, python-format +msgid "You are not in \"%s\"." +msgstr "" + +#: .\judge\views\organization.py:148 +#, python-format +msgid "Request to join %s" +msgstr "" + +#: .\judge\views\organization.py:164 +msgid "Join request detail" +msgstr "" + +#: .\judge\views\organization.py:193 +#, python-format +msgid "Managing join requests for %s" +msgstr "" + +#: .\judge\views\organization.py:224 +#, python-format +msgid "" +"Your organization can only receive %d more members. You cannot approve %d " +"users." +msgstr "" + +#: .\judge\views\organization.py:236 +#, python-format +msgid "Approved %d user." +msgid_plural "Approved %d users." +msgstr[0] "" +msgstr[1] "" + +#: .\judge\views\organization.py:237 +#, python-format +msgid "Rejected %d user." +msgid_plural "Rejected %d users." +msgstr[0] "" +msgstr[1] "" + +#: .\judge\views\organization.py:267 +#, python-format +msgid "Editing %s" +msgstr "" + +#: .\judge\views\organization.py:290 .\judge\views\organization.py:298 +msgid "Can't edit organization" +msgstr "" + +#: .\judge\views\organization.py:291 +msgid "You are not allowed to edit this organization." +msgstr "" + +#: .\judge\views\organization.py:299 +msgid "You are not allowed to kick people from this organization." +msgstr "" + +#: .\judge\views\organization.py:304 .\judge\views\organization.py:308 +msgid "Can't kick user" +msgstr "" + +#: .\judge\views\organization.py:305 +msgid "The user you are trying to kick does not exist!" +msgstr "" + +#: .\judge\views\organization.py:309 +#, python-format +msgid "The user you are trying to kick is not in organization: %s." +msgstr "" + +#: .\judge\views\problem.py:72 +msgid "No such problem" +msgstr "" + +#: .\judge\views\problem.py:73 +#, python-format +msgid "Could not find a problem with the code \"%s\"." +msgstr "" + +#: .\judge\views\problem.py:109 +#, python-brace-format +msgid "Editorial for {0}" +msgstr "" + +#: .\judge\views\problem.py:112 +#, 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 +msgid "Problems" +msgstr "" + +#: .\judge\views\problem.py:527 +msgid "Banned from submitting" +msgstr "" + +#: .\judge\views\problem.py:528 +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 +msgid "Too many submissions" +msgstr "" + +#: .\judge\views\problem.py:540 +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" +msgstr "" + +#: .\judge\views\problem_data.py:36 +msgid "Checker arguments must be a JSON object" +msgstr "" + +#: .\judge\views\problem_data.py:38 +msgid "Checker arguments is invalid JSON" +msgstr "" + +#: .\judge\views\problem_data.py:45 +msgid "Your zip file is invalid!" +msgstr "" + +#: .\judge\views\problem_data.py:102 +#, python-brace-format +msgid "Comparing submissions for {0}" +msgstr "" + +#: .\judge\views\problem_data.py:105 +#, python-brace-format +msgid "Comparing submissions for {0}" +msgstr "" + +#: .\judge\views\problem_data.py:140 +#, 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 +#, python-format +msgid "Editing data for %s" +msgstr "" + +#: .\judge\views\problem_data.py:242 .\judge\views\problem_data.py:243 +#, python-format +msgid "Generated init.yml for %s" +msgstr "" + +#: .\judge\views\ranked_submission.py:59 +#, python-format +msgid "Best solutions for %s" +msgstr "" + +#: .\judge\views\ranked_submission.py:62 +#, python-brace-format +msgid "Best solutions for {0}" +msgstr "" + +#: .\judge\views\ranked_submission.py:72 +#, python-format +msgid "Best solutions for %(problem)s in %(contest)s" +msgstr "" + +#: .\judge\views\ranked_submission.py:74 +#, python-format +msgid "Best solutions for problem %(number)s in %(contest)s" +msgstr "" + +#: .\judge\views\ranked_submission.py:79 +#, python-brace-format +msgid "Best solutions for {0} in {2}" +msgstr "" + +#: .\judge\views\ranked_submission.py:82 +#, python-brace-format +msgid "Best solutions for problem {0} in {1}" +msgstr "" + +#: .\judge\views\register.py:27 +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 +msgid "Preferred language" +msgstr "" + +#: .\judge\views\register.py:39 +msgid "Subscribe to newsletter?" +msgstr "" + +#: .\judge\views\register.py:46 +#, python-format +msgid "" +"The email address \"%s\" is already taken. Only one registration is allowed " +"per address." +msgstr "" + +#: .\judge\views\register.py:52 +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 +msgid "Registration" +msgstr "" + +#: .\judge\views\register.py:108 +msgid "Authentication failure" +msgstr "" + +#: .\judge\views\stats.py:94 +msgid "Language statistics" +msgstr "" + +#: .\judge\views\status.py:24 .\templates\submission\list.html:222 +msgid "Status" +msgstr "" + +#: .\judge\views\status.py:109 +msgid "Version matrix" +msgstr "" + +#: .\judge\views\submission.py:56 .\judge\views\submission.py:63 +#, 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 +msgid "All submissions" +msgstr "" + +#: .\judge\views\submission.py:287 +msgid "All my submissions" +msgstr "" + +#: .\judge\views\submission.py:288 +#, python-format +msgid "All submissions by %s" +msgstr "" + +#: .\judge\views\submission.py:318 +#, python-format +msgid "All submissions for %s" +msgstr "" + +#: .\judge\views\submission.py:339 +msgid "Must pass a problem" +msgstr "" + +#: .\judge\views\submission.py:370 +#, python-format +msgid "My submissions for %(problem)s" +msgstr "" + +#: .\judge\views\submission.py:371 +#, python-format +msgid "%(user)s's submissions for %(problem)s" +msgstr "" + +#: .\judge\views\submission.py:445 +msgid "Must pass a contest" +msgstr "" + +#: .\judge\views\submission.py:464 +#, python-brace-format +msgid "" +"{0}'s submissions for {2} in {4}" +msgstr "" + +#: .\judge\views\submission.py:469 +#, python-brace-format +msgid "" +"{0}'s submissions for problem {2} in {3}" +"" +msgstr "" + +#: .\judge\views\ticket.py:37 .\judge\views\ticket.py:43 +msgid "Ticket title" +msgstr "" + +#: .\judge\views\ticket.py:44 +msgid "Issue description" +msgstr "" + +#: .\judge\views\ticket.py:102 .\judge\views\ticket.py:105 +#, python-format +msgid "New ticket for %s" +msgstr "" + +#: .\judge\views\ticket.py:151 +#, python-format +msgid "%(title)s - Ticket %(id)d" +msgstr "" + +#: .\judge\views\ticket.py:258 +#, python-format +msgid "Tickets - Page %(number)d of %(total)d" +msgstr "" + +#: .\judge\views\ticket.py:307 +#, python-format +msgid "New Ticket: %s" +msgstr "" + +#: .\judge\views\ticket.py:308 +#, python-format +msgid "#%(id)d, assigned to: %(users)s" +msgstr "" + +#: .\judge\views\ticket.py:309 +msgid ", " +msgstr "" + +#: .\judge\views\ticket.py:310 +msgid "no one" +msgstr "" + +#: .\judge\views\user.py:70 +msgid "No such user" +msgstr "" + +#: .\judge\views\user.py:70 +#, python-format +msgid "No user handle \"%s\"." +msgstr "" + +#: .\judge\views\user.py:74 +msgid "My account" +msgstr "" + +#: .\judge\views\user.py:75 +#, python-format +msgid "User %s" +msgstr "" + +#: .\judge\views\user.py:133 +msgid "M j, Y, G:i" +msgstr "" + +#: .\judge\views\user.py:215 +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 +msgid "Edit profile" +msgstr "" + +#: .\judge\views\user.py:256 .\templates\user\user-list-tabs.html:4 +msgid "Leaderboard" +msgstr "" + +#: .\judge\views\widgets.py:53 .\judge\views\widgets.py:64 +#, python-format +msgid "Invalid upstream data: %s" +msgstr "" + +#: .\judge\views\widgets.py:74 +msgid "Bad latitude or longitude" +msgstr "" + +#: .\templates\admin\judge\contest\change_form.html:14 +#: .\templates\admin\judge\contest\change_form.html:17 +msgid "Rate" +msgstr "" + +#: .\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 +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 +msgid "Rejudge" +msgstr "" + +#: .\templates\base.html:209 +#, 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" +msgstr "" + +#: .\templates\base.html:224 +msgid "Log out" +msgstr "" + +#: .\templates\base.html:235 +msgid "Register" +msgstr "" + +#: .\templates\base.html:247 +msgid "spectating" +msgstr "" + +#: .\templates\base.html:260 +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 +msgid "Edit" +msgstr "" + +#: .\templates\blog\content.html:27 +#, python-format +msgid "" +"\n" +" posted on %(time)s\n" +" " +msgstr "" + +#: .\templates\blog\dashboard.html:21 +#, python-format +msgid "" +"\n" +" on %(time)s\n" +" " +msgstr "" + +#: .\templates\blog\list.html:85 +msgid "Blog" +msgstr "" + +#: .\templates\blog\list.html:87 +msgid "Events" +msgstr "" + +#: .\templates\blog\list.html:92 +msgid "News" +msgstr "" + +#: .\templates\blog\list.html:106 +#, python-brace-format +msgid "posted on {time}" +msgstr "" + +#: .\templates\blog\list.html:130 .\templates\problem\problem.html:256 +msgid "Clarifications" +msgstr "" + +#: .\templates\blog\list.html:146 .\templates\problem\problem.html:267 +msgid "No clarifications have been made at this time." +msgstr "" + +#: .\templates\blog\list.html:154 +msgid "Ongoing contests" +msgstr "" + +#: .\templates\blog\list.html:172 +msgid "Upcoming contests" +msgstr "" + +#: .\templates\blog\list.html:189 +msgid "Comment stream" +msgstr "" + +#: .\templates\blog\list.html:208 +msgid "New problems" +msgstr "" + +#: .\templates\blog\list.html:225 +msgid "My open tickets" +msgstr "" + +#: .\templates\blog\list.html:246 +msgid "New tickets" +msgstr "" + +#: .\templates\comments\list.html:2 +msgid "Comments" +msgstr "" + +#: .\templates\comments\list.html:18 .\templates\comments\list.html:27 +msgid "Please login to vote" +msgstr "" + +#: .\templates\comments\list.html:40 +#, python-brace-format +msgid "commented on {time}" +msgstr "" + +#: .\templates\comments\list.html:49 +#, python-format +msgid "edit %(edits)s" +msgstr "" + +#: .\templates\comments\list.html:51 .\templates\comments\media-js.html:71 +msgid "edited" +msgstr "" + +#: .\templates\comments\list.html:60 +msgid "Link" +msgstr "" + +#: .\templates\comments\list.html:73 .\templates\comments\list.html:80 +msgid "Reply" +msgstr "" + +#: .\templates\comments\list.html:86 +msgid "Hide" +msgstr "" + +#: .\templates\comments\list.html:111 +msgid "There are no comments at the moment." +msgstr "" + +#: .\templates\comments\list.html:117 +msgid "New comment" +msgstr "" + +#: .\templates\comments\list.html:131 +msgid "Invalid comment body." +msgstr "" + +#: .\templates\comments\list.html:139 +msgid "Post!" +msgstr "" + +#: .\templates\comments\media-js.html:66 +#, python-brace-format +msgid "edit {edits}" +msgstr "" + +#: .\templates\comments\media-js.html:69 +msgid "original" +msgstr "" + +#: .\templates\contest\access_code.html:26 +msgid "Invalid access code." +msgstr "" + +#: .\templates\contest\access_code.html:29 +msgid "Please enter your access code:" +msgstr "" + +#: .\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 +msgid "Sunday" +msgstr "" + +#: .\templates\contest\calendar.html:14 +msgid "Monday" +msgstr "" + +#: .\templates\contest\calendar.html:15 +msgid "Tuesday" +msgstr "" + +#: .\templates\contest\calendar.html:16 +msgid "Wednesday" +msgstr "" + +#: .\templates\contest\calendar.html:17 +msgid "Thursday" +msgstr "" + +#: .\templates\contest\calendar.html:18 +msgid "Friday" +msgstr "" + +#: .\templates\contest\calendar.html:19 +msgid "Saturday" +msgstr "" + +#: .\templates\contest\contest-list-tabs.html:7 +msgid "Prev" +msgstr "" + +#: .\templates\contest\contest-list-tabs.html:10 +msgid "Next" +msgstr "" + +#: .\templates\contest\contest-list-tabs.html:18 +#: .\templates\problem\problem-list-tabs.html:5 +msgid "List" +msgstr "" + +#: .\templates\contest\contest-list-tabs.html:19 +msgid "Calendar" +msgstr "" + +#: .\templates\contest\contest-tabs.html:4 +msgid "Info" +msgstr "" + +#: .\templates\contest\contest-tabs.html:8 +msgid "Rankings" +msgstr "" + +#: .\templates\contest\contest-tabs.html:10 +msgid "Hidden Rankings" +msgstr "" + +#: .\templates\contest\contest-tabs.html:26 +#: .\templates\contest\contest-tabs.html:40 +msgid "Leave contest" +msgstr "" + +#: .\templates\contest\contest-tabs.html:30 .\templates\contest\list.html:209 +msgid "Virtual join" +msgstr "" + +#: .\templates\contest\contest-tabs.html:38 +msgid "Stop spectating" +msgstr "" + +#: .\templates\contest\contest-tabs.html:45 +msgid "Spectate contest" +msgstr "" + +#: .\templates\contest\contest-tabs.html:48 +#: .\templates\contest\contest-tabs.html:51 +msgid "Join contest" +msgstr "" + +#: .\templates\contest\contest-tabs.html:57 +msgid "Login to participate" +msgstr "" + +#: .\templates\contest\contest.html:37 +msgid "Participating virtually." +msgstr "" + +#: .\templates\contest\contest.html:43 +msgid "Contest is over." +msgstr "" + +#: .\templates\contest\contest.html:59 .\templates\contest\contest.html:63 +msgid "F j, Y, G:i T" +msgstr "" + +#: .\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 +#, python-format +msgid "%(length)s long starting on %(start_time)s" +msgstr "" + +#: .\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 +msgid "Users" +msgstr "" + +#: .\templates\contest\contest.html:99 +msgid "Editorial" +msgstr "" + +#: .\templates\contest\list.html:27 .\templates\contest\media-js.html:9 +msgid "Are you sure you want to join?" +msgstr "" + +#: .\templates\contest\list.html:28 +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" +msgstr "" + +#: .\templates\contest\list.html:97 .\templates\contest\list.html:153 +#: .\templates\contest\list.html:184 +msgid "Contest" +msgstr "" + +#: .\templates\contest\list.html:132 +msgid "Spectate" +msgstr "" + +#: .\templates\contest\list.html:136 +msgid "Join" +msgstr "" + +#: .\templates\contest\list.html:148 +msgid "Upcoming Contests" +msgstr "" + +#: .\templates\contest\list.html:175 +msgid "There are no scheduled contests at this time." +msgstr "" + +#: .\templates\contest\list.html:180 +msgid "Past Contests" +msgstr "" + +#: .\templates\contest\media-js.html:4 +msgid "Are you sure you want to leave?" +msgstr "" + +#: .\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 +msgid "" +"Joining a contest starts your timer, after which it becomes unstoppable." +msgstr "" + +#: .\templates\contest\private.html:4 +msgid "Only the following organizations may access this contest:" +msgstr "" + +#: .\templates\contest\ranking-table.html:27 +#, python-brace-format +msgid "Started on {time}" +msgstr "" + +#: .\templates\contest\ranking-table.html:30 +msgid "Participation ended." +msgstr "" + +#: .\templates\contest\ranking.html:232 +msgid "View user participation" +msgstr "" + +#: .\templates\contest\ranking.html:236 +msgid "Show organizations" +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 +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 +msgid "activate" +msgstr "" + +#: .\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 +msgid "Newsletter unsubscribe" +msgstr "" + +#: .\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 +msgid "Do you want to unsubscribe from this newsletter?" +msgstr "" + +#: .\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 +msgid "Newsletter update" +msgstr "" + +#: .\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 +msgid "Update subscription" +msgstr "" + +#: .\templates\newsletter\subscription_update_activated.html:8 +msgid "Your subscription has successfully been updated." +msgstr "" + +#: .\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 +msgid "Update" +msgstr "" + +#: .\templates\organization\home.html:8 +msgid "Leave organization" +msgstr "" + +#: .\templates\organization\home.html:11 +msgid "Join organization" +msgstr "" + +#: .\templates\organization\home.html:14 +msgid "Request membership" +msgstr "" + +#: .\templates\organization\home.html:21 +msgid "Edit organization" +msgstr "" + +#: .\templates\organization\home.html:25 +msgid "View requests" +msgstr "" + +#: .\templates\organization\home.html:32 +msgid "Admin organization" +msgstr "" + +#: .\templates\organization\home.html:37 +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 +msgid "Name" +msgstr "" + +#: .\templates\organization\list.html:25 +msgid "Members" +msgstr "" + +#: .\templates\organization\new.html:10 .\templates\ticket\new.html:36 +msgid "Create" +msgstr "" + +#: .\templates\organization\requests\detail.html:13 +msgid "User:" +msgstr "" + +#: .\templates\organization\requests\detail.html:17 +msgid "Organization:" +msgstr "" + +#: .\templates\organization\requests\detail.html:25 +msgid "Time:" +msgstr "" + +#: .\templates\organization\requests\detail.html:29 +msgid "Reason:" +msgstr "" + +#: .\templates\organization\requests\log.html:11 +#: .\templates\organization\requests\pending.html:21 +msgid "State" +msgstr "" + +#: .\templates\organization\requests\log.html:12 +#: .\templates\organization\requests\pending.html:22 +msgid "Reason" +msgstr "" + +#: .\templates\organization\requests\log.html:28 +#: .\templates\organization\requests\pending.html:44 +msgid "There are no requests to approve." +msgstr "" + +#: .\templates\organization\requests\pending.html:24 +#: .\templates\problem\data.html:401 +msgid "Delete?" +msgstr "" + +#: .\templates\organization\requests\request.html:18 +msgid "Your reason for joining:" +msgstr "" + +#: .\templates\organization\requests\request.html:20 +msgid "Request" +msgstr "" + +#: .\templates\organization\requests\tabs.html:4 +msgid "Pending" +msgstr "" + +#: .\templates\organization\requests\tabs.html:7 +msgid "Log" +msgstr "" + +#: .\templates\organization\requests\tabs.html:10 +msgid "Approved" +msgstr "" + +#: .\templates\organization\requests\tabs.html:13 +msgid "Rejected" +msgstr "" + +#: .\templates\organization\users-table.html:15 +msgid "Kick" +msgstr "" + +#: .\templates\problem\data.html:353 +msgid "View YAML" +msgstr "" + +#: .\templates\problem\data.html:369 +msgid "Show columns:" +msgstr "" + +#: .\templates\problem\data.html:372 .\templates\problem\data.html:396 +msgid "Output prefix" +msgstr "" + +#: .\templates\problem\data.html:376 .\templates\problem\data.html:397 +msgid "Output limit" +msgstr "" + +#: .\templates\problem\data.html:380 .\templates\problem\data.html:398 +msgid "Checker" +msgstr "" + +#: .\templates\problem\data.html:384 .\templates\problem\data.html:399 +msgid "Generator args" +msgstr "" + +#: .\templates\problem\data.html:391 +msgid "Type" +msgstr "" + +#: .\templates\problem\data.html:392 +msgid "Input file" +msgstr "" + +#: .\templates\problem\data.html:393 +msgid "Output file" +msgstr "" + +#: .\templates\problem\data.html:395 +msgid "Pretest?" +msgstr "" + +#: .\templates\problem\data.html:447 .\templates\problem\submit.html:253 +msgid "Submit!" +msgstr "" + +#: .\templates\problem\data.html:448 +msgid "Add new case" +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 " +"editorialist.

Submitting an official solution before solving the " +"problem yourself is a bannable offence." +msgstr "" + +#: .\templates\problem\list.html:62 +msgid "Filter by type..." +msgstr "" + +#: .\templates\problem\list.html:179 +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 +msgid "Category" +msgstr "" + +#: .\templates\problem\list.html:209 .\templates\problem\list.html:228 +msgid "Types" +msgstr "" + +#: .\templates\problem\list.html:235 +#, python-format +msgid "AC %%" +msgstr "" + +#: .\templates\problem\problem.html:76 +msgid "View as PDF" +msgstr "" + +#: .\templates\problem\problem.html:86 .\templates\problem\problem.html:96 +#: .\templates\problem\problem.html:101 +msgid "Submit solution" +msgstr "" + +#: .\templates\problem\problem.html:89 +#, python-format +msgid "%(counter)s submission left" +msgid_plural "%(counter)s submissions left" +msgstr[0] "" +msgstr[1] "" + +#: .\templates\problem\problem.html:97 +msgid "0 submissions left" +msgstr "" + +#: .\templates\problem\problem.html:108 +msgid "My submissions" +msgstr "" + +#: .\templates\problem\problem.html:112 +msgid "Best submissions" +msgstr "" + +#: .\templates\problem\problem.html:115 +msgid "Read editorial" +msgstr "" + +#: .\templates\problem\problem.html:120 +msgid "Manage tickets" +msgstr "" + +#: .\templates\problem\problem.html:124 +msgid "Edit problem" +msgstr "" + +#: .\templates\problem\problem.html:126 +msgid "Edit test data" +msgstr "" + +#: .\templates\problem\problem.html:134 +msgid "Clone problem" +msgstr "" + +#: .\templates\problem\problem.html:141 +msgid "Points:" +msgstr "" + +#: .\templates\problem\problem.html:144 .\templates\problem\problem.html:146 +msgid "(partial)" +msgstr "" + +#: .\templates\problem\problem.html:151 +msgid "Time limit:" +msgstr "" + +#: .\templates\problem\problem.html:163 +msgid "Memory limit:" +msgstr "" + +#: .\templates\problem\problem.html:179 +msgid "Author:" +msgid_plural "Authors:" +msgstr[0] "" +msgstr[1] "" + +#: .\templates\problem\problem.html:194 +msgid "Problem type" +msgid_plural "Problem types" +msgstr[0] "" +msgstr[1] "" + +#: .\templates\problem\problem.html:208 +msgid "Allowed languages" +msgstr "" + +#: .\templates\problem\problem.html:216 +#, python-format +msgid "No %(lang)s judge online" +msgstr "" + +#: .\templates\problem\problem.html:245 +msgid "Request clarification" +msgstr "" + +#: .\templates\problem\problem.html:247 +msgid "Report an issue" +msgstr "" + +#: .\templates\problem\search-form.html:2 +msgid "Problem search" +msgstr "" + +#: .\templates\problem\search-form.html:8 +msgid "Search problems..." +msgstr "" + +#: .\templates\problem\search-form.html:14 +msgid "Full text search" +msgstr "" + +#: .\templates\problem\search-form.html:21 +msgid "Hide solved problems" +msgstr "" + +#: .\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 +msgid "All" +msgstr "" + +#: .\templates\problem\search-form.html:46 +msgid "Problem types" +msgstr "" + +#: .\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 +msgid "Go" +msgstr "" + +#: .\templates\problem\search-form.html:64 +msgid "Random" +msgstr "" + +#: .\templates\problem\statistics-table.html:1 .\templates\stats\base.html:11 +msgid "Statistics" +msgstr "" + +#: .\templates\problem\submit.html:193 +#, 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 +#, python-format +msgid "" +"\n" +" You have %(left)s submission left\n" +" " +msgid_plural "" +"\n" +" You have %(left)s submissions left\n" +" " +msgstr[0] "" +msgstr[1] "" + +#: .\templates\problem\submit.html:213 +msgid "You have 0 submissions left" +msgstr "" + +#: .\templates\problem\submit.html:251 +msgid "No judge is available for this problem." +msgstr "" + +#: .\templates\registration\activate.html:3 +#, python-format +msgid "%(key)s is an invalid activation key." +msgstr "" + +#: .\templates\registration\activation_complete.html:3 +msgid "Your account has been successfully activated." +msgstr "" + +#: .\templates\registration\login.html:46 +msgid "Invalid username or password." +msgstr "" + +#: .\templates\registration\login.html:64 +msgid "Login!" +msgstr "" + +#: .\templates\registration\login.html:67 +msgid "Forgot your password?" +msgstr "" + +#: .\templates\registration\login.html:70 +msgid "Or log in with..." +msgstr "" + +#: .\templates\registration\logout.html:3 +msgid "See you later!" +msgstr "" + +#: .\templates\registration\password_change_done.html:3 +msgid "Your password was sucessfully changed." +msgstr "" + +#: .\templates\registration\password_change_form.html:8 +msgid "Change Password" +msgstr "" + +#: .\templates\registration\password_reset.html:7 +msgid "Send Reset Email" +msgstr "" + +#: .\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" +msgstr "" + +#: .\templates\registration\password_reset_confirm.html:9 +msgid "Reset Password" +msgstr "" + +#: .\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 +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 +#, 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 +msgid "Please go to the following page and choose a new password:" +msgstr "" + +#: .\templates\registration\password_reset_email.txt:7 +msgid "Your username, in case you've forgotten:" +msgstr "" + +#: .\templates\registration\password_reset_email.txt:9 +msgid "Thanks for using our site!" +msgstr "" + +#: .\templates\registration\password_reset_email.txt:11 +#, python-format +msgid "The %(site_name)s team" +msgstr "" + +#: .\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 +msgid "Continue >" +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 +msgid "(again, for confirmation)" +msgstr "" + +#: .\templates\registration\registration_form.html:169 +msgid "(select your closest major city)" +msgstr "" + +#: .\templates\registration\registration_form.html:173 +msgid "or" +msgstr "" + +#: .\templates\registration\registration_form.html:174 +msgid "pick from map" +msgstr "" + +#: .\templates\registration\registration_form.html:179 +msgid "Default language" +msgstr "" + +#: .\templates\registration\registration_form.html:182 +#: .\templates\user\edit-profile.html:156 +msgid "Affiliated organizations" +msgstr "" + +#: .\templates\registration\registration_form.html:188 +#: .\templates\user\edit-profile.html:126 +msgid "Notify me about upcoming contests" +msgstr "" + +#: .\templates\registration\registration_form.html:202 +msgid "By registering, you agree to our" +msgstr "" + +#: .\templates\registration\registration_form.html:203 +msgid "Terms & Conditions" +msgstr "" + +#: .\templates\registration\registration_form.html:206 +msgid "Register!" +msgstr "" + +#: .\templates\stats\language.html:44 +msgid "Submission Statistics" +msgstr "" + +#: .\templates\stats\language.html:50 +msgid "Submissions by Language" +msgstr "" + +#: .\templates\stats\language.html:56 +msgid "AC Submissions by Language" +msgstr "" + +#: .\templates\stats\language.html:62 +msgid "Language AC Rate" +msgstr "" + +#: .\templates\status\judge-status-table.html:2 +msgid "Judge" +msgstr "" + +#: .\templates\status\judge-status-table.html:4 +msgid "Online" +msgstr "" + +#: .\templates\status\judge-status-table.html:6 +msgid "Uptime" +msgstr "" + +#: .\templates\status\judge-status-table.html:7 +msgid "Ping" +msgstr "" + +#: .\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 +msgid "N/A" +msgstr "" + +#: .\templates\status\judge-status-table.html:64 +msgid "There are no judges available at this time." +msgstr "" + +#: .\templates\status\language-list.html:35 +msgid "Runtime Info" +msgstr "" + +#: .\templates\status\status-tabs.html:4 +msgid "Judges" +msgstr "" + +#: .\templates\status\status-tabs.html:6 +msgid "Version Matrix" +msgstr "" + +#: .\templates\submission\internal-error-message.html:8 +msgid "An internal error occurred while grading." +msgstr "" + +#: .\templates\submission\internal-error-message.html:15 +msgid "Error information" +msgstr "" + +#: .\templates\submission\list.html:60 +msgid "Filter by status..." +msgstr "" + +#: .\templates\submission\list.html:62 +msgid "Filter by language..." +msgstr "" + +#: .\templates\submission\list.html:218 +msgid "Filter submissions" +msgstr "" + +#: .\templates\submission\list.html:260 +msgid "You were disconnected. Refresh to show latest updates." +msgstr "" + +#: .\templates\submission\row.html:39 +#, python-format +msgid "Case #%(case)s" +msgstr "" + +#: .\templates\submission\row.html:49 +msgid "view" +msgstr "" + +#: .\templates\submission\row.html:53 +msgid "rejudge" +msgstr "" + +#: .\templates\submission\row.html:58 +msgid "admin" +msgstr "" + +#: .\templates\submission\source.html:25 +msgid "View status" +msgstr "" + +#: .\templates\submission\source.html:26 +msgid "View raw source" +msgstr "" + +#: .\templates\submission\source.html:28 .\templates\submission\status.html:61 +msgid "Resubmit" +msgstr "" + +#: .\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 +msgid "Your submission is being processed..." +msgstr "" + +#: .\templates\submission\status-testcases.html:14 +msgid "Compilation Error" +msgstr "" + +#: .\templates\submission\status-testcases.html:18 +msgid "Compilation Warnings" +msgstr "" + +#: .\templates\submission\status-testcases.html:23 +msgid "Pretest Execution Results" +msgstr "" + +#: .\templates\submission\status-testcases.html:25 +msgid "Execution Results" +msgstr "" + +#: .\templates\submission\status-testcases.html:31 +msgid "Batch " +msgstr "" + +#: .\templates\submission\status-testcases.html:43 +msgid "Case" +msgstr "" + +#: .\templates\submission\status-testcases.html:45 +msgid "Pretest" +msgstr "" + +#: .\templates\submission\status-testcases.html:47 +msgid "Test case" +msgstr "" + +#: .\templates\submission\status-testcases.html:79 +msgid "Your output (clipped)" +msgstr "" + +#: .\templates\submission\status-testcases.html:99 +msgid "Final pretest score:" +msgstr "" + +#: .\templates\submission\status-testcases.html:101 +msgid "Final score:" +msgstr "" + +#: .\templates\submission\status-testcases.html:115 +msgid "Passing pretests does not guarantee a full score on system tests." +msgstr "" + +#: .\templates\submission\status-testcases.html:118 +msgid "Submission aborted!" +msgstr "" + +#: .\templates\submission\status.html:59 +msgid "View source" +msgstr "" + +#: .\templates\submission\status.html:88 +msgid "Abort" +msgstr "" + +#: .\templates\submission\submission-list-tabs.html:6 +msgid "Mine" +msgstr "" + +#: .\templates\submission\submission-list-tabs.html:9 +msgid "Best" +msgstr "" + +#: .\templates\submission\submission-list-tabs.html:12 +#, python-format +msgid "%(user)s's" +msgstr "" + +#: .\templates\ticket\list.html:135 .\templates\ticket\ticket.html:257 +msgid "Reopened: " +msgstr "" + +#: .\templates\ticket\list.html:138 .\templates\ticket\ticket.html:258 +msgid "Closed: " +msgstr "" + +#: .\templates\ticket\list.html:205 +msgid "Use desktop notification" +msgstr "" + +#: .\templates\ticket\list.html:211 +msgid "Show my tickets only" +msgstr "" + +#: .\templates\ticket\list.html:215 +msgid "Filing user" +msgstr "" + +#: .\templates\ticket\list.html:224 +msgid "Assignee" +msgstr "" + +#: .\templates\ticket\list.html:246 +msgid "Title" +msgstr "" + +#: .\templates\ticket\list.html:248 .\templates\ticket\ticket.html:304 +msgid "Assignees" +msgstr "" + +#: .\templates\ticket\new_problem.html:7 +msgid "Thanks for opening a ticket!" +msgstr "" + +#: .\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 +msgid "Associated object" +msgstr "" + +#: .\templates\ticket\ticket.html:309 +msgid "No one is assigned." +msgstr "" + +#: .\templates\ticket\ticket.html:315 +msgid "Close ticket" +msgstr "" + +#: .\templates\ticket\ticket.html:317 +msgid "Reopen ticket" +msgstr "" + +#: .\templates\ticket\ticket.html:321 +msgid "Assignee notes" +msgstr "" + +#: .\templates\ticket\ticket.html:328 .\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 +msgid "Rank" +msgstr "" + +#: .\templates\user\base-users.html:14 .\templates\user\base-users.html:69 +msgid "Search by handle..." +msgstr "" + +#: .\templates\user\edit-profile.html:91 +msgid "Display name" +msgstr "" + +#: .\templates\user\edit-profile.html:95 +msgid "Self-description" +msgstr "" + +#: .\templates\user\edit-profile.html:103 +msgid "Select your closest major city" +msgstr "" + +#: .\templates\user\edit-profile.html:112 +msgid "Editor theme" +msgstr "" + +#: .\templates\user\edit-profile.html:117 +msgid "Math engine" +msgstr "" + +#: .\templates\user\edit-profile.html:141 +#: .\templates\user\edit-profile.html:142 +msgid "Change your avatar" +msgstr "" + +#: .\templates\user\edit-profile.html:148 +msgid "Change your password" +msgstr "" + +#: .\templates\user\edit-profile.html:164 +msgid "User-script" +msgstr "" + +#: .\templates\user\edit-profile.html:168 +msgid "Update profile" +msgstr "" + +#: .\templates\user\pp-row.html:22 +#, python-format +msgid "" +"\n" +" weighted %(weight)s%%\n" +" " +msgstr "" + +#: .\templates\user\pp-row.html:27 +#, python-format +msgid "%(pp).1fpp" +msgstr "" + +#: .\templates\user\pp-row.html:29 +#, python-format +msgid "%(pp).0fpp" +msgstr "" + +#: .\templates\user\user-about.html:14 +msgid "From" +msgstr "" + +#: .\templates\user\user-about.html:24 .\templates\user\user-tabs.html:4 +msgid "About" +msgstr "" + +#: .\templates\user\user-about.html:31 +msgid "You have not shared any information." +msgstr "" + +#: .\templates\user\user-about.html:33 +msgid "This user has not shared any information." +msgstr "" + +#: .\templates\user\user-base.html:46 +#, python-format +msgid "%(count)d problems solved" +msgstr "" + +#: .\templates\user\user-base.html:48 +msgid "Rank by points:" +msgstr "" + +#: .\templates\user\user-base.html:50 +msgid "Total points:" +msgstr "" + +#: .\templates\user\user-base.html:58 +msgid "View submissions" +msgstr "" + +#: .\templates\user\user-base.html:64 +msgid "Rank by rating:" +msgstr "" + +#: .\templates\user\user-base.html:65 +msgid "Rating:" +msgstr "" + +#: .\templates\user\user-base.html:66 +msgid "Volatility:" +msgstr "" + +#: .\templates\user\user-base.html:67 +msgid "Min. rating:" +msgstr "" + +#: .\templates\user\user-base.html:68 +msgid "Max rating:" +msgstr "" + +#: .\templates\user\user-problems.html:35 +msgid "Points Breakdown" +msgstr "" + +#: .\templates\user\user-problems.html:46 +msgid "Load more..." +msgstr "" + +#: .\templates\user\user-problems.html:50 +msgid "This user has not yet solved any problems." +msgstr "" + +#: .\templates\user\user-problems.html:56 +msgid "Authored Problems" +msgstr "" + +#: .\templates\user\user-problems.html:88 +msgid "Hide problems I've solved" +msgstr "" + +#: .\templates\user\user-problems.html:98 +#, python-format +msgid "%(points).1f points" +msgstr "" + +#: .\templates\user\user-problems.html:104 +msgid "Score" +msgstr "" + +#: .\templates\user\user-problems.html:115 +#, python-format +msgid "%(points)s / %(total)s" +msgstr "" + +#: .\templates\user\user-tabs.html:7 +msgid "Impersonate" +msgstr "" + +#: .\templates\user\user-tabs.html:13 +msgid "Admin User" +msgstr "" + +#: .\templates\user\user-tabs.html:16 +msgid "Admin Profile" +msgstr "" + +#: .\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 new file mode 100644 index 0000000..2396075 --- /dev/null +++ b/locale/en/LC_MESSAGES/djangojs.po @@ -0,0 +1,31 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-08-21 17:54-0400\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: .\resources\common.js:203 +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 +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 new file mode 100644 index 0000000..b4ef31a --- /dev/null +++ b/locale/es/LC_MESSAGES/django.po @@ -0,0 +1,4541 @@ +msgid "" +msgstr "" +"Project-Id-Version: dmoj\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-11-11 21:54+0000\n" +"PO-Revision-Date: 2019-11-11 22:06\n" +"Last-Translator: Icyene\n" +"Language-Team: Spanish\n" +"Language: es_ES\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: crowdin.com\n" +"X-Crowdin-Project: dmoj\n" +"X-Crowdin-Language: es-ES\n" +"X-Crowdin-File: django.po\n" + +#: dmoj/settings.py:337 +msgid "German" +msgstr "Alemán" + +#: dmoj/settings.py:338 +msgid "English" +msgstr "Inglés" + +#: dmoj/settings.py:339 +msgid "Spanish" +msgstr "Español" + +#: dmoj/settings.py:340 +msgid "French" +msgstr "Francés" + +#: dmoj/settings.py:341 +msgid "Croatian" +msgstr "Croata" + +#: dmoj/settings.py:342 +msgid "Hungarian" +msgstr "Húngaro" + +#: dmoj/settings.py:343 +msgid "Japanese" +msgstr "" + +#: dmoj/settings.py:344 +msgid "Korean" +msgstr "Coreano" + +#: dmoj/settings.py:345 +msgid "Brazilian Portuguese" +msgstr "" + +#: dmoj/settings.py:346 +msgid "Romanian" +msgstr "Rumano" + +#: dmoj/settings.py:347 +msgid "Russian" +msgstr "Ruso" + +#: dmoj/settings.py:348 +msgid "Serbian (Latin)" +msgstr "Serbio (Latino)" + +#: dmoj/settings.py:349 +msgid "Turkish" +msgstr "Turco" + +#: dmoj/settings.py:350 +msgid "Vietnamese" +msgstr "Vietnamita" + +#: dmoj/settings.py:351 +msgid "Simplified Chinese" +msgstr "Chino simplificado" + +#: dmoj/urls.py:54 +msgid "Login" +msgstr "Iniciar sesión" + +#: dmoj/urls.py:102 templates/base.html:190 +msgid "Home" +msgstr "Inicio" + +#: judge/admin/comments.py:40 +#, python-format +msgid "%d comment successfully hidden." +msgid_plural "%d comments successfully hidden." +msgstr[0] "%d comentarios ocultos exitosamente." +msgstr[1] "%d comentarios ocultos de manera exitosa." + +#: judge/admin/comments.py:43 +msgid "Hide comments" +msgstr "Ocultar comentarios" + +#: judge/admin/comments.py:47 +#, python-format +msgid "%d comment successfully unhidden." +msgid_plural "%d comments successfully unhidden." +msgstr[0] "%d comentario mostrado de manera exitosa." +msgstr[1] "%d comentario desoculto exitosamente." + +#: judge/admin/comments.py:50 +msgid "Unhide comments" +msgstr "Mostrar comentarios" + +#: judge/admin/comments.py:58 +msgid "Associated page" +msgstr "Página asociada" + +#: judge/admin/contest.py:29 +msgid "Included contests" +msgstr "Concurso incluido" + +#: judge/admin/contest.py:65 templates/contest/contest.html:83 +#: templates/contest/moss.html:43 templates/problem/list.html:206 +#: templates/problem/list.html:221 templates/user/user-problems.html:56 +#: templates/user/user-problems.html:98 +msgid "Problem" +msgstr "Problema" + +#: judge/admin/contest.py:113 +msgid "Settings" +msgstr "" + +#: judge/admin/contest.py:115 +msgid "Scheduling" +msgstr "Programación" + +#: judge/admin/contest.py:116 +msgid "Details" +msgstr "Detalles" + +#: judge/admin/contest.py:117 +msgid "Format" +msgstr "" + +#: judge/admin/contest.py:118 templates/contest/ranking-table.html:5 +msgid "Rating" +msgstr "Puntuación" + +#: judge/admin/contest.py:119 +msgid "Access" +msgstr "" + +#: judge/admin/contest.py:121 judge/admin/problem.py:131 +msgid "Justice" +msgstr "Justicia" + +#: judge/admin/contest.py:159 +#, 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:162 +msgid "Mark contests as visible" +msgstr "" + +#: judge/admin/contest.py:166 +#, 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:169 +msgid "Mark contests as hidden" +msgstr "" + +#: judge/admin/contest.py:180 judge/admin/submission.py:149 +#: judge/admin/submission.py:171 +msgid "You do not have the permission to rejudge submissions." +msgstr "No tienes permiso de revaluar envíos." + +#: judge/admin/contest.py:187 judge/admin/submission.py:155 +msgid "You do not have the permission to rejudge THAT many submissions." +msgstr "No tienes permiso de revaluar todos esos envíos." + +#: judge/admin/contest.py:194 judge/admin/submission.py:164 +#, 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:265 +#, python-format +msgid "%d participation recalculated." +msgid_plural "%d participations recalculated." +msgstr[0] "" +msgstr[1] "" + +#: judge/admin/contest.py:268 +msgid "Recalculate results" +msgstr "" + +#: judge/admin/contest.py:272 judge/admin/organization.py:65 +msgid "username" +msgstr "nombre de usuario" + +#: judge/admin/contest.py:277 templates/base.html:258 +msgid "virtual" +msgstr "virtual" + +#: judge/admin/interface.py:28 judge/models/interface.py:46 +msgid "link path" +msgstr "ruta de enlace" + +#: judge/admin/interface.py:62 +msgid "Content" +msgstr "Contenido" + +#: judge/admin/interface.py:63 +msgid "Summary" +msgstr "Resumen" + +#: judge/admin/interface.py:107 judge/models/contest.py:251 +#: judge/models/contest.py:355 judge/models/profile.py:189 +msgid "user" +msgstr "usuario" + +#: judge/admin/interface.py:148 +msgid "object" +msgstr "" + +#: judge/admin/organization.py:34 judge/admin/problem.py:171 +#: judge/admin/profile.py:78 +msgid "View on site" +msgstr "Ver en el sitio web" + +#: judge/admin/problem.py:28 +msgid "Describe the changes you made (optional)" +msgstr "Describe los cambios que realizaste (opcional)" + +#: judge/admin/problem.py:126 +msgid "Social Media" +msgstr "Redes Sociales" + +#: judge/admin/problem.py:127 +msgid "Taxonomy" +msgstr "Taxanomía" + +#: judge/admin/problem.py:128 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:58 +msgid "Points" +msgstr "Puntos" + +#: judge/admin/problem.py:129 +msgid "Limits" +msgstr "Límites" + +#: judge/admin/problem.py:130 judge/admin/submission.py:232 +#: templates/stats/base.html:14 templates/submission/list.html:328 +msgid "Language" +msgstr "Idioma" + +#: judge/admin/problem.py:132 +msgid "History" +msgstr "Historia" + +#: judge/admin/problem.py:168 +msgid "Authors" +msgstr "Autores" + +#: judge/admin/problem.py:183 +#, 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:187 +msgid "Mark problems as public" +msgstr "Marcar problema como publico" + +#: judge/admin/problem.py:193 +#, 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:197 +msgid "Mark problems as private" +msgstr "Marcar problemas como privados" + +#: judge/admin/profile.py:32 +msgid "timezone" +msgstr "zona horaria" + +#: judge/admin/profile.py:84 judge/admin/submission.py:211 +#: templates/organization/requests/log.html:9 +#: templates/organization/requests/pending.html:12 +#: templates/ticket/list.html:263 +msgid "User" +msgstr "Usuario" + +#: judge/admin/profile.py:89 templates/registration/registration_form.html:145 +msgid "Email" +msgstr "Email" + +#: judge/admin/profile.py:94 judge/views/register.py:29 +#: templates/registration/registration_form.html:173 +#: templates/user/edit-profile.html:99 +msgid "Timezone" +msgstr "Zona horaria" + +#: judge/admin/profile.py:99 +msgid "date joined" +msgstr "fecha de registro" + +#: judge/admin/profile.py:106 +#, python-format +msgid "%d user have scores recalculated." +msgid_plural "%d users have scores recalculated." +msgstr[0] "%d usuarios con puntaje recalculado." +msgstr[1] "%d usuarios con puntaje recalculado." + +#: judge/admin/profile.py:109 +msgid "Recalculate scores" +msgstr "Recalcular puntajes" + +#: judge/admin/runtime.py:19 +msgid "Disallowed problems" +msgstr "Problemas no permitidos" + +#: judge/admin/runtime.py:22 +msgid "These problems are NOT allowed to be submitted in this language" +msgstr "Estos problemas no están permitidos para ser presentados en este idioma" + +#: judge/admin/runtime.py:83 +msgid "Description" +msgstr "Descripción" + +#: judge/admin/runtime.py:84 +msgid "Information" +msgstr "Información" + +#: judge/admin/runtime.py:85 +msgid "Capabilities" +msgstr "Capacidades" + +#: judge/admin/submission.py:23 judge/admin/submission.py:42 +#: judge/admin/submission.py:221 +msgid "None" +msgstr "Ninguno" + +#: judge/admin/submission.py:23 +msgid "Not done" +msgstr "No terminado" + +#: judge/admin/submission.py:23 +msgid "Exceptional" +msgstr "Excepcional" + +#: judge/admin/submission.py:42 +msgid "Unaccepted" +msgstr "No aceptado" + +#: judge/admin/submission.py:89 +#, python-format +msgctxt "contest problem" +msgid "%(problem)s in %(contest)s" +msgstr "%(problem)s en %(contest)s" + +#: judge/admin/submission.py:167 +msgid "Rejudge the selected submissions" +msgstr "Hacer de nuevo el juicio para las presentaciones seleccionadas" + +#: judge/admin/submission.py:193 judge/views/problem_manage.py:128 +#, python-format +msgid "%d submission were successfully rescored." +msgid_plural "%d submissions were successfully rescored." +msgstr[0] "%d de presentación fue rescatado con éxito." +msgstr[1] "%d de las presentaciones fue rescatado con éxito." + +#: judge/admin/submission.py:196 +msgid "Rescore the selected submissions" +msgstr "Repuntear las presentaciones seleccionadas" + +#: judge/admin/submission.py:200 +msgid "Problem code" +msgstr "Código del problema" + +#: judge/admin/submission.py:205 +msgid "Problem name" +msgstr "Nombre del problema" + +#: judge/admin/submission.py:215 templates/organization/requests/log.html:10 +#: templates/organization/requests/pending.html:13 +msgid "Time" +msgstr "Tiempo" + +#: judge/admin/submission.py:223 +#, python-format +msgid "%d KB" +msgstr "%d KB" + +#: judge/admin/submission.py:225 +#, python-format +msgid "%.2f MB" +msgstr "%.2f MB" + +#: judge/admin/submission.py:227 +msgid "Memory" +msgstr "Memoria" + +#: judge/admin/taxon.py:11 judge/admin/taxon.py:34 +msgid "Included problems" +msgstr "Problemas incluidos" + +#: judge/admin/taxon.py:14 +msgid "These problems are included in this group of problems" +msgstr "Estos problemas están incluidos en este grupo de problemas" + +#: judge/admin/taxon.py:37 +msgid "These problems are included in this type of problems" +msgstr "Estos problemas están incluidos en este tipo de problemas" + +#: judge/apps.py:8 +msgid "Online Judge" +msgstr "Juez en línea" + +#: judge/comments.py:41 +msgid "Comment body" +msgstr "Cuerpo del comentario" + +#: judge/comments.py:47 judge/views/ticket.py:46 +msgid "Your part is silent, little toad." +msgstr "Estás un poco callado." + +#: judge/comments.py:50 templates/comments/list.html:131 +msgid "You need to have solved at least one problem before your voice can be heard." +msgstr "Usted necesita tener resuelto por lo menos un problema antes de que su voz pueda ser escuchada." + +#: judge/comments.py:92 +msgid "Posted comment" +msgstr "Comentario publicado" + +#: judge/contest_format/atcoder.py:19 +msgid "AtCoder" +msgstr "" + +#: judge/contest_format/default.py:18 +msgid "Default" +msgstr "" + +#: judge/contest_format/ecoo.py:19 +msgid "ECOO" +msgstr "" + +#: judge/contest_format/ioi.py:19 +msgid "IOI" +msgstr "" + +#: judge/forms.py:27 +msgid "Subscribe to contest updates" +msgstr "Subscribirse en las actualizaciones de los concursos" + +#: judge/forms.py:28 +msgid "Enable experimental features" +msgstr "Habilitar las actualizaciones experimentales" + +#: judge/forms.py:57 judge/views/organization.py:127 +#, python-brace-format +msgid "You may not be part of more than {count} public organizations." +msgstr "Tu no deberías formar parte de más de {count} organizaciones públicas." + +#: judge/forms.py:107 judge/views/register.py:26 +#: templates/registration/registration_form.html:139 +#: templates/user/base-users-table.html:5 +msgid "Username" +msgstr "Nombre de usuario" + +#: judge/forms.py:108 templates/registration/registration_form.html:151 +#: templates/registration/registration_form.html:165 +msgid "Password" +msgstr "Contraseña" + +#: judge/forms.py:130 +msgid "Two Factor Authentication tokens must be 6 decimal digits." +msgstr "" + +#: judge/forms.py:139 templates/registration/totp_auth.html:32 +msgid "Invalid Two Factor Authentication token." +msgstr "" + +#: judge/forms.py:143 judge/models/problem.py:97 +msgid "Problem code must be ^[a-z0-9]+$" +msgstr "Código del problema debe ser ^[a-z0-9]+$" + +#: judge/forms.py:148 +msgid "Problem with code already exists." +msgstr "" + +#: judge/forms.py:153 judge/models/contest.py:51 +msgid "Contest id must be ^[a-z0-9]+$" +msgstr "Identificación del concurso debe ser ^[a-z0-9]+$" + +#: judge/forms.py:158 +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 "N j, Y, g:i a" + +#: judge/jinja2/datetime.py:26 +#, python-brace-format +msgid "{time}" +msgstr "{time}" + +#: judge/jinja2/datetime.py:26 +#, python-brace-format +msgid "on {time}" +msgstr "en {time}" + +#: judge/models/choices.py:59 +msgid "Leave as LaTeX" +msgstr "Dejar como LaTeX" + +#: judge/models/choices.py:60 +msgid "SVG with PNG fallback" +msgstr "SVG con suplencia PNG" + +#: judge/models/choices.py:61 +msgid "MathML only" +msgstr "Sólo MathML" + +#: judge/models/choices.py:62 +msgid "MathJax with SVG/PNG fallback" +msgstr "MathJax con suplencia SVG/PNG" + +#: judge/models/choices.py:63 +msgid "Detect best quality" +msgstr "Detectar la mejor calidad" + +#: judge/models/comment.py:25 +msgid "Page code must be ^[pcs]:[a-z0-9]+$|^b:\\d+$" +msgstr "" + +#: judge/models/comment.py:41 +msgid "commenter" +msgstr "comentador" + +#: judge/models/comment.py:42 +msgid "posted time" +msgstr "hora de publicación" + +#: judge/models/comment.py:43 judge/models/comment.py:176 +msgid "associated page" +msgstr "" + +#: judge/models/comment.py:45 +msgid "votes" +msgstr "votos" + +#: judge/models/comment.py:46 +msgid "body of comment" +msgstr "cuerpo del comentario" + +#: judge/models/comment.py:47 +msgid "hide the comment" +msgstr "ocultar el comentario" + +#: judge/models/comment.py:48 +msgid "parent" +msgstr "padre" + +#: judge/models/comment.py:53 +msgid "comment" +msgstr "comentario" + +#: judge/models/comment.py:54 +msgid "comments" +msgstr "comentarios" + +#: judge/models/comment.py:136 judge/models/problem.py:406 +#, python-format +msgid "Editorial for %s" +msgstr "Editorial de %s" + +#: judge/models/comment.py:171 +msgid "comment vote" +msgstr "voto del comentario" + +#: judge/models/comment.py:172 +msgid "comment votes" +msgstr "votos del comentario" + +#: judge/models/comment.py:181 +msgid "Override comment lock" +msgstr "" + +#: judge/models/contest.py:21 +msgid "Invalid colour." +msgstr "Color no válido." + +#: judge/models/contest.py:23 +msgid "tag name" +msgstr "nombre de la etiqueta" + +#: judge/models/contest.py:24 +msgid "Lowercase letters and hyphens only." +msgstr "Sólo letras minúsculas y guiones." + +#: judge/models/contest.py:25 +msgid "tag colour" +msgstr "color de etiqueta" + +#: judge/models/contest.py:26 +msgid "tag description" +msgstr "descripción de la etiqueta" + +#: judge/models/contest.py:45 +msgid "contest tag" +msgstr "etiqueta del concurso" + +#: judge/models/contest.py:46 judge/models/contest.py:100 +msgid "contest tags" +msgstr "etiquetas del concurso" + +#: judge/models/contest.py:50 +msgid "contest id" +msgstr "identificación del concurso" + +#: judge/models/contest.py:52 +msgid "contest name" +msgstr "nombre del concurso" + +#: judge/models/contest.py:53 +msgid "These people will be able to edit the contest." +msgstr "Estas personas serán capaces de editar el concurso." + +#: judge/models/contest.py:55 judge/models/runtime.py:124 +#: src/dmoj-wpadmin/test_project/apps/books/admin.py:20 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:27 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:27 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:27 +msgid "description" +msgstr "descripción" + +#: judge/models/contest.py:56 judge/models/problem.py:353 +#: judge/models/runtime.py:126 +msgid "problems" +msgstr "problemas" + +#: judge/models/contest.py:57 judge/models/contest.py:252 +msgid "start time" +msgstr "hora de inicio" + +#: judge/models/contest.py:58 +msgid "end time" +msgstr "hora final" + +#: judge/models/contest.py:59 judge/models/problem.py:118 +#: judge/models/problem.py:377 +msgid "time limit" +msgstr "tiempo límite" + +#: judge/models/contest.py:60 judge/models/problem.py:136 +msgid "publicly visible" +msgstr "publicidad visible" + +#: judge/models/contest.py:61 +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:64 +msgid "contest rated" +msgstr "concurso calificado" + +#: judge/models/contest.py:64 +msgid "Whether this contest can be rated." +msgstr "Si esta publicación puede ser calificada." + +#: judge/models/contest.py:66 +msgid "hide scoreboard" +msgstr "ocultar scoreboard" + +#: judge/models/contest.py:67 +msgid "Whether the scoreboard should remain hidden for the duration of the contest." +msgstr "Si el scoreboard debe permanecer oculto durante la competencia." + +#: judge/models/contest.py:70 +msgid "no comments" +msgstr "sin comentarios" + +#: judge/models/contest.py:71 +msgid "Use clarification system instead of comments." +msgstr "Use el sistema de calificación en vez de comentar." + +#: judge/models/contest.py:73 +msgid "Rating floor for contest" +msgstr "" + +#: judge/models/contest.py:75 +msgid "Rating ceiling for contest" +msgstr "" + +#: judge/models/contest.py:77 +msgid "rate all" +msgstr "calificar todo" + +#: judge/models/contest.py:77 +msgid "Rate all users who joined." +msgstr "Calificar todos los usuarios que se unieron." + +#: judge/models/contest.py:78 +msgid "exclude from ratings" +msgstr "excluir de las calificaciones" + +#: judge/models/contest.py:80 +msgid "private to specific users" +msgstr "" + +#: judge/models/contest.py:81 +msgid "private contestants" +msgstr "" + +#: judge/models/contest.py:82 +msgid "If private, only these users may see the contest" +msgstr "" + +#: judge/models/contest.py:84 +msgid "hide problem tags" +msgstr "ocultar etiquetas de problemas" + +#: judge/models/contest.py:85 +msgid "Whether problem tags should be hidden by default." +msgstr "Si las etiquetas problemáticas deberían estar ocultas de forma predeterminada." + +#: judge/models/contest.py:87 +msgid "run pretests only" +msgstr "ejecutar exámenes solamente" + +#: judge/models/contest.py:88 +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 desarmado antes de volver a juzgar las presentaciones de los usuarios cuando finaliza el concurso." + +#: judge/models/contest.py:92 judge/models/problem.py:157 +msgid "private to organizations" +msgstr "privado para organizaciones" + +#: judge/models/contest.py:93 judge/models/problem.py:155 +#: judge/models/profile.py:76 +msgid "organizations" +msgstr "organizaciones" + +#: judge/models/contest.py:94 +msgid "If private, only these organizations may see the contest" +msgstr "Es privado, sólo estas organizaciones deben ser el concurso" + +#: judge/models/contest.py:95 judge/models/problem.py:145 +msgid "OpenGraph image" +msgstr "Imagen de OpenGraph" + +#: judge/models/contest.py:96 judge/models/profile.py:47 +msgid "Logo override image" +msgstr "" + +#: judge/models/contest.py:98 +msgid "This image will replace the default site logo for users inside the contest." +msgstr "" + +#: judge/models/contest.py:101 +msgid "the amount of live participants" +msgstr "la cantidad de participantes en vivo" + +#: judge/models/contest.py:102 +msgid "contest summary" +msgstr "resumen del concurso" + +#: judge/models/contest.py:103 judge/models/problem.py:147 +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:104 judge/models/profile.py:46 +msgid "access code" +msgstr "código de acceso" + +#: judge/models/contest.py:105 +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:107 judge/models/problem.py:141 +msgid "personae non gratae" +msgstr "persona no grata" + +#: judge/models/contest.py:108 +msgid "Bans the selected users from joining this contest." +msgstr "" + +#: judge/models/contest.py:109 +msgid "contest format" +msgstr "" + +#: judge/models/contest.py:110 +msgid "The contest format module to use." +msgstr "" + +#: judge/models/contest.py:111 +msgid "contest format configuration" +msgstr "" + +#: judge/models/contest.py:112 +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:233 +msgid "See private contests" +msgstr "Ver publicaciones privadas" + +#: judge/models/contest.py:234 +msgid "Edit own contests" +msgstr "Editar sus propias notas" + +#: judge/models/contest.py:235 +msgid "Edit all contests" +msgstr "Editar todas las publicaciones" + +#: judge/models/contest.py:236 +msgid "Clone contest" +msgstr "" + +#: judge/models/contest.py:237 templates/contest/moss.html:74 +msgid "MOSS contest" +msgstr "" + +#: judge/models/contest.py:238 +msgid "Rate contests" +msgstr "Calificar publicaciones" + +#: judge/models/contest.py:239 +msgid "Contest access codes" +msgstr "Código de acceso a las publicaciones" + +#: judge/models/contest.py:240 +msgid "Create private contests" +msgstr "" + +#: judge/models/contest.py:242 judge/models/contest.py:320 +#: judge/models/contest.py:356 judge/models/contest.py:378 +#: judge/models/submission.py:83 +msgid "contest" +msgstr "concurso" + +#: judge/models/contest.py:243 +msgid "contests" +msgstr "concursos" + +#: judge/models/contest.py:250 +msgid "associated contest" +msgstr "concurso asociado" + +#: judge/models/contest.py:253 +msgid "score" +msgstr "puntuación" + +#: judge/models/contest.py:254 +msgid "cumulative time" +msgstr "tiempo acumulado" + +#: judge/models/contest.py:255 +msgid "virtual participation id" +msgstr "identificación de la participación virtual" + +#: judge/models/contest.py:256 +msgid "0 means non-virtual, otherwise the n-th virtual participation" +msgstr "0 significa no virtual, de lo contrario la n-ésima participación virtual" + +#: judge/models/contest.py:257 +msgid "contest format specific data" +msgstr "" + +#: judge/models/contest.py:306 +#, python-format +msgid "%s spectating in %s" +msgstr "%s ver en %s" + +#: judge/models/contest.py:308 +#, python-format +msgid "%s in %s, v%d" +msgstr "%s en %s, v%d" + +#: judge/models/contest.py:309 +#, python-format +msgid "%s in %s" +msgstr "%s en %s" + +#: judge/models/contest.py:312 +msgid "contest participation" +msgstr "participación del concurso" + +#: judge/models/contest.py:313 +msgid "contest participations" +msgstr "participaciones del concurso" + +#: judge/models/contest.py:319 judge/models/contest.py:340 +#: judge/models/contest.py:379 judge/models/problem.py:352 +#: judge/models/problem.py:357 judge/models/problem.py:375 +#: judge/models/problem_data.py:35 +msgid "problem" +msgstr "problema" + +#: judge/models/contest.py:321 judge/models/contest.py:344 +#: judge/models/problem.py:129 +msgid "points" +msgstr "puntos" + +#: judge/models/contest.py:322 +msgid "partial" +msgstr "parcial" + +#: judge/models/contest.py:323 judge/models/contest.py:345 +msgid "is pretested" +msgstr "está protegido" + +#: judge/models/contest.py:324 judge/models/interface.py:43 +msgid "order" +msgstr "orden" + +#: judge/models/contest.py:325 +msgid "output prefix length override" +msgstr "anular la longitud del prefijo de salida" + +#: judge/models/contest.py:326 +msgid "Maximum number of submissions for this problem, or 0 for no limit." +msgstr "Máximo número de envíos para este problema, o 0 para ningún límite." + +#: judge/models/contest.py:328 +msgid "Why include a problem you can't submit to?" +msgstr "¿Por qué incluir un problema que no puede enviarse?" + +#: judge/models/contest.py:333 +msgid "contest problem" +msgstr "problema de concurso" + +#: judge/models/contest.py:334 +msgid "contest problems" +msgstr "problemas del concurso" + +#: judge/models/contest.py:338 judge/models/submission.py:181 +msgid "submission" +msgstr "envío" + +#: judge/models/contest.py:342 judge/models/contest.py:357 +msgid "participation" +msgstr "participación" + +#: judge/models/contest.py:346 +msgid "Whether this submission was ran only on pretests." +msgstr "Si esta presentación funcionó sólo en pruebas previas." + +#: judge/models/contest.py:350 +msgid "contest submission" +msgstr "presentación del concurso" + +#: judge/models/contest.py:351 +msgid "contest submissions" +msgstr "presentaciones de concurso" + +#: judge/models/contest.py:359 +msgid "rank" +msgstr "rango" + +#: judge/models/contest.py:360 +msgid "rating" +msgstr "puntuación" + +#: judge/models/contest.py:361 +msgid "volatility" +msgstr "volatilidad" + +#: judge/models/contest.py:362 +msgid "last rated" +msgstr "último calificado" + +#: judge/models/contest.py:366 +msgid "contest rating" +msgstr "calificación del concurso" + +#: judge/models/contest.py:367 +msgid "contest ratings" +msgstr "calificaciones del concurso" + +#: judge/models/contest.py:386 +msgid "contest moss result" +msgstr "" + +#: judge/models/contest.py:387 +msgid "contest moss results" +msgstr "" + +#: judge/models/interface.py:24 +msgid "configuration item" +msgstr "elementos de configuración" + +#: judge/models/interface.py:25 +msgid "miscellaneous configuration" +msgstr "configuración miscelánea" + +#: judge/models/interface.py:37 +msgid "navigation item" +msgstr "elementos de navegación" + +#: judge/models/interface.py:38 +msgid "navigation bar" +msgstr "barra de navegación" + +#: judge/models/interface.py:44 +msgid "identifier" +msgstr "identificador" + +#: judge/models/interface.py:45 +msgid "label" +msgstr "etiqueta" + +#: judge/models/interface.py:47 +msgid "highlight regex" +msgstr "destacar la expresión regular" + +#: judge/models/interface.py:48 +msgid "parent item" +msgstr "elementos paternales" + +#: judge/models/interface.py:66 +msgid "post title" +msgstr "título de la publicación" + +#: judge/models/interface.py:67 judge/models/problem.py:395 +msgid "authors" +msgstr "autores" + +#: judge/models/interface.py:68 +msgid "slug" +msgstr "babosa" + +#: judge/models/interface.py:69 judge/models/problem.py:393 +msgid "public visibility" +msgstr "visibilidad pública" + +#: judge/models/interface.py:70 +msgid "sticky" +msgstr "pegajoso" + +#: judge/models/interface.py:71 +msgid "publish after" +msgstr "publicar después de" + +#: judge/models/interface.py:72 +msgid "post content" +msgstr "contenido del post" + +#: judge/models/interface.py:73 +msgid "post summary" +msgstr "resumen del post" + +#: judge/models/interface.py:74 +msgid "openGraph image" +msgstr "imagen de openGraph" + +#: judge/models/interface.py:91 +msgid "Edit all posts" +msgstr "Editar todas las publicaciones" + +#: judge/models/interface.py:93 +msgid "blog post" +msgstr "post del blog" + +#: judge/models/interface.py:94 +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:29 +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:26 +msgid "problem category ID" +msgstr "problema de categoría de identificación" + +#: judge/models/problem.py:27 +msgid "problem category name" +msgstr "problema de categoría de nombre" + +#: judge/models/problem.py:34 +msgid "problem type" +msgstr "tipo del problema" + +#: judge/models/problem.py:35 judge/models/problem.py:113 +msgid "problem types" +msgstr "tipos del problema" + +#: judge/models/problem.py:39 +msgid "problem group ID" +msgstr "problema de identificación del grupo" + +#: judge/models/problem.py:40 +msgid "problem group name" +msgstr "problema de identificación del nombre" + +#: judge/models/problem.py:47 judge/models/problem.py:116 +msgid "problem group" +msgstr "grupo de problema" + +#: judge/models/problem.py:48 +msgid "problem groups" +msgstr "grupos de problemas" + +#: judge/models/problem.py:52 +msgid "key" +msgstr "llave" + +#: judge/models/problem.py:54 +msgid "link" +msgstr "enlace" + +#: judge/models/problem.py:55 +msgid "full name" +msgstr "nombre completo" + +#: judge/models/problem.py:56 judge/models/profile.py:32 +#: judge/models/runtime.py:23 +msgid "short name" +msgstr "nombre corto" + +#: judge/models/problem.py:57 +msgid "Displayed on pages under this license" +msgstr "Mostrar en páginas bajo esta licencia" + +#: judge/models/problem.py:58 +msgid "icon" +msgstr "icono" + +#: judge/models/problem.py:58 +msgid "URL to the icon" +msgstr "Enlace al icono" + +#: judge/models/problem.py:59 +msgid "license text" +msgstr "texto de licencia" + +#: judge/models/problem.py:68 +msgid "license" +msgstr "licencia" + +#: judge/models/problem.py:69 +msgid "licenses" +msgstr "licencias" + +#: judge/models/problem.py:96 +msgid "problem code" +msgstr "código del problema" + +#: judge/models/problem.py:98 +msgid "A short, unique code for the problem, used in the url after /problem/" +msgstr "" + +#: judge/models/problem.py:100 +msgid "problem name" +msgstr "nombre del problema" + +#: judge/models/problem.py:101 +msgid "The full name of the problem, as shown in the problem list." +msgstr "" + +#: judge/models/problem.py:103 +msgid "problem body" +msgstr "cuerpo del problema" + +#: judge/models/problem.py:104 +msgid "creators" +msgstr "creadores" + +#: judge/models/problem.py:105 +msgid "These users will be able to edit the problem, and be listed as authors." +msgstr "" + +#: judge/models/problem.py:107 +msgid "curators" +msgstr "curadores" + +#: judge/models/problem.py:108 +msgid "These users will be able to edit the problem, but not be listed as authors." +msgstr "" + +#: judge/models/problem.py:110 +msgid "testers" +msgstr "probadores" + +#: judge/models/problem.py:112 +msgid "These users will be able to view the private problem, but not edit it." +msgstr "" + +#: judge/models/problem.py:114 +msgid "The type of problem, as shown on the problem's page." +msgstr "" + +#: judge/models/problem.py:117 +msgid "The group of problem, shown under Category in the problem list." +msgstr "" + +#: judge/models/problem.py:119 +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) serán permitidos." + +#: judge/models/problem.py:123 judge/models/problem.py:380 +msgid "memory limit" +msgstr "límite de memoria" + +#: judge/models/problem.py:124 +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:130 +msgid "Points awarded for problem completion. Points are displayed with a 'p' suffix if partial." +msgstr "" + +#: judge/models/problem.py:133 +msgid "allows partial points" +msgstr "permitir puntos parciales" + +#: judge/models/problem.py:134 +msgid "allowed languages" +msgstr "idiomas permitidos" + +#: judge/models/problem.py:135 +msgid "List of allowed submission languages." +msgstr "" + +#: judge/models/problem.py:137 +msgid "manually managed" +msgstr "manejado manualmente" + +#: judge/models/problem.py:138 +msgid "Whether judges should be allowed to manage data or not." +msgstr "" + +#: judge/models/problem.py:139 +msgid "date of publishing" +msgstr "fecha de publicación" + +#: judge/models/problem.py:140 +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:142 +msgid "Bans the selected users from submitting to this problem." +msgstr "" + +#: judge/models/problem.py:144 +msgid "The license under which this problem is published." +msgstr "" + +#: judge/models/problem.py:146 +msgid "problem summary" +msgstr "problemas de envío" + +#: judge/models/problem.py:148 +msgid "number of users" +msgstr "" + +#: judge/models/problem.py:149 +msgid "The number of users who solved the problem." +msgstr "" + +#: judge/models/problem.py:150 +msgid "solve rate" +msgstr "" + +#: judge/models/problem.py:156 +msgid "If private, only these organizations may see the problem." +msgstr "" + +#: judge/models/problem.py:358 judge/models/problem.py:376 +#: judge/models/runtime.py:99 +msgid "language" +msgstr "idioma" + +#: judge/models/problem.py:359 +msgid "translated name" +msgstr "nombre traducido" + +#: judge/models/problem.py:360 +msgid "translated description" +msgstr "descripción traducida" + +#: judge/models/problem.py:364 +msgid "problem translation" +msgstr "problemas de traducción" + +#: judge/models/problem.py:365 +msgid "problem translations" +msgstr "problemas de traducciones" + +#: judge/models/problem.py:369 +msgid "clarified problem" +msgstr "problema calificado" + +#: judge/models/problem.py:370 +msgid "clarification body" +msgstr "calificación del cuerpo" + +#: judge/models/problem.py:371 +msgid "clarification timestamp" +msgstr "marca de tiempo de aclaración" + +#: judge/models/problem.py:386 +msgid "language-specific resource limit" +msgstr "límite de recursos específicos del idioma" + +#: judge/models/problem.py:387 +msgid "language-specific resource limits" +msgstr "límites de recursos específicos del idioma" + +#: judge/models/problem.py:391 +msgid "associated problem" +msgstr "problema asociado" + +#: judge/models/problem.py:394 +msgid "publish date" +msgstr "fecha de publicación" + +#: judge/models/problem.py:396 +msgid "editorial content" +msgstr "contenido editorial" + +#: judge/models/problem.py:412 +msgid "solution" +msgstr "solución" + +#: judge/models/problem.py:413 +msgid "solutions" +msgstr "soluciones" + +#: judge/models/problem_data.py:23 +msgid "Standard" +msgstr "Estándar" + +#: judge/models/problem_data.py:24 +msgid "Floats" +msgstr "Flotantes" + +#: judge/models/problem_data.py:25 +msgid "Floats (absolute)" +msgstr "Flotantes (absoluto)" + +#: judge/models/problem_data.py:26 +msgid "Floats (relative)" +msgstr "Flotante (relativo)" + +#: judge/models/problem_data.py:27 +msgid "Non-trailing spaces" +msgstr "Espacios sin seguimiento" + +#: judge/models/problem_data.py:28 +msgid "Unordered" +msgstr "Sin ordenar" + +#: judge/models/problem_data.py:29 +msgid "Byte identical" +msgstr "Byte idéntico" + +#: judge/models/problem_data.py:30 +msgid "Line-by-line" +msgstr "" + +#: judge/models/problem_data.py:37 +msgid "data zip file" +msgstr "archivos de datos de zip" + +#: judge/models/problem_data.py:39 +msgid "generator file" +msgstr "generador de archivos" + +#: judge/models/problem_data.py:41 judge/models/problem_data.py:90 +msgid "output prefix length" +msgstr "longitud del prefijo de salida" + +#: judge/models/problem_data.py:42 judge/models/problem_data.py:91 +msgid "output limit length" +msgstr "longitud de límite de salida" + +#: judge/models/problem_data.py:43 +msgid "init.yml generation feedback" +msgstr "generación de recomendaciones init.yml" + +#: judge/models/problem_data.py:44 judge/models/problem_data.py:92 +msgid "checker" +msgstr "verificador" + +#: judge/models/problem_data.py:45 judge/models/problem_data.py:93 +msgid "checker arguments" +msgstr "argumentos del verificador" + +#: judge/models/problem_data.py:46 judge/models/problem_data.py:94 +msgid "checker arguments as a JSON object" +msgstr "argumentos del verificador como un objetivo JSON" + +#: judge/models/problem_data.py:77 +msgid "problem data set" +msgstr "problemas de conjunto de datos" + +#: judge/models/problem_data.py:79 +msgid "case position" +msgstr "posición del caso" + +#: judge/models/problem_data.py:80 +msgid "case type" +msgstr "tipo de caso" + +#: judge/models/problem_data.py:81 +msgid "Normal case" +msgstr "Caso normal" + +#: judge/models/problem_data.py:82 +msgid "Batch start" +msgstr "Lote de inicio" + +#: judge/models/problem_data.py:83 +msgid "Batch end" +msgstr "Lote final" + +#: judge/models/problem_data.py:85 +msgid "input file name" +msgstr "nombre de archivo de entrada" + +#: judge/models/problem_data.py:86 +msgid "output file name" +msgstr "nombre del archivo de salida" + +#: judge/models/problem_data.py:87 +msgid "generator arguments" +msgstr "generador de argumentos" + +#: judge/models/problem_data.py:88 +msgid "point value" +msgstr "valor del punto" + +#: judge/models/problem_data.py:89 +msgid "case is pretest?" +msgstr "¿Se trata de una prueba previa?" + +#: judge/models/profile.py:29 +msgid "organization title" +msgstr "título de la organización" + +#: judge/models/profile.py:30 +msgid "organization slug" +msgstr "" + +#: judge/models/profile.py:31 +msgid "Organization name shown in URL" +msgstr "" + +#: judge/models/profile.py:33 +msgid "Displayed beside user name during contests" +msgstr "Se muestra junto al nombre de usuario durante los concursos" + +#: judge/models/profile.py:34 +msgid "organization description" +msgstr "descripción de la organización" + +#: judge/models/profile.py:35 +msgid "registrant" +msgstr "registrante" + +#: judge/models/profile.py:36 +msgid "User who registered this organization" +msgstr "Usuario que registró esta organización" + +#: judge/models/profile.py:37 +msgid "administrators" +msgstr "administradores" + +#: judge/models/profile.py:38 +msgid "Those who can edit this organization" +msgstr "Aquellos que pueden editar esta organización" + +#: judge/models/profile.py:39 +msgid "creation date" +msgstr "fecha de creación" + +#: judge/models/profile.py:40 +msgid "is open organization?" +msgstr "¿es una organización abierta?" + +#: judge/models/profile.py:41 +msgid "Allow joining organization" +msgstr "Permitir la unión a la organización" + +#: judge/models/profile.py:42 +msgid "maximum size" +msgstr "tamaño máximo" + +#: judge/models/profile.py:43 +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:45 +msgid "Student access code" +msgstr "Código de acceso para estudiantes" + +#: judge/models/profile.py:49 +msgid "This image will replace the default site logo for users viewing the organization." +msgstr "" + +#: judge/models/profile.py:75 judge/models/profile.py:91 +#: judge/models/profile.py:190 +msgid "organization" +msgstr "onganización" + +#: judge/models/profile.py:80 +msgid "user associated" +msgstr "usuario asociado" + +#: judge/models/profile.py:81 +msgid "self-description" +msgstr "descripción propia" + +#: judge/models/profile.py:82 +msgid "location" +msgstr "ubicación" + +#: judge/models/profile.py:84 +msgid "preferred language" +msgstr "idioma preferido" + +#: judge/models/profile.py:89 +msgid "last access time" +msgstr "último tiempo de acceso" + +#: judge/models/profile.py:90 +msgid "last IP" +msgstr "último IP" + +#: judge/models/profile.py:93 +msgid "display rank" +msgstr "mostrar rango" + +#: judge/models/profile.py:95 +msgid "comment mute" +msgstr "comentario en silencio" + +#: judge/models/profile.py:95 +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:97 +msgid "unlisted user" +msgstr "" + +#: judge/models/profile.py:97 +msgid "User will not be ranked." +msgstr "" + +#: judge/models/profile.py:100 +msgid "user script" +msgstr "scrip de usuario" + +#: judge/models/profile.py:101 +msgid "User-defined JavaScript for site customization." +msgstr "JavaScript definido por el usuario para la personalización del sitio." + +#: judge/models/profile.py:102 +msgid "current contest" +msgstr "concurso actual" + +#: judge/models/profile.py:104 +msgid "math engine" +msgstr "motor matemático" + +#: judge/models/profile.py:106 +msgid "the rendering engine used to render math" +msgstr "el motor de renderizado utilizado para representar las matemáticas" + +#: judge/models/profile.py:107 +msgid "2FA enabled" +msgstr "" + +#: judge/models/profile.py:108 +msgid "check to enable TOTP-based two factor authentication" +msgstr "" + +#: judge/models/profile.py:109 +msgid "TOTP key" +msgstr "" + +#: judge/models/profile.py:110 +msgid "32 character base32-encoded key for TOTP" +msgstr "" + +#: judge/models/profile.py:112 +msgid "TOTP key must be empty or base32" +msgstr "" + +#: judge/models/profile.py:113 +msgid "internal notes" +msgstr "" + +#: judge/models/profile.py:114 +msgid "Notes for administrators regarding this user." +msgstr "" + +#: judge/models/profile.py:184 +msgid "user profile" +msgstr "perfil del usuario" + +#: judge/models/profile.py:185 +msgid "user profiles" +msgstr "perfiles de usuarios" + +#: judge/models/profile.py:192 +msgid "request time" +msgstr "tiempo requerido" + +#: judge/models/profile.py:193 +msgid "state" +msgstr "estado" + +#: judge/models/profile.py:198 +msgid "reason" +msgstr "razón" + +#: judge/models/profile.py:201 +msgid "organization join request" +msgstr "solicitud para asociarse a la organización" + +#: judge/models/profile.py:202 +msgid "organization join requests" +msgstr "peticiones para unirse a la organización" + +#: judge/models/runtime.py:18 +msgid "short identifier" +msgstr "identificador corto" + +#: judge/models/runtime.py:19 +msgid "The identifier for this language; the same as its executor id for judges." +msgstr "El identificador para este idioma; lo mismo que su identificador de ejecutor para los jueces." + +#: judge/models/runtime.py:21 +msgid "long name" +msgstr "nombre largo" + +#: judge/models/runtime.py:22 +msgid "Longer name for the language, e.g. \"Python 2\" or \"C++11\"." +msgstr "Un nombre más largo para el idioma, por ejemplo, \"Python 2\" o \"C ++ 11\"." + +#: judge/models/runtime.py:24 +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 "Un nombre más legible, pero corto, para mostrar públicamente; por ejemplo \"PY2\" o \"C ++ 11\". Si se deja en blanco, se mostrará de forma predeterminada el identificador corto." + +#: judge/models/runtime.py:28 +msgid "common name" +msgstr "nombre común" + +#: judge/models/runtime.py:29 +msgid "Common name for the language. For example, the common name for C++03, C++11, and C++14 would be \"C++\"" +msgstr "Nombre común del idioma. Por ejemplo, el nombre común de C++03, C++11, y C++14 seria \"C++\"" + +#: judge/models/runtime.py:31 +msgid "ace mode name" +msgstr "nombre del modo ace" + +#: judge/models/runtime.py:32 +msgid "Language ID for Ace.js editor highlighting, appended to \"mode-\" to determine the Ace JavaScript file to use, e.g., \"python\"." +msgstr "Identificador de idioma para destacar el editor Ace.js, anexado a \"modo-\" para determinar el archivo Ace JavaScript a usar, por ejemplo, \"python\"." + +#: judge/models/runtime.py:34 +msgid "pygments name" +msgstr "nombre de pygments" + +#: judge/models/runtime.py:35 +msgid "Language ID for Pygments highlighting in source windows." +msgstr "Identificador de idioma para Pygments destacado en ventanas de origen." + +#: judge/models/runtime.py:36 +msgid "code template" +msgstr "plantilla de código" + +#: judge/models/runtime.py:37 +msgid "Code template to display in submission editor." +msgstr "Plantilla de código para mostrar en el editor de envío." + +#: judge/models/runtime.py:38 +msgid "runtime info override" +msgstr "anular información de tiempo de ejecución" + +#: judge/models/runtime.py:39 +msgid "Do not set this unless you know what you're doing! It will override the usually more specific, judge-provided runtime info!" +msgstr "¡No configure esto a menos que sepa lo que está haciendo! ¡Anulará la información de tiempo de ejecución proporcionada por el juez, que por lo general es más específica!" + +#: judge/models/runtime.py:41 +msgid "language description" +msgstr "descripción del idioma" + +#: judge/models/runtime.py:42 +msgid "Use field this to inform users of quirks with your environment, additional restrictions, etc." +msgstr "Use este campo para informar a los usuarios de las peculiaridades de su entorno, restricciones adicionales, etc." + +#: judge/models/runtime.py:44 +msgid "extension" +msgstr "extensión" + +#: judge/models/runtime.py:45 +msgid "The extension of source files, e.g., \"py\" or \"cpp\"." +msgstr "La extensión de los archivos de código fuente, por ejemplo, \"py\" o \"cpp\"." + +#: judge/models/runtime.py:100 +msgid "languages" +msgstr "idiomas" + +#: judge/models/runtime.py:104 +msgid "language to which this runtime belongs" +msgstr "idioma al que pertenece este tiempo de ejecución" + +#: judge/models/runtime.py:105 +msgid "judge on which this runtime exists" +msgstr "juzgar donde exista el runtime" + +#: judge/models/runtime.py:106 +msgid "runtime name" +msgstr "nombre de tiempo de ejecución" + +#: judge/models/runtime.py:107 +msgid "runtime version" +msgstr "versión de tiempo de ejecución" + +#: judge/models/runtime.py:108 +msgid "order in which to display this runtime" +msgstr "orden en el que se muestra este tiempo de ejecución" + +#: judge/models/runtime.py:112 +msgid "Server name, hostname-style" +msgstr "Nombre del servidor, nombre del host-style" + +#: judge/models/runtime.py:113 +msgid "time of creation" +msgstr "fecha de creación" + +#: judge/models/runtime.py:114 +msgid "A key to authenticated this judge" +msgstr "Una llave para validar este juez" + +#: judge/models/runtime.py:115 +msgid "authentication key" +msgstr "llave de autentificación" + +#: judge/models/runtime.py:116 +msgid "block judge" +msgstr "" + +#: judge/models/runtime.py:117 +msgid "Whether this judge should be blocked from connecting, even if its key is correct." +msgstr "" + +#: judge/models/runtime.py:119 +msgid "judge online status" +msgstr "estatus del juez en línea" + +#: judge/models/runtime.py:120 +msgid "judge start time" +msgstr "hola de inicio del juzgado" + +#: judge/models/runtime.py:121 +msgid "response time" +msgstr "tiempo de respuesta" + +#: judge/models/runtime.py:122 +msgid "system load" +msgstr "carga del sistema" + +#: judge/models/runtime.py:123 +msgid "Load for the last minute, divided by processors to be fair." +msgstr "Carga para el último minuto, dividido procesadores para ser justos." + +#: judge/models/runtime.py:127 judge/models/runtime.py:167 +msgid "judges" +msgstr "jueces" + +#: judge/models/runtime.py:166 +msgid "judge" +msgstr "juez" + +#: judge/models/submission.py:20 judge/models/submission.py:47 +#: judge/utils/problems.py:86 +msgid "Accepted" +msgstr "Aceptado" + +#: judge/models/submission.py:21 judge/models/submission.py:48 +msgid "Wrong Answer" +msgstr "Respuesta incorrecta" + +#: judge/models/submission.py:22 judge/models/submission.py:50 +msgid "Time Limit Exceeded" +msgstr "Límite de tiempo excedido" + +#: judge/models/submission.py:23 judge/models/submission.py:51 +msgid "Memory Limit Exceeded" +msgstr "Límite de memoria excedido" + +#: judge/models/submission.py:24 judge/models/submission.py:52 +msgid "Output Limit Exceeded" +msgstr "Límite de tiempo excedido" + +#: judge/models/submission.py:25 judge/models/submission.py:53 +msgid "Invalid Return" +msgstr "Retorno no válido" + +#: judge/models/submission.py:26 judge/models/submission.py:54 +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:88 +msgid "Compile Error" +msgstr "Error de compilación" + +#: judge/models/submission.py:28 judge/models/submission.py:40 +msgid "Internal Error" +msgstr "Error interno" + +#: judge/models/submission.py:29 +msgid "Short circuit" +msgstr "Circuito corto" + +#: judge/models/submission.py:30 judge/models/submission.py:42 +#: judge/models/submission.py:61 +msgid "Aborted" +msgstr "Cancelado" + +#: judge/models/submission.py:36 judge/models/submission.py:57 +msgid "Queued" +msgstr "En espera" + +#: judge/models/submission.py:37 judge/models/submission.py:58 +msgid "Processing" +msgstr "Procesando" + +#: judge/models/submission.py:38 judge/models/submission.py:59 +msgid "Grading" +msgstr "Clasificación" + +#: judge/models/submission.py:39 judge/models/submission.py:60 +msgid "Completed" +msgstr "Completado" + +#: judge/models/submission.py:56 +msgid "Internal Error (judging server error)" +msgstr "Error interno (juzgando error del servidor)" + +#: judge/models/submission.py:66 +msgid "submission time" +msgstr "tiempo de envío" + +#: judge/models/submission.py:67 judge/models/submission.py:201 +msgid "execution time" +msgstr "tiempo de ejecución" + +#: judge/models/submission.py:68 judge/models/submission.py:202 +msgid "memory usage" +msgstr "uso de memoria" + +#: judge/models/submission.py:69 judge/models/submission.py:203 +msgid "points granted" +msgstr "puntos otorgados" + +#: judge/models/submission.py:70 +msgid "submission language" +msgstr "idioma de presentación" + +#: judge/models/submission.py:71 +msgid "status" +msgstr "estatus" + +#: judge/models/submission.py:72 +msgid "result" +msgstr "resultado" + +#: judge/models/submission.py:74 +msgid "compile errors" +msgstr "errores de compilación" + +#: judge/models/submission.py:76 +msgid "batched cases" +msgstr "casos de lotes" + +#: judge/models/submission.py:77 +msgid "test case points" +msgstr "puntos de prueba" + +#: judge/models/submission.py:78 +msgid "test case total points" +msgstr "total de puntos del caso de prueba" + +#: judge/models/submission.py:79 +msgid "judged on" +msgstr "juzgado en" + +#: judge/models/submission.py:81 +msgid "was rejudged by admin" +msgstr "fue reevaluado por el administrador" + +#: judge/models/submission.py:82 +msgid "was ran on pretests only" +msgstr "solo se ejecutó en pruebas previas" + +#: judge/models/submission.py:182 templates/contest/moss.html:58 +msgid "submissions" +msgstr "envíos" + +#: judge/models/submission.py:186 judge/models/submission.py:197 +msgid "associated submission" +msgstr "presentaciones asociadas" + +#: judge/models/submission.py:188 +msgid "source code" +msgstr "código fuente" + +#: judge/models/submission.py:199 +msgid "test case ID" +msgstr "identificación en caso de prueba" + +#: judge/models/submission.py:200 +msgid "status flag" +msgstr "indicador de estado" + +#: judge/models/submission.py:204 +msgid "points possible" +msgstr "puntos posibles" + +#: judge/models/submission.py:205 +msgid "batch number" +msgstr "número de lote" + +#: judge/models/submission.py:206 +msgid "judging feedback" +msgstr "respuesta del juzgado" + +#: judge/models/submission.py:207 +msgid "extended judging feedback" +msgstr "" + +#: judge/models/submission.py:208 +msgid "program output" +msgstr "salida del programa" + +#: judge/models/submission.py:216 +msgid "submission test case" +msgstr "prueba de presentación" + +#: judge/models/submission.py:217 +msgid "submission test cases" +msgstr "pruebas de presentación" + +#: judge/models/ticket.py:10 +msgid "ticket title" +msgstr "título del ticket" + +#: judge/models/ticket.py:11 +msgid "ticket creator" +msgstr "creador del ticket" + +#: judge/models/ticket.py:13 +msgid "creation time" +msgstr "fecha de creación" + +#: judge/models/ticket.py:14 +msgid "assignees" +msgstr "asignados" + +#: judge/models/ticket.py:15 +msgid "quick notes" +msgstr "notas rápidas" + +#: judge/models/ticket.py:16 +msgid "Staff notes for this issue to aid in processing." +msgstr "Notas del personal en este problema para ayudar en el procesamiento." + +#: judge/models/ticket.py:17 +msgid "linked item type" +msgstr "tipo de elemento enlazado" + +#: judge/models/ticket.py:19 +msgid "linked item ID" +msgstr "identificación del artículo vinculado" + +#: judge/models/ticket.py:21 +msgid "is ticket open?" +msgstr "¿está abierto el boleto?" + +#: judge/models/ticket.py:25 +msgid "ticket" +msgstr "ticket" + +#: judge/models/ticket.py:27 +msgid "poster" +msgstr "publicación" + +#: judge/models/ticket.py:30 +msgid "message time" +msgstr "hora del mensaje" + +#: judge/pdf_problems.py:134 judge/pdf_problems.py:186 +#: judge/pdf_problems.py:246 +msgid "Page [page] of [topage]" +msgstr "Página [page] de [topage]" + +#: judge/tasks/moss.py:25 +msgid "Running MOSS" +msgstr "" + +#: judge/tasks/submission.py:43 +msgid "Modifying submissions" +msgstr "" + +#: judge/tasks/submission.py:56 +msgid "Recalculating user points" +msgstr "" + +#: judge/utils/problem_data.py:63 +msgid "Empty batches not allowed." +msgstr "No está permitido contraseñas vacías." + +#: judge/utils/problem_data.py:82 +#, python-format +msgid "Points must be defined for non-batch case #%d." +msgstr "Puntos deben ser definidos para casos de no lote #%d." + +#: judge/utils/problem_data.py:87 +#, python-format +msgid "Input file for case %d does not exist: %s" +msgstr "El archivo de entrada para el caso %d no existe: %s" + +#: judge/utils/problem_data.py:90 +#, python-format +msgid "Output file for case %d does not exist: %s" +msgstr "El archivo de salida para el caso %d no existe: %s" + +#: judge/utils/problem_data.py:115 +#, python-format +msgid "Batch start case #%d requires points." +msgstr "El caso de inicio de lote #%d requiere puntos." + +#: 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 +msgid "How did you corrupt the zip path?" +msgstr "¿Cómo usted corrompió la ruta postal?" + +#: judge/utils/problem_data.py:160 +msgid "How did you corrupt the generator path?" +msgstr "¿Cómo corrompió la ruta del generador?" + +#: judge/utils/problems.py:76 +msgid "Can't pass both queryset and keyword filters" +msgstr "No se pueden pasar los filtros de consulta y conjunto de palabras clave" + +#: judge/utils/problems.py:87 +msgid "Wrong" +msgstr "" + +#: judge/utils/problems.py:89 +msgid "Timeout" +msgstr "" + +#: judge/utils/problems.py:90 +msgid "Error" +msgstr "" + +#: 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/timedelta.py:49 +msgctxt "time format with day" +msgid "%d day %h:%m:%s" +msgid_plural "%d days %h:%m:%s" +msgstr[0] "%d día %h:%m:%s" +msgstr[1] "%d días %h:%m:%s" + +#: judge/utils/timedelta.py:53 +msgctxt "time format without day" +msgid "%h:%m:%s" +msgstr "%h:%m:%s" + +#: 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] "%d día %h:%m" +msgstr[1] "%d días %h:%m" + +#: judge/utils/timedelta.py:61 +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d día" +msgstr[1] "%d días" + +#: judge/utils/timedelta.py:63 +msgctxt "hours and minutes" +msgid "%h:%m" +msgstr "%h:%m" + +#: judge/views/blog.py:38 +#, python-format +msgid "Page %d of Posts" +msgstr "Página %d de publicaciones" + +#: judge/views/comment.py:27 +msgid "Messing around, are we?" +msgstr "¿Estamos perdiendo el tiempo?" + +#: judge/views/comment.py:36 +msgid "You must solve at least one problem before you can vote." +msgstr "" + +#: judge/views/comment.py:63 +msgid "You already voted." +msgstr "Tu ya votaste." + +#: judge/views/comment.py:120 judge/views/organization.py:299 +msgid "Edited from site" +msgstr "Editado desde sitio" + +#: judge/views/comment.py:141 +msgid "Editing comment" +msgstr "Comentario editado" + +#: judge/views/contests.py:49 judge/views/contests.py:211 +#: judge/views/contests.py:214 judge/views/contests.py:385 +msgid "No such contest" +msgstr "No hay tal concurso" + +#: judge/views/contests.py:50 judge/views/contests.py:212 +#, 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:75 +msgid "Contests" +msgstr "Concursos" + +#: judge/views/contests.py:215 +msgid "Could not find such contest." +msgstr "No se pudo encontrar dicho concurso." + +#: judge/views/contests.py:218 +#, python-format +msgid "Access to contest \"%s\" denied" +msgstr "Acceso al concurso \"%s\" denegado" + +#: judge/views/contests.py:242 +msgid "Clone Contest" +msgstr "" + +#: judge/views/contests.py:305 +msgid "Contest not ongoing" +msgstr "Concurso no permanente" + +#: judge/views/contests.py:306 +#, python-format +msgid "\"%s\" is not currently ongoing." +msgstr "\"%s\" no esta actualmente en curso." + +#: judge/views/contests.py:310 +msgid "Already in contest" +msgstr "Ya en el concurso" + +#: judge/views/contests.py:311 +#, python-format +msgid "You are already in a contest: \"%s\"." +msgstr "Ya estas en el concurso: \"%s\"." + +#: judge/views/contests.py:314 +msgid "Banned from joining" +msgstr "" + +#: judge/views/contests.py:315 +msgid "You have been declared persona non grata for this contest. You are permanently barred from joining this contest." +msgstr "" + +#: judge/views/contests.py:375 +#, python-format +msgid "Enter access code for \"%s\"" +msgstr "Ingrese el código de acceso para \"%s\"" + +#: judge/views/contests.py:386 +#, python-format +msgid "You are not in contest \"%s\"." +msgstr "Tu no estas concursando \"%s\"." + +#: judge/views/contests.py:405 +msgid "ContestCalendar requires integer year and month" +msgstr "" + +#: judge/views/contests.py:445 +#, python-format +msgid "Contests in %(month)s" +msgstr "Concursos en %(month)s" + +#: judge/views/contests.py:445 +msgid "F Y" +msgstr "" + +#: judge/views/contests.py:531 +msgid "???" +msgstr "" + +#: judge/views/contests.py:594 +#, python-format +msgid "%s Rankings" +msgstr "%s Clasificaciones" + +#: judge/views/contests.py:610 +#, python-format +msgid "Your participation in %s" +msgstr "Su participación en %s" + +#: judge/views/contests.py:611 +#, python-format +msgid "%s's participation in %s" +msgstr "participación de %s en %s" + +#: judge/views/contests.py:615 +msgid "Live" +msgstr "En Vivo" + +#: judge/views/contests.py:627 templates/contest/contest-tabs.html:13 +msgid "Participation" +msgstr "Participación" + +#: judge/views/contests.py:654 +#, python-format +msgid "%s MOSS Results" +msgstr "" + +#: judge/views/contests.py:681 +#, python-format +msgid "Running MOSS for %s..." +msgstr "" + +#: judge/views/contests.py:704 +#, python-format +msgid "Contest tag: %s" +msgstr "Concurso etiqueta: %s" + +#: judge/views/error.py:14 +msgid "404 error" +msgstr "404 error" + +#: judge/views/error.py:15 +#, python-format +msgid "Could not find page \"%s\"" +msgstr "No se pudo encontrar la página \"%s\"" + +#: judge/views/error.py:22 +#, python-format +msgid "no permission for %s" +msgstr "ningún permiso para %s" + +#: judge/views/error.py:30 +#, python-format +msgid "corrupt page %s" +msgstr "página corrupta %s" + +#: judge/views/language.py:12 templates/status/judge-status-table.html:9 +#: templates/status/status-tabs.html:5 +msgid "Runtimes" +msgstr "Duración" + +#: judge/views/organization.py:44 judge/views/organization.py:47 +msgid "No such organization" +msgstr "Ninguna organización" + +#: judge/views/organization.py:45 +#, 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 +msgid "Could not find such organization." +msgstr "No se pudo encontrar tal organización." + +#: judge/views/organization.py:72 judge/views/register.py:34 +#: templates/organization/list.html:15 templates/user/user-list-tabs.html:5 +msgid "Organizations" +msgstr "Organizaciones" + +#: judge/views/organization.py:93 +#, python-format +msgid "%s Members" +msgstr "%s miembros" + +#: judge/views/organization.py:118 judge/views/organization.py:121 +#: judge/views/organization.py:126 +msgid "Joining organization" +msgstr "Unirse a la organización" + +#: judge/views/organization.py:118 +msgid "You are already in the organization." +msgstr "Ya estas en esta organización." + +#: judge/views/organization.py:121 +msgid "This organization is not open." +msgstr "Esta organización no está abierta." + +#: judge/views/organization.py:138 +msgid "Leaving organization" +msgstr "Abandonar organización" + +#: judge/views/organization.py:138 +#, python-format +msgid "You are not in \"%s\"." +msgstr "No estás en \"%s\"." + +#: judge/views/organization.py:162 +#, python-format +msgid "Request to join %s" +msgstr "Solicitar para unirse %s" + +#: judge/views/organization.py:180 +msgid "Join request detail" +msgstr "Únete a detalle de la solicitud" + +#: judge/views/organization.py:209 +#, python-format +msgid "Managing join requests for %s" +msgstr "Gestionar solicitudes de unirse para %s" + +#: judge/views/organization.py:240 +#, 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:252 +#, 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:253 +#, 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:283 +#, python-format +msgid "Editing %s" +msgstr "Editando %s" + +#: judge/views/organization.py:307 judge/views/organization.py:315 +msgid "Can't edit organization" +msgstr "No se puede editar la organización" + +#: judge/views/organization.py:308 +msgid "You are not allowed to edit this organization." +msgstr "No tiene permitido editar esta organización." + +#: judge/views/organization.py:316 +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:321 judge/views/organization.py:325 +msgid "Can't kick user" +msgstr "No se puede reaccionar en contra del usuario" + +#: judge/views/organization.py:322 +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:326 +#, 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:68 +msgid "No such problem" +msgstr "No existe ese problema" + +#: 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:111 +#, python-brace-format +msgid "Editorial for {0}" +msgstr "Editorial de{0}" + +#: judge/views/problem.py:114 +#, python-brace-format +msgid "Editorial for {0}" +msgstr "Editorial de {0}" + +#: judge/views/problem.py:285 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:546 +msgid "Banned from submitting" +msgstr "Esta prohibido enviarlo" + +#: judge/views/problem.py:547 +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:560 +msgid "Too many submissions" +msgstr "Muchos envíos" + +#: judge/views/problem.py:561 +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:627 judge/views/problem.py:630 +#, python-format +msgid "Submit to %(problem)s" +msgstr "Enviar a %(problem)s" + +#: judge/views/problem.py:646 +msgid "Clone Problem" +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" + +#: judge/views/problem_data.py:39 +msgid "Checker arguments is invalid JSON" +msgstr "Los argumentos JSON del inspector son inválidos" + +#: judge/views/problem_data.py:46 +msgid "Your zip file is invalid!" +msgstr "¡Tu carpeta Zip es invalida!" + +#: judge/views/problem_data.py:104 +#, python-brace-format +msgid "Comparing submissions for {0}" +msgstr "Comparando envíos para {0}" + +#: judge/views/problem_data.py:107 +#, python-brace-format +msgid "Comparing submissions for {0}" +msgstr "" + +#: judge/views/problem_data.py:142 +#, python-brace-format +msgid "Editing data for {0}" +msgstr "" + +#: judge/views/problem_data.py:145 +#, python-format +msgid "Editing data for %s" +msgstr "Editando datos para %s" + +#: judge/views/problem_data.py:237 judge/views/problem_data.py:238 +#, python-format +msgid "Generated init.yml for %s" +msgstr "Generado init.yml para %s" + +#: 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:58 +#, python-format +msgid "Best solutions for %s" +msgstr "Las mejores soluciones para %s" + +#: judge/views/ranked_submission.py:61 +#, python-brace-format +msgid "Best solutions for {0}" +msgstr "Las mejores soluciones para {0}" + +#: judge/views/ranked_submission.py:71 +#, 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:74 +#, 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:80 +#, python-brace-format +msgid "Best solutions for {0} in {2}" +msgstr "Las mejores soluciones para {0} en {2}" + +#: judge/views/ranked_submission.py:83 +#, 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 +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 templates/user/edit-profile.html:103 +msgid "Preferred language" +msgstr "Idioma preferido" + +#: judge/views/register.py:38 +msgid "Subscribe to newsletter?" +msgstr "¿suscribete en el boletín de noticias?" + +#: judge/views/register.py:45 +#, 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 +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 +msgid "Registration" +msgstr "Registro de usuarios" + +#: judge/views/register.py:106 +msgid "Authentication failure" +msgstr "Error de autenticación" + +#: judge/views/stats.py:105 +msgid "Language statistics" +msgstr "Estadísticas del idioma" + +#: judge/views/status.py:24 templates/submission/list.html:319 +msgid "Status" +msgstr "Estado" + +#: judge/views/status.py:108 +msgid "Version matrix" +msgstr "Versión matriz" + +#: judge/views/submission.py:59 judge/views/submission.py:66 +#, python-format +msgid "Submission of %(problem)s by %(user)s" +msgstr "Presentación de %(problem)s por %(user)s" + +#: judge/views/submission.py:161 judge/views/submission.py:162 +#: templates/problem/problem.html:127 +msgid "All submissions" +msgstr "Todos los envíos" + +#: judge/views/submission.py:303 +msgid "All my submissions" +msgstr "Todos mis envíos" + +#: judge/views/submission.py:304 +#, python-format +msgid "All submissions by %s" +msgstr "Todos las presentaciones por %s" + +#: judge/views/submission.py:335 +#, python-format +msgid "All submissions for %s" +msgstr "Todas las presentaciones por %s" + +#: judge/views/submission.py:354 +msgid "Must pass a problem" +msgstr "Debe pasar un problema" + +#: judge/views/submission.py:397 +#, python-format +msgid "My submissions for %(problem)s" +msgstr "Mis presentaciones de %(problem)s" + +#: judge/views/submission.py:398 +#, python-format +msgid "%(user)s's submissions for %(problem)s" +msgstr "%(user)s's presentaciones para %(problem)s" + +#: judge/views/submission.py:495 +msgid "Must pass a contest" +msgstr "Debe pasar un concurso" + +#: judge/views/submission.py:514 +#, python-brace-format +msgid "{0}'s submissions for {2} in {4}" +msgstr "{0} envíos de {2} en {4}" + +#: judge/views/submission.py:519 +#, python-brace-format +msgid "{0}'s submissions for problem {2} in {3}" +msgstr "{0} envíos de problema {2} en {3}" + +#: judge/views/ticket.py:33 judge/views/ticket.py:39 +msgid "Ticket title" +msgstr "Título del ticket" + +#: judge/views/ticket.py:40 +msgid "Issue description" +msgstr "Descripción del problema" + +#: judge/views/ticket.py:85 judge/views/ticket.py:88 +#, python-format +msgid "New ticket for %s" +msgstr "Nuevo ticket de %s" + +#: judge/views/ticket.py:139 +#, python-format +msgid "%(title)s - Ticket %(id)d" +msgstr "%(title)s - Ticket %(id)d" + +#: judge/views/ticket.py:248 +#, python-format +msgid "Tickets - Page %(number)d of %(total)d" +msgstr "Tickets - Página %(number)d de %(total)d" + +#: judge/views/ticket.py:297 +#, python-format +msgid "New Ticket: %s" +msgstr "Tickets nuevos: %s" + +#: judge/views/ticket.py:298 +#, python-format +msgid "#%(id)d, assigned to: %(users)s" +msgstr "#%(id)d asignado para: %(users)s" + +#: judge/views/ticket.py:300 +msgid ", " +msgstr ", " + +#: judge/views/ticket.py:300 +msgid "no one" +msgstr "ninguno" + +#: judge/views/totp.py:42 templates/registration/totp_enable.html:86 +msgid "Enable Two Factor Authentication" +msgstr "" + +#: judge/views/totp.py:89 templates/registration/totp_disable.html:48 +msgid "Disable Two Factor Authentication" +msgstr "" + +#: judge/views/totp.py:103 +msgid "Perform Two Factor Authentication" +msgstr "" + +#: judge/views/user.py:68 +msgid "No such user" +msgstr "No existe este usuario" + +#: judge/views/user.py:68 +#, python-format +msgid "No user handle \"%s\"." +msgstr "Ningún usuario se encarga de \"%s\"." + +#: judge/views/user.py:72 +msgid "My account" +msgstr "Mi cuenta" + +#: judge/views/user.py:73 +#, python-format +msgid "User %s" +msgstr "Usuario %s" + +#: judge/views/user.py:136 +msgid "M j, Y, G:i" +msgstr "M j, Y, G:i" + +#: judge/views/user.py:221 +msgid "Updated on site" +msgstr "Actualizado en el sitio" + +#: judge/views/user.py:253 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:10 +msgid "Edit profile" +msgstr "Modificar perfil" + +#: judge/views/user.py:262 templates/user/user-list-tabs.html:4 +msgid "Leaderboard" +msgstr "Tabla de calificación" + +#: judge/views/widgets.py:48 judge/views/widgets.py:58 +#, python-format +msgid "Invalid upstream data: %s" +msgstr "Datos ascendentes no válidos: %s" + +#: judge/views/widgets.py:68 +msgid "Bad latitude or longitude" +msgstr "Latitud o longitud invalida" + +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:13 +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:27 +msgid "Photo" +msgstr "" + +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:14 +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:28 +msgid "Photos" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:9 +msgid "first name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:10 +msgid "last name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:11 +msgid "biography" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/admin.py:24 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:30 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:30 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:30 +msgid "owner" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:12 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:12 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:12 +msgid "name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:19 +msgid "Category of Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:20 +msgid "Categories of Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:26 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:26 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:26 +msgid "title" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:28 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:28 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:28 +msgid "category" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:29 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:29 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:29 +msgid "author" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:31 +msgid "publication date" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:37 +msgid "Book" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:38 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:136 +msgid "Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:19 +msgid "Category of CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:20 +msgid "Categories of CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:36 +msgid "CD" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:37 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:141 +msgid "CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:19 +msgid "Category of DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:20 +msgid "Categories of DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:36 +msgid "DVD" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:37 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:146 +msgid "DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/templates/admin/base_site.html:7 +msgid "Django administration" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/forms.py:12 +#, python-format +msgid "Please enter the correct %(username)s and password for an admin account. Note that both fields may be case-sensitive." +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/forms.py:32 +#, python-format +msgid "Please enter the correct %(username)s and password for an user account. Note that both fields may be case-sensitive." +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:27 +msgid "Site" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:38 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:41 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:130 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:133 +msgid "Dashboard" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:48 +msgid "Applications" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:53 +msgid "Administration" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:64 +msgid "Color theme" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:66 +msgid "Change color theme" +msgstr "" + +#: 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 "Calificar" + +#: templates/admin/judge/contest/change_list.html:9 +msgid "Rate all ratable contests" +msgstr "Califica todos los concursos que pueda calificar" + +#: 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 "Ver presentaciones" + +#: templates/admin/judge/profile/change_form.html:14 +#: templates/admin/judge/profile/change_form.html:17 +msgid "Edit user" +msgstr "Editar usuario" + +#: 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 +msgid "Rejudge" +msgstr "Juzgar de nuevo" + +#: templates/base.html:214 +#, python-format +msgid "Hello, %(username)s." +msgstr "Hola, %(username)s." + +#: templates/base.html:220 templates/comments/list.html:89 +#: templates/contest/contest-list-tabs.html:24 +#: templates/problem/problem-list-tabs.html:6 +#: templates/submission/info-base.html:12 +#: templates/submission/submission-list-tabs.html:15 +msgid "Admin" +msgstr "Administrador" + +#: templates/base.html:229 +msgid "Log out" +msgstr "Cerrar Sesión" + +#: templates/base.html:238 +#: templates/registration/password_reset_complete.html:4 +msgid "Log in" +msgstr "Iniciar sesión" + +#: templates/base.html:239 templates/registration/registration_form.html:177 +msgid "or" +msgstr "o" + +#: templates/base.html:240 +msgid "Sign up" +msgstr "" + +#: templates/base.html:252 +msgid "spectating" +msgstr "modo de espectador" + +#: templates/base.html:265 +msgid "This site works best with JavaScript enabled." +msgstr "Esta aplicación funciona mejor con JavaScript activado." + +#: templates/blog/content.html:13 templates/comments/list.html:68 +#: templates/comments/list.html:83 templates/contest/contest-tabs.html:20 +#: 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 +msgid "Edit" +msgstr "Editar" + +#: templates/blog/content.html:27 +#, python-format +msgid "\n" +" posted on %(time)s\n" +" " +msgstr "\n" +" publicada en %(time)s\n" +" " + +#: templates/blog/dashboard.html:21 +#, python-format +msgid "\n" +" on %(time)s\n" +" " +msgstr "\n" +" en %(time)s\n" +" " + +#: templates/blog/list.html:85 +msgid "Blog" +msgstr "Blog" + +#: templates/blog/list.html:87 +msgid "Events" +msgstr "Eventos" + +#: templates/blog/list.html:92 +msgid "News" +msgstr "Noticias" + +#: templates/blog/list.html:106 +#, python-brace-format +msgid "posted on {time}" +msgstr "publicado en {time}" + +#: templates/blog/list.html:130 templates/problem/problem.html:310 +msgid "Clarifications" +msgstr "Aclaraciones" + +#: templates/blog/list.html:146 templates/problem/problem.html:321 +msgid "No clarifications have been made at this time." +msgstr "No se han hecho aclaraciones en este momento." + +#: templates/blog/list.html:154 +msgid "Ongoing contests" +msgstr "Concursos en marcha" + +#: templates/blog/list.html:172 +msgid "Upcoming contests" +msgstr "Próximos concursos" + +#: templates/blog/list.html:189 +msgid "Comment stream" +msgstr "Corriente del comentario" + +#: templates/blog/list.html:208 +msgid "New problems" +msgstr "Problemas nuevos" + +#: templates/blog/list.html:225 +msgid "My open tickets" +msgstr "Mis tickets abiertos" + +#: templates/blog/list.html:246 +msgid "New tickets" +msgstr "Tickets nuevos" + +#: templates/comments/list.html:2 +msgid "Comments" +msgstr "Comentarios" + +#: templates/comments/list.html:18 templates/comments/list.html:27 +msgid "Please login to vote" +msgstr "Por favor iniciar sesión para votar" + +#: templates/comments/list.html:40 +#, python-brace-format +msgid "commented on {time}" +msgstr "comentado en {time}" + +#: templates/comments/list.html:49 +#, python-format +msgid "edit %(edits)s" +msgstr "editar %(edits)s" + +#: templates/comments/list.html:51 templates/comments/media-js.html:77 +msgid "edited" +msgstr "editado" + +#: templates/comments/list.html:60 +msgid "Link" +msgstr "Enlace" + +#: templates/comments/list.html:73 templates/comments/list.html:80 +msgid "Reply" +msgstr "Responder" + +#: templates/comments/list.html:86 +msgid "Hide" +msgstr "Ocultar" + +#: templates/comments/list.html:101 +#, 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:120 +msgid "There are no comments at the moment." +msgstr "No hay comentarios por el momento." + +#: templates/comments/list.html:126 +msgid "New comment" +msgstr "Comentario nuevo" + +#: templates/comments/list.html:140 +msgid "Invalid comment body." +msgstr "Cuerpo del comentario inválido." + +#: templates/comments/list.html:148 +msgid "Post!" +msgstr "¡Publicar!" + +#: templates/comments/list.html:156 +msgid "Comments are disabled on this page." +msgstr "" + +#: templates/comments/media-js.html:72 +#, python-brace-format +msgid "edit {edits}" +msgstr "editar {edits}" + +#: templates/comments/media-js.html:75 +msgid "original" +msgstr "original" + +#: templates/contest/access_code.html:26 +msgid "Invalid access code." +msgstr "Código de acceso inválido." + +#: templates/contest/access_code.html:29 +msgid "Please enter your access code:" +msgstr "Por favor introduzca su código de acceso:" + +#: templates/contest/access_code.html:32 +msgid "Join Contest" +msgstr "Únete al concurso" + +#: templates/contest/calendar.html:12 +msgid "Sunday" +msgstr "Domingo" + +#: templates/contest/calendar.html:13 +msgid "Monday" +msgstr "Lunes" + +#: templates/contest/calendar.html:14 +msgid "Tuesday" +msgstr "Martes" + +#: templates/contest/calendar.html:15 +msgid "Wednesday" +msgstr "Miércoles" + +#: templates/contest/calendar.html:16 +msgid "Thursday" +msgstr "Jueves" + +#: templates/contest/calendar.html:17 +msgid "Friday" +msgstr "Viernes" + +#: templates/contest/calendar.html:18 +msgid "Saturday" +msgstr "Sábado" + +#: 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 "Anterior" + +#: templates/contest/contest-list-tabs.html:10 +msgid "Today" +msgstr "" + +#: templates/contest/contest-list-tabs.html:13 +msgid "Next" +msgstr "Siguiente" + +#: templates/contest/contest-list-tabs.html:21 +#: templates/problem/problem-list-tabs.html:5 +msgid "List" +msgstr "Lista" + +#: templates/contest/contest-list-tabs.html:22 +msgid "Calendar" +msgstr "Calendario" + +#: templates/contest/contest-tabs.html:4 +msgid "Info" +msgstr "Información" + +#: templates/contest/contest-tabs.html:8 +msgid "Rankings" +msgstr "Valoraciones" + +#: templates/contest/contest-tabs.html:10 +msgid "Hidden Rankings" +msgstr "Rankings ocultos" + +#: templates/contest/contest-tabs.html:18 +msgid "MOSS" +msgstr "" + +#: templates/contest/contest-tabs.html:23 +msgid "Clone" +msgstr "" + +#: templates/contest/contest-tabs.html:34 +#: templates/contest/contest-tabs.html:54 +msgid "Leave contest" +msgstr "Abandonar concurso" + +#: templates/contest/contest-tabs.html:41 templates/contest/list.html:293 +msgid "Virtual join" +msgstr "Unión virtual" + +#: templates/contest/contest-tabs.html:52 +msgid "Stop spectating" +msgstr "Parar de ver" + +#: templates/contest/contest-tabs.html:61 +msgid "Spectate contest" +msgstr "Ver concurso" + +#: templates/contest/contest-tabs.html:67 +#: templates/contest/contest-tabs.html:73 +msgid "Join contest" +msgstr "Unirse al concurso" + +#: templates/contest/contest-tabs.html:82 +msgid "Login to participate" +msgstr "Inicio de sesión para participar" + +#: templates/contest/contest.html:37 +msgid "Participating virtually." +msgstr "Participación virtual." + +#: templates/contest/contest.html:43 +msgid "Contest is over." +msgstr "El concurso ha terminado." + +#: templates/contest/contest.html:59 templates/contest/contest.html:63 +msgid "F j, Y, G:i T" +msgstr "F j, Y, G:i T" + +#: templates/contest/contest.html:59 +#, python-format +msgid "%(time_limit)s window between %(start_time)s and %(end_time)s" +msgstr "%(time_limit)s ventana entre %(start_time)s y %(end_time)s" + +#: templates/contest/contest.html:63 +#, python-format +msgid "%(length)s long starting on %(start_time)s" +msgstr "%(length)s larga a partir de %(start_time)s" + +#: templates/contest/contest.html:85 +msgid "AC Rate" +msgstr "Tasa de AC" + +#: templates/contest/contest.html:86 templates/contest/list.html:153 +#: templates/contest/list.html:195 templates/contest/list.html:271 +#: templates/problem/list.html:212 templates/problem/list.html:238 +msgid "Users" +msgstr "Usuarios" + +#: templates/contest/contest.html:111 +msgid "Editorial" +msgstr "Editorial" + +#: templates/contest/list.html:31 templates/contest/media-js.html:9 +msgid "Are you sure you want to join?" +msgstr "¿Usted esta seguro de que quiere unirse?" + +#: templates/contest/list.html:32 +msgid "Joining a contest for the first time starts your timer, after which it becomes unstoppable." +msgstr "Al unirse a un concurso por primera vez inicia el cronómetro, después se vuelve imparable." + +#: templates/contest/list.html:65 +msgid "hidden" +msgstr "" + +#: templates/contest/list.html:70 +msgid "private" +msgstr "" + +#: templates/contest/list.html:84 +msgid "rated" +msgstr "" + +#: templates/contest/list.html:132 +msgid "Spectate" +msgstr "Espectador" + +#: templates/contest/list.html:138 +msgid "Join" +msgstr "Unir" + +#: templates/contest/list.html:148 +msgid "Active Contests" +msgstr "" + +#: templates/contest/list.html:152 templates/contest/list.html:194 +#: templates/contest/list.html:232 templates/contest/list.html:270 +msgid "Contest" +msgstr "Concurso" + +#: templates/contest/list.html:190 +msgid "Ongoing Contests" +msgstr "Concursos en curso" + +#: templates/contest/list.html:227 +msgid "Upcoming Contests" +msgstr "Próximos eventos" + +#: templates/contest/list.html:255 +msgid "There are no scheduled contests at this time." +msgstr "No hay concursos programados en este momento." + +#: templates/contest/list.html:261 +msgid "Past Contests" +msgstr "Concursos pasados" + +#: templates/contest/media-js.html:4 +msgid "Are you sure you want to leave?" +msgstr "¿Está seguro que quiere salir?" + +#: templates/contest/media-js.html:5 +msgid "You cannot come back to a virtual participation. You will have to start a new one." +msgstr "Usted no puede volver a una participación virtual. Tendrá que comenzar uno nuevo." + +#: templates/contest/media-js.html:10 +msgid "Joining a contest starts your timer, after which it becomes unstoppable." +msgstr "Al unirse a un concurso por primera vez inicia su temporizador, después de lo cual se vuelve imparable." + +#: 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 "Sólo las siguientes organizaciones pueden tener acceso a este concurso:" + +#: templates/contest/ranking-table.html:7 +msgid "Organization" +msgstr "Organización" + +#: templates/contest/ranking-table.html:27 +#, python-brace-format +msgid "Started on {time}" +msgstr "Comenzó en {time}" + +#: templates/contest/ranking-table.html:30 +msgid "Participation ended." +msgstr "Participación terminada." + +#: templates/contest/ranking.html:232 +msgid "View user participation" +msgstr "Ver la participación del usuario" + +#: templates/contest/ranking.html:236 +msgid "Show organizations" +msgstr "Mostrar organizaciones" + +#: templates/license.html:12 +msgid "Source:" +msgstr "Origen:" + +#: 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 "Boletín informativo" + +#: 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 "activar" + +#: templates/newsletter/subscription_unsubscribe_activated.html:8 +msgid "You have successfully been unsubscribed." +msgstr "Ha sido cancelado exitosamente." + +#: 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 "Baja el boletín informativo" + +#: 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 "Su solicitud de desuscripción se ha recibido exitosamente. Se ha enviado un correo electrónico con un enlace que debe seguir para confirmar su cancelación." + +#: templates/newsletter/subscription_unsubscribe_user.html:17 +msgid "Do you want to unsubscribe from this newsletter?" +msgstr "¿Desea darse de baja de este boletín informativo?" + +#: templates/newsletter/subscription_unsubscribe_user.html:21 +msgid "Unsubscribe" +msgstr "Desuscribirse" + +#: 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 "Actualizar Boletín" + +#: 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 "Debido a un error técnico no pudimos enviar su correo electrónico de confirmación. Esto podría deberse a que no es válida su dirección de correo electrónico." + +#: templates/newsletter/subscription_update.html:14 +msgid "Update subscription" +msgstr "Actualizar suscripción" + +#: templates/newsletter/subscription_update_activated.html:8 +msgid "Your subscription has successfully been updated." +msgstr "Su suscripción ha sido actualizada con éxito." + +#: 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 "Su solicitud de actualización se recibió correctamente y se le envió un correo electrónico de activación. En ese correo electrónico encontrará un vinculo que debe seguir para actualizar su suscripción." + +#: templates/organization/edit.html:46 +#: templates/organization/requests/pending.html:34 +#: templates/ticket/edit-notes.html:4 +msgid "Update" +msgstr "Actualizar" + +#: 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 "Abandonar organización" + +#: templates/organization/home.html:29 +msgid "Join organization" +msgstr "Unirse a esta organización" + +#: templates/organization/home.html:33 +msgid "Request membership" +msgstr "Solicitar membresía" + +#: templates/organization/home.html:39 +msgid "Edit organization" +msgstr "Editar organización" + +#: templates/organization/home.html:43 +msgid "View requests" +msgstr "Ver solicitud" + +#: templates/organization/home.html:50 +msgid "Admin organization" +msgstr "Administrador de la organización" + +#: templates/organization/home.html:55 +msgid "View members" +msgstr "Ver miembros" + +#: templates/organization/list.html:23 templates/status/language-list.html:34 +msgid "Name" +msgstr "Nombre" + +#: templates/organization/list.html:24 +msgid "Members" +msgstr "Miembros" + +#: templates/organization/new.html:10 templates/ticket/new.html:38 +msgid "Create" +msgstr "Crear" + +#: templates/organization/requests/detail.html:13 +msgid "User:" +msgstr "Usuario:" + +#: templates/organization/requests/detail.html:17 +msgid "Organization:" +msgstr "Organización:" + +#: templates/organization/requests/detail.html:25 +msgid "Time:" +msgstr "Tiempo:" + +#: templates/organization/requests/detail.html:29 +msgid "Reason:" +msgstr "Razón:" + +#: templates/organization/requests/log.html:11 +#: templates/organization/requests/pending.html:14 +msgid "State" +msgstr "Estado" + +#: templates/organization/requests/log.html:12 +#: templates/organization/requests/pending.html:15 +msgid "Reason" +msgstr "Razón" + +#: templates/organization/requests/log.html:28 +#: templates/organization/requests/pending.html:37 +msgid "There are no requests to approve." +msgstr "No hay solicitudes para aprobar." + +#: templates/organization/requests/pending.html:17 +#: templates/problem/data.html:401 +msgid "Delete?" +msgstr "¿Eliminar?" + +#: templates/organization/requests/request.html:18 +msgid "Your reason for joining:" +msgstr "Su razón para unirse:" + +#: templates/organization/requests/request.html:20 +msgid "Request" +msgstr "Solicitud" + +#: templates/organization/requests/tabs.html:4 +msgid "Pending" +msgstr "Pendiente" + +#: templates/organization/requests/tabs.html:7 +msgid "Log" +msgstr "Resgistro" + +#: templates/organization/requests/tabs.html:10 +msgid "Approved" +msgstr "Aprobado" + +#: templates/organization/requests/tabs.html:13 +msgid "Rejected" +msgstr "Rechazado" + +#: templates/organization/users-table.html:15 +msgid "Kick" +msgstr "Expulsar" + +#: templates/problem/clone.html:37 +msgid "Enter a new code for the cloned problem:" +msgstr "" + +#: templates/problem/data.html:353 +msgid "View YAML" +msgstr "Ver YAML" + +#: templates/problem/data.html:369 +msgid "Show columns:" +msgstr "Mostrar columnas:" + +#: templates/problem/data.html:372 templates/problem/data.html:396 +msgid "Output prefix" +msgstr "Prefijo de salida" + +#: templates/problem/data.html:376 templates/problem/data.html:397 +msgid "Output limit" +msgstr "Límite de salida" + +#: templates/problem/data.html:380 templates/problem/data.html:398 +msgid "Checker" +msgstr "Verificadores" + +#: templates/problem/data.html:384 templates/problem/data.html:399 +msgid "Generator args" +msgstr "Generador de argumentos" + +#: templates/problem/data.html:391 +msgid "Type" +msgstr "Tipo" + +#: templates/problem/data.html:392 +msgid "Input file" +msgstr "Archivo de entrada" + +#: templates/problem/data.html:393 +msgid "Output file" +msgstr "Archivo de salida" + +#: templates/problem/data.html:395 +msgid "Pretest?" +msgstr "Pretest?" + +#: templates/problem/data.html:447 templates/problem/submit.html:252 +msgid "Submit!" +msgstr "¡Enviar!" + +#: templates/problem/data.html:448 +msgid "Add new case" +msgstr "Añadir nueva etiqueta" + +#: 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 "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." + +#: templates/problem/list.html:62 +msgid "Filter by type..." +msgstr "Filtrar por tipo..." + +#: templates/problem/list.html:185 +msgid "Hot problems" +msgstr "Problemas calientes" + +#: templates/problem/list.html:207 templates/problem/list.html:224 +#: templates/problem/search-form.html:30 templates/user/user-problems.html:57 +msgid "Category" +msgstr "Categoría" + +#: templates/problem/list.html:209 templates/problem/list.html:228 +msgid "Types" +msgstr "Tipos" + +#: templates/problem/list.html:235 +#, python-format +msgid "AC %%" +msgstr "AC%%" + +#: 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:142 +msgid "Filter by result:" +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 "Ver en PDF" + +#: templates/problem/problem.html:101 templates/problem/problem.html:111 +#: templates/problem/problem.html:116 +msgid "Submit solution" +msgstr "Enviar solución" + +#: templates/problem/problem.html:104 +#, python-format +msgid "%(counter)s submission left" +msgid_plural "%(counter)s submissions left" +msgstr[0] "%(counter)s envío restante" +msgstr[1] "%(counter)s envíos restantes" + +#: templates/problem/problem.html:112 +msgid "0 submissions left" +msgstr "0 envíos restantes" + +#: templates/problem/problem.html:124 +msgid "My submissions" +msgstr "Mis Envíos" + +#: templates/problem/problem.html:128 +msgid "Best submissions" +msgstr "Mejores envíos" + +#: templates/problem/problem.html:132 +msgid "Read editorial" +msgstr "Leer editorial" + +#: templates/problem/problem.html:137 +msgid "Manage tickets" +msgstr "Administrar tickets" + +#: templates/problem/problem.html:141 +msgid "Edit problem" +msgstr "Editar el problema" + +#: templates/problem/problem.html:143 +msgid "Edit test data" +msgstr "Editar casos de prueba" + +#: templates/problem/problem.html:148 +msgid "My tickets" +msgstr "" + +#: templates/problem/problem.html:156 +msgid "Manage submissions" +msgstr "" + +#: templates/problem/problem.html:162 +msgid "Clone problem" +msgstr "Clonar problema" + +#: templates/problem/problem.html:169 +msgid "Points:" +msgstr "Puntos:" + +#: templates/problem/problem.html:172 templates/problem/problem.html:174 +msgid "(partial)" +msgstr "(parcial)" + +#: templates/problem/problem.html:179 +msgid "Time limit:" +msgstr "Tiempo límite:" + +#: templates/problem/problem.html:191 +msgid "Memory limit:" +msgstr "Límite de memoria:" + +#: templates/problem/problem.html:210 +msgid "Author:" +msgid_plural "Authors:" +msgstr[0] "Autor:" +msgstr[1] "Autores:" + +#: templates/problem/problem.html:225 +msgid "Problem type" +msgid_plural "Problem types" +msgstr[0] "Tipo de problema" +msgstr[1] "Tipos de problema" + +#: templates/problem/problem.html:238 +msgid "Allowed languages" +msgstr "Idiomas permitidos" + +#: templates/problem/problem.html:246 +#, python-format +msgid "No %(lang)s judge online" +msgstr "No hay jueces online para %(lang)s" + +#: templates/problem/problem.html:257 +msgid "Judge:" +msgid_plural "Judges:" +msgstr[0] "" +msgstr[1] "" + +#: templates/problem/problem.html:274 +msgid "none available" +msgstr "" + +#: templates/problem/problem.html:299 +msgid "Request clarification" +msgstr "Solicitar aclaración" + +#: templates/problem/problem.html:301 +msgid "Report an issue" +msgstr "Reportar un problema" + +#: 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 "Búsqueda de problema" + +#: templates/problem/search-form.html:8 +msgid "Search problems..." +msgstr "Búsqueda de problemas..." + +#: templates/problem/search-form.html:14 +msgid "Full text search" +msgstr "Búsqueda de texto completo" + +#: templates/problem/search-form.html:21 +msgid "Hide solved problems" +msgstr "Ocultar problemas resueltos" + +#: templates/problem/search-form.html:27 +msgid "Show problem types" +msgstr "Mostrar tipos de problemas" + +#: templates/problem/search-form.html:33 templates/problem/search-form.html:35 +#: templates/submission/submission-list-tabs.html:4 +msgid "All" +msgstr "Todo" + +#: templates/problem/search-form.html:46 +msgid "Problem types" +msgstr "Tipos de problema" + +#: templates/problem/search-form.html:57 +msgid "Point range" +msgstr "" + +#: templates/problem/search-form.html:63 templates/submission/list.html:337 +#: templates/ticket/list.html:248 +msgid "Go" +msgstr "Ir" + +#: templates/problem/search-form.html:64 +msgid "Random" +msgstr "Aleatorio" + +#: templates/problem/submit.html:192 +#, python-format +msgid "Warning! Your default language, %(default_language)s, is unavailable for this problem and has been deselected." +msgstr "¡Advertencia! Su idioma predeterminado, %(default_language)s, no está disponible para este problema y no se seleccionó." + +#: templates/problem/submit.html:203 +#, python-format +msgid "\n" +" You have %(left)s submission left\n" +" " +msgid_plural "\n" +" You have %(left)s submissions left\n" +" " +msgstr[0] "\n" +" Aún tienes %(left)s envío restante\n" +" " +msgstr[1] "\n" +" Aún tienes %(left)s envíos restantes\n" +" " + +#: templates/problem/submit.html:212 +msgid "You have 0 submissions left" +msgstr "Usted tiene 0 presentaciones aun" + +#: templates/problem/submit.html:250 +msgid "No judge is available for this problem." +msgstr "Ningún Juez esta disponible para este problema." + +#: templates/registration/activate.html:3 +#, python-format +msgid "%(key)s is an invalid activation key." +msgstr "%(key)s es una llave no válida." + +#: templates/registration/activation_complete.html:3 +msgid "Your account has been successfully activated." +msgstr "Su cuenta ha sido activada con éxito." + +#: templates/registration/login.html:43 +msgid "Invalid username or password." +msgstr "Usuario o contraseña inválida." + +#: templates/registration/login.html:61 +#: templates/registration/totp_auth.html:39 +msgid "Login!" +msgstr "¡Iniciar sesión!" + +#: templates/registration/login.html:64 +msgid "Forgot your password?" +msgstr "¿Olvidaste tu contraseña?" + +#: templates/registration/login.html:67 +msgid "Or log in with..." +msgstr "O ingresa con..." + +#: templates/registration/logout.html:3 +msgid "See you later!" +msgstr "¡Nos vemos luego!" + +#: templates/registration/password_change_done.html:3 +msgid "Your password was sucessfully changed." +msgstr "Su contraseña se ha cambiado con éxito." + +#: templates/registration/password_change_form.html:8 +msgid "Change Password" +msgstr "Cambiar contraseña" + +#: templates/registration/password_reset.html:7 +msgid "Send Reset Email" +msgstr "Envía un correo de restablecimiento" + +#: templates/registration/password_reset_complete.html:3 +msgid "Your password has been set. You may go ahead and log in now" +msgstr "Su contraseña ha sido establecida. Usted puede continuar e iniciar sesión ahora" + +#: templates/registration/password_reset_confirm.html:9 +msgid "Reset Password" +msgstr "Restablecer contraseña" + +#: templates/registration/password_reset_done.html:4 +msgid "We've emailed you instructions for setting your password. You should be receiving them shortly." +msgstr "Nosotros te hemos enviado por correo electrónico las instrucciones para configurar su contraseña. Debería recibirlos en breve." + +#: 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 "Si usted no recibe un correo electrónico, asegúrese de haber ingresado la dirección con la que se registró y revise su carpeta de correo no deseado." + +#: 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 "Usted está recibiendo este correo electrónico porque solicitó restablecer la contraseña de su cuenta de usuario en%(site_name)s." + +#: templates/registration/password_reset_email.txt:3 +msgid "Please go to the following page and choose a new password:" +msgstr "Por favor ve a la siguiente página y elige una nueva contraseña:" + +#: templates/registration/password_reset_email.txt:7 +msgid "Your username, in case you've forgotten:" +msgstr "Nombre de usuario, en caso de que lo hayas olvidado:" + +#: templates/registration/password_reset_email.txt:9 +msgid "Thanks for using our site!" +msgstr "¡Gracias por usar nuestro sitio!" + +#: templates/registration/password_reset_email.txt:11 +#, python-format +msgid "The %(site_name)s team" +msgstr "El equipo de %(site_name)s" + +#: templates/registration/password_reset_subject.txt:1 +#, python-format +msgid "Password reset on %(site_name)s" +msgstr "Contraseña se reinicia en %(site_name)s" + +#: templates/registration/profile_creation.html:36 +#: templates/registration/username_select.html:7 +msgid "Continue >" +msgstr "Continuar" + +#: 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 "Has sido registrado con éxito. Se le ha enviado un correo electrónico para confirmar su registro." + +#: templates/registration/registration_form.html:166 +msgid "(again, for confirmation)" +msgstr "(de nuevo, por confirmación)" + +#: templates/registration/registration_form.html:173 +msgid "(select your closest major city)" +msgstr "(Seleccione la ciudad importante más cercana)" + +#: templates/registration/registration_form.html:178 +msgid "pick from map" +msgstr "seleccionar en el mapa" + +#: templates/registration/registration_form.html:183 +msgid "Default language" +msgstr "Idioma predeterminado" + +#: templates/registration/registration_form.html:186 +#: templates/user/edit-profile.html:162 +msgid "Affiliated organizations" +msgstr "Organizaciones afiliadas" + +#: templates/registration/registration_form.html:192 +#: templates/user/edit-profile.html:121 +msgid "Notify me about upcoming contests" +msgstr "Notificarme sobre próximas competencias" + +#: templates/registration/registration_form.html:206 +msgid "By registering, you agree to our" +msgstr "Al registrarte, estás aceptando nuestras" + +#: templates/registration/registration_form.html:207 +msgid "Terms & Conditions" +msgstr "Términos y condiciones" + +#: templates/registration/registration_form.html:210 +msgid "Register!" +msgstr "¡Registrarse!" + +#: templates/registration/totp_auth.html:36 +#: templates/registration/totp_disable.html:45 +#: templates/registration/totp_enable.html:83 +msgid "Enter the 6-digit code generated by your app:" +msgstr "" + +#: templates/registration/totp_auth.html:41 +#, python-format +msgid "If you lost your authentication device, please contact us at %(email)s." +msgstr "" + +#: templates/registration/totp_disable.html:38 +msgid "To protect your account, you must first authenticate before you can disable Two Factor Authentication." +msgstr "" + +#: templates/registration/totp_enable.html:71 +msgid "Scan this code with your authenticator app:" +msgstr "" + +#: templates/registration/totp_enable.html:72 +msgid "QR code" +msgstr "" + +#: templates/registration/totp_enable.html:73 +msgid "Or enter this code manually:" +msgstr "" + +#: templates/stats/base.html:9 templates/submission/list.html:345 +msgid "Statistics" +msgstr "Estadística" + +#: templates/stats/language.html:11 +msgid "Submission Statistics" +msgstr "Estadísticas de envíos" + +#: templates/stats/language.html:16 +msgid "Submissions by Language" +msgstr "Envíos por Lenguaje" + +#: templates/stats/language.html:21 +msgid "AC Submissions by Language" +msgstr "Envíos AC por Lenguaje" + +#: templates/stats/language.html:26 +msgid "Language AC Rate" +msgstr "Tasa de AC por Lenguaje" + +#: templates/status/judge-status-table.html:2 +msgid "Judge" +msgstr "Juez" + +#: templates/status/judge-status-table.html:4 +msgid "Online" +msgstr "En línea" + +#: templates/status/judge-status-table.html:6 +msgid "Uptime" +msgstr "Tiempo de actividad" + +#: templates/status/judge-status-table.html:7 +msgid "Ping" +msgstr "" + +#: templates/status/judge-status-table.html:8 +msgid "Load" +msgstr "Cargar" + +#: 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 "N/A" + +#: templates/status/judge-status-table.html:64 +msgid "There are no judges available at this time." +msgstr "No hay jueces disponibles en este momento." + +#: templates/status/language-list.html:33 templates/ticket/list.html:261 +msgid "ID" +msgstr "Identificación" + +#: templates/status/language-list.html:35 +msgid "Runtime Info" +msgstr "Información del tiempo transcurrido" + +#: templates/status/status-tabs.html:4 +msgid "Judges" +msgstr "Jueces" + +#: templates/status/status-tabs.html:6 +msgid "Version Matrix" +msgstr "Versión matriz" + +#: templates/submission/internal-error-message.html:8 +msgid "An internal error occurred while grading." +msgstr "A ocurrido un error interno durante la clasificación." + +#: templates/submission/internal-error-message.html:15 +msgid "Error information" +msgstr "Información errónea" + +#: templates/submission/list.html:76 +msgid "Filter by status..." +msgstr "Filtrar por estatus..." + +#: templates/submission/list.html:82 +msgid "Filter by language..." +msgstr "Filtrar por idioma..." + +#: templates/submission/list.html:315 +msgid "Filter submissions" +msgstr "Filtrar envíos" + +#: templates/submission/list.html:351 +msgid "Total:" +msgstr "" + +#: templates/submission/list.html:361 +msgid "You were disconnected. Refresh to show latest updates." +msgstr "Estuviste desconectado. Actualiza para mostrar las últimas actualizaciones." + +#: templates/submission/row.html:39 +#, python-format +msgid "Case #%(case)s" +msgstr "Caso #%(case)s" + +#: templates/submission/row.html:49 +msgid "view" +msgstr "ver" + +#: templates/submission/row.html:53 +msgid "rejudge" +msgstr "juzgar de nuevo" + +#: templates/submission/row.html:58 +msgid "admin" +msgstr "administrador" + +#: templates/submission/source.html:25 +msgid "View status" +msgstr "Ver estado" + +#: templates/submission/source.html:26 +msgid "View raw source" +msgstr "Ver fuente sin procesar" + +#: templates/submission/source.html:28 templates/submission/status.html:61 +msgid "Resubmit" +msgstr "Reenviar" + +#: templates/submission/status-testcases.html:10 +msgid "We are waiting for a suitable judge to process your submission..." +msgstr "Estamos esperando un juez adecuado procese su presentación..." + +#: templates/submission/status-testcases.html:12 +msgid "Your submission is being processed..." +msgstr "Su presentación está siendo procesada..." + +#: templates/submission/status-testcases.html:14 +msgid "Compilation Error" +msgstr "Error de compilación" + +#: templates/submission/status-testcases.html:18 +msgid "Compilation Warnings" +msgstr "Advertencias de compilación" + +#: templates/submission/status-testcases.html:23 +msgid "Pretest Execution Results" +msgstr "Resultados de la ejecución de prueba previa" + +#: templates/submission/status-testcases.html:25 +msgid "Execution Results" +msgstr "Resultados de la ejecución" + +#: templates/submission/status-testcases.html:31 +msgid "Batch " +msgstr "Grupo " + +#: templates/submission/status-testcases.html:43 +msgid "Case" +msgstr "Caso" + +#: templates/submission/status-testcases.html:45 +msgid "Pretest" +msgstr "Antes de la prueba" + +#: templates/submission/status-testcases.html:47 +msgid "Test case" +msgstr "Caso de prueba" + +#: templates/submission/status-testcases.html:79 +msgid "Your output (clipped)" +msgstr "Su salida (enganchada)" + +#: templates/submission/status-testcases.html:90 +msgid "Judge feedback" +msgstr "" + +#: templates/submission/status-testcases.html:106 +msgid "Resources:" +msgstr "" + +#: templates/submission/status-testcases.html:115 +msgid "Final pretest score:" +msgstr "Puntuación final de la prueba:" + +#: templates/submission/status-testcases.html:117 +msgid "Final score:" +msgstr "Puntuación total:" + +#: templates/submission/status-testcases.html:131 +msgid "Passing pretests does not guarantee a full score on system tests." +msgstr "Pasar pruebas previas no garantiza una puntuación completa en pruebas del sistema." + +#: templates/submission/status-testcases.html:134 +msgid "Submission aborted!" +msgstr "¡Presentación abortada!" + +#: templates/submission/status.html:59 +msgid "View source" +msgstr "Ver fuente" + +#: templates/submission/status.html:88 +msgid "Abort" +msgstr "Anular" + +#: templates/submission/submission-list-tabs.html:6 +msgid "Mine" +msgstr "Mío" + +#: templates/submission/submission-list-tabs.html:9 +msgid "Best" +msgstr "El Mejor" + +#: templates/submission/submission-list-tabs.html:12 +#, python-format +msgid "%(user)s's" +msgstr "De %(user)s" + +#: templates/ticket/list.html:135 templates/ticket/ticket.html:257 +msgid "Reopened: " +msgstr "Reabierto: " + +#: templates/ticket/list.html:138 templates/ticket/ticket.html:258 +msgid "Closed: " +msgstr "Cerrado: " + +#: templates/ticket/list.html:221 +msgid "Use desktop notification" +msgstr "Usar notificaciones de escritorio" + +#: templates/ticket/list.html:227 +msgid "Show my tickets only" +msgstr "Sólo mostrar mis tickets" + +#: templates/ticket/list.html:231 +msgid "Filing user" +msgstr "Registro de usuario" + +#: templates/ticket/list.html:240 +msgid "Assignee" +msgstr "Asignado" + +#: templates/ticket/list.html:262 +msgid "Title" +msgstr "Título" + +#: templates/ticket/list.html:264 templates/ticket/ticket.html:304 +msgid "Assignees" +msgstr "Asignados" + +#: templates/ticket/new_problem.html:7 +msgid "Thanks for opening a ticket!" +msgstr "¡Gracias por abrir un ticket!" + +#: 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 "Por favor tenga en cuenta que este formulario es para informar problemas con una declaración del mismo y no para pedir ayuda. Si necesita ayuda para resolver un problema, pregunte en los comentarios." + +#: templates/ticket/ticket.html:298 +msgid "Associated object" +msgstr "Objeto asociado" + +#: templates/ticket/ticket.html:309 +msgid "No one is assigned." +msgstr "Ninguno asignado." + +#: templates/ticket/ticket.html:315 +msgid "Close ticket" +msgstr "Ticket de cierre" + +#: templates/ticket/ticket.html:317 +msgid "Reopen ticket" +msgstr "Reabrir ticket" + +#: templates/ticket/ticket.html:321 +msgid "Assignee notes" +msgstr "Notas de asignado" + +#: templates/ticket/ticket.html:328 templates/widgets/select_all.html:4 +msgid "Nothing here." +msgstr "Nada aquí." + +#: templates/ticket/ticket.html:378 +msgid "Post" +msgstr "Publicar" + +#: templates/user/base-users-table.html:3 +msgid "Rank" +msgstr "Puesto" + +#: templates/user/base-users.html:14 templates/user/base-users.html:69 +msgid "Search by handle..." +msgstr "Buscar por manejo..." + +#: templates/user/edit-profile.html:90 +msgid "Self-description" +msgstr "Descripción propia" + +#: templates/user/edit-profile.html:98 +msgid "Select your closest major city" +msgstr "Seleccione la ciudad importante más cercana" + +#: templates/user/edit-profile.html:107 +msgid "Editor theme" +msgstr "Tema editor" + +#: templates/user/edit-profile.html:112 +msgid "Math engine" +msgstr "" + +#: templates/user/edit-profile.html:136 templates/user/edit-profile.html:137 +msgid "Change your avatar" +msgstr "Cambiar tu avatar" + +#: templates/user/edit-profile.html:143 +msgid "Change your password" +msgstr "Cambiar tu contraseña" + +#: templates/user/edit-profile.html:150 +msgid "Two Factor Authentication is enabled." +msgstr "" + +#: templates/user/edit-profile.html:153 +msgid "Two Factor Authentication is disabled." +msgstr "" + +#: templates/user/edit-profile.html:170 +msgid "User-script" +msgstr "Script de usuario" + +#: templates/user/edit-profile.html:174 +msgid "Update profile" +msgstr "Actualizar perfil" + +#: templates/user/pp-row.html:22 +#, python-format +msgid "\n" +" weighted %(weight)s%%\n" +" " +msgstr "\n" +" ponderado %(weight)s\n" +" " + +#: templates/user/pp-row.html:27 +#, python-format +msgid "%(pp).1fpp" +msgstr "%(pp).1fpp" + +#: templates/user/pp-row.html:29 +#, python-format +msgid "%(pp).0fpp" +msgstr "%(pp).0fpp" + +#: templates/user/user-about.html:14 +msgid "From" +msgstr "De" + +#: 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 "Sobre" + +#: templates/user/user-about.html:40 +msgid "You have not shared any information." +msgstr "No has compartido ninguna información." + +#: templates/user/user-about.html:42 +msgid "This user has not shared any information." +msgstr "Este usuario no ha compartido ninguna información." + +#: 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 "Calificar por puntos:" + +#: templates/user/user-base.html:53 +msgid "Total points:" +msgstr "Puntos totales:" + +#: templates/user/user-base.html:68 +msgid "Rank by rating:" +msgstr "Rango de la clasificación:" + +#: templates/user/user-base.html:70 +msgid "Rating:" +msgstr "Puntuación:" + +#: templates/user/user-base.html:71 +msgid "Volatility:" +msgstr "Valatilidad:" + +#: templates/user/user-base.html:72 +msgid "Min. rating:" +msgstr "Calificación mínima:" + +#: templates/user/user-base.html:73 +msgid "Max rating:" +msgstr "Calificación máxima:" + +#: templates/user/user-problems.html:35 +msgid "Points Breakdown" +msgstr "Puntos de ruptura" + +#: templates/user/user-problems.html:41 +msgid "Load more..." +msgstr "Cargas más..." + +#: templates/user/user-problems.html:45 +msgid "This user has not yet solved any problems." +msgstr "Este usuario aún no ha resuelto ningún problema." + +#: templates/user/user-problems.html:51 +msgid "Authored Problems" +msgstr "Problemas de autores" + +#: templates/user/user-problems.html:83 +msgid "Hide problems I've solved" +msgstr "Ocultar problemas que ya he solucionado" + +#: templates/user/user-problems.html:93 +#, python-format +msgid "%(points).1f points" +msgstr "puntos %(points).1f" + +#: templates/user/user-problems.html:99 +msgid "Score" +msgstr "Puntuación" + +#: templates/user/user-problems.html:110 +#, python-format +msgid "%(points)s / %(total)s" +msgstr "%(points)s / %(total)s" + +#: templates/user/user-tabs.html:7 +msgid "Impersonate" +msgstr "Impersonal" + +#: templates/user/user-tabs.html:13 +msgid "Admin User" +msgstr "Administrador" + +#: templates/user/user-tabs.html:16 +msgid "Admin Profile" +msgstr "Perfil del administrador" + +#: templates/widgets/select_all.html:8 +msgid "Check all" +msgstr "Seleccionar todo" + diff --git a/locale/es/LC_MESSAGES/djangojs.po b/locale/es/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..1dd72ac --- /dev/null +++ b/locale/es/LC_MESSAGES/djangojs.po @@ -0,0 +1,30 @@ +msgid "" +msgstr "" +"Project-Id-Version: dmoj\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-10-01 23:12+0000\n" +"PO-Revision-Date: 2019-11-11 22:06\n" +"Last-Translator: Icyene\n" +"Language-Team: Spanish\n" +"Language: es_ES\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: crowdin.com\n" +"X-Crowdin-Project: dmoj\n" +"X-Crowdin-Language: es-ES\n" +"X-Crowdin-File: djangojs.po\n" + +#: resources/common.js:207 +msgctxt "time format with day" +msgid "%d day %h:%m:%s" +msgid_plural "%d days %h:%m:%s" +msgstr[0] "%d día %h:%m:%s" +msgstr[1] "%d días %h:%m:%s" + +#: resources/common.js:210 +msgctxt "time format without day" +msgid "%h:%m:%s" +msgstr "%h:%m:%s" + diff --git a/locale/fr/LC_MESSAGES/django.po b/locale/fr/LC_MESSAGES/django.po new file mode 100644 index 0000000..2bdc78c --- /dev/null +++ b/locale/fr/LC_MESSAGES/django.po @@ -0,0 +1,4531 @@ +msgid "" +msgstr "" +"Project-Id-Version: dmoj\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-11-11 21:54+0000\n" +"PO-Revision-Date: 2019-11-11 22:05\n" +"Last-Translator: Icyene\n" +"Language-Team: French\n" +"Language: fr_FR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: crowdin.com\n" +"X-Crowdin-Project: dmoj\n" +"X-Crowdin-Language: fr\n" +"X-Crowdin-File: django.po\n" + +#: dmoj/settings.py:337 +msgid "German" +msgstr "Allemand" + +#: dmoj/settings.py:338 +msgid "English" +msgstr "Anglais" + +#: dmoj/settings.py:339 +msgid "Spanish" +msgstr "Espagnol" + +#: dmoj/settings.py:340 +msgid "French" +msgstr "Français" + +#: dmoj/settings.py:341 +msgid "Croatian" +msgstr "Croate" + +#: dmoj/settings.py:342 +msgid "Hungarian" +msgstr "Hongrois" + +#: dmoj/settings.py:343 +msgid "Japanese" +msgstr "" + +#: dmoj/settings.py:344 +msgid "Korean" +msgstr "Coréen" + +#: dmoj/settings.py:345 +msgid "Brazilian Portuguese" +msgstr "" + +#: dmoj/settings.py:346 +msgid "Romanian" +msgstr "Roumain" + +#: dmoj/settings.py:347 +msgid "Russian" +msgstr "Russe" + +#: dmoj/settings.py:348 +msgid "Serbian (Latin)" +msgstr "Serbe (Latin)" + +#: dmoj/settings.py:349 +msgid "Turkish" +msgstr "Turque" + +#: dmoj/settings.py:350 +msgid "Vietnamese" +msgstr "Vietnamien" + +#: dmoj/settings.py:351 +msgid "Simplified Chinese" +msgstr "Chinois simplifié" + +#: dmoj/urls.py:54 +msgid "Login" +msgstr "Se connecter" + +#: dmoj/urls.py:102 templates/base.html:190 +msgid "Home" +msgstr "Accueil" + +#: judge/admin/comments.py:40 +#, python-format +msgid "%d comment successfully hidden." +msgid_plural "%d comments successfully hidden." +msgstr[0] "%d commentaire masqué avec succès." +msgstr[1] "%d commentaires masqués avec succès." + +#: judge/admin/comments.py:43 +msgid "Hide comments" +msgstr "Masquer les commentaires" + +#: judge/admin/comments.py:47 +#, python-format +msgid "%d comment successfully unhidden." +msgid_plural "%d comments successfully unhidden." +msgstr[0] "%d commentaire non masqué avec succès." +msgstr[1] "%d commentaires non masqués avec succès." + +#: judge/admin/comments.py:50 +msgid "Unhide comments" +msgstr "Montrer les commentaires" + +#: judge/admin/comments.py:58 +msgid "Associated page" +msgstr "Page associée" + +#: judge/admin/contest.py:29 +msgid "Included contests" +msgstr "Concours inclus" + +#: judge/admin/contest.py:65 templates/contest/contest.html:83 +#: templates/contest/moss.html:43 templates/problem/list.html:206 +#: templates/problem/list.html:221 templates/user/user-problems.html:56 +#: templates/user/user-problems.html:98 +msgid "Problem" +msgstr "Problème" + +#: judge/admin/contest.py:113 +msgid "Settings" +msgstr "" + +#: judge/admin/contest.py:115 +msgid "Scheduling" +msgstr "Planification" + +#: judge/admin/contest.py:116 +msgid "Details" +msgstr "Détails" + +#: judge/admin/contest.py:117 +msgid "Format" +msgstr "" + +#: judge/admin/contest.py:118 templates/contest/ranking-table.html:5 +msgid "Rating" +msgstr "Valeur" + +#: judge/admin/contest.py:119 +msgid "Access" +msgstr "" + +#: judge/admin/contest.py:121 judge/admin/problem.py:131 +msgid "Justice" +msgstr "Justice" + +#: judge/admin/contest.py:159 +#, 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:162 +msgid "Mark contests as visible" +msgstr "" + +#: judge/admin/contest.py:166 +#, 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:169 +msgid "Mark contests as hidden" +msgstr "" + +#: judge/admin/contest.py:180 judge/admin/submission.py:149 +#: judge/admin/submission.py:171 +msgid "You do not have the permission to rejudge submissions." +msgstr "Vous n'avez pas le droit de resoumettre les soumissions." + +#: judge/admin/contest.py:187 judge/admin/submission.py:155 +msgid "You do not have the permission to rejudge THAT many submissions." +msgstr "Vous n'avez pas le droit de resoumettre AUTANT de soumissions." + +#: judge/admin/contest.py:194 judge/admin/submission.py:164 +#, 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:265 +#, python-format +msgid "%d participation recalculated." +msgid_plural "%d participations recalculated." +msgstr[0] "" +msgstr[1] "" + +#: judge/admin/contest.py:268 +msgid "Recalculate results" +msgstr "" + +#: judge/admin/contest.py:272 judge/admin/organization.py:65 +msgid "username" +msgstr "nom d'utilisateur" + +#: judge/admin/contest.py:277 templates/base.html:258 +msgid "virtual" +msgstr "virtuel" + +#: judge/admin/interface.py:28 judge/models/interface.py:46 +msgid "link path" +msgstr "chemin du lien" + +#: judge/admin/interface.py:62 +msgid "Content" +msgstr "Contenu" + +#: judge/admin/interface.py:63 +msgid "Summary" +msgstr "Résumé" + +#: judge/admin/interface.py:107 judge/models/contest.py:251 +#: judge/models/contest.py:355 judge/models/profile.py:189 +msgid "user" +msgstr "utilisateur" + +#: judge/admin/interface.py:148 +msgid "object" +msgstr "" + +#: judge/admin/organization.py:34 judge/admin/problem.py:171 +#: judge/admin/profile.py:78 +msgid "View on site" +msgstr "Sur le site" + +#: judge/admin/problem.py:28 +msgid "Describe the changes you made (optional)" +msgstr "Décrire les modifications apportées (optionnel)" + +#: judge/admin/problem.py:126 +msgid "Social Media" +msgstr "Médias Sociaux" + +#: judge/admin/problem.py:127 +msgid "Taxonomy" +msgstr "Taxonomie" + +#: judge/admin/problem.py:128 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:58 +msgid "Points" +msgstr "Points " + +#: judge/admin/problem.py:129 +msgid "Limits" +msgstr "Limites" + +#: judge/admin/problem.py:130 judge/admin/submission.py:232 +#: templates/stats/base.html:14 templates/submission/list.html:328 +msgid "Language" +msgstr "Langue" + +#: judge/admin/problem.py:132 +msgid "History" +msgstr "Histoire" + +#: judge/admin/problem.py:168 +msgid "Authors" +msgstr "Auteurs" + +#: judge/admin/problem.py:183 +#, 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:187 +msgid "Mark problems as public" +msgstr "Rendre ces problèmes publique" + +#: judge/admin/problem.py:193 +#, 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:197 +msgid "Mark problems as private" +msgstr "Marquer les problèmes comme privés" + +#: judge/admin/profile.py:32 +msgid "timezone" +msgstr "" + +#: judge/admin/profile.py:84 judge/admin/submission.py:211 +#: templates/organization/requests/log.html:9 +#: templates/organization/requests/pending.html:12 +#: templates/ticket/list.html:263 +msgid "User" +msgstr "Utilisateur" + +#: judge/admin/profile.py:89 templates/registration/registration_form.html:145 +msgid "Email" +msgstr "Courriel" + +#: judge/admin/profile.py:94 judge/views/register.py:29 +#: templates/registration/registration_form.html:173 +#: templates/user/edit-profile.html:99 +msgid "Timezone" +msgstr "Fuseau horaire" + +#: judge/admin/profile.py:99 +msgid "date joined" +msgstr "date d'adhésion" + +#: judge/admin/profile.py:106 +#, python-format +msgid "%d user have scores recalculated." +msgid_plural "%d users have scores recalculated." +msgstr[0] "" +msgstr[1] "" + +#: judge/admin/profile.py:109 +msgid "Recalculate scores" +msgstr "Recalculer les scores" + +#: judge/admin/runtime.py:19 +msgid "Disallowed problems" +msgstr "Problèmes non autorisés" + +#: judge/admin/runtime.py:22 +msgid "These problems are NOT allowed to be submitted in this language" +msgstr "Ces problèmes ne peuvent êtres soumis dans ce language" + +#: judge/admin/runtime.py:83 +msgid "Description" +msgstr "Description" + +#: judge/admin/runtime.py:84 +msgid "Information" +msgstr "Information" + +#: judge/admin/runtime.py:85 +msgid "Capabilities" +msgstr "Capacités" + +#: judge/admin/submission.py:23 judge/admin/submission.py:42 +#: judge/admin/submission.py:221 +msgid "None" +msgstr "Rien" + +#: judge/admin/submission.py:23 +msgid "Not done" +msgstr "Pas finit" + +#: judge/admin/submission.py:23 +msgid "Exceptional" +msgstr "Exceptionnel" + +#: judge/admin/submission.py:42 +msgid "Unaccepted" +msgstr "Non acceptés" + +#: judge/admin/submission.py:89 +#, python-format +msgctxt "contest problem" +msgid "%(problem)s in %(contest)s" +msgstr "" + +#: judge/admin/submission.py:167 +msgid "Rejudge the selected submissions" +msgstr "Resoumettre les soumissions sélectionnées" + +#: judge/admin/submission.py:193 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:196 +msgid "Rescore the selected submissions" +msgstr "" + +#: judge/admin/submission.py:200 +msgid "Problem code" +msgstr "Code de la problème" + +#: judge/admin/submission.py:205 +msgid "Problem name" +msgstr "Nom de la problème" + +#: judge/admin/submission.py:215 templates/organization/requests/log.html:10 +#: templates/organization/requests/pending.html:13 +msgid "Time" +msgstr "Temps" + +#: judge/admin/submission.py:223 +#, python-format +msgid "%d KB" +msgstr "%d Ko" + +#: judge/admin/submission.py:225 +#, python-format +msgid "%.2f MB" +msgstr "%.2f Mo" + +#: judge/admin/submission.py:227 +msgid "Memory" +msgstr "RAM" + +#: judge/admin/taxon.py:11 judge/admin/taxon.py:34 +msgid "Included problems" +msgstr "Problèmes inclus" + +#: judge/admin/taxon.py:14 +msgid "These problems are included in this group of problems" +msgstr "Ces problèmes sont inclus dans ce groupe de problèmes" + +#: judge/admin/taxon.py:37 +msgid "These problems are included in this type of problems" +msgstr "" + +#: judge/apps.py:8 +msgid "Online Judge" +msgstr "Juge en ligne" + +#: judge/comments.py:41 +msgid "Comment body" +msgstr "Corps du commentaire" + +#: judge/comments.py:47 judge/views/ticket.py:46 +msgid "Your part is silent, little toad." +msgstr "Votre partie est silencieux, petit crapaud." + +#: judge/comments.py:50 templates/comments/list.html:131 +msgid "You need to have solved at least one problem before your voice can be heard." +msgstr "Il faut résoudre un problème avant que tu ne puisse être entendu." + +#: judge/comments.py:92 +msgid "Posted comment" +msgstr "Commentaire posté" + +#: judge/contest_format/atcoder.py:19 +msgid "AtCoder" +msgstr "" + +#: judge/contest_format/default.py:18 +msgid "Default" +msgstr "" + +#: judge/contest_format/ecoo.py:19 +msgid "ECOO" +msgstr "" + +#: judge/contest_format/ioi.py:19 +msgid "IOI" +msgstr "" + +#: judge/forms.py:27 +msgid "Subscribe to contest updates" +msgstr "" + +#: judge/forms.py:28 +msgid "Enable experimental features" +msgstr "" + +#: judge/forms.py:57 judge/views/organization.py:127 +#, python-brace-format +msgid "You may not be part of more than {count} public organizations." +msgstr "" + +#: judge/forms.py:107 judge/views/register.py:26 +#: templates/registration/registration_form.html:139 +#: templates/user/base-users-table.html:5 +msgid "Username" +msgstr "Nom d'utilisateur" + +#: judge/forms.py:108 templates/registration/registration_form.html:151 +#: templates/registration/registration_form.html:165 +msgid "Password" +msgstr "Mot de passe " + +#: judge/forms.py:130 +msgid "Two Factor Authentication tokens must be 6 decimal digits." +msgstr "" + +#: judge/forms.py:139 templates/registration/totp_auth.html:32 +msgid "Invalid Two Factor Authentication token." +msgstr "" + +#: judge/forms.py:143 judge/models/problem.py:97 +msgid "Problem code must be ^[a-z0-9]+$" +msgstr "" + +#: judge/forms.py:148 +msgid "Problem with code already exists." +msgstr "" + +#: judge/forms.py:153 judge/models/contest.py:51 +msgid "Contest id must be ^[a-z0-9]+$" +msgstr "" + +#: judge/forms.py:158 +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:59 +msgid "Leave as LaTeX" +msgstr "" + +#: judge/models/choices.py:60 +msgid "SVG with PNG fallback" +msgstr "" + +#: judge/models/choices.py:61 +msgid "MathML only" +msgstr "MathML seulement" + +#: judge/models/choices.py:62 +msgid "MathJax with SVG/PNG fallback" +msgstr "" + +#: judge/models/choices.py:63 +msgid "Detect best quality" +msgstr "" + +#: judge/models/comment.py:25 +msgid "Page code must be ^[pcs]:[a-z0-9]+$|^b:\\d+$" +msgstr "" + +#: judge/models/comment.py:41 +msgid "commenter" +msgstr "" + +#: judge/models/comment.py:42 +msgid "posted time" +msgstr "" + +#: judge/models/comment.py:43 judge/models/comment.py:176 +msgid "associated page" +msgstr "" + +#: judge/models/comment.py:45 +msgid "votes" +msgstr "votes" + +#: judge/models/comment.py:46 +msgid "body of comment" +msgstr "" + +#: judge/models/comment.py:47 +msgid "hide the comment" +msgstr "" + +#: judge/models/comment.py:48 +msgid "parent" +msgstr "parent" + +#: judge/models/comment.py:53 +msgid "comment" +msgstr "commentaire" + +#: judge/models/comment.py:54 +msgid "comments" +msgstr "commentaires" + +#: judge/models/comment.py:136 judge/models/problem.py:406 +#, python-format +msgid "Editorial for %s" +msgstr "" + +#: judge/models/comment.py:171 +msgid "comment vote" +msgstr "" + +#: judge/models/comment.py:172 +msgid "comment votes" +msgstr "" + +#: judge/models/comment.py:181 +msgid "Override comment lock" +msgstr "" + +#: judge/models/contest.py:21 +msgid "Invalid colour." +msgstr "Couleur invalide." + +#: judge/models/contest.py:23 +msgid "tag name" +msgstr "" + +#: judge/models/contest.py:24 +msgid "Lowercase letters and hyphens only." +msgstr "Des lettres minuscules et des traits d’Union seulement." + +#: judge/models/contest.py:25 +msgid "tag colour" +msgstr "" + +#: judge/models/contest.py:26 +msgid "tag description" +msgstr "" + +#: judge/models/contest.py:45 +msgid "contest tag" +msgstr "" + +#: judge/models/contest.py:46 judge/models/contest.py:100 +msgid "contest tags" +msgstr "" + +#: judge/models/contest.py:50 +msgid "contest id" +msgstr "" + +#: judge/models/contest.py:52 +msgid "contest name" +msgstr "nom du concours" + +#: judge/models/contest.py:53 +msgid "These people will be able to edit the contest." +msgstr "" + +#: judge/models/contest.py:55 judge/models/runtime.py:124 +#: src/dmoj-wpadmin/test_project/apps/books/admin.py:20 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:27 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:27 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:27 +msgid "description" +msgstr "" + +#: judge/models/contest.py:56 judge/models/problem.py:353 +#: judge/models/runtime.py:126 +msgid "problems" +msgstr "problèmes" + +#: judge/models/contest.py:57 judge/models/contest.py:252 +msgid "start time" +msgstr "heure de début" + +#: judge/models/contest.py:58 +msgid "end time" +msgstr "heure de fin" + +#: judge/models/contest.py:59 judge/models/problem.py:118 +#: judge/models/problem.py:377 +msgid "time limit" +msgstr "limite de Temps" + +#: judge/models/contest.py:60 judge/models/problem.py:136 +msgid "publicly visible" +msgstr "visible publiquement" + +#: judge/models/contest.py:61 +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:64 +msgid "contest rated" +msgstr "" + +#: judge/models/contest.py:64 +msgid "Whether this contest can be rated." +msgstr "" + +#: judge/models/contest.py:66 +msgid "hide scoreboard" +msgstr "" + +#: judge/models/contest.py:67 +msgid "Whether the scoreboard should remain hidden for the duration of the contest." +msgstr "" + +#: judge/models/contest.py:70 +msgid "no comments" +msgstr "" + +#: judge/models/contest.py:71 +msgid "Use clarification system instead of comments." +msgstr "" + +#: judge/models/contest.py:73 +msgid "Rating floor for contest" +msgstr "" + +#: judge/models/contest.py:75 +msgid "Rating ceiling for contest" +msgstr "" + +#: judge/models/contest.py:77 +msgid "rate all" +msgstr "" + +#: judge/models/contest.py:77 +msgid "Rate all users who joined." +msgstr "" + +#: judge/models/contest.py:78 +msgid "exclude from ratings" +msgstr "" + +#: judge/models/contest.py:80 +msgid "private to specific users" +msgstr "" + +#: judge/models/contest.py:81 +msgid "private contestants" +msgstr "" + +#: judge/models/contest.py:82 +msgid "If private, only these users may see the contest" +msgstr "" + +#: judge/models/contest.py:84 +msgid "hide problem tags" +msgstr "" + +#: judge/models/contest.py:85 +msgid "Whether problem tags should be hidden by default." +msgstr "" + +#: judge/models/contest.py:87 +msgid "run pretests only" +msgstr "" + +#: judge/models/contest.py:88 +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:92 judge/models/problem.py:157 +msgid "private to organizations" +msgstr "" + +#: judge/models/contest.py:93 judge/models/problem.py:155 +#: judge/models/profile.py:76 +msgid "organizations" +msgstr "organisations" + +#: judge/models/contest.py:94 +msgid "If private, only these organizations may see the contest" +msgstr "" + +#: judge/models/contest.py:95 judge/models/problem.py:145 +msgid "OpenGraph image" +msgstr "" + +#: judge/models/contest.py:96 judge/models/profile.py:47 +msgid "Logo override image" +msgstr "" + +#: judge/models/contest.py:98 +msgid "This image will replace the default site logo for users inside the contest." +msgstr "" + +#: judge/models/contest.py:101 +msgid "the amount of live participants" +msgstr "" + +#: judge/models/contest.py:102 +msgid "contest summary" +msgstr "" + +#: judge/models/contest.py:103 judge/models/problem.py:147 +msgid "Plain-text, shown in meta description tag, e.g. for social media." +msgstr "" + +#: judge/models/contest.py:104 judge/models/profile.py:46 +msgid "access code" +msgstr "" + +#: judge/models/contest.py:105 +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:107 judge/models/problem.py:141 +msgid "personae non gratae" +msgstr "" + +#: judge/models/contest.py:108 +msgid "Bans the selected users from joining this contest." +msgstr "" + +#: judge/models/contest.py:109 +msgid "contest format" +msgstr "" + +#: judge/models/contest.py:110 +msgid "The contest format module to use." +msgstr "" + +#: judge/models/contest.py:111 +msgid "contest format configuration" +msgstr "" + +#: judge/models/contest.py:112 +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:233 +msgid "See private contests" +msgstr "" + +#: judge/models/contest.py:234 +msgid "Edit own contests" +msgstr "" + +#: judge/models/contest.py:235 +msgid "Edit all contests" +msgstr "" + +#: judge/models/contest.py:236 +msgid "Clone contest" +msgstr "" + +#: judge/models/contest.py:237 templates/contest/moss.html:74 +msgid "MOSS contest" +msgstr "" + +#: judge/models/contest.py:238 +msgid "Rate contests" +msgstr "" + +#: judge/models/contest.py:239 +msgid "Contest access codes" +msgstr "" + +#: judge/models/contest.py:240 +msgid "Create private contests" +msgstr "" + +#: judge/models/contest.py:242 judge/models/contest.py:320 +#: judge/models/contest.py:356 judge/models/contest.py:378 +#: judge/models/submission.py:83 +msgid "contest" +msgstr "concours" + +#: judge/models/contest.py:243 +msgid "contests" +msgstr "concours" + +#: judge/models/contest.py:250 +msgid "associated contest" +msgstr "" + +#: judge/models/contest.py:253 +msgid "score" +msgstr "score" + +#: judge/models/contest.py:254 +msgid "cumulative time" +msgstr "" + +#: judge/models/contest.py:255 +msgid "virtual participation id" +msgstr "" + +#: judge/models/contest.py:256 +msgid "0 means non-virtual, otherwise the n-th virtual participation" +msgstr "" + +#: judge/models/contest.py:257 +msgid "contest format specific data" +msgstr "" + +#: judge/models/contest.py:306 +#, python-format +msgid "%s spectating in %s" +msgstr "" + +#: judge/models/contest.py:308 +#, python-format +msgid "%s in %s, v%d" +msgstr "" + +#: judge/models/contest.py:309 +#, python-format +msgid "%s in %s" +msgstr "" + +#: judge/models/contest.py:312 +msgid "contest participation" +msgstr "" + +#: judge/models/contest.py:313 +msgid "contest participations" +msgstr "" + +#: judge/models/contest.py:319 judge/models/contest.py:340 +#: judge/models/contest.py:379 judge/models/problem.py:352 +#: judge/models/problem.py:357 judge/models/problem.py:375 +#: judge/models/problem_data.py:35 +msgid "problem" +msgstr "problème" + +#: judge/models/contest.py:321 judge/models/contest.py:344 +#: judge/models/problem.py:129 +msgid "points" +msgstr "points" + +#: judge/models/contest.py:322 +msgid "partial" +msgstr "partiel" + +#: judge/models/contest.py:323 judge/models/contest.py:345 +msgid "is pretested" +msgstr "" + +#: judge/models/contest.py:324 judge/models/interface.py:43 +msgid "order" +msgstr "" + +#: judge/models/contest.py:325 +msgid "output prefix length override" +msgstr "" + +#: judge/models/contest.py:326 +msgid "Maximum number of submissions for this problem, or 0 for no limit." +msgstr "" + +#: judge/models/contest.py:328 +msgid "Why include a problem you can't submit to?" +msgstr "" + +#: judge/models/contest.py:333 +msgid "contest problem" +msgstr "" + +#: judge/models/contest.py:334 +msgid "contest problems" +msgstr "" + +#: judge/models/contest.py:338 judge/models/submission.py:181 +msgid "submission" +msgstr "soumission" + +#: judge/models/contest.py:342 judge/models/contest.py:357 +msgid "participation" +msgstr "" + +#: judge/models/contest.py:346 +msgid "Whether this submission was ran only on pretests." +msgstr "" + +#: judge/models/contest.py:350 +msgid "contest submission" +msgstr "" + +#: judge/models/contest.py:351 +msgid "contest submissions" +msgstr "" + +#: judge/models/contest.py:359 +msgid "rank" +msgstr "" + +#: judge/models/contest.py:360 +msgid "rating" +msgstr "évaluation" + +#: judge/models/contest.py:361 +msgid "volatility" +msgstr "" + +#: judge/models/contest.py:362 +msgid "last rated" +msgstr "" + +#: judge/models/contest.py:366 +msgid "contest rating" +msgstr "" + +#: judge/models/contest.py:367 +msgid "contest ratings" +msgstr "" + +#: judge/models/contest.py:386 +msgid "contest moss result" +msgstr "" + +#: judge/models/contest.py:387 +msgid "contest moss results" +msgstr "" + +#: judge/models/interface.py:24 +msgid "configuration item" +msgstr "" + +#: judge/models/interface.py:25 +msgid "miscellaneous configuration" +msgstr "" + +#: judge/models/interface.py:37 +msgid "navigation item" +msgstr "" + +#: judge/models/interface.py:38 +msgid "navigation bar" +msgstr "" + +#: judge/models/interface.py:44 +msgid "identifier" +msgstr "" + +#: judge/models/interface.py:45 +msgid "label" +msgstr "" + +#: judge/models/interface.py:47 +msgid "highlight regex" +msgstr "" + +#: judge/models/interface.py:48 +msgid "parent item" +msgstr "" + +#: judge/models/interface.py:66 +msgid "post title" +msgstr "" + +#: judge/models/interface.py:67 judge/models/problem.py:395 +msgid "authors" +msgstr "auteurs" + +#: judge/models/interface.py:68 +msgid "slug" +msgstr "" + +#: judge/models/interface.py:69 judge/models/problem.py:393 +msgid "public visibility" +msgstr "" + +#: judge/models/interface.py:70 +msgid "sticky" +msgstr "" + +#: judge/models/interface.py:71 +msgid "publish after" +msgstr "" + +#: judge/models/interface.py:72 +msgid "post content" +msgstr "" + +#: judge/models/interface.py:73 +msgid "post summary" +msgstr "" + +#: judge/models/interface.py:74 +msgid "openGraph image" +msgstr "" + +#: judge/models/interface.py:91 +msgid "Edit all posts" +msgstr "" + +#: judge/models/interface.py:93 +msgid "blog post" +msgstr "" + +#: judge/models/interface.py:94 +msgid "blog posts" +msgstr "" + +#: judge/models/message.py:11 +msgid "message title" +msgstr "" + +#: judge/models/message.py:12 judge/models/ticket.py:29 +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:26 +msgid "problem category ID" +msgstr "" + +#: judge/models/problem.py:27 +msgid "problem category name" +msgstr "" + +#: judge/models/problem.py:34 +msgid "problem type" +msgstr "type de problème" + +#: judge/models/problem.py:35 judge/models/problem.py:113 +msgid "problem types" +msgstr "" + +#: judge/models/problem.py:39 +msgid "problem group ID" +msgstr "" + +#: judge/models/problem.py:40 +msgid "problem group name" +msgstr "" + +#: judge/models/problem.py:47 judge/models/problem.py:116 +msgid "problem group" +msgstr "" + +#: judge/models/problem.py:48 +msgid "problem groups" +msgstr "" + +#: judge/models/problem.py:52 +msgid "key" +msgstr "clé" + +#: judge/models/problem.py:54 +msgid "link" +msgstr "" + +#: judge/models/problem.py:55 +msgid "full name" +msgstr "nom complet" + +#: judge/models/problem.py:56 judge/models/profile.py:32 +#: judge/models/runtime.py:23 +msgid "short name" +msgstr "" + +#: judge/models/problem.py:57 +msgid "Displayed on pages under this license" +msgstr "" + +#: judge/models/problem.py:58 +msgid "icon" +msgstr "" + +#: judge/models/problem.py:58 +msgid "URL to the icon" +msgstr "" + +#: judge/models/problem.py:59 +msgid "license text" +msgstr "" + +#: judge/models/problem.py:68 +msgid "license" +msgstr "licence" + +#: judge/models/problem.py:69 +msgid "licenses" +msgstr "licenses" + +#: judge/models/problem.py:96 +msgid "problem code" +msgstr "" + +#: judge/models/problem.py:98 +msgid "A short, unique code for the problem, used in the url after /problem/" +msgstr "" + +#: judge/models/problem.py:100 +msgid "problem name" +msgstr "" + +#: judge/models/problem.py:101 +msgid "The full name of the problem, as shown in the problem list." +msgstr "" + +#: judge/models/problem.py:103 +msgid "problem body" +msgstr "" + +#: judge/models/problem.py:104 +msgid "creators" +msgstr "" + +#: judge/models/problem.py:105 +msgid "These users will be able to edit the problem, and be listed as authors." +msgstr "" + +#: judge/models/problem.py:107 +msgid "curators" +msgstr "" + +#: judge/models/problem.py:108 +msgid "These users will be able to edit the problem, but not be listed as authors." +msgstr "" + +#: judge/models/problem.py:110 +msgid "testers" +msgstr "" + +#: judge/models/problem.py:112 +msgid "These users will be able to view the private problem, but not edit it." +msgstr "" + +#: judge/models/problem.py:114 +msgid "The type of problem, as shown on the problem's page." +msgstr "" + +#: judge/models/problem.py:117 +msgid "The group of problem, shown under Category in the problem list." +msgstr "" + +#: judge/models/problem.py:119 +msgid "The time limit for this problem, in seconds. Fractional seconds (e.g. 1.5) are supported." +msgstr "" + +#: judge/models/problem.py:123 judge/models/problem.py:380 +msgid "memory limit" +msgstr "limite de mémoire" + +#: judge/models/problem.py:124 +msgid "The memory limit for this problem, in kilobytes (e.g. 64mb = 65536 kilobytes)." +msgstr "" + +#: judge/models/problem.py:130 +msgid "Points awarded for problem completion. Points are displayed with a 'p' suffix if partial." +msgstr "" + +#: judge/models/problem.py:133 +msgid "allows partial points" +msgstr "" + +#: judge/models/problem.py:134 +msgid "allowed languages" +msgstr "langages autorisées" + +#: judge/models/problem.py:135 +msgid "List of allowed submission languages." +msgstr "" + +#: judge/models/problem.py:137 +msgid "manually managed" +msgstr "" + +#: judge/models/problem.py:138 +msgid "Whether judges should be allowed to manage data or not." +msgstr "" + +#: judge/models/problem.py:139 +msgid "date of publishing" +msgstr "" + +#: judge/models/problem.py:140 +msgid "Doesn't have magic ability to auto-publish due to backward compatibility" +msgstr "" + +#: judge/models/problem.py:142 +msgid "Bans the selected users from submitting to this problem." +msgstr "" + +#: judge/models/problem.py:144 +msgid "The license under which this problem is published." +msgstr "" + +#: judge/models/problem.py:146 +msgid "problem summary" +msgstr "" + +#: judge/models/problem.py:148 +msgid "number of users" +msgstr "" + +#: judge/models/problem.py:149 +msgid "The number of users who solved the problem." +msgstr "" + +#: judge/models/problem.py:150 +msgid "solve rate" +msgstr "" + +#: judge/models/problem.py:156 +msgid "If private, only these organizations may see the problem." +msgstr "" + +#: judge/models/problem.py:358 judge/models/problem.py:376 +#: judge/models/runtime.py:99 +msgid "language" +msgstr "langue" + +#: judge/models/problem.py:359 +msgid "translated name" +msgstr "" + +#: judge/models/problem.py:360 +msgid "translated description" +msgstr "" + +#: judge/models/problem.py:364 +msgid "problem translation" +msgstr "" + +#: judge/models/problem.py:365 +msgid "problem translations" +msgstr "" + +#: judge/models/problem.py:369 +msgid "clarified problem" +msgstr "" + +#: judge/models/problem.py:370 +msgid "clarification body" +msgstr "" + +#: judge/models/problem.py:371 +msgid "clarification timestamp" +msgstr "" + +#: judge/models/problem.py:386 +msgid "language-specific resource limit" +msgstr "limite de ressources spécifiques à un language" + +#: judge/models/problem.py:387 +msgid "language-specific resource limits" +msgstr "limites de ressources spécifiques à un language" + +#: judge/models/problem.py:391 +msgid "associated problem" +msgstr "" + +#: judge/models/problem.py:394 +msgid "publish date" +msgstr "" + +#: judge/models/problem.py:396 +msgid "editorial content" +msgstr "" + +#: judge/models/problem.py:412 +msgid "solution" +msgstr "solution" + +#: judge/models/problem.py:413 +msgid "solutions" +msgstr "solutions" + +#: judge/models/problem_data.py:23 +msgid "Standard" +msgstr "" + +#: judge/models/problem_data.py:24 +msgid "Floats" +msgstr "" + +#: judge/models/problem_data.py:25 +msgid "Floats (absolute)" +msgstr "" + +#: judge/models/problem_data.py:26 +msgid "Floats (relative)" +msgstr "" + +#: judge/models/problem_data.py:27 +msgid "Non-trailing spaces" +msgstr "" + +#: judge/models/problem_data.py:28 +msgid "Unordered" +msgstr "" + +#: judge/models/problem_data.py:29 +msgid "Byte identical" +msgstr "" + +#: 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:39 +msgid "generator file" +msgstr "" + +#: judge/models/problem_data.py:41 judge/models/problem_data.py:90 +msgid "output prefix length" +msgstr "" + +#: judge/models/problem_data.py:42 judge/models/problem_data.py:91 +msgid "output limit length" +msgstr "" + +#: judge/models/problem_data.py:43 +msgid "init.yml generation feedback" +msgstr "" + +#: judge/models/problem_data.py:44 judge/models/problem_data.py:92 +msgid "checker" +msgstr "" + +#: judge/models/problem_data.py:45 judge/models/problem_data.py:93 +msgid "checker arguments" +msgstr "" + +#: 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:77 +msgid "problem data set" +msgstr "" + +#: judge/models/problem_data.py:79 +msgid "case position" +msgstr "" + +#: judge/models/problem_data.py:80 +msgid "case type" +msgstr "" + +#: judge/models/problem_data.py:81 +msgid "Normal case" +msgstr "" + +#: judge/models/problem_data.py:82 +msgid "Batch start" +msgstr "" + +#: judge/models/problem_data.py:83 +msgid "Batch end" +msgstr "" + +#: judge/models/problem_data.py:85 +msgid "input file name" +msgstr "" + +#: judge/models/problem_data.py:86 +msgid "output file name" +msgstr "" + +#: judge/models/problem_data.py:87 +msgid "generator arguments" +msgstr "" + +#: judge/models/problem_data.py:88 +msgid "point value" +msgstr "" + +#: judge/models/problem_data.py:89 +msgid "case is pretest?" +msgstr "" + +#: judge/models/profile.py:29 +msgid "organization title" +msgstr "" + +#: judge/models/profile.py:30 +msgid "organization slug" +msgstr "" + +#: judge/models/profile.py:31 +msgid "Organization name shown in URL" +msgstr "" + +#: judge/models/profile.py:33 +msgid "Displayed beside user name during contests" +msgstr "" + +#: judge/models/profile.py:34 +msgid "organization description" +msgstr "" + +#: judge/models/profile.py:35 +msgid "registrant" +msgstr "" + +#: judge/models/profile.py:36 +msgid "User who registered this organization" +msgstr "Utilisateur qui a enregistré cette organisation" + +#: judge/models/profile.py:37 +msgid "administrators" +msgstr "" + +#: judge/models/profile.py:38 +msgid "Those who can edit this organization" +msgstr "Ceux qui peuvent modifier cette organisation" + +#: judge/models/profile.py:39 +msgid "creation date" +msgstr "date de création" + +#: judge/models/profile.py:40 +msgid "is open organization?" +msgstr "" + +#: judge/models/profile.py:41 +msgid "Allow joining organization" +msgstr "Permettre de rejoindre l'Organisation" + +#: judge/models/profile.py:42 +msgid "maximum size" +msgstr "taille maximum" + +#: judge/models/profile.py:43 +msgid "Maximum amount of users in this organization, only applicable to private organizations" +msgstr "" + +#: judge/models/profile.py:45 +msgid "Student access code" +msgstr "" + +#: judge/models/profile.py:49 +msgid "This image will replace the default site logo for users viewing the organization." +msgstr "" + +#: judge/models/profile.py:75 judge/models/profile.py:91 +#: judge/models/profile.py:190 +msgid "organization" +msgstr "organisation" + +#: judge/models/profile.py:80 +msgid "user associated" +msgstr "" + +#: judge/models/profile.py:81 +msgid "self-description" +msgstr "" + +#: judge/models/profile.py:82 +msgid "location" +msgstr "" + +#: judge/models/profile.py:84 +msgid "preferred language" +msgstr "langage préféré" + +#: judge/models/profile.py:89 +msgid "last access time" +msgstr "" + +#: judge/models/profile.py:90 +msgid "last IP" +msgstr "" + +#: judge/models/profile.py:93 +msgid "display rank" +msgstr "" + +#: judge/models/profile.py:95 +msgid "comment mute" +msgstr "" + +#: judge/models/profile.py:95 +msgid "Some users are at their best when silent." +msgstr "" + +#: judge/models/profile.py:97 +msgid "unlisted user" +msgstr "" + +#: judge/models/profile.py:97 +msgid "User will not be ranked." +msgstr "" + +#: judge/models/profile.py:100 +msgid "user script" +msgstr "" + +#: judge/models/profile.py:101 +msgid "User-defined JavaScript for site customization." +msgstr "" + +#: judge/models/profile.py:102 +msgid "current contest" +msgstr "" + +#: judge/models/profile.py:104 +msgid "math engine" +msgstr "" + +#: judge/models/profile.py:106 +msgid "the rendering engine used to render math" +msgstr "" + +#: judge/models/profile.py:107 +msgid "2FA enabled" +msgstr "" + +#: judge/models/profile.py:108 +msgid "check to enable TOTP-based two factor authentication" +msgstr "" + +#: judge/models/profile.py:109 +msgid "TOTP key" +msgstr "" + +#: judge/models/profile.py:110 +msgid "32 character base32-encoded key for TOTP" +msgstr "" + +#: judge/models/profile.py:112 +msgid "TOTP key must be empty or base32" +msgstr "" + +#: judge/models/profile.py:113 +msgid "internal notes" +msgstr "" + +#: judge/models/profile.py:114 +msgid "Notes for administrators regarding this user." +msgstr "" + +#: judge/models/profile.py:184 +msgid "user profile" +msgstr "profil utilisateur" + +#: judge/models/profile.py:185 +msgid "user profiles" +msgstr "" + +#: judge/models/profile.py:192 +msgid "request time" +msgstr "" + +#: judge/models/profile.py:193 +msgid "state" +msgstr "" + +#: judge/models/profile.py:198 +msgid "reason" +msgstr "raison" + +#: judge/models/profile.py:201 +msgid "organization join request" +msgstr "" + +#: judge/models/profile.py:202 +msgid "organization join requests" +msgstr "" + +#: judge/models/runtime.py:18 +msgid "short identifier" +msgstr "" + +#: judge/models/runtime.py:19 +msgid "The identifier for this language; the same as its executor id for judges." +msgstr "" + +#: judge/models/runtime.py:21 +msgid "long name" +msgstr "" + +#: judge/models/runtime.py:22 +msgid "Longer name for the language, e.g. \"Python 2\" or \"C++11\"." +msgstr "" + +#: judge/models/runtime.py:24 +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:28 +msgid "common name" +msgstr "" + +#: judge/models/runtime.py:29 +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:31 +msgid "ace mode name" +msgstr "" + +#: judge/models/runtime.py:32 +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:34 +msgid "pygments name" +msgstr "" + +#: judge/models/runtime.py:35 +msgid "Language ID for Pygments highlighting in source windows." +msgstr "" + +#: judge/models/runtime.py:36 +msgid "code template" +msgstr "" + +#: judge/models/runtime.py:37 +msgid "Code template to display in submission editor." +msgstr "" + +#: judge/models/runtime.py:38 +msgid "runtime info override" +msgstr "" + +#: judge/models/runtime.py:39 +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:41 +msgid "language description" +msgstr "" + +#: judge/models/runtime.py:42 +msgid "Use field this to inform users of quirks with your environment, additional restrictions, etc." +msgstr "" + +#: judge/models/runtime.py:44 +msgid "extension" +msgstr "" + +#: judge/models/runtime.py:45 +msgid "The extension of source files, e.g., \"py\" or \"cpp\"." +msgstr "L'extension des fichiers sources, par exemple \"py\" ou \"cpp\"." + +#: judge/models/runtime.py:100 +msgid "languages" +msgstr "langues" + +#: judge/models/runtime.py:104 +msgid "language to which this runtime belongs" +msgstr "" + +#: judge/models/runtime.py:105 +msgid "judge on which this runtime exists" +msgstr "" + +#: judge/models/runtime.py:106 +msgid "runtime name" +msgstr "" + +#: judge/models/runtime.py:107 +msgid "runtime version" +msgstr "" + +#: judge/models/runtime.py:108 +msgid "order in which to display this runtime" +msgstr "" + +#: judge/models/runtime.py:112 +msgid "Server name, hostname-style" +msgstr "" + +#: judge/models/runtime.py:113 +msgid "time of creation" +msgstr "moment de création" + +#: judge/models/runtime.py:114 +msgid "A key to authenticated this judge" +msgstr "" + +#: judge/models/runtime.py:115 +msgid "authentication key" +msgstr "" + +#: judge/models/runtime.py:116 +msgid "block judge" +msgstr "" + +#: judge/models/runtime.py:117 +msgid "Whether this judge should be blocked from connecting, even if its key is correct." +msgstr "" + +#: judge/models/runtime.py:119 +msgid "judge online status" +msgstr "" + +#: judge/models/runtime.py:120 +msgid "judge start time" +msgstr "" + +#: judge/models/runtime.py:121 +msgid "response time" +msgstr "" + +#: judge/models/runtime.py:122 +msgid "system load" +msgstr "" + +#: judge/models/runtime.py:123 +msgid "Load for the last minute, divided by processors to be fair." +msgstr "" + +#: judge/models/runtime.py:127 judge/models/runtime.py:167 +msgid "judges" +msgstr "" + +#: judge/models/runtime.py:166 +msgid "judge" +msgstr "" + +#: judge/models/submission.py:20 judge/models/submission.py:47 +#: judge/utils/problems.py:86 +msgid "Accepted" +msgstr "Accepté" + +#: judge/models/submission.py:21 judge/models/submission.py:48 +msgid "Wrong Answer" +msgstr "Mauvaise réponse" + +#: judge/models/submission.py:22 judge/models/submission.py:50 +msgid "Time Limit Exceeded" +msgstr "Limite temps dépassée" + +#: judge/models/submission.py:23 judge/models/submission.py:51 +msgid "Memory Limit Exceeded" +msgstr "Limite mémoire dépassée" + +#: judge/models/submission.py:24 judge/models/submission.py:52 +msgid "Output Limit Exceeded" +msgstr "" + +#: judge/models/submission.py:25 judge/models/submission.py:53 +msgid "Invalid Return" +msgstr "Retour invalide" + +#: judge/models/submission.py:26 judge/models/submission.py:54 +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:88 +msgid "Compile Error" +msgstr "Erreur de compilation" + +#: judge/models/submission.py:28 judge/models/submission.py:40 +msgid "Internal Error" +msgstr "Erreur interne" + +#: judge/models/submission.py:29 +msgid "Short circuit" +msgstr "Court circuit" + +#: judge/models/submission.py:30 judge/models/submission.py:42 +#: judge/models/submission.py:61 +msgid "Aborted" +msgstr "Abandonné" + +#: judge/models/submission.py:36 judge/models/submission.py:57 +msgid "Queued" +msgstr "En file d'attente" + +#: judge/models/submission.py:37 judge/models/submission.py:58 +msgid "Processing" +msgstr "En cours de traitement" + +#: judge/models/submission.py:38 judge/models/submission.py:59 +msgid "Grading" +msgstr "En cours de notation" + +#: judge/models/submission.py:39 judge/models/submission.py:60 +msgid "Completed" +msgstr "Terminé" + +#: judge/models/submission.py:56 +msgid "Internal Error (judging server error)" +msgstr "" + +#: judge/models/submission.py:66 +msgid "submission time" +msgstr "" + +#: judge/models/submission.py:67 judge/models/submission.py:201 +msgid "execution time" +msgstr "" + +#: judge/models/submission.py:68 judge/models/submission.py:202 +msgid "memory usage" +msgstr "" + +#: judge/models/submission.py:69 judge/models/submission.py:203 +msgid "points granted" +msgstr "" + +#: judge/models/submission.py:70 +msgid "submission language" +msgstr "" + +#: judge/models/submission.py:71 +msgid "status" +msgstr "" + +#: judge/models/submission.py:72 +msgid "result" +msgstr "" + +#: judge/models/submission.py:74 +msgid "compile errors" +msgstr "" + +#: judge/models/submission.py:76 +msgid "batched cases" +msgstr "" + +#: judge/models/submission.py:77 +msgid "test case points" +msgstr "" + +#: judge/models/submission.py:78 +msgid "test case total points" +msgstr "" + +#: judge/models/submission.py:79 +msgid "judged on" +msgstr "" + +#: judge/models/submission.py:81 +msgid "was rejudged by admin" +msgstr "" + +#: judge/models/submission.py:82 +msgid "was ran on pretests only" +msgstr "" + +#: judge/models/submission.py:182 templates/contest/moss.html:58 +msgid "submissions" +msgstr "soumissions" + +#: judge/models/submission.py:186 judge/models/submission.py:197 +msgid "associated submission" +msgstr "" + +#: judge/models/submission.py:188 +msgid "source code" +msgstr "" + +#: judge/models/submission.py:199 +msgid "test case ID" +msgstr "" + +#: judge/models/submission.py:200 +msgid "status flag" +msgstr "" + +#: judge/models/submission.py:204 +msgid "points possible" +msgstr "" + +#: judge/models/submission.py:205 +msgid "batch number" +msgstr "" + +#: judge/models/submission.py:206 +msgid "judging feedback" +msgstr "" + +#: judge/models/submission.py:207 +msgid "extended judging feedback" +msgstr "" + +#: judge/models/submission.py:208 +msgid "program output" +msgstr "" + +#: judge/models/submission.py:216 +msgid "submission test case" +msgstr "" + +#: judge/models/submission.py:217 +msgid "submission test cases" +msgstr "" + +#: judge/models/ticket.py:10 +msgid "ticket title" +msgstr "" + +#: judge/models/ticket.py:11 +msgid "ticket creator" +msgstr "" + +#: judge/models/ticket.py:13 +msgid "creation time" +msgstr "" + +#: judge/models/ticket.py:14 +msgid "assignees" +msgstr "" + +#: judge/models/ticket.py:15 +msgid "quick notes" +msgstr "" + +#: judge/models/ticket.py:16 +msgid "Staff notes for this issue to aid in processing." +msgstr "" + +#: judge/models/ticket.py:17 +msgid "linked item type" +msgstr "" + +#: judge/models/ticket.py:19 +msgid "linked item ID" +msgstr "" + +#: judge/models/ticket.py:21 +msgid "is ticket open?" +msgstr "" + +#: judge/models/ticket.py:25 +msgid "ticket" +msgstr "" + +#: judge/models/ticket.py:27 +msgid "poster" +msgstr "" + +#: judge/models/ticket.py:30 +msgid "message time" +msgstr "" + +#: judge/pdf_problems.py:134 judge/pdf_problems.py:186 +#: judge/pdf_problems.py:246 +msgid "Page [page] of [topage]" +msgstr "" + +#: judge/tasks/moss.py:25 +msgid "Running MOSS" +msgstr "" + +#: judge/tasks/submission.py:43 +msgid "Modifying submissions" +msgstr "" + +#: judge/tasks/submission.py:56 +msgid "Recalculating user points" +msgstr "" + +#: judge/utils/problem_data.py:63 +msgid "Empty batches not allowed." +msgstr "" + +#: 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 +#, python-format +msgid "Input file for case %d does not exist: %s" +msgstr "" + +#: 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 +#, python-format +msgid "Batch start case #%d requires points." +msgstr "" + +#: 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 +msgid "How did you corrupt the zip path?" +msgstr "" + +#: judge/utils/problem_data.py:160 +msgid "How did you corrupt the generator path?" +msgstr "" + +#: judge/utils/problems.py:76 +msgid "Can't pass both queryset and keyword filters" +msgstr "" + +#: judge/utils/problems.py:87 +msgid "Wrong" +msgstr "" + +#: judge/utils/problems.py:89 +msgid "Timeout" +msgstr "" + +#: judge/utils/problems.py:90 +msgid "Error" +msgstr "" + +#: 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/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:38 +#, python-format +msgid "Page %d of Posts" +msgstr "" + +#: judge/views/comment.py:27 +msgid "Messing around, are we?" +msgstr "" + +#: judge/views/comment.py:36 +msgid "You must solve at least one problem before you can vote." +msgstr "" + +#: judge/views/comment.py:63 +msgid "You already voted." +msgstr "" + +#: judge/views/comment.py:120 judge/views/organization.py:299 +msgid "Edited from site" +msgstr "" + +#: judge/views/comment.py:141 +msgid "Editing comment" +msgstr "" + +#: judge/views/contests.py:49 judge/views/contests.py:211 +#: judge/views/contests.py:214 judge/views/contests.py:385 +msgid "No such contest" +msgstr "" + +#: judge/views/contests.py:50 judge/views/contests.py:212 +#, python-format +msgid "Could not find a contest with the key \"%s\"." +msgstr "" + +#: judge/views/contests.py:75 +msgid "Contests" +msgstr "Concours" + +#: judge/views/contests.py:215 +msgid "Could not find such contest." +msgstr "" + +#: judge/views/contests.py:218 +#, python-format +msgid "Access to contest \"%s\" denied" +msgstr "" + +#: judge/views/contests.py:242 +msgid "Clone Contest" +msgstr "" + +#: judge/views/contests.py:305 +msgid "Contest not ongoing" +msgstr "" + +#: judge/views/contests.py:306 +#, python-format +msgid "\"%s\" is not currently ongoing." +msgstr "" + +#: judge/views/contests.py:310 +msgid "Already in contest" +msgstr "" + +#: judge/views/contests.py:311 +#, python-format +msgid "You are already in a contest: \"%s\"." +msgstr "" + +#: judge/views/contests.py:314 +msgid "Banned from joining" +msgstr "" + +#: judge/views/contests.py:315 +msgid "You have been declared persona non grata for this contest. You are permanently barred from joining this contest." +msgstr "" + +#: judge/views/contests.py:375 +#, python-format +msgid "Enter access code for \"%s\"" +msgstr "" + +#: judge/views/contests.py:386 +#, python-format +msgid "You are not in contest \"%s\"." +msgstr "" + +#: judge/views/contests.py:405 +msgid "ContestCalendar requires integer year and month" +msgstr "" + +#: judge/views/contests.py:445 +#, python-format +msgid "Contests in %(month)s" +msgstr "" + +#: judge/views/contests.py:445 +msgid "F Y" +msgstr "" + +#: judge/views/contests.py:531 +msgid "???" +msgstr "" + +#: judge/views/contests.py:594 +#, python-format +msgid "%s Rankings" +msgstr "" + +#: judge/views/contests.py:610 +#, python-format +msgid "Your participation in %s" +msgstr "" + +#: judge/views/contests.py:611 +#, python-format +msgid "%s's participation in %s" +msgstr "" + +#: judge/views/contests.py:615 +msgid "Live" +msgstr "" + +#: judge/views/contests.py:627 templates/contest/contest-tabs.html:13 +msgid "Participation" +msgstr "" + +#: judge/views/contests.py:654 +#, python-format +msgid "%s MOSS Results" +msgstr "" + +#: judge/views/contests.py:681 +#, python-format +msgid "Running MOSS for %s..." +msgstr "" + +#: judge/views/contests.py:704 +#, python-format +msgid "Contest tag: %s" +msgstr "" + +#: judge/views/error.py:14 +msgid "404 error" +msgstr "Erreur 404" + +#: judge/views/error.py:15 +#, python-format +msgid "Could not find page \"%s\"" +msgstr "" + +#: judge/views/error.py:22 +#, python-format +msgid "no permission for %s" +msgstr "" + +#: 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 +msgid "Runtimes" +msgstr "" + +#: judge/views/organization.py:44 judge/views/organization.py:47 +msgid "No such organization" +msgstr "" + +#: judge/views/organization.py:45 +#, python-format +msgid "Could not find an organization with the key \"%s\"." +msgstr "" + +#: judge/views/organization.py:48 +msgid "Could not find such organization." +msgstr "" + +#: judge/views/organization.py:72 judge/views/register.py:34 +#: templates/organization/list.html:15 templates/user/user-list-tabs.html:5 +msgid "Organizations" +msgstr "" + +#: judge/views/organization.py:93 +#, python-format +msgid "%s Members" +msgstr "" + +#: judge/views/organization.py:118 judge/views/organization.py:121 +#: judge/views/organization.py:126 +msgid "Joining organization" +msgstr "" + +#: judge/views/organization.py:118 +msgid "You are already in the organization." +msgstr "" + +#: judge/views/organization.py:121 +msgid "This organization is not open." +msgstr "" + +#: judge/views/organization.py:138 +msgid "Leaving organization" +msgstr "" + +#: judge/views/organization.py:138 +#, python-format +msgid "You are not in \"%s\"." +msgstr "" + +#: judge/views/organization.py:162 +#, python-format +msgid "Request to join %s" +msgstr "" + +#: judge/views/organization.py:180 +msgid "Join request detail" +msgstr "" + +#: judge/views/organization.py:209 +#, python-format +msgid "Managing join requests for %s" +msgstr "" + +#: judge/views/organization.py:240 +#, python-format +msgid "Your organization can only receive %d more members. You cannot approve %d users." +msgstr "" + +#: judge/views/organization.py:252 +#, python-format +msgid "Approved %d user." +msgid_plural "Approved %d users." +msgstr[0] "" +msgstr[1] "" + +#: judge/views/organization.py:253 +#, python-format +msgid "Rejected %d user." +msgid_plural "Rejected %d users." +msgstr[0] "" +msgstr[1] "" + +#: judge/views/organization.py:283 +#, python-format +msgid "Editing %s" +msgstr "" + +#: judge/views/organization.py:307 judge/views/organization.py:315 +msgid "Can't edit organization" +msgstr "" + +#: judge/views/organization.py:308 +msgid "You are not allowed to edit this organization." +msgstr "" + +#: judge/views/organization.py:316 +msgid "You are not allowed to kick people from this organization." +msgstr "" + +#: judge/views/organization.py:321 judge/views/organization.py:325 +msgid "Can't kick user" +msgstr "" + +#: judge/views/organization.py:322 +msgid "The user you are trying to kick does not exist!" +msgstr "" + +#: judge/views/organization.py:326 +#, python-format +msgid "The user you are trying to kick is not in organization: %s." +msgstr "" + +#: judge/views/problem.py:68 +msgid "No such problem" +msgstr "" + +#: judge/views/problem.py:69 +#, python-format +msgid "Could not find a problem with the code \"%s\"." +msgstr "" + +#: judge/views/problem.py:111 +#, python-brace-format +msgid "Editorial for {0}" +msgstr "" + +#: judge/views/problem.py:114 +#, python-brace-format +msgid "Editorial for {0}" +msgstr "" + +#: judge/views/problem.py:285 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:546 +msgid "Banned from submitting" +msgstr "" + +#: judge/views/problem.py:547 +msgid "You have been declared persona non grata for this problem. You are permanently barred from submitting this problem." +msgstr "" + +#: judge/views/problem.py:560 +msgid "Too many submissions" +msgstr "" + +#: judge/views/problem.py:561 +msgid "You have exceeded the submission limit for this problem." +msgstr "" + +#: judge/views/problem.py:627 judge/views/problem.py:630 +#, python-format +msgid "Submit to %(problem)s" +msgstr "" + +#: judge/views/problem.py:646 +msgid "Clone Problem" +msgstr "" + +#: judge/views/problem_data.py:37 +msgid "Checker arguments must be a JSON object" +msgstr "" + +#: judge/views/problem_data.py:39 +msgid "Checker arguments is invalid JSON" +msgstr "" + +#: judge/views/problem_data.py:46 +msgid "Your zip file is invalid!" +msgstr "" + +#: judge/views/problem_data.py:104 +#, python-brace-format +msgid "Comparing submissions for {0}" +msgstr "" + +#: judge/views/problem_data.py:107 +#, python-brace-format +msgid "Comparing submissions for {0}" +msgstr "" + +#: judge/views/problem_data.py:142 +#, python-brace-format +msgid "Editing data for {0}" +msgstr "" + +#: judge/views/problem_data.py:145 +#, python-format +msgid "Editing data for %s" +msgstr "" + +#: judge/views/problem_data.py:237 judge/views/problem_data.py:238 +#, python-format +msgid "Generated init.yml for %s" +msgstr "" + +#: 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:58 +#, python-format +msgid "Best solutions for %s" +msgstr "Les meilleures solutions pour %s" + +#: judge/views/ranked_submission.py:61 +#, python-brace-format +msgid "Best solutions for {0}" +msgstr "Les meilleures solutions pour {0}" + +#: judge/views/ranked_submission.py:71 +#, python-format +msgid "Best solutions for %(problem)s in %(contest)s" +msgstr "" + +#: judge/views/ranked_submission.py:74 +#, python-format +msgid "Best solutions for problem %(number)s in %(contest)s" +msgstr "" + +#: judge/views/ranked_submission.py:80 +#, python-brace-format +msgid "Best solutions for {0} in {2}" +msgstr "" + +#: judge/views/ranked_submission.py:83 +#, python-brace-format +msgid "Best solutions for problem {0} in {1}" +msgstr "" + +#: judge/views/register.py:27 +msgid "A username must contain letters, numbers, or underscores" +msgstr "" + +#: judge/views/register.py:31 templates/user/edit-profile.html:103 +msgid "Preferred language" +msgstr "Langue préférée" + +#: judge/views/register.py:38 +msgid "Subscribe to newsletter?" +msgstr "" + +#: judge/views/register.py:45 +#, 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 +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 +msgid "Registration" +msgstr "" + +#: judge/views/register.py:106 +msgid "Authentication failure" +msgstr "" + +#: judge/views/stats.py:105 +msgid "Language statistics" +msgstr "" + +#: judge/views/status.py:24 templates/submission/list.html:319 +msgid "Status" +msgstr "Etat" + +#: judge/views/status.py:108 +msgid "Version matrix" +msgstr "" + +#: judge/views/submission.py:59 judge/views/submission.py:66 +#, python-format +msgid "Submission of %(problem)s by %(user)s" +msgstr "" + +#: judge/views/submission.py:161 judge/views/submission.py:162 +#: templates/problem/problem.html:127 +msgid "All submissions" +msgstr "" + +#: judge/views/submission.py:303 +msgid "All my submissions" +msgstr "" + +#: judge/views/submission.py:304 +#, python-format +msgid "All submissions by %s" +msgstr "" + +#: judge/views/submission.py:335 +#, python-format +msgid "All submissions for %s" +msgstr "" + +#: judge/views/submission.py:354 +msgid "Must pass a problem" +msgstr "" + +#: judge/views/submission.py:397 +#, python-format +msgid "My submissions for %(problem)s" +msgstr "" + +#: judge/views/submission.py:398 +#, python-format +msgid "%(user)s's submissions for %(problem)s" +msgstr "" + +#: judge/views/submission.py:495 +msgid "Must pass a contest" +msgstr "" + +#: judge/views/submission.py:514 +#, python-brace-format +msgid "{0}'s submissions for {2} in {4}" +msgstr "" + +#: judge/views/submission.py:519 +#, 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 "" + +#: judge/views/ticket.py:40 +msgid "Issue description" +msgstr "" + +#: judge/views/ticket.py:85 judge/views/ticket.py:88 +#, python-format +msgid "New ticket for %s" +msgstr "" + +#: judge/views/ticket.py:139 +#, python-format +msgid "%(title)s - Ticket %(id)d" +msgstr "" + +#: judge/views/ticket.py:248 +#, python-format +msgid "Tickets - Page %(number)d of %(total)d" +msgstr "" + +#: judge/views/ticket.py:297 +#, python-format +msgid "New Ticket: %s" +msgstr "" + +#: judge/views/ticket.py:298 +#, python-format +msgid "#%(id)d, assigned to: %(users)s" +msgstr "" + +#: judge/views/ticket.py:300 +msgid ", " +msgstr "" + +#: judge/views/ticket.py:300 +msgid "no one" +msgstr "" + +#: judge/views/totp.py:42 templates/registration/totp_enable.html:86 +msgid "Enable Two Factor Authentication" +msgstr "" + +#: judge/views/totp.py:89 templates/registration/totp_disable.html:48 +msgid "Disable Two Factor Authentication" +msgstr "" + +#: judge/views/totp.py:103 +msgid "Perform Two Factor Authentication" +msgstr "" + +#: judge/views/user.py:68 +msgid "No such user" +msgstr "" + +#: judge/views/user.py:68 +#, python-format +msgid "No user handle \"%s\"." +msgstr "" + +#: judge/views/user.py:72 +msgid "My account" +msgstr "" + +#: judge/views/user.py:73 +#, python-format +msgid "User %s" +msgstr "" + +#: judge/views/user.py:136 +msgid "M j, Y, G:i" +msgstr "" + +#: judge/views/user.py:221 +msgid "Updated on site" +msgstr "" + +#: judge/views/user.py:253 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:10 +msgid "Edit profile" +msgstr "Modifier le profile" + +#: judge/views/user.py:262 templates/user/user-list-tabs.html:4 +msgid "Leaderboard" +msgstr "" + +#: judge/views/widgets.py:48 judge/views/widgets.py:58 +#, python-format +msgid "Invalid upstream data: %s" +msgstr "" + +#: judge/views/widgets.py:68 +msgid "Bad latitude or longitude" +msgstr "" + +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:13 +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:27 +msgid "Photo" +msgstr "" + +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:14 +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:28 +msgid "Photos" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:9 +msgid "first name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:10 +msgid "last name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:11 +msgid "biography" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/admin.py:24 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:30 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:30 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:30 +msgid "owner" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:12 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:12 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:12 +msgid "name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:19 +msgid "Category of Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:20 +msgid "Categories of Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:26 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:26 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:26 +msgid "title" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:28 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:28 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:28 +msgid "category" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:29 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:29 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:29 +msgid "author" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:31 +msgid "publication date" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:37 +msgid "Book" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:38 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:136 +msgid "Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:19 +msgid "Category of CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:20 +msgid "Categories of CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:36 +msgid "CD" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:37 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:141 +msgid "CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:19 +msgid "Category of DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:20 +msgid "Categories of DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:36 +msgid "DVD" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:37 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:146 +msgid "DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/templates/admin/base_site.html:7 +msgid "Django administration" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/forms.py:12 +#, python-format +msgid "Please enter the correct %(username)s and password for an admin account. Note that both fields may be case-sensitive." +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/forms.py:32 +#, python-format +msgid "Please enter the correct %(username)s and password for an user account. Note that both fields may be case-sensitive." +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:27 +msgid "Site" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:38 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:41 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:130 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:133 +msgid "Dashboard" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:48 +msgid "Applications" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:53 +msgid "Administration" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:64 +msgid "Color theme" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:66 +msgid "Change color theme" +msgstr "" + +#: 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 +msgid "Rate all ratable contests" +msgstr "" + +#: 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 "Voir les soumissions" + +#: 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 +msgid "Rejudge" +msgstr "" + +#: templates/base.html:214 +#, python-format +msgid "Hello, %(username)s." +msgstr "Bonjour, %(username)s." + +#: templates/base.html:220 templates/comments/list.html:89 +#: templates/contest/contest-list-tabs.html:24 +#: templates/problem/problem-list-tabs.html:6 +#: templates/submission/info-base.html:12 +#: templates/submission/submission-list-tabs.html:15 +msgid "Admin" +msgstr "Admin" + +#: templates/base.html:229 +msgid "Log out" +msgstr "Se déconnecter" + +#: templates/base.html:238 +#: templates/registration/password_reset_complete.html:4 +msgid "Log in" +msgstr "" + +#: templates/base.html:239 templates/registration/registration_form.html:177 +msgid "or" +msgstr "" + +#: templates/base.html:240 +msgid "Sign up" +msgstr "" + +#: templates/base.html:252 +msgid "spectating" +msgstr "" + +#: templates/base.html:265 +msgid "This site works best with JavaScript enabled." +msgstr "Ce site fonctionne mieux avec JavaScript activé." + +#: templates/blog/content.html:13 templates/comments/list.html:68 +#: templates/comments/list.html:83 templates/contest/contest-tabs.html:20 +#: 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 +msgid "Edit" +msgstr "Modifier" + +#: templates/blog/content.html:27 +#, python-format +msgid "\n" +" posted on %(time)s\n" +" " +msgstr "" + +#: templates/blog/dashboard.html:21 +#, python-format +msgid "\n" +" on %(time)s\n" +" " +msgstr "" + +#: templates/blog/list.html:85 +msgid "Blog" +msgstr "Blog" + +#: templates/blog/list.html:87 +msgid "Events" +msgstr "Evènements" + +#: templates/blog/list.html:92 +msgid "News" +msgstr "" + +#: templates/blog/list.html:106 +#, python-brace-format +msgid "posted on {time}" +msgstr "" + +#: templates/blog/list.html:130 templates/problem/problem.html:310 +msgid "Clarifications" +msgstr "" + +#: templates/blog/list.html:146 templates/problem/problem.html:321 +msgid "No clarifications have been made at this time." +msgstr "" + +#: templates/blog/list.html:154 +msgid "Ongoing contests" +msgstr "Concours en cours" + +#: templates/blog/list.html:172 +msgid "Upcoming contests" +msgstr "Concours à venir" + +#: templates/blog/list.html:189 +msgid "Comment stream" +msgstr "Flux de commentaire" + +#: templates/blog/list.html:208 +msgid "New problems" +msgstr "Nouveaux problèmes" + +#: templates/blog/list.html:225 +msgid "My open tickets" +msgstr "" + +#: templates/blog/list.html:246 +msgid "New tickets" +msgstr "" + +#: templates/comments/list.html:2 +msgid "Comments" +msgstr "Commentaires" + +#: templates/comments/list.html:18 templates/comments/list.html:27 +msgid "Please login to vote" +msgstr "" + +#: templates/comments/list.html:40 +#, python-brace-format +msgid "commented on {time}" +msgstr "" + +#: templates/comments/list.html:49 +#, python-format +msgid "edit %(edits)s" +msgstr "" + +#: templates/comments/list.html:51 templates/comments/media-js.html:77 +msgid "edited" +msgstr "" + +#: templates/comments/list.html:60 +msgid "Link" +msgstr "" + +#: templates/comments/list.html:73 templates/comments/list.html:80 +msgid "Reply" +msgstr "" + +#: templates/comments/list.html:86 +msgid "Hide" +msgstr "" + +#: templates/comments/list.html:101 +#, 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:120 +msgid "There are no comments at the moment." +msgstr "Il n'y a aucun commentaire pour le moment." + +#: templates/comments/list.html:126 +msgid "New comment" +msgstr "Commenter" + +#: templates/comments/list.html:140 +msgid "Invalid comment body." +msgstr "Corps de commentaire non valide." + +#: templates/comments/list.html:148 +msgid "Post!" +msgstr "" + +#: templates/comments/list.html:156 +msgid "Comments are disabled on this page." +msgstr "" + +#: templates/comments/media-js.html:72 +#, python-brace-format +msgid "edit {edits}" +msgstr "" + +#: templates/comments/media-js.html:75 +msgid "original" +msgstr "" + +#: templates/contest/access_code.html:26 +msgid "Invalid access code." +msgstr "" + +#: templates/contest/access_code.html:29 +msgid "Please enter your access code:" +msgstr "" + +#: templates/contest/access_code.html:32 +msgid "Join Contest" +msgstr "" + +#: templates/contest/calendar.html:12 +msgid "Sunday" +msgstr "Dimanche" + +#: templates/contest/calendar.html:13 +msgid "Monday" +msgstr "Lundi" + +#: templates/contest/calendar.html:14 +msgid "Tuesday" +msgstr "Mardi" + +#: templates/contest/calendar.html:15 +msgid "Wednesday" +msgstr "Mercredi" + +#: templates/contest/calendar.html:16 +msgid "Thursday" +msgstr "Jeudi" + +#: templates/contest/calendar.html:17 +msgid "Friday" +msgstr "Vendredi" + +#: templates/contest/calendar.html:18 +msgid "Saturday" +msgstr "Samedi" + +#: 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 "Prec" + +#: templates/contest/contest-list-tabs.html:10 +msgid "Today" +msgstr "" + +#: templates/contest/contest-list-tabs.html:13 +msgid "Next" +msgstr "Suiv" + +#: templates/contest/contest-list-tabs.html:21 +#: templates/problem/problem-list-tabs.html:5 +msgid "List" +msgstr "" + +#: templates/contest/contest-list-tabs.html:22 +msgid "Calendar" +msgstr "" + +#: templates/contest/contest-tabs.html:4 +msgid "Info" +msgstr "" + +#: templates/contest/contest-tabs.html:8 +msgid "Rankings" +msgstr "" + +#: templates/contest/contest-tabs.html:10 +msgid "Hidden Rankings" +msgstr "" + +#: templates/contest/contest-tabs.html:18 +msgid "MOSS" +msgstr "" + +#: templates/contest/contest-tabs.html:23 +msgid "Clone" +msgstr "" + +#: templates/contest/contest-tabs.html:34 +#: templates/contest/contest-tabs.html:54 +msgid "Leave contest" +msgstr "Quitter le concours" + +#: templates/contest/contest-tabs.html:41 templates/contest/list.html:293 +msgid "Virtual join" +msgstr "" + +#: templates/contest/contest-tabs.html:52 +msgid "Stop spectating" +msgstr "" + +#: templates/contest/contest-tabs.html:61 +msgid "Spectate contest" +msgstr "" + +#: templates/contest/contest-tabs.html:67 +#: templates/contest/contest-tabs.html:73 +msgid "Join contest" +msgstr "Joindre les concours" + +#: templates/contest/contest-tabs.html:82 +msgid "Login to participate" +msgstr "" + +#: templates/contest/contest.html:37 +msgid "Participating virtually." +msgstr "" + +#: templates/contest/contest.html:43 +msgid "Contest is over." +msgstr "Concours est terminé." + +#: templates/contest/contest.html:59 templates/contest/contest.html:63 +msgid "F j, Y, G:i T" +msgstr "" + +#: 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 +#, python-format +msgid "%(length)s long starting on %(start_time)s" +msgstr "" + +#: templates/contest/contest.html:85 +msgid "AC Rate" +msgstr "" + +#: templates/contest/contest.html:86 templates/contest/list.html:153 +#: templates/contest/list.html:195 templates/contest/list.html:271 +#: templates/problem/list.html:212 templates/problem/list.html:238 +msgid "Users" +msgstr "Utilisateurs" + +#: templates/contest/contest.html:111 +msgid "Editorial" +msgstr "" + +#: templates/contest/list.html:31 templates/contest/media-js.html:9 +msgid "Are you sure you want to join?" +msgstr "" + +#: 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:65 +msgid "hidden" +msgstr "" + +#: templates/contest/list.html:70 +msgid "private" +msgstr "" + +#: templates/contest/list.html:84 +msgid "rated" +msgstr "" + +#: templates/contest/list.html:132 +msgid "Spectate" +msgstr "" + +#: templates/contest/list.html:138 +msgid "Join" +msgstr "Joindre" + +#: templates/contest/list.html:148 +msgid "Active Contests" +msgstr "" + +#: templates/contest/list.html:152 templates/contest/list.html:194 +#: templates/contest/list.html:232 templates/contest/list.html:270 +msgid "Contest" +msgstr "Concours" + +#: templates/contest/list.html:190 +msgid "Ongoing Contests" +msgstr "Concours en cours" + +#: templates/contest/list.html:227 +msgid "Upcoming Contests" +msgstr "Concours à venir" + +#: templates/contest/list.html:255 +msgid "There are no scheduled contests at this time." +msgstr "Il n'y a aucun concours au futur à ce moment." + +#: templates/contest/list.html:261 +msgid "Past Contests" +msgstr "Concours de la passé" + +#: templates/contest/media-js.html:4 +msgid "Are you sure you want to leave?" +msgstr "" + +#: 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 +msgid "Joining a contest starts your timer, after which it becomes unstoppable." +msgstr "" + +#: 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:7 +msgid "Organization" +msgstr "Organisation " + +#: templates/contest/ranking-table.html:27 +#, python-brace-format +msgid "Started on {time}" +msgstr "" + +#: templates/contest/ranking-table.html:30 +msgid "Participation ended." +msgstr "" + +#: templates/contest/ranking.html:232 +msgid "View user participation" +msgstr "" + +#: templates/contest/ranking.html:236 +msgid "Show organizations" +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 +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 +msgid "activate" +msgstr "" + +#: 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 +msgid "Newsletter unsubscribe" +msgstr "" + +#: 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 +msgid "Do you want to unsubscribe from this newsletter?" +msgstr "" + +#: 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 +msgid "Newsletter update" +msgstr "" + +#: 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 +msgid "Update subscription" +msgstr "" + +#: templates/newsletter/subscription_update_activated.html:8 +msgid "Your subscription has successfully been updated." +msgstr "" + +#: 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:34 +#: templates/ticket/edit-notes.html:4 +msgid "Update" +msgstr "" + +#: 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:29 +msgid "Join organization" +msgstr "" + +#: templates/organization/home.html:33 +msgid "Request membership" +msgstr "" + +#: templates/organization/home.html:39 +msgid "Edit organization" +msgstr "" + +#: templates/organization/home.html:43 +msgid "View requests" +msgstr "" + +#: templates/organization/home.html:50 +msgid "Admin organization" +msgstr "" + +#: templates/organization/home.html:55 +msgid "View members" +msgstr "" + +#: templates/organization/list.html:23 templates/status/language-list.html:34 +msgid "Name" +msgstr "" + +#: templates/organization/list.html:24 +msgid "Members" +msgstr "Membres" + +#: templates/organization/new.html:10 templates/ticket/new.html:38 +msgid "Create" +msgstr "Créer" + +#: templates/organization/requests/detail.html:13 +msgid "User:" +msgstr "" + +#: templates/organization/requests/detail.html:17 +msgid "Organization:" +msgstr "" + +#: templates/organization/requests/detail.html:25 +msgid "Time:" +msgstr "Temps:" + +#: templates/organization/requests/detail.html:29 +msgid "Reason:" +msgstr "Motif :" + +#: templates/organization/requests/log.html:11 +#: templates/organization/requests/pending.html:14 +msgid "State" +msgstr "Etat" + +#: templates/organization/requests/log.html:12 +#: templates/organization/requests/pending.html:15 +msgid "Reason" +msgstr "Motif" + +#: 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:17 +#: templates/problem/data.html:401 +msgid "Delete?" +msgstr "Supprimer ?" + +#: templates/organization/requests/request.html:18 +msgid "Your reason for joining:" +msgstr "" + +#: templates/organization/requests/request.html:20 +msgid "Request" +msgstr "" + +#: templates/organization/requests/tabs.html:4 +msgid "Pending" +msgstr "En attente" + +#: templates/organization/requests/tabs.html:7 +msgid "Log" +msgstr "Journal" + +#: templates/organization/requests/tabs.html:10 +msgid "Approved" +msgstr "Approuvé" + +#: templates/organization/requests/tabs.html:13 +msgid "Rejected" +msgstr "Rejeté" + +#: templates/organization/users-table.html:15 +msgid "Kick" +msgstr "" + +#: templates/problem/clone.html:37 +msgid "Enter a new code for the cloned problem:" +msgstr "" + +#: templates/problem/data.html:353 +msgid "View YAML" +msgstr "" + +#: templates/problem/data.html:369 +msgid "Show columns:" +msgstr "" + +#: templates/problem/data.html:372 templates/problem/data.html:396 +msgid "Output prefix" +msgstr "" + +#: templates/problem/data.html:376 templates/problem/data.html:397 +msgid "Output limit" +msgstr "" + +#: templates/problem/data.html:380 templates/problem/data.html:398 +msgid "Checker" +msgstr "" + +#: templates/problem/data.html:384 templates/problem/data.html:399 +msgid "Generator args" +msgstr "" + +#: templates/problem/data.html:391 +msgid "Type" +msgstr "Genre" + +#: templates/problem/data.html:392 +msgid "Input file" +msgstr "" + +#: templates/problem/data.html:393 +msgid "Output file" +msgstr "" + +#: templates/problem/data.html:395 +msgid "Pretest?" +msgstr "" + +#: templates/problem/data.html:447 templates/problem/submit.html:252 +msgid "Submit!" +msgstr "" + +#: templates/problem/data.html:448 +msgid "Add new case" +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 editorialist.

Submitting an official solution before solving the problem yourself is a bannable offence." +msgstr "" + +#: templates/problem/list.html:62 +msgid "Filter by type..." +msgstr "" + +#: templates/problem/list.html:185 +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:57 +msgid "Category" +msgstr "" + +#: templates/problem/list.html:209 templates/problem/list.html:228 +msgid "Types" +msgstr "" + +#: templates/problem/list.html:235 +#, python-format +msgid "AC %%" +msgstr "" + +#: 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:142 +msgid "Filter by result:" +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 "Voir en PDF" + +#: templates/problem/problem.html:101 templates/problem/problem.html:111 +#: templates/problem/problem.html:116 +msgid "Submit solution" +msgstr "" + +#: 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:112 +msgid "0 submissions left" +msgstr "" + +#: templates/problem/problem.html:124 +msgid "My submissions" +msgstr "" + +#: templates/problem/problem.html:128 +msgid "Best submissions" +msgstr "" + +#: templates/problem/problem.html:132 +msgid "Read editorial" +msgstr "" + +#: templates/problem/problem.html:137 +msgid "Manage tickets" +msgstr "" + +#: templates/problem/problem.html:141 +msgid "Edit problem" +msgstr "" + +#: templates/problem/problem.html:143 +msgid "Edit test data" +msgstr "" + +#: templates/problem/problem.html:148 +msgid "My tickets" +msgstr "" + +#: templates/problem/problem.html:156 +msgid "Manage submissions" +msgstr "" + +#: templates/problem/problem.html:162 +msgid "Clone problem" +msgstr "" + +#: templates/problem/problem.html:169 +msgid "Points:" +msgstr "Points :" + +#: templates/problem/problem.html:172 templates/problem/problem.html:174 +msgid "(partial)" +msgstr "" + +#: templates/problem/problem.html:179 +msgid "Time limit:" +msgstr "" + +#: templates/problem/problem.html:191 +msgid "Memory limit:" +msgstr "" + +#: templates/problem/problem.html:210 +msgid "Author:" +msgid_plural "Authors:" +msgstr[0] "" +msgstr[1] "" + +#: templates/problem/problem.html:225 +msgid "Problem type" +msgid_plural "Problem types" +msgstr[0] "" +msgstr[1] "" + +#: templates/problem/problem.html:238 +msgid "Allowed languages" +msgstr "Languages autorisés" + +#: templates/problem/problem.html:246 +#, python-format +msgid "No %(lang)s judge online" +msgstr "" + +#: templates/problem/problem.html:257 +msgid "Judge:" +msgid_plural "Judges:" +msgstr[0] "" +msgstr[1] "" + +#: templates/problem/problem.html:274 +msgid "none available" +msgstr "" + +#: templates/problem/problem.html:299 +msgid "Request clarification" +msgstr "" + +#: templates/problem/problem.html:301 +msgid "Report an issue" +msgstr "" + +#: 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 +msgid "Search problems..." +msgstr "" + +#: templates/problem/search-form.html:14 +msgid "Full text search" +msgstr "" + +#: templates/problem/search-form.html:21 +msgid "Hide solved problems" +msgstr "" + +#: 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 +msgid "All" +msgstr "" + +#: templates/problem/search-form.html:46 +msgid "Problem types" +msgstr "" + +#: templates/problem/search-form.html:57 +msgid "Point range" +msgstr "" + +#: templates/problem/search-form.html:63 templates/submission/list.html:337 +#: templates/ticket/list.html:248 +msgid "Go" +msgstr "" + +#: templates/problem/search-form.html:64 +msgid "Random" +msgstr "" + +#: templates/problem/submit.html:192 +#, python-format +msgid "Warning! Your default language, %(default_language)s, is unavailable for this problem and has been deselected." +msgstr "" + +#: templates/problem/submit.html:203 +#, python-format +msgid "\n" +" You have %(left)s submission left\n" +" " +msgid_plural "\n" +" You have %(left)s submissions left\n" +" " +msgstr[0] "" +msgstr[1] "" + +#: templates/problem/submit.html:212 +msgid "You have 0 submissions left" +msgstr "" + +#: templates/problem/submit.html:250 +msgid "No judge is available for this problem." +msgstr "" + +#: templates/registration/activate.html:3 +#, python-format +msgid "%(key)s is an invalid activation key." +msgstr "" + +#: templates/registration/activation_complete.html:3 +msgid "Your account has been successfully activated." +msgstr "" + +#: templates/registration/login.html:43 +msgid "Invalid username or password." +msgstr "" + +#: templates/registration/login.html:61 +#: templates/registration/totp_auth.html:39 +msgid "Login!" +msgstr "" + +#: templates/registration/login.html:64 +msgid "Forgot your password?" +msgstr "Vous avez oublié votre mot de passe ?" + +#: templates/registration/login.html:67 +msgid "Or log in with..." +msgstr "" + +#: templates/registration/logout.html:3 +msgid "See you later!" +msgstr "" + +#: templates/registration/password_change_done.html:3 +msgid "Your password was sucessfully changed." +msgstr "" + +#: templates/registration/password_change_form.html:8 +msgid "Change Password" +msgstr "" + +#: templates/registration/password_reset.html:7 +msgid "Send Reset Email" +msgstr "" + +#: 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_confirm.html:9 +msgid "Reset Password" +msgstr "Réinitialiser le mot de passe" + +#: 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 +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 +#, 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 +msgid "Please go to the following page and choose a new password:" +msgstr "" + +#: templates/registration/password_reset_email.txt:7 +msgid "Your username, in case you've forgotten:" +msgstr "" + +#: templates/registration/password_reset_email.txt:9 +msgid "Thanks for using our site!" +msgstr "" + +#: templates/registration/password_reset_email.txt:11 +#, python-format +msgid "The %(site_name)s team" +msgstr "" + +#: 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 +msgid "Continue >" +msgstr "" + +#: 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:166 +msgid "(again, for confirmation)" +msgstr "" + +#: templates/registration/registration_form.html:173 +msgid "(select your closest major city)" +msgstr "" + +#: templates/registration/registration_form.html:178 +msgid "pick from map" +msgstr "" + +#: templates/registration/registration_form.html:183 +msgid "Default language" +msgstr "" + +#: templates/registration/registration_form.html:186 +#: templates/user/edit-profile.html:162 +msgid "Affiliated organizations" +msgstr "" + +#: templates/registration/registration_form.html:192 +#: templates/user/edit-profile.html:121 +msgid "Notify me about upcoming contests" +msgstr "" + +#: templates/registration/registration_form.html:206 +msgid "By registering, you agree to our" +msgstr "" + +#: templates/registration/registration_form.html:207 +msgid "Terms & Conditions" +msgstr "" + +#: templates/registration/registration_form.html:210 +msgid "Register!" +msgstr "" + +#: templates/registration/totp_auth.html:36 +#: templates/registration/totp_disable.html:45 +#: templates/registration/totp_enable.html:83 +msgid "Enter the 6-digit code generated by your app:" +msgstr "" + +#: templates/registration/totp_auth.html:41 +#, python-format +msgid "If you lost your authentication device, please contact us at %(email)s." +msgstr "" + +#: templates/registration/totp_disable.html:38 +msgid "To protect your account, you must first authenticate before you can disable Two Factor Authentication." +msgstr "" + +#: templates/registration/totp_enable.html:71 +msgid "Scan this code with your authenticator app:" +msgstr "" + +#: templates/registration/totp_enable.html:72 +msgid "QR code" +msgstr "" + +#: templates/registration/totp_enable.html:73 +msgid "Or enter this code manually:" +msgstr "" + +#: templates/stats/base.html:9 templates/submission/list.html:345 +msgid "Statistics" +msgstr "" + +#: templates/stats/language.html:11 +msgid "Submission Statistics" +msgstr "" + +#: templates/stats/language.html:16 +msgid "Submissions by Language" +msgstr "" + +#: templates/stats/language.html:21 +msgid "AC Submissions by Language" +msgstr "" + +#: templates/stats/language.html:26 +msgid "Language AC Rate" +msgstr "" + +#: templates/status/judge-status-table.html:2 +msgid "Judge" +msgstr "" + +#: templates/status/judge-status-table.html:4 +msgid "Online" +msgstr "Connecté" + +#: templates/status/judge-status-table.html:6 +msgid "Uptime" +msgstr "" + +#: templates/status/judge-status-table.html:7 +msgid "Ping" +msgstr "" + +#: templates/status/judge-status-table.html:8 +msgid "Load" +msgstr "Charge" + +#: 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 +msgid "There are no judges available at this time." +msgstr "" + +#: templates/status/language-list.html:33 templates/ticket/list.html:261 +msgid "ID" +msgstr "" + +#: templates/status/language-list.html:35 +msgid "Runtime Info" +msgstr "" + +#: templates/status/status-tabs.html:4 +msgid "Judges" +msgstr "" + +#: templates/status/status-tabs.html:6 +msgid "Version Matrix" +msgstr "" + +#: templates/submission/internal-error-message.html:8 +msgid "An internal error occurred while grading." +msgstr "" + +#: templates/submission/internal-error-message.html:15 +msgid "Error information" +msgstr "" + +#: templates/submission/list.html:76 +msgid "Filter by status..." +msgstr "" + +#: templates/submission/list.html:82 +msgid "Filter by language..." +msgstr "" + +#: templates/submission/list.html:315 +msgid "Filter submissions" +msgstr "" + +#: templates/submission/list.html:351 +msgid "Total:" +msgstr "" + +#: templates/submission/list.html:361 +msgid "You were disconnected. Refresh to show latest updates." +msgstr "" + +#: templates/submission/row.html:39 +#, python-format +msgid "Case #%(case)s" +msgstr "" + +#: templates/submission/row.html:49 +msgid "view" +msgstr "" + +#: templates/submission/row.html:53 +msgid "rejudge" +msgstr "" + +#: templates/submission/row.html:58 +msgid "admin" +msgstr "" + +#: templates/submission/source.html:25 +msgid "View status" +msgstr "" + +#: templates/submission/source.html:26 +msgid "View raw source" +msgstr "" + +#: templates/submission/source.html:28 templates/submission/status.html:61 +msgid "Resubmit" +msgstr "" + +#: 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 +msgid "Your submission is being processed..." +msgstr "" + +#: templates/submission/status-testcases.html:14 +msgid "Compilation Error" +msgstr "Erreur de compilation" + +#: templates/submission/status-testcases.html:18 +msgid "Compilation Warnings" +msgstr "" + +#: templates/submission/status-testcases.html:23 +msgid "Pretest Execution Results" +msgstr "" + +#: templates/submission/status-testcases.html:25 +msgid "Execution Results" +msgstr "" + +#: templates/submission/status-testcases.html:31 +msgid "Batch " +msgstr "" + +#: templates/submission/status-testcases.html:43 +msgid "Case" +msgstr "" + +#: templates/submission/status-testcases.html:45 +msgid "Pretest" +msgstr "" + +#: templates/submission/status-testcases.html:47 +msgid "Test case" +msgstr "Cas de test" + +#: templates/submission/status-testcases.html:79 +msgid "Your output (clipped)" +msgstr "Votre retour (abrégé)" + +#: templates/submission/status-testcases.html:90 +msgid "Judge feedback" +msgstr "" + +#: templates/submission/status-testcases.html:106 +msgid "Resources:" +msgstr "" + +#: templates/submission/status-testcases.html:115 +msgid "Final pretest score:" +msgstr "" + +#: templates/submission/status-testcases.html:117 +msgid "Final score:" +msgstr "Score final :" + +#: templates/submission/status-testcases.html:131 +msgid "Passing pretests does not guarantee a full score on system tests." +msgstr "" + +#: templates/submission/status-testcases.html:134 +msgid "Submission aborted!" +msgstr "Soumission abandonnée !" + +#: templates/submission/status.html:59 +msgid "View source" +msgstr "" + +#: templates/submission/status.html:88 +msgid "Abort" +msgstr "Interrompre" + +#: templates/submission/submission-list-tabs.html:6 +msgid "Mine" +msgstr "" + +#: templates/submission/submission-list-tabs.html:9 +msgid "Best" +msgstr "" + +#: templates/submission/submission-list-tabs.html:12 +#, python-format +msgid "%(user)s's" +msgstr "" + +#: templates/ticket/list.html:135 templates/ticket/ticket.html:257 +msgid "Reopened: " +msgstr "" + +#: templates/ticket/list.html:138 templates/ticket/ticket.html:258 +msgid "Closed: " +msgstr "" + +#: templates/ticket/list.html:221 +msgid "Use desktop notification" +msgstr "" + +#: templates/ticket/list.html:227 +msgid "Show my tickets only" +msgstr "" + +#: templates/ticket/list.html:231 +msgid "Filing user" +msgstr "" + +#: templates/ticket/list.html:240 +msgid "Assignee" +msgstr "" + +#: templates/ticket/list.html:262 +msgid "Title" +msgstr "" + +#: templates/ticket/list.html:264 templates/ticket/ticket.html:304 +msgid "Assignees" +msgstr "" + +#: templates/ticket/new_problem.html:7 +msgid "Thanks for opening a ticket!" +msgstr "" + +#: 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 +msgid "Associated object" +msgstr "" + +#: templates/ticket/ticket.html:309 +msgid "No one is assigned." +msgstr "" + +#: templates/ticket/ticket.html:315 +msgid "Close ticket" +msgstr "" + +#: templates/ticket/ticket.html:317 +msgid "Reopen ticket" +msgstr "" + +#: templates/ticket/ticket.html:321 +msgid "Assignee notes" +msgstr "" + +#: templates/ticket/ticket.html:328 templates/widgets/select_all.html:4 +msgid "Nothing here." +msgstr "Il n'y a rien ici." + +#: templates/ticket/ticket.html:378 +msgid "Post" +msgstr "" + +#: templates/user/base-users-table.html:3 +msgid "Rank" +msgstr "Classement" + +#: templates/user/base-users.html:14 templates/user/base-users.html:69 +msgid "Search by handle..." +msgstr "" + +#: templates/user/edit-profile.html:90 +msgid "Self-description" +msgstr "" + +#: templates/user/edit-profile.html:98 +msgid "Select your closest major city" +msgstr "" + +#: templates/user/edit-profile.html:107 +msgid "Editor theme" +msgstr "" + +#: templates/user/edit-profile.html:112 +msgid "Math engine" +msgstr "" + +#: templates/user/edit-profile.html:136 templates/user/edit-profile.html:137 +msgid "Change your avatar" +msgstr "Changer votre avatar" + +#: templates/user/edit-profile.html:143 +msgid "Change your password" +msgstr "" + +#: templates/user/edit-profile.html:150 +msgid "Two Factor Authentication is enabled." +msgstr "" + +#: templates/user/edit-profile.html:153 +msgid "Two Factor Authentication is disabled." +msgstr "" + +#: templates/user/edit-profile.html:170 +msgid "User-script" +msgstr "" + +#: templates/user/edit-profile.html:174 +msgid "Update profile" +msgstr "" + +#: templates/user/pp-row.html:22 +#, python-format +msgid "\n" +" weighted %(weight)s%%\n" +" " +msgstr "" + +#: templates/user/pp-row.html:27 +#, python-format +msgid "%(pp).1fpp" +msgstr "" + +#: templates/user/pp-row.html:29 +#, python-format +msgid "%(pp).0fpp" +msgstr "" + +#: templates/user/user-about.html:14 +msgid "From" +msgstr "" + +#: 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 "A propos" + +#: templates/user/user-about.html:40 +msgid "You have not shared any information." +msgstr "" + +#: templates/user/user-about.html:42 +msgid "This user has not shared any information." +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 "Classement par points :" + +#: templates/user/user-base.html:53 +msgid "Total points:" +msgstr "Total des points :" + +#: templates/user/user-base.html:68 +msgid "Rank by rating:" +msgstr "" + +#: templates/user/user-base.html:70 +msgid "Rating:" +msgstr "Classement :" + +#: templates/user/user-base.html:71 +msgid "Volatility:" +msgstr "" + +#: templates/user/user-base.html:72 +msgid "Min. rating:" +msgstr "" + +#: templates/user/user-base.html:73 +msgid "Max rating:" +msgstr "" + +#: templates/user/user-problems.html:35 +msgid "Points Breakdown" +msgstr "" + +#: templates/user/user-problems.html:41 +msgid "Load more..." +msgstr "" + +#: templates/user/user-problems.html:45 +msgid "This user has not yet solved any problems." +msgstr "" + +#: templates/user/user-problems.html:51 +msgid "Authored Problems" +msgstr "" + +#: templates/user/user-problems.html:83 +msgid "Hide problems I've solved" +msgstr "Cacher les problèmes que j'ai déjà résolus" + +#: templates/user/user-problems.html:93 +#, python-format +msgid "%(points).1f points" +msgstr "" + +#: templates/user/user-problems.html:99 +msgid "Score" +msgstr "" + +#: templates/user/user-problems.html:110 +#, python-format +msgid "%(points)s / %(total)s" +msgstr "" + +#: templates/user/user-tabs.html:7 +msgid "Impersonate" +msgstr "" + +#: templates/user/user-tabs.html:13 +msgid "Admin User" +msgstr "Administrateurs" + +#: templates/user/user-tabs.html:16 +msgid "Admin Profile" +msgstr "Profil d'Admin" + +#: templates/widgets/select_all.html:8 +msgid "Check all" +msgstr "Cocher tout" + diff --git a/locale/fr/LC_MESSAGES/djangojs.po b/locale/fr/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..c41af44 --- /dev/null +++ b/locale/fr/LC_MESSAGES/djangojs.po @@ -0,0 +1,30 @@ +msgid "" +msgstr "" +"Project-Id-Version: dmoj\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-10-01 23:12+0000\n" +"PO-Revision-Date: 2019-11-11 22:05\n" +"Last-Translator: Icyene\n" +"Language-Team: French\n" +"Language: fr_FR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: crowdin.com\n" +"X-Crowdin-Project: dmoj\n" +"X-Crowdin-Language: fr\n" +"X-Crowdin-File: djangojs.po\n" + +#: resources/common.js:207 +msgctxt "time format with day" +msgid "%d day %h:%m:%s" +msgid_plural "%d days %h:%m:%s" +msgstr[0] "%d jour %h:%m:%s" +msgstr[1] "%d jours %h:%m:%s" + +#: resources/common.js:210 +msgctxt "time format without day" +msgid "%h:%m:%s" +msgstr "%h:%m:%s" + diff --git a/locale/hr/LC_MESSAGES/django.po b/locale/hr/LC_MESSAGES/django.po new file mode 100644 index 0000000..c28f326 --- /dev/null +++ b/locale/hr/LC_MESSAGES/django.po @@ -0,0 +1,4553 @@ +msgid "" +msgstr "" +"Project-Id-Version: dmoj\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-11-11 21:54+0000\n" +"PO-Revision-Date: 2019-11-11 22:05\n" +"Last-Translator: Icyene\n" +"Language-Team: Croatian\n" +"Language: hr_HR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: crowdin.com\n" +"X-Crowdin-Project: dmoj\n" +"X-Crowdin-Language: hr\n" +"X-Crowdin-File: django.po\n" + +#: dmoj/settings.py:337 +msgid "German" +msgstr "Njemački" + +#: dmoj/settings.py:338 +msgid "English" +msgstr "Engleski" + +#: dmoj/settings.py:339 +msgid "Spanish" +msgstr "Španjolski" + +#: dmoj/settings.py:340 +msgid "French" +msgstr "Francuski" + +#: dmoj/settings.py:341 +msgid "Croatian" +msgstr "Hrvatski" + +#: dmoj/settings.py:342 +msgid "Hungarian" +msgstr "Mađarski" + +#: dmoj/settings.py:343 +msgid "Japanese" +msgstr "" + +#: dmoj/settings.py:344 +msgid "Korean" +msgstr "Korejski" + +#: dmoj/settings.py:345 +msgid "Brazilian Portuguese" +msgstr "" + +#: dmoj/settings.py:346 +msgid "Romanian" +msgstr "Rumunjski" + +#: dmoj/settings.py:347 +msgid "Russian" +msgstr "Ruski" + +#: dmoj/settings.py:348 +msgid "Serbian (Latin)" +msgstr "Srpski (Latinica)" + +#: dmoj/settings.py:349 +msgid "Turkish" +msgstr "Turski" + +#: dmoj/settings.py:350 +msgid "Vietnamese" +msgstr "Vijetnamski" + +#: dmoj/settings.py:351 +msgid "Simplified Chinese" +msgstr "Pojednostavljeni kineski" + +#: dmoj/urls.py:54 +msgid "Login" +msgstr "Prijava" + +#: dmoj/urls.py:102 templates/base.html:190 +msgid "Home" +msgstr "Početna" + +#: judge/admin/comments.py:40 +#, python-format +msgid "%d comment successfully hidden." +msgid_plural "%d comments successfully hidden." +msgstr[0] "%d komentar uspješno sakriven." +msgstr[1] "%d komentara uspješno sakriven." +msgstr[2] "%d komentara uspješno sakriveno." + +#: judge/admin/comments.py:43 +msgid "Hide comments" +msgstr "Sakrij komentare" + +#: judge/admin/comments.py:47 +#, python-format +msgid "%d comment successfully unhidden." +msgid_plural "%d comments successfully unhidden." +msgstr[0] "%d komentar uspješno otkriven." +msgstr[1] "%d komentara uspješno otkriveno." +msgstr[2] "%d komentara uspješno otkriveno." + +#: judge/admin/comments.py:50 +msgid "Unhide comments" +msgstr "Otkrij komentare" + +#: judge/admin/comments.py:58 +msgid "Associated page" +msgstr "Povezana stranica" + +#: judge/admin/contest.py:29 +msgid "Included contests" +msgstr "Uključena natjecanja" + +#: judge/admin/contest.py:65 templates/contest/contest.html:83 +#: templates/contest/moss.html:43 templates/problem/list.html:206 +#: templates/problem/list.html:221 templates/user/user-problems.html:56 +#: templates/user/user-problems.html:98 +msgid "Problem" +msgstr "Zadatak" + +#: judge/admin/contest.py:113 +msgid "Settings" +msgstr "" + +#: judge/admin/contest.py:115 +msgid "Scheduling" +msgstr "Raspoređivanje" + +#: judge/admin/contest.py:116 +msgid "Details" +msgstr "Pojedinosti" + +#: judge/admin/contest.py:117 +msgid "Format" +msgstr "" + +#: judge/admin/contest.py:118 templates/contest/ranking-table.html:5 +msgid "Rating" +msgstr "Bodovi" + +#: judge/admin/contest.py:119 +msgid "Access" +msgstr "" + +#: judge/admin/contest.py:121 judge/admin/problem.py:131 +msgid "Justice" +msgstr "Pravda" + +#: judge/admin/contest.py:159 +#, python-format +msgid "%d contest successfully marked as visible." +msgid_plural "%d contests successfully marked as visible." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: judge/admin/contest.py:162 +msgid "Mark contests as visible" +msgstr "" + +#: judge/admin/contest.py:166 +#, python-format +msgid "%d contest successfully marked as hidden." +msgid_plural "%d contests successfully marked as hidden." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: judge/admin/contest.py:169 +msgid "Mark contests as hidden" +msgstr "" + +#: judge/admin/contest.py:180 judge/admin/submission.py:149 +#: judge/admin/submission.py:171 +msgid "You do not have the permission to rejudge submissions." +msgstr "Nemate dozvolu za ponovno evaluiranje predanog rješenja." + +#: judge/admin/contest.py:187 judge/admin/submission.py:155 +msgid "You do not have the permission to rejudge THAT many submissions." +msgstr "Nemate dozvolu za ponovnu evaluaciju toliko puno predanih rješenja." + +#: judge/admin/contest.py:194 judge/admin/submission.py:164 +#, 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] "" + +#: judge/admin/contest.py:265 +#, python-format +msgid "%d participation recalculated." +msgid_plural "%d participations recalculated." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: judge/admin/contest.py:268 +msgid "Recalculate results" +msgstr "" + +#: judge/admin/contest.py:272 judge/admin/organization.py:65 +msgid "username" +msgstr "korisničko ime" + +#: judge/admin/contest.py:277 templates/base.html:258 +msgid "virtual" +msgstr "virtualno" + +#: judge/admin/interface.py:28 judge/models/interface.py:46 +msgid "link path" +msgstr "putanja veze" + +#: judge/admin/interface.py:62 +msgid "Content" +msgstr "Sadržaj" + +#: judge/admin/interface.py:63 +msgid "Summary" +msgstr "Sažetak" + +#: judge/admin/interface.py:107 judge/models/contest.py:251 +#: judge/models/contest.py:355 judge/models/profile.py:189 +msgid "user" +msgstr "korisnik" + +#: judge/admin/interface.py:148 +msgid "object" +msgstr "" + +#: judge/admin/organization.py:34 judge/admin/problem.py:171 +#: judge/admin/profile.py:78 +msgid "View on site" +msgstr "Prikaži na stranici" + +#: judge/admin/problem.py:28 +msgid "Describe the changes you made (optional)" +msgstr "Opišite promjene koje ste napravili (neobavezno)" + +#: judge/admin/problem.py:126 +msgid "Social Media" +msgstr "Društveni mediji" + +#: judge/admin/problem.py:127 +msgid "Taxonomy" +msgstr "Taksonomija" + +#: judge/admin/problem.py:128 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:58 +msgid "Points" +msgstr "Bodovi" + +#: judge/admin/problem.py:129 +msgid "Limits" +msgstr "Ograničenja" + +#: judge/admin/problem.py:130 judge/admin/submission.py:232 +#: templates/stats/base.html:14 templates/submission/list.html:328 +msgid "Language" +msgstr "Jezik" + +#: judge/admin/problem.py:132 +msgid "History" +msgstr "Povijest" + +#: judge/admin/problem.py:168 +msgid "Authors" +msgstr "Autori" + +#: judge/admin/problem.py:183 +#, python-format +msgid "%d problem successfully marked as public." +msgid_plural "%d problems successfully marked as public." +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:187 +msgid "Mark problems as public" +msgstr "Označi zadatke javnima" + +#: judge/admin/problem.py:193 +#, python-format +msgid "%d problem successfully marked as private." +msgid_plural "%d problems successfully marked as private." +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:197 +msgid "Mark problems as private" +msgstr "Označi zadatke privatnima" + +#: judge/admin/profile.py:32 +msgid "timezone" +msgstr "" + +#: judge/admin/profile.py:84 judge/admin/submission.py:211 +#: templates/organization/requests/log.html:9 +#: templates/organization/requests/pending.html:12 +#: templates/ticket/list.html:263 +msgid "User" +msgstr "Korisnik" + +#: judge/admin/profile.py:89 templates/registration/registration_form.html:145 +msgid "Email" +msgstr "E-mail" + +#: judge/admin/profile.py:94 judge/views/register.py:29 +#: templates/registration/registration_form.html:173 +#: templates/user/edit-profile.html:99 +msgid "Timezone" +msgstr "Vremenska zona" + +#: judge/admin/profile.py:99 +msgid "date joined" +msgstr "datum registracije" + +#: judge/admin/profile.py:106 +#, python-format +msgid "%d user have scores recalculated." +msgid_plural "%d users have scores recalculated." +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:109 +msgid "Recalculate scores" +msgstr "Ponovno izračunavanje rezultata" + +#: judge/admin/runtime.py:19 +msgid "Disallowed problems" +msgstr "Nedozvoljeni zadaci" + +#: judge/admin/runtime.py:22 +msgid "These problems are NOT allowed to be submitted in this language" +msgstr "Sljedeći zadatke NE možete riješiti u ovom jeziku" + +#: judge/admin/runtime.py:83 +msgid "Description" +msgstr "Opis" + +#: judge/admin/runtime.py:84 +msgid "Information" +msgstr "Informacije" + +#: judge/admin/runtime.py:85 +msgid "Capabilities" +msgstr "Mogućnosti" + +#: judge/admin/submission.py:23 judge/admin/submission.py:42 +#: judge/admin/submission.py:221 +msgid "None" +msgstr "Nepoznato" + +#: judge/admin/submission.py:23 +msgid "Not done" +msgstr "Nedovršeno" + +#: judge/admin/submission.py:23 +msgid "Exceptional" +msgstr "Izuzetno" + +#: judge/admin/submission.py:42 +msgid "Unaccepted" +msgstr "Odbijeno" + +#: judge/admin/submission.py:89 +#, python-format +msgctxt "contest problem" +msgid "%(problem)s in %(contest)s" +msgstr "%(problem)s u %(contest)s" + +#: judge/admin/submission.py:167 +msgid "Rejudge the selected submissions" +msgstr "Reevaluiraj označena predana rješenja" + +#: judge/admin/submission.py:193 judge/views/problem_manage.py:128 +#, python-format +msgid "%d submission were successfully rescored." +msgid_plural "%d submissions were successfully rescored." +msgstr[0] "%d predano rješenje je uspješno ponovno ocijenjeno." +msgstr[1] "%d predanih rješenja je uspješno ponovno ocijenjeno." +msgstr[2] "%d predanih rješenja je uspješno ponovno ocijenjeno." + +#: judge/admin/submission.py:196 +msgid "Rescore the selected submissions" +msgstr "Ponovno ocijeni označena predana rješenja" + +#: judge/admin/submission.py:200 +msgid "Problem code" +msgstr "Kod zadatka" + +#: judge/admin/submission.py:205 +msgid "Problem name" +msgstr "Ime zadatka" + +#: judge/admin/submission.py:215 templates/organization/requests/log.html:10 +#: templates/organization/requests/pending.html:13 +msgid "Time" +msgstr "Vrijeme" + +#: judge/admin/submission.py:223 +#, python-format +msgid "%d KB" +msgstr "%d KB" + +#: judge/admin/submission.py:225 +#, python-format +msgid "%.2f MB" +msgstr "%.2f MB" + +#: judge/admin/submission.py:227 +msgid "Memory" +msgstr "Memorija" + +#: judge/admin/taxon.py:11 judge/admin/taxon.py:34 +msgid "Included problems" +msgstr "Zadaci" + +#: judge/admin/taxon.py:14 +msgid "These problems are included in this group of problems" +msgstr "Ovi zadaci su dio ove grupe zadataka" + +#: judge/admin/taxon.py:37 +msgid "These problems are included in this type of problems" +msgstr "Ovi zadaci imaju ovaj tip zadatka" + +#: judge/apps.py:8 +msgid "Online Judge" +msgstr "Evaluator" + +#: judge/comments.py:41 +msgid "Comment body" +msgstr "Tekst komentara" + +#: judge/comments.py:47 judge/views/ticket.py:46 +msgid "Your part is silent, little toad." +msgstr "Budi tiho, mala žabice." + +#: judge/comments.py:50 templates/comments/list.html:131 +msgid "You need to have solved at least one problem before your voice can be heard." +msgstr "Moraš riješiti barem jedan zadatak kako bi mogao komentirati." + +#: judge/comments.py:92 +msgid "Posted comment" +msgstr "Objavljen komentar" + +#: judge/contest_format/atcoder.py:19 +msgid "AtCoder" +msgstr "" + +#: judge/contest_format/default.py:18 +msgid "Default" +msgstr "" + +#: judge/contest_format/ecoo.py:19 +msgid "ECOO" +msgstr "" + +#: judge/contest_format/ioi.py:19 +msgid "IOI" +msgstr "" + +#: judge/forms.py:27 +msgid "Subscribe to contest updates" +msgstr "Pretplati se na novosti na natjecanju" + +#: judge/forms.py:28 +msgid "Enable experimental features" +msgstr "Uključi eksperimentalne opcije" + +#: judge/forms.py:57 judge/views/organization.py:127 +#, 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:107 judge/views/register.py:26 +#: templates/registration/registration_form.html:139 +#: templates/user/base-users-table.html:5 +msgid "Username" +msgstr "Korisničko ime" + +#: judge/forms.py:108 templates/registration/registration_form.html:151 +#: templates/registration/registration_form.html:165 +msgid "Password" +msgstr "Lozinka" + +#: judge/forms.py:130 +msgid "Two Factor Authentication tokens must be 6 decimal digits." +msgstr "" + +#: judge/forms.py:139 templates/registration/totp_auth.html:32 +msgid "Invalid Two Factor Authentication token." +msgstr "" + +#: judge/forms.py:143 judge/models/problem.py:97 +msgid "Problem code must be ^[a-z0-9]+$" +msgstr "" + +#: judge/forms.py:148 +msgid "Problem with code already exists." +msgstr "" + +#: judge/forms.py:153 judge/models/contest.py:51 +msgid "Contest id must be ^[a-z0-9]+$" +msgstr "ID natjecanja mora biti ^[a-z0-9]+$" + +#: judge/forms.py:158 +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 "N j, Y, g:i a" + +#: judge/jinja2/datetime.py:26 +#, python-brace-format +msgid "{time}" +msgstr "{time}" + +#: judge/jinja2/datetime.py:26 +#, python-brace-format +msgid "on {time}" +msgstr "u {time}" + +#: judge/models/choices.py:59 +msgid "Leave as LaTeX" +msgstr "Ostavi kao LaTeX" + +#: judge/models/choices.py:60 +msgid "SVG with PNG fallback" +msgstr "SVG sa PNG rezervom" + +#: judge/models/choices.py:61 +msgid "MathML only" +msgstr "Samo MathML" + +#: judge/models/choices.py:62 +msgid "MathJax with SVG/PNG fallback" +msgstr "MathJax sa SVG/PNG rezervom" + +#: judge/models/choices.py:63 +msgid "Detect best quality" +msgstr "Prepoznaj najbolju kvalitetu" + +#: judge/models/comment.py:25 +msgid "Page code must be ^[pcs]:[a-z0-9]+$|^b:\\d+$" +msgstr "" + +#: judge/models/comment.py:41 +msgid "commenter" +msgstr "komentator" + +#: judge/models/comment.py:42 +msgid "posted time" +msgstr "vrijeme objave" + +#: judge/models/comment.py:43 judge/models/comment.py:176 +msgid "associated page" +msgstr "" + +#: judge/models/comment.py:45 +msgid "votes" +msgstr "glasova" + +#: judge/models/comment.py:46 +msgid "body of comment" +msgstr "tekst komentara" + +#: judge/models/comment.py:47 +msgid "hide the comment" +msgstr "sakrij komentar" + +#: judge/models/comment.py:48 +msgid "parent" +msgstr "nadređeni komentar" + +#: judge/models/comment.py:53 +msgid "comment" +msgstr "komentar" + +#: judge/models/comment.py:54 +msgid "comments" +msgstr "komentari" + +#: judge/models/comment.py:136 judge/models/problem.py:406 +#, python-format +msgid "Editorial for %s" +msgstr "Objašnjenje za %s" + +#: judge/models/comment.py:171 +msgid "comment vote" +msgstr "" + +#: judge/models/comment.py:172 +msgid "comment votes" +msgstr "" + +#: judge/models/comment.py:181 +msgid "Override comment lock" +msgstr "" + +#: judge/models/contest.py:21 +msgid "Invalid colour." +msgstr "Pogrešna boja." + +#: judge/models/contest.py:23 +msgid "tag name" +msgstr "naziv oznake" + +#: judge/models/contest.py:24 +msgid "Lowercase letters and hyphens only." +msgstr "Samo mala slova i crtice." + +#: judge/models/contest.py:25 +msgid "tag colour" +msgstr "boja oznake" + +#: judge/models/contest.py:26 +msgid "tag description" +msgstr "opis oznake" + +#: judge/models/contest.py:45 +msgid "contest tag" +msgstr "oznaka natjecanja" + +#: judge/models/contest.py:46 judge/models/contest.py:100 +msgid "contest tags" +msgstr "oznake natjecanja" + +#: judge/models/contest.py:50 +msgid "contest id" +msgstr "ID natjecanja" + +#: judge/models/contest.py:52 +msgid "contest name" +msgstr "naziv natjecanja" + +#: judge/models/contest.py:53 +msgid "These people will be able to edit the contest." +msgstr "Ove osobe će moći uređivati natjecanje." + +#: judge/models/contest.py:55 judge/models/runtime.py:124 +#: src/dmoj-wpadmin/test_project/apps/books/admin.py:20 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:27 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:27 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:27 +msgid "description" +msgstr "opis" + +#: judge/models/contest.py:56 judge/models/problem.py:353 +#: judge/models/runtime.py:126 +msgid "problems" +msgstr "zadaci" + +#: judge/models/contest.py:57 judge/models/contest.py:252 +msgid "start time" +msgstr "vrijeme početka" + +#: judge/models/contest.py:58 +msgid "end time" +msgstr "vrijeme kraja" + +#: judge/models/contest.py:59 judge/models/problem.py:118 +#: judge/models/problem.py:377 +msgid "time limit" +msgstr "vremensko ograničenje" + +#: judge/models/contest.py:60 judge/models/problem.py:136 +msgid "publicly visible" +msgstr "javno vidljivo" + +#: judge/models/contest.py:61 +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:64 +msgid "contest rated" +msgstr "bodovanje natjecanja" + +#: judge/models/contest.py:64 +msgid "Whether this contest can be rated." +msgstr "Može li ovo natjecanje biti bodovano." + +#: judge/models/contest.py:66 +msgid "hide scoreboard" +msgstr "" + +#: judge/models/contest.py:67 +msgid "Whether the scoreboard should remain hidden for the duration of the contest." +msgstr "Treba li tablica poretka ostati skrivena za vrijeme natjecanja." + +#: judge/models/contest.py:70 +msgid "no comments" +msgstr "bez komentara" + +#: judge/models/contest.py:71 +msgid "Use clarification system instead of comments." +msgstr "Koristite sustav za pojašnjenja umjesto komentara." + +#: judge/models/contest.py:73 +msgid "Rating floor for contest" +msgstr "" + +#: judge/models/contest.py:75 +msgid "Rating ceiling for contest" +msgstr "" + +#: judge/models/contest.py:77 +msgid "rate all" +msgstr "boduj sve" + +#: judge/models/contest.py:77 +msgid "Rate all users who joined." +msgstr "Boduj sve korisnike koji su se pridružili." + +#: judge/models/contest.py:78 +msgid "exclude from ratings" +msgstr "izostavi iz bodovanja" + +#: judge/models/contest.py:80 +msgid "private to specific users" +msgstr "" + +#: judge/models/contest.py:81 +msgid "private contestants" +msgstr "" + +#: judge/models/contest.py:82 +msgid "If private, only these users may see the contest" +msgstr "" + +#: judge/models/contest.py:84 +msgid "hide problem tags" +msgstr "sakrij oznake zadataka" + +#: judge/models/contest.py:85 +msgid "Whether problem tags should be hidden by default." +msgstr "Trebaju li oznake zadataka biti zadano skrivene." + +#: judge/models/contest.py:87 +msgid "run pretests only" +msgstr "pokreni samo predtestiranje" + +#: judge/models/contest.py:88 +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:92 judge/models/problem.py:157 +msgid "private to organizations" +msgstr "privatno za organizacije" + +#: judge/models/contest.py:93 judge/models/problem.py:155 +#: judge/models/profile.py:76 +msgid "organizations" +msgstr "" + +#: judge/models/contest.py:94 +msgid "If private, only these organizations may see the contest" +msgstr "" + +#: judge/models/contest.py:95 judge/models/problem.py:145 +msgid "OpenGraph image" +msgstr "OpenGraph slika" + +#: judge/models/contest.py:96 judge/models/profile.py:47 +msgid "Logo override image" +msgstr "" + +#: judge/models/contest.py:98 +msgid "This image will replace the default site logo for users inside the contest." +msgstr "" + +#: judge/models/contest.py:101 +msgid "the amount of live participants" +msgstr "" + +#: judge/models/contest.py:102 +msgid "contest summary" +msgstr "" + +#: judge/models/contest.py:103 judge/models/problem.py:147 +msgid "Plain-text, shown in meta description tag, e.g. for social media." +msgstr "" + +#: judge/models/contest.py:104 judge/models/profile.py:46 +msgid "access code" +msgstr "" + +#: judge/models/contest.py:105 +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:107 judge/models/problem.py:141 +msgid "personae non gratae" +msgstr "persona non grata" + +#: judge/models/contest.py:108 +msgid "Bans the selected users from joining this contest." +msgstr "" + +#: judge/models/contest.py:109 +msgid "contest format" +msgstr "" + +#: judge/models/contest.py:110 +msgid "The contest format module to use." +msgstr "" + +#: judge/models/contest.py:111 +msgid "contest format configuration" +msgstr "" + +#: judge/models/contest.py:112 +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:233 +msgid "See private contests" +msgstr "" + +#: judge/models/contest.py:234 +msgid "Edit own contests" +msgstr "" + +#: judge/models/contest.py:235 +msgid "Edit all contests" +msgstr "" + +#: judge/models/contest.py:236 +msgid "Clone contest" +msgstr "" + +#: judge/models/contest.py:237 templates/contest/moss.html:74 +msgid "MOSS contest" +msgstr "" + +#: judge/models/contest.py:238 +msgid "Rate contests" +msgstr "" + +#: judge/models/contest.py:239 +msgid "Contest access codes" +msgstr "" + +#: judge/models/contest.py:240 +msgid "Create private contests" +msgstr "" + +#: judge/models/contest.py:242 judge/models/contest.py:320 +#: judge/models/contest.py:356 judge/models/contest.py:378 +#: judge/models/submission.py:83 +msgid "contest" +msgstr "natjecanje" + +#: judge/models/contest.py:243 +msgid "contests" +msgstr "natjecanja" + +#: judge/models/contest.py:250 +msgid "associated contest" +msgstr "" + +#: judge/models/contest.py:253 +msgid "score" +msgstr "bodovi" + +#: judge/models/contest.py:254 +msgid "cumulative time" +msgstr "" + +#: judge/models/contest.py:255 +msgid "virtual participation id" +msgstr "" + +#: judge/models/contest.py:256 +msgid "0 means non-virtual, otherwise the n-th virtual participation" +msgstr "" + +#: judge/models/contest.py:257 +msgid "contest format specific data" +msgstr "" + +#: judge/models/contest.py:306 +#, python-format +msgid "%s spectating in %s" +msgstr "" + +#: judge/models/contest.py:308 +#, python-format +msgid "%s in %s, v%d" +msgstr "" + +#: judge/models/contest.py:309 +#, python-format +msgid "%s in %s" +msgstr "" + +#: judge/models/contest.py:312 +msgid "contest participation" +msgstr "" + +#: judge/models/contest.py:313 +msgid "contest participations" +msgstr "" + +#: judge/models/contest.py:319 judge/models/contest.py:340 +#: judge/models/contest.py:379 judge/models/problem.py:352 +#: judge/models/problem.py:357 judge/models/problem.py:375 +#: judge/models/problem_data.py:35 +msgid "problem" +msgstr "" + +#: judge/models/contest.py:321 judge/models/contest.py:344 +#: judge/models/problem.py:129 +msgid "points" +msgstr "" + +#: judge/models/contest.py:322 +msgid "partial" +msgstr "" + +#: judge/models/contest.py:323 judge/models/contest.py:345 +msgid "is pretested" +msgstr "" + +#: judge/models/contest.py:324 judge/models/interface.py:43 +msgid "order" +msgstr "" + +#: judge/models/contest.py:325 +msgid "output prefix length override" +msgstr "" + +#: judge/models/contest.py:326 +msgid "Maximum number of submissions for this problem, or 0 for no limit." +msgstr "" + +#: judge/models/contest.py:328 +msgid "Why include a problem you can't submit to?" +msgstr "" + +#: judge/models/contest.py:333 +msgid "contest problem" +msgstr "" + +#: judge/models/contest.py:334 +msgid "contest problems" +msgstr "" + +#: judge/models/contest.py:338 judge/models/submission.py:181 +msgid "submission" +msgstr "" + +#: judge/models/contest.py:342 judge/models/contest.py:357 +msgid "participation" +msgstr "" + +#: judge/models/contest.py:346 +msgid "Whether this submission was ran only on pretests." +msgstr "" + +#: judge/models/contest.py:350 +msgid "contest submission" +msgstr "" + +#: judge/models/contest.py:351 +msgid "contest submissions" +msgstr "" + +#: judge/models/contest.py:359 +msgid "rank" +msgstr "" + +#: judge/models/contest.py:360 +msgid "rating" +msgstr "" + +#: judge/models/contest.py:361 +msgid "volatility" +msgstr "" + +#: judge/models/contest.py:362 +msgid "last rated" +msgstr "" + +#: judge/models/contest.py:366 +msgid "contest rating" +msgstr "" + +#: judge/models/contest.py:367 +msgid "contest ratings" +msgstr "" + +#: judge/models/contest.py:386 +msgid "contest moss result" +msgstr "" + +#: judge/models/contest.py:387 +msgid "contest moss results" +msgstr "" + +#: judge/models/interface.py:24 +msgid "configuration item" +msgstr "" + +#: judge/models/interface.py:25 +msgid "miscellaneous configuration" +msgstr "" + +#: judge/models/interface.py:37 +msgid "navigation item" +msgstr "" + +#: judge/models/interface.py:38 +msgid "navigation bar" +msgstr "" + +#: judge/models/interface.py:44 +msgid "identifier" +msgstr "" + +#: judge/models/interface.py:45 +msgid "label" +msgstr "" + +#: judge/models/interface.py:47 +msgid "highlight regex" +msgstr "" + +#: judge/models/interface.py:48 +msgid "parent item" +msgstr "" + +#: judge/models/interface.py:66 +msgid "post title" +msgstr "" + +#: judge/models/interface.py:67 judge/models/problem.py:395 +msgid "authors" +msgstr "" + +#: judge/models/interface.py:68 +msgid "slug" +msgstr "" + +#: judge/models/interface.py:69 judge/models/problem.py:393 +msgid "public visibility" +msgstr "" + +#: judge/models/interface.py:70 +msgid "sticky" +msgstr "" + +#: judge/models/interface.py:71 +msgid "publish after" +msgstr "" + +#: judge/models/interface.py:72 +msgid "post content" +msgstr "" + +#: judge/models/interface.py:73 +msgid "post summary" +msgstr "" + +#: judge/models/interface.py:74 +msgid "openGraph image" +msgstr "" + +#: judge/models/interface.py:91 +msgid "Edit all posts" +msgstr "" + +#: judge/models/interface.py:93 +msgid "blog post" +msgstr "" + +#: judge/models/interface.py:94 +msgid "blog posts" +msgstr "" + +#: judge/models/message.py:11 +msgid "message title" +msgstr "" + +#: judge/models/message.py:12 judge/models/ticket.py:29 +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:26 +msgid "problem category ID" +msgstr "" + +#: judge/models/problem.py:27 +msgid "problem category name" +msgstr "" + +#: judge/models/problem.py:34 +msgid "problem type" +msgstr "" + +#: judge/models/problem.py:35 judge/models/problem.py:113 +msgid "problem types" +msgstr "" + +#: judge/models/problem.py:39 +msgid "problem group ID" +msgstr "" + +#: judge/models/problem.py:40 +msgid "problem group name" +msgstr "" + +#: judge/models/problem.py:47 judge/models/problem.py:116 +msgid "problem group" +msgstr "" + +#: judge/models/problem.py:48 +msgid "problem groups" +msgstr "" + +#: judge/models/problem.py:52 +msgid "key" +msgstr "" + +#: judge/models/problem.py:54 +msgid "link" +msgstr "" + +#: judge/models/problem.py:55 +msgid "full name" +msgstr "" + +#: judge/models/problem.py:56 judge/models/profile.py:32 +#: judge/models/runtime.py:23 +msgid "short name" +msgstr "" + +#: judge/models/problem.py:57 +msgid "Displayed on pages under this license" +msgstr "" + +#: judge/models/problem.py:58 +msgid "icon" +msgstr "" + +#: judge/models/problem.py:58 +msgid "URL to the icon" +msgstr "" + +#: judge/models/problem.py:59 +msgid "license text" +msgstr "" + +#: judge/models/problem.py:68 +msgid "license" +msgstr "" + +#: judge/models/problem.py:69 +msgid "licenses" +msgstr "" + +#: judge/models/problem.py:96 +msgid "problem code" +msgstr "" + +#: judge/models/problem.py:98 +msgid "A short, unique code for the problem, used in the url after /problem/" +msgstr "" + +#: judge/models/problem.py:100 +msgid "problem name" +msgstr "" + +#: judge/models/problem.py:101 +msgid "The full name of the problem, as shown in the problem list." +msgstr "" + +#: judge/models/problem.py:103 +msgid "problem body" +msgstr "" + +#: judge/models/problem.py:104 +msgid "creators" +msgstr "" + +#: judge/models/problem.py:105 +msgid "These users will be able to edit the problem, and be listed as authors." +msgstr "" + +#: judge/models/problem.py:107 +msgid "curators" +msgstr "" + +#: judge/models/problem.py:108 +msgid "These users will be able to edit the problem, but not be listed as authors." +msgstr "" + +#: judge/models/problem.py:110 +msgid "testers" +msgstr "" + +#: judge/models/problem.py:112 +msgid "These users will be able to view the private problem, but not edit it." +msgstr "" + +#: judge/models/problem.py:114 +msgid "The type of problem, as shown on the problem's page." +msgstr "" + +#: judge/models/problem.py:117 +msgid "The group of problem, shown under Category in the problem list." +msgstr "" + +#: judge/models/problem.py:119 +msgid "The time limit for this problem, in seconds. Fractional seconds (e.g. 1.5) are supported." +msgstr "" + +#: judge/models/problem.py:123 judge/models/problem.py:380 +msgid "memory limit" +msgstr "memorijsko ograničenje" + +#: judge/models/problem.py:124 +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:130 +msgid "Points awarded for problem completion. Points are displayed with a 'p' suffix if partial." +msgstr "" + +#: judge/models/problem.py:133 +msgid "allows partial points" +msgstr "dopušteno djelomično bodovanje" + +#: judge/models/problem.py:134 +msgid "allowed languages" +msgstr "dopušteni programski jezici" + +#: judge/models/problem.py:135 +msgid "List of allowed submission languages." +msgstr "" + +#: judge/models/problem.py:137 +msgid "manually managed" +msgstr "ručno upravljano" + +#: judge/models/problem.py:138 +msgid "Whether judges should be allowed to manage data or not." +msgstr "" + +#: judge/models/problem.py:139 +msgid "date of publishing" +msgstr "datum objave" + +#: judge/models/problem.py:140 +msgid "Doesn't have magic ability to auto-publish due to backward compatibility" +msgstr "" + +#: judge/models/problem.py:142 +msgid "Bans the selected users from submitting to this problem." +msgstr "" + +#: judge/models/problem.py:144 +msgid "The license under which this problem is published." +msgstr "" + +#: judge/models/problem.py:146 +msgid "problem summary" +msgstr "sažetak zadatka" + +#: judge/models/problem.py:148 +msgid "number of users" +msgstr "" + +#: judge/models/problem.py:149 +msgid "The number of users who solved the problem." +msgstr "" + +#: judge/models/problem.py:150 +msgid "solve rate" +msgstr "" + +#: judge/models/problem.py:156 +msgid "If private, only these organizations may see the problem." +msgstr "" + +#: judge/models/problem.py:358 judge/models/problem.py:376 +#: judge/models/runtime.py:99 +msgid "language" +msgstr "" + +#: judge/models/problem.py:359 +msgid "translated name" +msgstr "" + +#: judge/models/problem.py:360 +msgid "translated description" +msgstr "" + +#: judge/models/problem.py:364 +msgid "problem translation" +msgstr "" + +#: judge/models/problem.py:365 +msgid "problem translations" +msgstr "" + +#: judge/models/problem.py:369 +msgid "clarified problem" +msgstr "" + +#: judge/models/problem.py:370 +msgid "clarification body" +msgstr "" + +#: judge/models/problem.py:371 +msgid "clarification timestamp" +msgstr "" + +#: judge/models/problem.py:386 +msgid "language-specific resource limit" +msgstr "" + +#: judge/models/problem.py:387 +msgid "language-specific resource limits" +msgstr "" + +#: judge/models/problem.py:391 +msgid "associated problem" +msgstr "" + +#: judge/models/problem.py:394 +msgid "publish date" +msgstr "" + +#: judge/models/problem.py:396 +msgid "editorial content" +msgstr "" + +#: judge/models/problem.py:412 +msgid "solution" +msgstr "" + +#: judge/models/problem.py:413 +msgid "solutions" +msgstr "" + +#: judge/models/problem_data.py:23 +msgid "Standard" +msgstr "" + +#: judge/models/problem_data.py:24 +msgid "Floats" +msgstr "" + +#: judge/models/problem_data.py:25 +msgid "Floats (absolute)" +msgstr "" + +#: judge/models/problem_data.py:26 +msgid "Floats (relative)" +msgstr "" + +#: judge/models/problem_data.py:27 +msgid "Non-trailing spaces" +msgstr "" + +#: judge/models/problem_data.py:28 +msgid "Unordered" +msgstr "" + +#: judge/models/problem_data.py:29 +msgid "Byte identical" +msgstr "" + +#: 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:39 +msgid "generator file" +msgstr "" + +#: judge/models/problem_data.py:41 judge/models/problem_data.py:90 +msgid "output prefix length" +msgstr "" + +#: judge/models/problem_data.py:42 judge/models/problem_data.py:91 +msgid "output limit length" +msgstr "" + +#: judge/models/problem_data.py:43 +msgid "init.yml generation feedback" +msgstr "" + +#: judge/models/problem_data.py:44 judge/models/problem_data.py:92 +msgid "checker" +msgstr "" + +#: judge/models/problem_data.py:45 judge/models/problem_data.py:93 +msgid "checker arguments" +msgstr "" + +#: 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:77 +msgid "problem data set" +msgstr "" + +#: judge/models/problem_data.py:79 +msgid "case position" +msgstr "" + +#: judge/models/problem_data.py:80 +msgid "case type" +msgstr "" + +#: judge/models/problem_data.py:81 +msgid "Normal case" +msgstr "" + +#: judge/models/problem_data.py:82 +msgid "Batch start" +msgstr "" + +#: judge/models/problem_data.py:83 +msgid "Batch end" +msgstr "" + +#: judge/models/problem_data.py:85 +msgid "input file name" +msgstr "" + +#: judge/models/problem_data.py:86 +msgid "output file name" +msgstr "" + +#: judge/models/problem_data.py:87 +msgid "generator arguments" +msgstr "" + +#: judge/models/problem_data.py:88 +msgid "point value" +msgstr "" + +#: judge/models/problem_data.py:89 +msgid "case is pretest?" +msgstr "" + +#: judge/models/profile.py:29 +msgid "organization title" +msgstr "" + +#: judge/models/profile.py:30 +msgid "organization slug" +msgstr "" + +#: judge/models/profile.py:31 +msgid "Organization name shown in URL" +msgstr "" + +#: judge/models/profile.py:33 +msgid "Displayed beside user name during contests" +msgstr "" + +#: judge/models/profile.py:34 +msgid "organization description" +msgstr "" + +#: judge/models/profile.py:35 +msgid "registrant" +msgstr "" + +#: judge/models/profile.py:36 +msgid "User who registered this organization" +msgstr "" + +#: judge/models/profile.py:37 +msgid "administrators" +msgstr "" + +#: judge/models/profile.py:38 +msgid "Those who can edit this organization" +msgstr "" + +#: judge/models/profile.py:39 +msgid "creation date" +msgstr "" + +#: judge/models/profile.py:40 +msgid "is open organization?" +msgstr "" + +#: judge/models/profile.py:41 +msgid "Allow joining organization" +msgstr "" + +#: judge/models/profile.py:42 +msgid "maximum size" +msgstr "" + +#: judge/models/profile.py:43 +msgid "Maximum amount of users in this organization, only applicable to private organizations" +msgstr "" + +#: judge/models/profile.py:45 +msgid "Student access code" +msgstr "" + +#: judge/models/profile.py:49 +msgid "This image will replace the default site logo for users viewing the organization." +msgstr "" + +#: judge/models/profile.py:75 judge/models/profile.py:91 +#: judge/models/profile.py:190 +msgid "organization" +msgstr "" + +#: judge/models/profile.py:80 +msgid "user associated" +msgstr "" + +#: judge/models/profile.py:81 +msgid "self-description" +msgstr "" + +#: judge/models/profile.py:82 +msgid "location" +msgstr "" + +#: judge/models/profile.py:84 +msgid "preferred language" +msgstr "" + +#: judge/models/profile.py:89 +msgid "last access time" +msgstr "" + +#: judge/models/profile.py:90 +msgid "last IP" +msgstr "" + +#: judge/models/profile.py:93 +msgid "display rank" +msgstr "" + +#: judge/models/profile.py:95 +msgid "comment mute" +msgstr "" + +#: judge/models/profile.py:95 +msgid "Some users are at their best when silent." +msgstr "" + +#: judge/models/profile.py:97 +msgid "unlisted user" +msgstr "" + +#: judge/models/profile.py:97 +msgid "User will not be ranked." +msgstr "" + +#: judge/models/profile.py:100 +msgid "user script" +msgstr "" + +#: judge/models/profile.py:101 +msgid "User-defined JavaScript for site customization." +msgstr "" + +#: judge/models/profile.py:102 +msgid "current contest" +msgstr "" + +#: judge/models/profile.py:104 +msgid "math engine" +msgstr "" + +#: judge/models/profile.py:106 +msgid "the rendering engine used to render math" +msgstr "" + +#: judge/models/profile.py:107 +msgid "2FA enabled" +msgstr "" + +#: judge/models/profile.py:108 +msgid "check to enable TOTP-based two factor authentication" +msgstr "" + +#: judge/models/profile.py:109 +msgid "TOTP key" +msgstr "" + +#: judge/models/profile.py:110 +msgid "32 character base32-encoded key for TOTP" +msgstr "" + +#: judge/models/profile.py:112 +msgid "TOTP key must be empty or base32" +msgstr "" + +#: judge/models/profile.py:113 +msgid "internal notes" +msgstr "" + +#: judge/models/profile.py:114 +msgid "Notes for administrators regarding this user." +msgstr "" + +#: judge/models/profile.py:184 +msgid "user profile" +msgstr "" + +#: judge/models/profile.py:185 +msgid "user profiles" +msgstr "" + +#: judge/models/profile.py:192 +msgid "request time" +msgstr "" + +#: judge/models/profile.py:193 +msgid "state" +msgstr "" + +#: judge/models/profile.py:198 +msgid "reason" +msgstr "" + +#: judge/models/profile.py:201 +msgid "organization join request" +msgstr "" + +#: judge/models/profile.py:202 +msgid "organization join requests" +msgstr "" + +#: judge/models/runtime.py:18 +msgid "short identifier" +msgstr "" + +#: judge/models/runtime.py:19 +msgid "The identifier for this language; the same as its executor id for judges." +msgstr "" + +#: judge/models/runtime.py:21 +msgid "long name" +msgstr "" + +#: judge/models/runtime.py:22 +msgid "Longer name for the language, e.g. \"Python 2\" or \"C++11\"." +msgstr "" + +#: judge/models/runtime.py:24 +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:28 +msgid "common name" +msgstr "" + +#: judge/models/runtime.py:29 +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:31 +msgid "ace mode name" +msgstr "" + +#: judge/models/runtime.py:32 +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:34 +msgid "pygments name" +msgstr "" + +#: judge/models/runtime.py:35 +msgid "Language ID for Pygments highlighting in source windows." +msgstr "" + +#: judge/models/runtime.py:36 +msgid "code template" +msgstr "" + +#: judge/models/runtime.py:37 +msgid "Code template to display in submission editor." +msgstr "" + +#: judge/models/runtime.py:38 +msgid "runtime info override" +msgstr "" + +#: judge/models/runtime.py:39 +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:41 +msgid "language description" +msgstr "" + +#: judge/models/runtime.py:42 +msgid "Use field this to inform users of quirks with your environment, additional restrictions, etc." +msgstr "" + +#: judge/models/runtime.py:44 +msgid "extension" +msgstr "" + +#: judge/models/runtime.py:45 +msgid "The extension of source files, e.g., \"py\" or \"cpp\"." +msgstr "" + +#: judge/models/runtime.py:100 +msgid "languages" +msgstr "" + +#: judge/models/runtime.py:104 +msgid "language to which this runtime belongs" +msgstr "" + +#: judge/models/runtime.py:105 +msgid "judge on which this runtime exists" +msgstr "" + +#: judge/models/runtime.py:106 +msgid "runtime name" +msgstr "" + +#: judge/models/runtime.py:107 +msgid "runtime version" +msgstr "" + +#: judge/models/runtime.py:108 +msgid "order in which to display this runtime" +msgstr "" + +#: judge/models/runtime.py:112 +msgid "Server name, hostname-style" +msgstr "" + +#: judge/models/runtime.py:113 +msgid "time of creation" +msgstr "" + +#: judge/models/runtime.py:114 +msgid "A key to authenticated this judge" +msgstr "" + +#: judge/models/runtime.py:115 +msgid "authentication key" +msgstr "" + +#: judge/models/runtime.py:116 +msgid "block judge" +msgstr "" + +#: judge/models/runtime.py:117 +msgid "Whether this judge should be blocked from connecting, even if its key is correct." +msgstr "" + +#: judge/models/runtime.py:119 +msgid "judge online status" +msgstr "" + +#: judge/models/runtime.py:120 +msgid "judge start time" +msgstr "" + +#: judge/models/runtime.py:121 +msgid "response time" +msgstr "" + +#: judge/models/runtime.py:122 +msgid "system load" +msgstr "" + +#: judge/models/runtime.py:123 +msgid "Load for the last minute, divided by processors to be fair." +msgstr "" + +#: judge/models/runtime.py:127 judge/models/runtime.py:167 +msgid "judges" +msgstr "" + +#: judge/models/runtime.py:166 +msgid "judge" +msgstr "" + +#: judge/models/submission.py:20 judge/models/submission.py:47 +#: judge/utils/problems.py:86 +msgid "Accepted" +msgstr "" + +#: judge/models/submission.py:21 judge/models/submission.py:48 +msgid "Wrong Answer" +msgstr "" + +#: judge/models/submission.py:22 judge/models/submission.py:50 +msgid "Time Limit Exceeded" +msgstr "" + +#: judge/models/submission.py:23 judge/models/submission.py:51 +msgid "Memory Limit Exceeded" +msgstr "" + +#: judge/models/submission.py:24 judge/models/submission.py:52 +msgid "Output Limit Exceeded" +msgstr "" + +#: judge/models/submission.py:25 judge/models/submission.py:53 +msgid "Invalid Return" +msgstr "" + +#: judge/models/submission.py:26 judge/models/submission.py:54 +msgid "Runtime Error" +msgstr "" + +#: judge/models/submission.py:27 judge/models/submission.py:41 +#: judge/models/submission.py:55 judge/utils/problems.py:88 +msgid "Compile Error" +msgstr "" + +#: judge/models/submission.py:28 judge/models/submission.py:40 +msgid "Internal Error" +msgstr "" + +#: judge/models/submission.py:29 +msgid "Short circuit" +msgstr "" + +#: judge/models/submission.py:30 judge/models/submission.py:42 +#: judge/models/submission.py:61 +msgid "Aborted" +msgstr "" + +#: judge/models/submission.py:36 judge/models/submission.py:57 +msgid "Queued" +msgstr "" + +#: judge/models/submission.py:37 judge/models/submission.py:58 +msgid "Processing" +msgstr "" + +#: judge/models/submission.py:38 judge/models/submission.py:59 +msgid "Grading" +msgstr "" + +#: judge/models/submission.py:39 judge/models/submission.py:60 +msgid "Completed" +msgstr "" + +#: judge/models/submission.py:56 +msgid "Internal Error (judging server error)" +msgstr "" + +#: judge/models/submission.py:66 +msgid "submission time" +msgstr "" + +#: judge/models/submission.py:67 judge/models/submission.py:201 +msgid "execution time" +msgstr "" + +#: judge/models/submission.py:68 judge/models/submission.py:202 +msgid "memory usage" +msgstr "" + +#: judge/models/submission.py:69 judge/models/submission.py:203 +msgid "points granted" +msgstr "" + +#: judge/models/submission.py:70 +msgid "submission language" +msgstr "" + +#: judge/models/submission.py:71 +msgid "status" +msgstr "" + +#: judge/models/submission.py:72 +msgid "result" +msgstr "" + +#: judge/models/submission.py:74 +msgid "compile errors" +msgstr "" + +#: judge/models/submission.py:76 +msgid "batched cases" +msgstr "" + +#: judge/models/submission.py:77 +msgid "test case points" +msgstr "" + +#: judge/models/submission.py:78 +msgid "test case total points" +msgstr "" + +#: judge/models/submission.py:79 +msgid "judged on" +msgstr "" + +#: judge/models/submission.py:81 +msgid "was rejudged by admin" +msgstr "" + +#: judge/models/submission.py:82 +msgid "was ran on pretests only" +msgstr "" + +#: judge/models/submission.py:182 templates/contest/moss.html:58 +msgid "submissions" +msgstr "" + +#: judge/models/submission.py:186 judge/models/submission.py:197 +msgid "associated submission" +msgstr "" + +#: judge/models/submission.py:188 +msgid "source code" +msgstr "" + +#: judge/models/submission.py:199 +msgid "test case ID" +msgstr "" + +#: judge/models/submission.py:200 +msgid "status flag" +msgstr "" + +#: judge/models/submission.py:204 +msgid "points possible" +msgstr "" + +#: judge/models/submission.py:205 +msgid "batch number" +msgstr "" + +#: judge/models/submission.py:206 +msgid "judging feedback" +msgstr "" + +#: judge/models/submission.py:207 +msgid "extended judging feedback" +msgstr "" + +#: judge/models/submission.py:208 +msgid "program output" +msgstr "" + +#: judge/models/submission.py:216 +msgid "submission test case" +msgstr "" + +#: judge/models/submission.py:217 +msgid "submission test cases" +msgstr "" + +#: judge/models/ticket.py:10 +msgid "ticket title" +msgstr "" + +#: judge/models/ticket.py:11 +msgid "ticket creator" +msgstr "" + +#: judge/models/ticket.py:13 +msgid "creation time" +msgstr "" + +#: judge/models/ticket.py:14 +msgid "assignees" +msgstr "" + +#: judge/models/ticket.py:15 +msgid "quick notes" +msgstr "" + +#: judge/models/ticket.py:16 +msgid "Staff notes for this issue to aid in processing." +msgstr "" + +#: judge/models/ticket.py:17 +msgid "linked item type" +msgstr "" + +#: judge/models/ticket.py:19 +msgid "linked item ID" +msgstr "" + +#: judge/models/ticket.py:21 +msgid "is ticket open?" +msgstr "" + +#: judge/models/ticket.py:25 +msgid "ticket" +msgstr "" + +#: judge/models/ticket.py:27 +msgid "poster" +msgstr "" + +#: judge/models/ticket.py:30 +msgid "message time" +msgstr "" + +#: judge/pdf_problems.py:134 judge/pdf_problems.py:186 +#: judge/pdf_problems.py:246 +msgid "Page [page] of [topage]" +msgstr "" + +#: judge/tasks/moss.py:25 +msgid "Running MOSS" +msgstr "" + +#: judge/tasks/submission.py:43 +msgid "Modifying submissions" +msgstr "" + +#: judge/tasks/submission.py:56 +msgid "Recalculating user points" +msgstr "" + +#: judge/utils/problem_data.py:63 +msgid "Empty batches not allowed." +msgstr "" + +#: 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 +#, python-format +msgid "Input file for case %d does not exist: %s" +msgstr "" + +#: 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 +#, python-format +msgid "Batch start case #%d requires points." +msgstr "" + +#: 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 +msgid "How did you corrupt the zip path?" +msgstr "" + +#: judge/utils/problem_data.py:160 +msgid "How did you corrupt the generator path?" +msgstr "" + +#: judge/utils/problems.py:76 +msgid "Can't pass both queryset and keyword filters" +msgstr "" + +#: judge/utils/problems.py:87 +msgid "Wrong" +msgstr "" + +#: judge/utils/problems.py:89 +msgid "Timeout" +msgstr "" + +#: judge/utils/problems.py:90 +msgid "Error" +msgstr "" + +#: 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/timedelta.py:49 +msgctxt "time format with day" +msgid "%d day %h:%m:%s" +msgid_plural "%d days %h:%m:%s" +msgstr[0] "%d dan %h:%m:%s" +msgstr[1] "%d dana %h:%m:%s" +msgstr[2] "%d dana %h:%m:%s" + +#: judge/utils/timedelta.py:53 +msgctxt "time format without day" +msgid "%h:%m:%s" +msgstr "%h:%m:%s" + +#: 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] "%d dan %h:%m" +msgstr[1] "%d dana %h:%m" +msgstr[2] "%d dana %h:%m" + +#: judge/utils/timedelta.py:61 +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d dan" +msgstr[1] "%d dana" +msgstr[2] "%d dana" + +#: judge/utils/timedelta.py:63 +msgctxt "hours and minutes" +msgid "%h:%m" +msgstr "%h:%m" + +#: judge/views/blog.py:38 +#, python-format +msgid "Page %d of Posts" +msgstr "" + +#: judge/views/comment.py:27 +msgid "Messing around, are we?" +msgstr "" + +#: judge/views/comment.py:36 +msgid "You must solve at least one problem before you can vote." +msgstr "" + +#: judge/views/comment.py:63 +msgid "You already voted." +msgstr "" + +#: judge/views/comment.py:120 judge/views/organization.py:299 +msgid "Edited from site" +msgstr "" + +#: judge/views/comment.py:141 +msgid "Editing comment" +msgstr "" + +#: judge/views/contests.py:49 judge/views/contests.py:211 +#: judge/views/contests.py:214 judge/views/contests.py:385 +msgid "No such contest" +msgstr "" + +#: judge/views/contests.py:50 judge/views/contests.py:212 +#, python-format +msgid "Could not find a contest with the key \"%s\"." +msgstr "" + +#: judge/views/contests.py:75 +msgid "Contests" +msgstr "" + +#: judge/views/contests.py:215 +msgid "Could not find such contest." +msgstr "" + +#: judge/views/contests.py:218 +#, python-format +msgid "Access to contest \"%s\" denied" +msgstr "" + +#: judge/views/contests.py:242 +msgid "Clone Contest" +msgstr "" + +#: judge/views/contests.py:305 +msgid "Contest not ongoing" +msgstr "" + +#: judge/views/contests.py:306 +#, python-format +msgid "\"%s\" is not currently ongoing." +msgstr "" + +#: judge/views/contests.py:310 +msgid "Already in contest" +msgstr "" + +#: judge/views/contests.py:311 +#, python-format +msgid "You are already in a contest: \"%s\"." +msgstr "" + +#: judge/views/contests.py:314 +msgid "Banned from joining" +msgstr "" + +#: judge/views/contests.py:315 +msgid "You have been declared persona non grata for this contest. You are permanently barred from joining this contest." +msgstr "" + +#: judge/views/contests.py:375 +#, python-format +msgid "Enter access code for \"%s\"" +msgstr "" + +#: judge/views/contests.py:386 +#, python-format +msgid "You are not in contest \"%s\"." +msgstr "" + +#: judge/views/contests.py:405 +msgid "ContestCalendar requires integer year and month" +msgstr "" + +#: judge/views/contests.py:445 +#, python-format +msgid "Contests in %(month)s" +msgstr "" + +#: judge/views/contests.py:445 +msgid "F Y" +msgstr "" + +#: judge/views/contests.py:531 +msgid "???" +msgstr "" + +#: judge/views/contests.py:594 +#, python-format +msgid "%s Rankings" +msgstr "" + +#: judge/views/contests.py:610 +#, python-format +msgid "Your participation in %s" +msgstr "" + +#: judge/views/contests.py:611 +#, python-format +msgid "%s's participation in %s" +msgstr "" + +#: judge/views/contests.py:615 +msgid "Live" +msgstr "" + +#: judge/views/contests.py:627 templates/contest/contest-tabs.html:13 +msgid "Participation" +msgstr "" + +#: judge/views/contests.py:654 +#, python-format +msgid "%s MOSS Results" +msgstr "" + +#: judge/views/contests.py:681 +#, python-format +msgid "Running MOSS for %s..." +msgstr "" + +#: judge/views/contests.py:704 +#, python-format +msgid "Contest tag: %s" +msgstr "" + +#: judge/views/error.py:14 +msgid "404 error" +msgstr "404 greška" + +#: judge/views/error.py:15 +#, python-format +msgid "Could not find page \"%s\"" +msgstr "" + +#: judge/views/error.py:22 +#, python-format +msgid "no permission for %s" +msgstr "" + +#: 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 +msgid "Runtimes" +msgstr "" + +#: judge/views/organization.py:44 judge/views/organization.py:47 +msgid "No such organization" +msgstr "" + +#: judge/views/organization.py:45 +#, python-format +msgid "Could not find an organization with the key \"%s\"." +msgstr "" + +#: judge/views/organization.py:48 +msgid "Could not find such organization." +msgstr "" + +#: judge/views/organization.py:72 judge/views/register.py:34 +#: templates/organization/list.html:15 templates/user/user-list-tabs.html:5 +msgid "Organizations" +msgstr "" + +#: judge/views/organization.py:93 +#, python-format +msgid "%s Members" +msgstr "" + +#: judge/views/organization.py:118 judge/views/organization.py:121 +#: judge/views/organization.py:126 +msgid "Joining organization" +msgstr "" + +#: judge/views/organization.py:118 +msgid "You are already in the organization." +msgstr "" + +#: judge/views/organization.py:121 +msgid "This organization is not open." +msgstr "" + +#: judge/views/organization.py:138 +msgid "Leaving organization" +msgstr "" + +#: judge/views/organization.py:138 +#, python-format +msgid "You are not in \"%s\"." +msgstr "" + +#: judge/views/organization.py:162 +#, python-format +msgid "Request to join %s" +msgstr "Zahtjev za pridruživanje %s" + +#: judge/views/organization.py:180 +msgid "Join request detail" +msgstr "" + +#: judge/views/organization.py:209 +#, python-format +msgid "Managing join requests for %s" +msgstr "" + +#: judge/views/organization.py:240 +#, python-format +msgid "Your organization can only receive %d more members. You cannot approve %d users." +msgstr "" + +#: judge/views/organization.py:252 +#, python-format +msgid "Approved %d user." +msgid_plural "Approved %d users." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: judge/views/organization.py:253 +#, python-format +msgid "Rejected %d user." +msgid_plural "Rejected %d users." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: judge/views/organization.py:283 +#, python-format +msgid "Editing %s" +msgstr "Uređivanje %s" + +#: judge/views/organization.py:307 judge/views/organization.py:315 +msgid "Can't edit organization" +msgstr "Nije moguće urediti organizaciju" + +#: judge/views/organization.py:308 +msgid "You are not allowed to edit this organization." +msgstr "Nemate ovlasti za uređivanje ove organizacije." + +#: judge/views/organization.py:316 +msgid "You are not allowed to kick people from this organization." +msgstr "Nemate ovlasti za izbacivanje ljudi iz ove organizacije." + +#: judge/views/organization.py:321 judge/views/organization.py:325 +msgid "Can't kick user" +msgstr "Nije moguće izbaciti korisnika" + +#: judge/views/organization.py:322 +msgid "The user you are trying to kick does not exist!" +msgstr "Korisnik kojeg pokušavate izbaciti ne postoji!" + +#: judge/views/organization.py:326 +#, 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:68 +msgid "No such problem" +msgstr "" + +#: judge/views/problem.py:69 +#, python-format +msgid "Could not find a problem with the code \"%s\"." +msgstr "" + +#: judge/views/problem.py:111 +#, python-brace-format +msgid "Editorial for {0}" +msgstr "" + +#: judge/views/problem.py:114 +#, python-brace-format +msgid "Editorial for {0}" +msgstr "" + +#: judge/views/problem.py:285 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:546 +msgid "Banned from submitting" +msgstr "" + +#: judge/views/problem.py:547 +msgid "You have been declared persona non grata for this problem. You are permanently barred from submitting this problem." +msgstr "" + +#: judge/views/problem.py:560 +msgid "Too many submissions" +msgstr "Previše poslanih rješenja" + +#: judge/views/problem.py:561 +msgid "You have exceeded the submission limit for this problem." +msgstr "" + +#: judge/views/problem.py:627 judge/views/problem.py:630 +#, python-format +msgid "Submit to %(problem)s" +msgstr "" + +#: judge/views/problem.py:646 +msgid "Clone Problem" +msgstr "" + +#: judge/views/problem_data.py:37 +msgid "Checker arguments must be a JSON object" +msgstr "" + +#: judge/views/problem_data.py:39 +msgid "Checker arguments is invalid JSON" +msgstr "" + +#: judge/views/problem_data.py:46 +msgid "Your zip file is invalid!" +msgstr "" + +#: judge/views/problem_data.py:104 +#, python-brace-format +msgid "Comparing submissions for {0}" +msgstr "" + +#: judge/views/problem_data.py:107 +#, python-brace-format +msgid "Comparing submissions for {0}" +msgstr "" + +#: judge/views/problem_data.py:142 +#, python-brace-format +msgid "Editing data for {0}" +msgstr "" + +#: judge/views/problem_data.py:145 +#, python-format +msgid "Editing data for %s" +msgstr "" + +#: judge/views/problem_data.py:237 judge/views/problem_data.py:238 +#, python-format +msgid "Generated init.yml for %s" +msgstr "" + +#: 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] "" +msgstr[2] "" + +#: judge/views/ranked_submission.py:58 +#, python-format +msgid "Best solutions for %s" +msgstr "" + +#: judge/views/ranked_submission.py:61 +#, python-brace-format +msgid "Best solutions for {0}" +msgstr "" + +#: judge/views/ranked_submission.py:71 +#, python-format +msgid "Best solutions for %(problem)s in %(contest)s" +msgstr "" + +#: judge/views/ranked_submission.py:74 +#, python-format +msgid "Best solutions for problem %(number)s in %(contest)s" +msgstr "" + +#: judge/views/ranked_submission.py:80 +#, python-brace-format +msgid "Best solutions for {0} in {2}" +msgstr "" + +#: judge/views/ranked_submission.py:83 +#, python-brace-format +msgid "Best solutions for problem {0} in {1}" +msgstr "" + +#: judge/views/register.py:27 +msgid "A username must contain letters, numbers, or underscores" +msgstr "" + +#: judge/views/register.py:31 templates/user/edit-profile.html:103 +msgid "Preferred language" +msgstr "" + +#: judge/views/register.py:38 +msgid "Subscribe to newsletter?" +msgstr "Pretplatite se na naš newsletter?" + +#: judge/views/register.py:45 +#, 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 +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 +msgid "Registration" +msgstr "Registracija" + +#: judge/views/register.py:106 +msgid "Authentication failure" +msgstr "" + +#: judge/views/stats.py:105 +msgid "Language statistics" +msgstr "" + +#: judge/views/status.py:24 templates/submission/list.html:319 +msgid "Status" +msgstr "Status predanog rješenja" + +#: judge/views/status.py:108 +msgid "Version matrix" +msgstr "" + +#: judge/views/submission.py:59 judge/views/submission.py:66 +#, 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:161 judge/views/submission.py:162 +#: templates/problem/problem.html:127 +msgid "All submissions" +msgstr "Sva predana rješenja" + +#: judge/views/submission.py:303 +msgid "All my submissions" +msgstr "Sva moja predana rješenja" + +#: judge/views/submission.py:304 +#, python-format +msgid "All submissions by %s" +msgstr "Sva predana rješenja od korisnika %s" + +#: judge/views/submission.py:335 +#, python-format +msgid "All submissions for %s" +msgstr "Sva predana rješenja za korisnika %s" + +#: judge/views/submission.py:354 +msgid "Must pass a problem" +msgstr "" + +#: judge/views/submission.py:397 +#, python-format +msgid "My submissions for %(problem)s" +msgstr "" + +#: judge/views/submission.py:398 +#, python-format +msgid "%(user)s's submissions for %(problem)s" +msgstr "" + +#: judge/views/submission.py:495 +msgid "Must pass a contest" +msgstr "" + +#: judge/views/submission.py:514 +#, python-brace-format +msgid "{0}'s submissions for {2} in {4}" +msgstr "" + +#: judge/views/submission.py:519 +#, 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 "" + +#: judge/views/ticket.py:40 +msgid "Issue description" +msgstr "" + +#: judge/views/ticket.py:85 judge/views/ticket.py:88 +#, python-format +msgid "New ticket for %s" +msgstr "" + +#: judge/views/ticket.py:139 +#, python-format +msgid "%(title)s - Ticket %(id)d" +msgstr "" + +#: judge/views/ticket.py:248 +#, python-format +msgid "Tickets - Page %(number)d of %(total)d" +msgstr "" + +#: judge/views/ticket.py:297 +#, python-format +msgid "New Ticket: %s" +msgstr "" + +#: judge/views/ticket.py:298 +#, python-format +msgid "#%(id)d, assigned to: %(users)s" +msgstr "" + +#: judge/views/ticket.py:300 +msgid ", " +msgstr "" + +#: judge/views/ticket.py:300 +msgid "no one" +msgstr "" + +#: judge/views/totp.py:42 templates/registration/totp_enable.html:86 +msgid "Enable Two Factor Authentication" +msgstr "" + +#: judge/views/totp.py:89 templates/registration/totp_disable.html:48 +msgid "Disable Two Factor Authentication" +msgstr "" + +#: judge/views/totp.py:103 +msgid "Perform Two Factor Authentication" +msgstr "" + +#: judge/views/user.py:68 +msgid "No such user" +msgstr "" + +#: judge/views/user.py:68 +#, python-format +msgid "No user handle \"%s\"." +msgstr "" + +#: judge/views/user.py:72 +msgid "My account" +msgstr "" + +#: judge/views/user.py:73 +#, python-format +msgid "User %s" +msgstr "" + +#: judge/views/user.py:136 +msgid "M j, Y, G:i" +msgstr "" + +#: judge/views/user.py:221 +msgid "Updated on site" +msgstr "" + +#: judge/views/user.py:253 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:10 +msgid "Edit profile" +msgstr "" + +#: judge/views/user.py:262 templates/user/user-list-tabs.html:4 +msgid "Leaderboard" +msgstr "" + +#: judge/views/widgets.py:48 judge/views/widgets.py:58 +#, python-format +msgid "Invalid upstream data: %s" +msgstr "" + +#: judge/views/widgets.py:68 +msgid "Bad latitude or longitude" +msgstr "" + +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:13 +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:27 +msgid "Photo" +msgstr "" + +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:14 +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:28 +msgid "Photos" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:9 +msgid "first name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:10 +msgid "last name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:11 +msgid "biography" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/admin.py:24 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:30 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:30 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:30 +msgid "owner" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:12 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:12 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:12 +msgid "name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:19 +msgid "Category of Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:20 +msgid "Categories of Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:26 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:26 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:26 +msgid "title" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:28 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:28 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:28 +msgid "category" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:29 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:29 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:29 +msgid "author" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:31 +msgid "publication date" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:37 +msgid "Book" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:38 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:136 +msgid "Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:19 +msgid "Category of CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:20 +msgid "Categories of CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:36 +msgid "CD" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:37 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:141 +msgid "CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:19 +msgid "Category of DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:20 +msgid "Categories of DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:36 +msgid "DVD" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:37 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:146 +msgid "DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/templates/admin/base_site.html:7 +msgid "Django administration" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/forms.py:12 +#, python-format +msgid "Please enter the correct %(username)s and password for an admin account. Note that both fields may be case-sensitive." +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/forms.py:32 +#, python-format +msgid "Please enter the correct %(username)s and password for an user account. Note that both fields may be case-sensitive." +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:27 +msgid "Site" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:38 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:41 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:130 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:133 +msgid "Dashboard" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:48 +msgid "Applications" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:53 +msgid "Administration" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:64 +msgid "Color theme" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:66 +msgid "Change color theme" +msgstr "" + +#: 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 +msgid "Rate all ratable contests" +msgstr "" + +#: 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 +msgid "Rejudge" +msgstr "" + +#: templates/base.html:214 +#, python-format +msgid "Hello, %(username)s." +msgstr "" + +#: templates/base.html:220 templates/comments/list.html:89 +#: templates/contest/contest-list-tabs.html:24 +#: templates/problem/problem-list-tabs.html:6 +#: templates/submission/info-base.html:12 +#: templates/submission/submission-list-tabs.html:15 +msgid "Admin" +msgstr "" + +#: templates/base.html:229 +msgid "Log out" +msgstr "" + +#: templates/base.html:238 +#: templates/registration/password_reset_complete.html:4 +msgid "Log in" +msgstr "" + +#: templates/base.html:239 templates/registration/registration_form.html:177 +msgid "or" +msgstr "" + +#: templates/base.html:240 +msgid "Sign up" +msgstr "" + +#: templates/base.html:252 +msgid "spectating" +msgstr "" + +#: 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:20 +#: 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 +msgid "Edit" +msgstr "" + +#: templates/blog/content.html:27 +#, python-format +msgid "\n" +" posted on %(time)s\n" +" " +msgstr "" + +#: templates/blog/dashboard.html:21 +#, python-format +msgid "\n" +" on %(time)s\n" +" " +msgstr "" + +#: templates/blog/list.html:85 +msgid "Blog" +msgstr "" + +#: templates/blog/list.html:87 +msgid "Events" +msgstr "" + +#: templates/blog/list.html:92 +msgid "News" +msgstr "" + +#: templates/blog/list.html:106 +#, python-brace-format +msgid "posted on {time}" +msgstr "" + +#: templates/blog/list.html:130 templates/problem/problem.html:310 +msgid "Clarifications" +msgstr "" + +#: templates/blog/list.html:146 templates/problem/problem.html:321 +msgid "No clarifications have been made at this time." +msgstr "" + +#: templates/blog/list.html:154 +msgid "Ongoing contests" +msgstr "" + +#: templates/blog/list.html:172 +msgid "Upcoming contests" +msgstr "" + +#: templates/blog/list.html:189 +msgid "Comment stream" +msgstr "" + +#: templates/blog/list.html:208 +msgid "New problems" +msgstr "" + +#: templates/blog/list.html:225 +msgid "My open tickets" +msgstr "" + +#: templates/blog/list.html:246 +msgid "New tickets" +msgstr "" + +#: templates/comments/list.html:2 +msgid "Comments" +msgstr "Komentari" + +#: templates/comments/list.html:18 templates/comments/list.html:27 +msgid "Please login to vote" +msgstr "Molimo, prijavite se da biste mogli glasati" + +#: templates/comments/list.html:40 +#, python-brace-format +msgid "commented on {time}" +msgstr "" + +#: templates/comments/list.html:49 +#, python-format +msgid "edit %(edits)s" +msgstr "" + +#: templates/comments/list.html:51 templates/comments/media-js.html:77 +msgid "edited" +msgstr "" + +#: templates/comments/list.html:60 +msgid "Link" +msgstr "" + +#: templates/comments/list.html:73 templates/comments/list.html:80 +msgid "Reply" +msgstr "" + +#: templates/comments/list.html:86 +msgid "Hide" +msgstr "" + +#: templates/comments/list.html:101 +#, 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:120 +msgid "There are no comments at the moment." +msgstr "" + +#: templates/comments/list.html:126 +msgid "New comment" +msgstr "" + +#: templates/comments/list.html:140 +msgid "Invalid comment body." +msgstr "" + +#: templates/comments/list.html:148 +msgid "Post!" +msgstr "" + +#: templates/comments/list.html:156 +msgid "Comments are disabled on this page." +msgstr "" + +#: templates/comments/media-js.html:72 +#, python-brace-format +msgid "edit {edits}" +msgstr "" + +#: templates/comments/media-js.html:75 +msgid "original" +msgstr "" + +#: templates/contest/access_code.html:26 +msgid "Invalid access code." +msgstr "" + +#: templates/contest/access_code.html:29 +msgid "Please enter your access code:" +msgstr "" + +#: templates/contest/access_code.html:32 +msgid "Join Contest" +msgstr "" + +#: templates/contest/calendar.html:12 +msgid "Sunday" +msgstr "Nedjelja" + +#: templates/contest/calendar.html:13 +msgid "Monday" +msgstr "Ponedjeljak" + +#: templates/contest/calendar.html:14 +msgid "Tuesday" +msgstr "Utorak" + +#: templates/contest/calendar.html:15 +msgid "Wednesday" +msgstr "Srijeda" + +#: templates/contest/calendar.html:16 +msgid "Thursday" +msgstr "Četvrtak" + +#: templates/contest/calendar.html:17 +msgid "Friday" +msgstr "Petak" + +#: templates/contest/calendar.html:18 +msgid "Saturday" +msgstr "Subota" + +#: 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 "Prethodna" + +#: templates/contest/contest-list-tabs.html:10 +msgid "Today" +msgstr "" + +#: templates/contest/contest-list-tabs.html:13 +msgid "Next" +msgstr "Sljedeća" + +#: templates/contest/contest-list-tabs.html:21 +#: templates/problem/problem-list-tabs.html:5 +msgid "List" +msgstr "" + +#: templates/contest/contest-list-tabs.html:22 +msgid "Calendar" +msgstr "Kalendar" + +#: templates/contest/contest-tabs.html:4 +msgid "Info" +msgstr "" + +#: templates/contest/contest-tabs.html:8 +msgid "Rankings" +msgstr "" + +#: templates/contest/contest-tabs.html:10 +msgid "Hidden Rankings" +msgstr "" + +#: templates/contest/contest-tabs.html:18 +msgid "MOSS" +msgstr "" + +#: templates/contest/contest-tabs.html:23 +msgid "Clone" +msgstr "" + +#: templates/contest/contest-tabs.html:34 +#: templates/contest/contest-tabs.html:54 +msgid "Leave contest" +msgstr "" + +#: templates/contest/contest-tabs.html:41 templates/contest/list.html:293 +msgid "Virtual join" +msgstr "" + +#: templates/contest/contest-tabs.html:52 +msgid "Stop spectating" +msgstr "" + +#: templates/contest/contest-tabs.html:61 +msgid "Spectate contest" +msgstr "" + +#: templates/contest/contest-tabs.html:67 +#: templates/contest/contest-tabs.html:73 +msgid "Join contest" +msgstr "" + +#: templates/contest/contest-tabs.html:82 +msgid "Login to participate" +msgstr "" + +#: templates/contest/contest.html:37 +msgid "Participating virtually." +msgstr "" + +#: templates/contest/contest.html:43 +msgid "Contest is over." +msgstr "" + +#: templates/contest/contest.html:59 templates/contest/contest.html:63 +msgid "F j, Y, G:i T" +msgstr "" + +#: 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 +#, python-format +msgid "%(length)s long starting on %(start_time)s" +msgstr "" + +#: templates/contest/contest.html:85 +msgid "AC Rate" +msgstr "" + +#: templates/contest/contest.html:86 templates/contest/list.html:153 +#: templates/contest/list.html:195 templates/contest/list.html:271 +#: templates/problem/list.html:212 templates/problem/list.html:238 +msgid "Users" +msgstr "" + +#: templates/contest/contest.html:111 +msgid "Editorial" +msgstr "" + +#: templates/contest/list.html:31 templates/contest/media-js.html:9 +msgid "Are you sure you want to join?" +msgstr "" + +#: 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:65 +msgid "hidden" +msgstr "" + +#: templates/contest/list.html:70 +msgid "private" +msgstr "" + +#: templates/contest/list.html:84 +msgid "rated" +msgstr "" + +#: templates/contest/list.html:132 +msgid "Spectate" +msgstr "" + +#: templates/contest/list.html:138 +msgid "Join" +msgstr "" + +#: templates/contest/list.html:148 +msgid "Active Contests" +msgstr "" + +#: templates/contest/list.html:152 templates/contest/list.html:194 +#: templates/contest/list.html:232 templates/contest/list.html:270 +msgid "Contest" +msgstr "" + +#: templates/contest/list.html:190 +msgid "Ongoing Contests" +msgstr "" + +#: templates/contest/list.html:227 +msgid "Upcoming Contests" +msgstr "" + +#: templates/contest/list.html:255 +msgid "There are no scheduled contests at this time." +msgstr "" + +#: templates/contest/list.html:261 +msgid "Past Contests" +msgstr "" + +#: templates/contest/media-js.html:4 +msgid "Are you sure you want to leave?" +msgstr "" + +#: 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 +msgid "Joining a contest starts your timer, after which it becomes unstoppable." +msgstr "" + +#: 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:7 +msgid "Organization" +msgstr "Organizacija" + +#: templates/contest/ranking-table.html:27 +#, python-brace-format +msgid "Started on {time}" +msgstr "" + +#: templates/contest/ranking-table.html:30 +msgid "Participation ended." +msgstr "" + +#: templates/contest/ranking.html:232 +msgid "View user participation" +msgstr "" + +#: templates/contest/ranking.html:236 +msgid "Show organizations" +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 +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 +msgid "activate" +msgstr "" + +#: 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 +msgid "Newsletter unsubscribe" +msgstr "" + +#: 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 +msgid "Do you want to unsubscribe from this newsletter?" +msgstr "" + +#: 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 +msgid "Newsletter update" +msgstr "" + +#: 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 +msgid "Update subscription" +msgstr "" + +#: templates/newsletter/subscription_update_activated.html:8 +msgid "Your subscription has successfully been updated." +msgstr "" + +#: 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:34 +#: templates/ticket/edit-notes.html:4 +msgid "Update" +msgstr "" + +#: 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:29 +msgid "Join organization" +msgstr "" + +#: templates/organization/home.html:33 +msgid "Request membership" +msgstr "" + +#: templates/organization/home.html:39 +msgid "Edit organization" +msgstr "" + +#: templates/organization/home.html:43 +msgid "View requests" +msgstr "" + +#: templates/organization/home.html:50 +msgid "Admin organization" +msgstr "" + +#: templates/organization/home.html:55 +msgid "View members" +msgstr "" + +#: templates/organization/list.html:23 templates/status/language-list.html:34 +msgid "Name" +msgstr "" + +#: templates/organization/list.html:24 +msgid "Members" +msgstr "" + +#: templates/organization/new.html:10 templates/ticket/new.html:38 +msgid "Create" +msgstr "" + +#: templates/organization/requests/detail.html:13 +msgid "User:" +msgstr "" + +#: templates/organization/requests/detail.html:17 +msgid "Organization:" +msgstr "" + +#: templates/organization/requests/detail.html:25 +msgid "Time:" +msgstr "" + +#: templates/organization/requests/detail.html:29 +msgid "Reason:" +msgstr "" + +#: 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:15 +msgid "Reason" +msgstr "" + +#: 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:17 +#: templates/problem/data.html:401 +msgid "Delete?" +msgstr "" + +#: templates/organization/requests/request.html:18 +msgid "Your reason for joining:" +msgstr "" + +#: templates/organization/requests/request.html:20 +msgid "Request" +msgstr "" + +#: templates/organization/requests/tabs.html:4 +msgid "Pending" +msgstr "" + +#: templates/organization/requests/tabs.html:7 +msgid "Log" +msgstr "" + +#: templates/organization/requests/tabs.html:10 +msgid "Approved" +msgstr "" + +#: templates/organization/requests/tabs.html:13 +msgid "Rejected" +msgstr "" + +#: templates/organization/users-table.html:15 +msgid "Kick" +msgstr "" + +#: templates/problem/clone.html:37 +msgid "Enter a new code for the cloned problem:" +msgstr "" + +#: templates/problem/data.html:353 +msgid "View YAML" +msgstr "" + +#: templates/problem/data.html:369 +msgid "Show columns:" +msgstr "" + +#: templates/problem/data.html:372 templates/problem/data.html:396 +msgid "Output prefix" +msgstr "" + +#: templates/problem/data.html:376 templates/problem/data.html:397 +msgid "Output limit" +msgstr "" + +#: templates/problem/data.html:380 templates/problem/data.html:398 +msgid "Checker" +msgstr "" + +#: templates/problem/data.html:384 templates/problem/data.html:399 +msgid "Generator args" +msgstr "" + +#: templates/problem/data.html:391 +msgid "Type" +msgstr "" + +#: templates/problem/data.html:392 +msgid "Input file" +msgstr "" + +#: templates/problem/data.html:393 +msgid "Output file" +msgstr "" + +#: templates/problem/data.html:395 +msgid "Pretest?" +msgstr "" + +#: templates/problem/data.html:447 templates/problem/submit.html:252 +msgid "Submit!" +msgstr "" + +#: templates/problem/data.html:448 +msgid "Add new case" +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 editorialist.

Submitting an official solution before solving the problem yourself is a bannable offence." +msgstr "" + +#: templates/problem/list.html:62 +msgid "Filter by type..." +msgstr "" + +#: templates/problem/list.html:185 +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:57 +msgid "Category" +msgstr "" + +#: templates/problem/list.html:209 templates/problem/list.html:228 +msgid "Types" +msgstr "" + +#: templates/problem/list.html:235 +#, python-format +msgid "AC %%" +msgstr "" + +#: 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:142 +msgid "Filter by result:" +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:101 templates/problem/problem.html:111 +#: templates/problem/problem.html:116 +msgid "Submit solution" +msgstr "" + +#: templates/problem/problem.html:104 +#, python-format +msgid "%(counter)s submission left" +msgid_plural "%(counter)s submissions left" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: templates/problem/problem.html:112 +msgid "0 submissions left" +msgstr "" + +#: templates/problem/problem.html:124 +msgid "My submissions" +msgstr "" + +#: templates/problem/problem.html:128 +msgid "Best submissions" +msgstr "" + +#: templates/problem/problem.html:132 +msgid "Read editorial" +msgstr "" + +#: templates/problem/problem.html:137 +msgid "Manage tickets" +msgstr "" + +#: templates/problem/problem.html:141 +msgid "Edit problem" +msgstr "" + +#: templates/problem/problem.html:143 +msgid "Edit test data" +msgstr "" + +#: templates/problem/problem.html:148 +msgid "My tickets" +msgstr "" + +#: templates/problem/problem.html:156 +msgid "Manage submissions" +msgstr "" + +#: templates/problem/problem.html:162 +msgid "Clone problem" +msgstr "" + +#: templates/problem/problem.html:169 +msgid "Points:" +msgstr "" + +#: templates/problem/problem.html:172 templates/problem/problem.html:174 +msgid "(partial)" +msgstr "" + +#: templates/problem/problem.html:179 +msgid "Time limit:" +msgstr "" + +#: templates/problem/problem.html:191 +msgid "Memory limit:" +msgstr "" + +#: templates/problem/problem.html:210 +msgid "Author:" +msgid_plural "Authors:" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: templates/problem/problem.html:225 +msgid "Problem type" +msgid_plural "Problem types" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: templates/problem/problem.html:238 +msgid "Allowed languages" +msgstr "" + +#: templates/problem/problem.html:246 +#, python-format +msgid "No %(lang)s judge online" +msgstr "" + +#: templates/problem/problem.html:257 +msgid "Judge:" +msgid_plural "Judges:" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: templates/problem/problem.html:274 +msgid "none available" +msgstr "" + +#: templates/problem/problem.html:299 +msgid "Request clarification" +msgstr "" + +#: templates/problem/problem.html:301 +msgid "Report an issue" +msgstr "" + +#: 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 +msgid "Search problems..." +msgstr "" + +#: templates/problem/search-form.html:14 +msgid "Full text search" +msgstr "" + +#: templates/problem/search-form.html:21 +msgid "Hide solved problems" +msgstr "" + +#: 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 +msgid "All" +msgstr "" + +#: templates/problem/search-form.html:46 +msgid "Problem types" +msgstr "" + +#: templates/problem/search-form.html:57 +msgid "Point range" +msgstr "" + +#: templates/problem/search-form.html:63 templates/submission/list.html:337 +#: templates/ticket/list.html:248 +msgid "Go" +msgstr "" + +#: templates/problem/search-form.html:64 +msgid "Random" +msgstr "" + +#: templates/problem/submit.html:192 +#, python-format +msgid "Warning! Your default language, %(default_language)s, is unavailable for this problem and has been deselected." +msgstr "" + +#: templates/problem/submit.html:203 +#, python-format +msgid "\n" +" You have %(left)s submission left\n" +" " +msgid_plural "\n" +" You have %(left)s submissions left\n" +" " +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: templates/problem/submit.html:212 +msgid "You have 0 submissions left" +msgstr "" + +#: templates/problem/submit.html:250 +msgid "No judge is available for this problem." +msgstr "" + +#: templates/registration/activate.html:3 +#, python-format +msgid "%(key)s is an invalid activation key." +msgstr "" + +#: templates/registration/activation_complete.html:3 +msgid "Your account has been successfully activated." +msgstr "" + +#: templates/registration/login.html:43 +msgid "Invalid username or password." +msgstr "" + +#: templates/registration/login.html:61 +#: templates/registration/totp_auth.html:39 +msgid "Login!" +msgstr "" + +#: templates/registration/login.html:64 +msgid "Forgot your password?" +msgstr "" + +#: templates/registration/login.html:67 +msgid "Or log in with..." +msgstr "" + +#: templates/registration/logout.html:3 +msgid "See you later!" +msgstr "" + +#: templates/registration/password_change_done.html:3 +msgid "Your password was sucessfully changed." +msgstr "" + +#: templates/registration/password_change_form.html:8 +msgid "Change Password" +msgstr "" + +#: templates/registration/password_reset.html:7 +msgid "Send Reset Email" +msgstr "" + +#: 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_confirm.html:9 +msgid "Reset Password" +msgstr "" + +#: 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 +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 +#, 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 +msgid "Please go to the following page and choose a new password:" +msgstr "" + +#: templates/registration/password_reset_email.txt:7 +msgid "Your username, in case you've forgotten:" +msgstr "" + +#: templates/registration/password_reset_email.txt:9 +msgid "Thanks for using our site!" +msgstr "" + +#: templates/registration/password_reset_email.txt:11 +#, python-format +msgid "The %(site_name)s team" +msgstr "" + +#: 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 +msgid "Continue >" +msgstr "" + +#: 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:166 +msgid "(again, for confirmation)" +msgstr "" + +#: templates/registration/registration_form.html:173 +msgid "(select your closest major city)" +msgstr "" + +#: templates/registration/registration_form.html:178 +msgid "pick from map" +msgstr "" + +#: templates/registration/registration_form.html:183 +msgid "Default language" +msgstr "" + +#: templates/registration/registration_form.html:186 +#: templates/user/edit-profile.html:162 +msgid "Affiliated organizations" +msgstr "" + +#: templates/registration/registration_form.html:192 +#: templates/user/edit-profile.html:121 +msgid "Notify me about upcoming contests" +msgstr "" + +#: templates/registration/registration_form.html:206 +msgid "By registering, you agree to our" +msgstr "" + +#: templates/registration/registration_form.html:207 +msgid "Terms & Conditions" +msgstr "" + +#: templates/registration/registration_form.html:210 +msgid "Register!" +msgstr "" + +#: templates/registration/totp_auth.html:36 +#: templates/registration/totp_disable.html:45 +#: templates/registration/totp_enable.html:83 +msgid "Enter the 6-digit code generated by your app:" +msgstr "" + +#: templates/registration/totp_auth.html:41 +#, python-format +msgid "If you lost your authentication device, please contact us at %(email)s." +msgstr "" + +#: templates/registration/totp_disable.html:38 +msgid "To protect your account, you must first authenticate before you can disable Two Factor Authentication." +msgstr "" + +#: templates/registration/totp_enable.html:71 +msgid "Scan this code with your authenticator app:" +msgstr "" + +#: templates/registration/totp_enable.html:72 +msgid "QR code" +msgstr "" + +#: templates/registration/totp_enable.html:73 +msgid "Or enter this code manually:" +msgstr "" + +#: templates/stats/base.html:9 templates/submission/list.html:345 +msgid "Statistics" +msgstr "" + +#: templates/stats/language.html:11 +msgid "Submission Statistics" +msgstr "" + +#: templates/stats/language.html:16 +msgid "Submissions by Language" +msgstr "" + +#: templates/stats/language.html:21 +msgid "AC Submissions by Language" +msgstr "" + +#: templates/stats/language.html:26 +msgid "Language AC Rate" +msgstr "" + +#: templates/status/judge-status-table.html:2 +msgid "Judge" +msgstr "" + +#: templates/status/judge-status-table.html:4 +msgid "Online" +msgstr "" + +#: templates/status/judge-status-table.html:6 +msgid "Uptime" +msgstr "" + +#: templates/status/judge-status-table.html:7 +msgid "Ping" +msgstr "" + +#: 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 +msgid "N/A" +msgstr "" + +#: templates/status/judge-status-table.html:64 +msgid "There are no judges available at this time." +msgstr "" + +#: templates/status/language-list.html:33 templates/ticket/list.html:261 +msgid "ID" +msgstr "" + +#: templates/status/language-list.html:35 +msgid "Runtime Info" +msgstr "" + +#: templates/status/status-tabs.html:4 +msgid "Judges" +msgstr "" + +#: templates/status/status-tabs.html:6 +msgid "Version Matrix" +msgstr "" + +#: templates/submission/internal-error-message.html:8 +msgid "An internal error occurred while grading." +msgstr "" + +#: templates/submission/internal-error-message.html:15 +msgid "Error information" +msgstr "" + +#: templates/submission/list.html:76 +msgid "Filter by status..." +msgstr "" + +#: templates/submission/list.html:82 +msgid "Filter by language..." +msgstr "" + +#: templates/submission/list.html:315 +msgid "Filter submissions" +msgstr "" + +#: templates/submission/list.html:351 +msgid "Total:" +msgstr "" + +#: templates/submission/list.html:361 +msgid "You were disconnected. Refresh to show latest updates." +msgstr "" + +#: templates/submission/row.html:39 +#, python-format +msgid "Case #%(case)s" +msgstr "" + +#: templates/submission/row.html:49 +msgid "view" +msgstr "" + +#: templates/submission/row.html:53 +msgid "rejudge" +msgstr "" + +#: templates/submission/row.html:58 +msgid "admin" +msgstr "" + +#: templates/submission/source.html:25 +msgid "View status" +msgstr "" + +#: templates/submission/source.html:26 +msgid "View raw source" +msgstr "" + +#: templates/submission/source.html:28 templates/submission/status.html:61 +msgid "Resubmit" +msgstr "" + +#: 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 +msgid "Your submission is being processed..." +msgstr "" + +#: templates/submission/status-testcases.html:14 +msgid "Compilation Error" +msgstr "" + +#: templates/submission/status-testcases.html:18 +msgid "Compilation Warnings" +msgstr "" + +#: templates/submission/status-testcases.html:23 +msgid "Pretest Execution Results" +msgstr "" + +#: templates/submission/status-testcases.html:25 +msgid "Execution Results" +msgstr "" + +#: templates/submission/status-testcases.html:31 +msgid "Batch " +msgstr "" + +#: templates/submission/status-testcases.html:43 +msgid "Case" +msgstr "" + +#: templates/submission/status-testcases.html:45 +msgid "Pretest" +msgstr "" + +#: templates/submission/status-testcases.html:47 +msgid "Test case" +msgstr "" + +#: templates/submission/status-testcases.html:79 +msgid "Your output (clipped)" +msgstr "" + +#: templates/submission/status-testcases.html:90 +msgid "Judge feedback" +msgstr "" + +#: templates/submission/status-testcases.html:106 +msgid "Resources:" +msgstr "" + +#: templates/submission/status-testcases.html:115 +msgid "Final pretest score:" +msgstr "" + +#: templates/submission/status-testcases.html:117 +msgid "Final score:" +msgstr "" + +#: templates/submission/status-testcases.html:131 +msgid "Passing pretests does not guarantee a full score on system tests." +msgstr "" + +#: templates/submission/status-testcases.html:134 +msgid "Submission aborted!" +msgstr "" + +#: templates/submission/status.html:59 +msgid "View source" +msgstr "" + +#: templates/submission/status.html:88 +msgid "Abort" +msgstr "" + +#: templates/submission/submission-list-tabs.html:6 +msgid "Mine" +msgstr "" + +#: templates/submission/submission-list-tabs.html:9 +msgid "Best" +msgstr "" + +#: templates/submission/submission-list-tabs.html:12 +#, python-format +msgid "%(user)s's" +msgstr "" + +#: templates/ticket/list.html:135 templates/ticket/ticket.html:257 +msgid "Reopened: " +msgstr "" + +#: templates/ticket/list.html:138 templates/ticket/ticket.html:258 +msgid "Closed: " +msgstr "" + +#: templates/ticket/list.html:221 +msgid "Use desktop notification" +msgstr "" + +#: templates/ticket/list.html:227 +msgid "Show my tickets only" +msgstr "" + +#: templates/ticket/list.html:231 +msgid "Filing user" +msgstr "" + +#: templates/ticket/list.html:240 +msgid "Assignee" +msgstr "" + +#: templates/ticket/list.html:262 +msgid "Title" +msgstr "" + +#: templates/ticket/list.html:264 templates/ticket/ticket.html:304 +msgid "Assignees" +msgstr "" + +#: templates/ticket/new_problem.html:7 +msgid "Thanks for opening a ticket!" +msgstr "" + +#: 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 +msgid "Associated object" +msgstr "" + +#: templates/ticket/ticket.html:309 +msgid "No one is assigned." +msgstr "" + +#: templates/ticket/ticket.html:315 +msgid "Close ticket" +msgstr "" + +#: templates/ticket/ticket.html:317 +msgid "Reopen ticket" +msgstr "" + +#: templates/ticket/ticket.html:321 +msgid "Assignee notes" +msgstr "" + +#: templates/ticket/ticket.html:328 templates/widgets/select_all.html:4 +msgid "Nothing here." +msgstr "" + +#: templates/ticket/ticket.html:378 +msgid "Post" +msgstr "" + +#: templates/user/base-users-table.html:3 +msgid "Rank" +msgstr "" + +#: templates/user/base-users.html:14 templates/user/base-users.html:69 +msgid "Search by handle..." +msgstr "" + +#: templates/user/edit-profile.html:90 +msgid "Self-description" +msgstr "" + +#: templates/user/edit-profile.html:98 +msgid "Select your closest major city" +msgstr "" + +#: templates/user/edit-profile.html:107 +msgid "Editor theme" +msgstr "" + +#: templates/user/edit-profile.html:112 +msgid "Math engine" +msgstr "" + +#: templates/user/edit-profile.html:136 templates/user/edit-profile.html:137 +msgid "Change your avatar" +msgstr "" + +#: templates/user/edit-profile.html:143 +msgid "Change your password" +msgstr "" + +#: templates/user/edit-profile.html:150 +msgid "Two Factor Authentication is enabled." +msgstr "" + +#: templates/user/edit-profile.html:153 +msgid "Two Factor Authentication is disabled." +msgstr "" + +#: templates/user/edit-profile.html:170 +msgid "User-script" +msgstr "" + +#: templates/user/edit-profile.html:174 +msgid "Update profile" +msgstr "" + +#: templates/user/pp-row.html:22 +#, python-format +msgid "\n" +" weighted %(weight)s%%\n" +" " +msgstr "" + +#: templates/user/pp-row.html:27 +#, python-format +msgid "%(pp).1fpp" +msgstr "" + +#: templates/user/pp-row.html:29 +#, python-format +msgid "%(pp).0fpp" +msgstr "" + +#: templates/user/user-about.html:14 +msgid "From" +msgstr "" + +#: 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:40 +msgid "You have not shared any information." +msgstr "" + +#: templates/user/user-about.html:42 +msgid "This user has not shared any information." +msgstr "" + +#: templates/user/user-base.html:42 +#, python-format +msgid "%(counter)s problem solved" +msgid_plural "%(counter)s problems solved" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: templates/user/user-base.html:50 +msgid "Rank by points:" +msgstr "" + +#: templates/user/user-base.html:53 +msgid "Total points:" +msgstr "" + +#: templates/user/user-base.html:68 +msgid "Rank by rating:" +msgstr "" + +#: templates/user/user-base.html:70 +msgid "Rating:" +msgstr "" + +#: templates/user/user-base.html:71 +msgid "Volatility:" +msgstr "" + +#: templates/user/user-base.html:72 +msgid "Min. rating:" +msgstr "" + +#: templates/user/user-base.html:73 +msgid "Max rating:" +msgstr "" + +#: templates/user/user-problems.html:35 +msgid "Points Breakdown" +msgstr "" + +#: templates/user/user-problems.html:41 +msgid "Load more..." +msgstr "" + +#: templates/user/user-problems.html:45 +msgid "This user has not yet solved any problems." +msgstr "" + +#: templates/user/user-problems.html:51 +msgid "Authored Problems" +msgstr "" + +#: templates/user/user-problems.html:83 +msgid "Hide problems I've solved" +msgstr "" + +#: templates/user/user-problems.html:93 +#, python-format +msgid "%(points).1f points" +msgstr "" + +#: templates/user/user-problems.html:99 +msgid "Score" +msgstr "" + +#: templates/user/user-problems.html:110 +#, python-format +msgid "%(points)s / %(total)s" +msgstr "" + +#: templates/user/user-tabs.html:7 +msgid "Impersonate" +msgstr "" + +#: templates/user/user-tabs.html:13 +msgid "Admin User" +msgstr "" + +#: templates/user/user-tabs.html:16 +msgid "Admin Profile" +msgstr "" + +#: templates/widgets/select_all.html:8 +msgid "Check all" +msgstr "" + diff --git a/locale/hr/LC_MESSAGES/djangojs.po b/locale/hr/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..ef0d238 --- /dev/null +++ b/locale/hr/LC_MESSAGES/djangojs.po @@ -0,0 +1,31 @@ +msgid "" +msgstr "" +"Project-Id-Version: dmoj\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-10-01 23:12+0000\n" +"PO-Revision-Date: 2019-11-11 22:05\n" +"Last-Translator: Icyene\n" +"Language-Team: Croatian\n" +"Language: hr_HR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: crowdin.com\n" +"X-Crowdin-Project: dmoj\n" +"X-Crowdin-Language: hr\n" +"X-Crowdin-File: djangojs.po\n" + +#: resources/common.js:207 +msgctxt "time format with day" +msgid "%d day %h:%m:%s" +msgid_plural "%d days %h:%m:%s" +msgstr[0] "%d dan %h:%m:%s" +msgstr[1] "%d dana %h:%m:%s" +msgstr[2] "%d dana %h:%m:%s" + +#: resources/common.js:210 +msgctxt "time format without day" +msgid "%h:%m:%s" +msgstr "%h:%m:%s" + diff --git a/locale/hu/LC_MESSAGES/django.po b/locale/hu/LC_MESSAGES/django.po new file mode 100644 index 0000000..57c2c6b --- /dev/null +++ b/locale/hu/LC_MESSAGES/django.po @@ -0,0 +1,4531 @@ +msgid "" +msgstr "" +"Project-Id-Version: dmoj\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-11-11 21:54+0000\n" +"PO-Revision-Date: 2019-11-11 22:05\n" +"Last-Translator: Icyene\n" +"Language-Team: Hungarian\n" +"Language: hu_HU\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: crowdin.com\n" +"X-Crowdin-Project: dmoj\n" +"X-Crowdin-Language: hu\n" +"X-Crowdin-File: django.po\n" + +#: dmoj/settings.py:337 +msgid "German" +msgstr "Német" + +#: dmoj/settings.py:338 +msgid "English" +msgstr "Angol" + +#: dmoj/settings.py:339 +msgid "Spanish" +msgstr "Spanyol" + +#: dmoj/settings.py:340 +msgid "French" +msgstr "Francia" + +#: dmoj/settings.py:341 +msgid "Croatian" +msgstr "Horvát" + +#: dmoj/settings.py:342 +msgid "Hungarian" +msgstr "" + +#: dmoj/settings.py:343 +msgid "Japanese" +msgstr "" + +#: dmoj/settings.py:344 +msgid "Korean" +msgstr "Koreai" + +#: dmoj/settings.py:345 +msgid "Brazilian Portuguese" +msgstr "" + +#: dmoj/settings.py:346 +msgid "Romanian" +msgstr "Román" + +#: dmoj/settings.py:347 +msgid "Russian" +msgstr "Orosz" + +#: dmoj/settings.py:348 +msgid "Serbian (Latin)" +msgstr "Szerb (latin)" + +#: dmoj/settings.py:349 +msgid "Turkish" +msgstr "" + +#: dmoj/settings.py:350 +msgid "Vietnamese" +msgstr "Vietnami" + +#: dmoj/settings.py:351 +msgid "Simplified Chinese" +msgstr "Egyszerűsített kínai" + +#: dmoj/urls.py:54 +msgid "Login" +msgstr "Belépés" + +#: dmoj/urls.py:102 templates/base.html:190 +msgid "Home" +msgstr "Nyitólap" + +#: judge/admin/comments.py:40 +#, python-format +msgid "%d comment successfully hidden." +msgid_plural "%d comments successfully hidden." +msgstr[0] "%d hozzászólás sikeresen elrejtve." +msgstr[1] "%d hozzászólás elrejtve." + +#: judge/admin/comments.py:43 +msgid "Hide comments" +msgstr "Kommentek elrejtése" + +#: judge/admin/comments.py:47 +#, python-format +msgid "%d comment successfully unhidden." +msgid_plural "%d comments successfully unhidden." +msgstr[0] "%d megjegyzés újra megjelenítve." +msgstr[1] "%d megjegyzés újra megjelenítve." + +#: judge/admin/comments.py:50 +msgid "Unhide comments" +msgstr "Kommentek megjelenítése" + +#: judge/admin/comments.py:58 +msgid "Associated page" +msgstr "Kapcsolódó lap" + +#: judge/admin/contest.py:29 +msgid "Included contests" +msgstr "Hozzárendelt versenyek" + +#: judge/admin/contest.py:65 templates/contest/contest.html:83 +#: templates/contest/moss.html:43 templates/problem/list.html:206 +#: templates/problem/list.html:221 templates/user/user-problems.html:56 +#: templates/user/user-problems.html:98 +msgid "Problem" +msgstr "Feladat" + +#: judge/admin/contest.py:113 +msgid "Settings" +msgstr "" + +#: judge/admin/contest.py:115 +msgid "Scheduling" +msgstr "Időbeosztás" + +#: judge/admin/contest.py:116 +msgid "Details" +msgstr "Részletek" + +#: judge/admin/contest.py:117 +msgid "Format" +msgstr "" + +#: judge/admin/contest.py:118 templates/contest/ranking-table.html:5 +msgid "Rating" +msgstr "Értékelés" + +#: judge/admin/contest.py:119 +msgid "Access" +msgstr "" + +#: judge/admin/contest.py:121 judge/admin/problem.py:131 +msgid "Justice" +msgstr "Igazságszolgáltatás" + +#: judge/admin/contest.py:159 +#, 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:162 +msgid "Mark contests as visible" +msgstr "" + +#: judge/admin/contest.py:166 +#, 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:169 +msgid "Mark contests as hidden" +msgstr "" + +#: judge/admin/contest.py:180 judge/admin/submission.py:149 +#: judge/admin/submission.py:171 +msgid "You do not have the permission to rejudge submissions." +msgstr "Nincs jogosultságod a feltöltések újratesztelésére." + +#: judge/admin/contest.py:187 judge/admin/submission.py:155 +msgid "You do not have the permission to rejudge THAT many submissions." +msgstr "Nincs jogosultságod ilyen sok feltöltés újratesztelésére." + +#: judge/admin/contest.py:194 judge/admin/submission.py:164 +#, 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:265 +#, python-format +msgid "%d participation recalculated." +msgid_plural "%d participations recalculated." +msgstr[0] "" +msgstr[1] "" + +#: judge/admin/contest.py:268 +msgid "Recalculate results" +msgstr "" + +#: judge/admin/contest.py:272 judge/admin/organization.py:65 +msgid "username" +msgstr "felhasználónév" + +#: judge/admin/contest.py:277 templates/base.html:258 +msgid "virtual" +msgstr "virtuális" + +#: judge/admin/interface.py:28 judge/models/interface.py:46 +msgid "link path" +msgstr "csatolási útvonal" + +#: judge/admin/interface.py:62 +msgid "Content" +msgstr "Tartalom" + +#: judge/admin/interface.py:63 +msgid "Summary" +msgstr "Összefoglalás" + +#: judge/admin/interface.py:107 judge/models/contest.py:251 +#: judge/models/contest.py:355 judge/models/profile.py:189 +msgid "user" +msgstr "felhasználó" + +#: judge/admin/interface.py:148 +msgid "object" +msgstr "" + +#: judge/admin/organization.py:34 judge/admin/problem.py:171 +#: judge/admin/profile.py:78 +msgid "View on site" +msgstr "Nézd meg élesben" + +#: judge/admin/problem.py:28 +msgid "Describe the changes you made (optional)" +msgstr "Ismertesd a módosításokat (opcionális)" + +#: judge/admin/problem.py:126 +msgid "Social Media" +msgstr "Közösségi média" + +#: judge/admin/problem.py:127 +msgid "Taxonomy" +msgstr "Rendszerezés" + +#: judge/admin/problem.py:128 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:58 +msgid "Points" +msgstr "Pontok" + +#: judge/admin/problem.py:129 +msgid "Limits" +msgstr "Limitek" + +#: judge/admin/problem.py:130 judge/admin/submission.py:232 +#: templates/stats/base.html:14 templates/submission/list.html:328 +msgid "Language" +msgstr "Nyelv" + +#: judge/admin/problem.py:132 +msgid "History" +msgstr "Előzmények" + +#: judge/admin/problem.py:168 +msgid "Authors" +msgstr "Szerzők" + +#: judge/admin/problem.py:183 +#, 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:187 +msgid "Mark problems as public" +msgstr "Jelöld publikusnak a problémákat" + +#: judge/admin/problem.py:193 +#, 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:197 +msgid "Mark problems as private" +msgstr "Jelöld a problémákat privátnak" + +#: judge/admin/profile.py:32 +msgid "timezone" +msgstr "időzóna" + +#: judge/admin/profile.py:84 judge/admin/submission.py:211 +#: templates/organization/requests/log.html:9 +#: templates/organization/requests/pending.html:12 +#: templates/ticket/list.html:263 +msgid "User" +msgstr "Felhasználó" + +#: judge/admin/profile.py:89 templates/registration/registration_form.html:145 +msgid "Email" +msgstr "Email" + +#: judge/admin/profile.py:94 judge/views/register.py:29 +#: templates/registration/registration_form.html:173 +#: templates/user/edit-profile.html:99 +msgid "Timezone" +msgstr "Időzóna" + +#: judge/admin/profile.py:99 +msgid "date joined" +msgstr "csatlakozás dátuma" + +#: judge/admin/profile.py:106 +#, 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:109 +msgid "Recalculate scores" +msgstr "Pontok újraszámítása" + +#: judge/admin/runtime.py:19 +msgid "Disallowed problems" +msgstr "Tiltott feladatok" + +#: judge/admin/runtime.py:22 +msgid "These problems are NOT allowed to be submitted in this language" +msgstr "Ezekre a feladatokra nem lehet megoldást beküldeni ezen a nyelven" + +#: judge/admin/runtime.py:83 +msgid "Description" +msgstr "Leírás" + +#: judge/admin/runtime.py:84 +msgid "Information" +msgstr "Információ" + +#: judge/admin/runtime.py:85 +msgid "Capabilities" +msgstr "Képességek" + +#: judge/admin/submission.py:23 judge/admin/submission.py:42 +#: judge/admin/submission.py:221 +msgid "None" +msgstr "Semmi" + +#: judge/admin/submission.py:23 +msgid "Not done" +msgstr "Nincs kész" + +#: judge/admin/submission.py:23 +msgid "Exceptional" +msgstr "Kivételes" + +#: judge/admin/submission.py:42 +msgid "Unaccepted" +msgstr "Nem elfogadott" + +#: judge/admin/submission.py:89 +#, python-format +msgctxt "contest problem" +msgid "%(problem)s in %(contest)s" +msgstr "%(problem)s - %(contest)s" + +#: judge/admin/submission.py:167 +msgid "Rejudge the selected submissions" +msgstr "A kiválasztott feltöltések újratesztelése" + +#: judge/admin/submission.py:193 judge/views/problem_manage.py:128 +#, python-format +msgid "%d submission were successfully rescored." +msgid_plural "%d submissions were successfully rescored." +msgstr[0] "%d feltöltés sikeresen újrapontozva." +msgstr[1] "%d feltöltés sikeresen újrapontozva." + +#: judge/admin/submission.py:196 +msgid "Rescore the selected submissions" +msgstr "A kiválasztott feltöltések újrapontozása" + +#: judge/admin/submission.py:200 +msgid "Problem code" +msgstr "Feladat azonosító" + +#: judge/admin/submission.py:205 +msgid "Problem name" +msgstr "Feladat név" + +#: judge/admin/submission.py:215 templates/organization/requests/log.html:10 +#: templates/organization/requests/pending.html:13 +msgid "Time" +msgstr "Idő" + +#: judge/admin/submission.py:223 +#, python-format +msgid "%d KB" +msgstr "%d KB" + +#: judge/admin/submission.py:225 +#, python-format +msgid "%.2f MB" +msgstr "%.2f MB" + +#: judge/admin/submission.py:227 +msgid "Memory" +msgstr "Memória" + +#: judge/admin/taxon.py:11 judge/admin/taxon.py:34 +msgid "Included problems" +msgstr "Mellékelt problémák" + +#: judge/admin/taxon.py:14 +msgid "These problems are included in this group of problems" +msgstr "Ezek a problémák tartoznak ehhez a csoporthoz" + +#: judge/admin/taxon.py:37 +msgid "These problems are included in this type of problems" +msgstr "Ezek a problémák tartoznak ehhez a típushoz" + +#: judge/apps.py:8 +msgid "Online Judge" +msgstr "Online tesztelő" + +#: judge/comments.py:41 +msgid "Comment body" +msgstr "Hozzászólás törzse" + +#: judge/comments.py:47 judge/views/ticket.py:46 +msgid "Your part is silent, little toad." +msgstr "Az útvonalad csendes, kis varangy." + +#: judge/comments.py:50 templates/comments/list.html:131 +msgid "You need to have solved at least one problem before your voice can be heard." +msgstr "Legalább 1 feladatot meg kell oldanod mielőtt hozzászólsz." + +#: judge/comments.py:92 +msgid "Posted comment" +msgstr "Elküldött hozzászólás" + +#: judge/contest_format/atcoder.py:19 +msgid "AtCoder" +msgstr "" + +#: judge/contest_format/default.py:18 +msgid "Default" +msgstr "" + +#: judge/contest_format/ecoo.py:19 +msgid "ECOO" +msgstr "" + +#: judge/contest_format/ioi.py:19 +msgid "IOI" +msgstr "" + +#: judge/forms.py:27 +msgid "Subscribe to contest updates" +msgstr "Iratkozz fel hírlevelünkre" + +#: judge/forms.py:28 +msgid "Enable experimental features" +msgstr "Kísérleti funkciók engedélyezése" + +#: judge/forms.py:57 judge/views/organization.py:127 +#, 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:107 judge/views/register.py:26 +#: templates/registration/registration_form.html:139 +#: templates/user/base-users-table.html:5 +msgid "Username" +msgstr "Felhasználóinév" + +#: judge/forms.py:108 templates/registration/registration_form.html:151 +#: templates/registration/registration_form.html:165 +msgid "Password" +msgstr "Jelszó" + +#: judge/forms.py:130 +msgid "Two Factor Authentication tokens must be 6 decimal digits." +msgstr "" + +#: judge/forms.py:139 templates/registration/totp_auth.html:32 +msgid "Invalid Two Factor Authentication token." +msgstr "" + +#: judge/forms.py:143 judge/models/problem.py:97 +msgid "Problem code must be ^[a-z0-9]+$" +msgstr "A feladat azonosítónak ^[a-z0-9]+$ kell lennie" + +#: judge/forms.py:148 +msgid "Problem with code already exists." +msgstr "" + +#: judge/forms.py:153 judge/models/contest.py:51 +msgid "Contest id must be ^[a-z0-9]+$" +msgstr "A verseny azonosítójának ^[a-z0-9]+$ kell lennie" + +#: judge/forms.py:158 +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 "N j, Y, g:i a" + +#: judge/jinja2/datetime.py:26 +#, python-brace-format +msgid "{time}" +msgstr "{time}" + +#: judge/jinja2/datetime.py:26 +#, python-brace-format +msgid "on {time}" +msgstr "{time}-kor" + +#: judge/models/choices.py:59 +msgid "Leave as LaTeX" +msgstr "Hagy LaTeX-ként" + +#: judge/models/choices.py:60 +msgid "SVG with PNG fallback" +msgstr "SVG PNG fallbackkel" + +#: judge/models/choices.py:61 +msgid "MathML only" +msgstr "Csak MathML" + +#: judge/models/choices.py:62 +msgid "MathJax with SVG/PNG fallback" +msgstr "MathJax SVG/PNG fallback-kel" + +#: judge/models/choices.py:63 +msgid "Detect best quality" +msgstr "Legjobb minőség detektálása" + +#: judge/models/comment.py:25 +msgid "Page code must be ^[pcs]:[a-z0-9]+$|^b:\\d+$" +msgstr "" + +#: judge/models/comment.py:41 +msgid "commenter" +msgstr "hozzászóló" + +#: judge/models/comment.py:42 +msgid "posted time" +msgstr "hozzászólás ideje" + +#: judge/models/comment.py:43 judge/models/comment.py:176 +msgid "associated page" +msgstr "" + +#: judge/models/comment.py:45 +msgid "votes" +msgstr "szavazatok" + +#: judge/models/comment.py:46 +msgid "body of comment" +msgstr "hozzászólás törzse" + +#: judge/models/comment.py:47 +msgid "hide the comment" +msgstr "hozzászólás elrejtése" + +#: judge/models/comment.py:48 +msgid "parent" +msgstr "előzmény" + +#: judge/models/comment.py:53 +msgid "comment" +msgstr "hozzászólás" + +#: judge/models/comment.py:54 +msgid "comments" +msgstr "hozzászólások" + +#: judge/models/comment.py:136 judge/models/problem.py:406 +#, python-format +msgid "Editorial for %s" +msgstr "Megoldási útmutató %s-hez" + +#: judge/models/comment.py:171 +msgid "comment vote" +msgstr "hozzászólás értékelése" + +#: judge/models/comment.py:172 +msgid "comment votes" +msgstr "hozzászólás értékelései" + +#: judge/models/comment.py:181 +msgid "Override comment lock" +msgstr "" + +#: judge/models/contest.py:21 +msgid "Invalid colour." +msgstr "Érvénytelen szín." + +#: judge/models/contest.py:23 +msgid "tag name" +msgstr "címke neve" + +#: judge/models/contest.py:24 +msgid "Lowercase letters and hyphens only." +msgstr "Csak kisbetűk és kötőjelek." + +#: judge/models/contest.py:25 +msgid "tag colour" +msgstr "címke színe" + +#: judge/models/contest.py:26 +msgid "tag description" +msgstr "címke leírása" + +#: judge/models/contest.py:45 +msgid "contest tag" +msgstr "verseny címkéje" + +#: judge/models/contest.py:46 judge/models/contest.py:100 +msgid "contest tags" +msgstr "verseny cimkéi" + +#: judge/models/contest.py:50 +msgid "contest id" +msgstr "verseny azonosítója" + +#: judge/models/contest.py:52 +msgid "contest name" +msgstr "verseny neve" + +#: judge/models/contest.py:53 +msgid "These people will be able to edit the contest." +msgstr "Ezek az emberek szerkeszthetik a versenyt." + +#: judge/models/contest.py:55 judge/models/runtime.py:124 +#: src/dmoj-wpadmin/test_project/apps/books/admin.py:20 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:27 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:27 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:27 +msgid "description" +msgstr "leírás" + +#: judge/models/contest.py:56 judge/models/problem.py:353 +#: judge/models/runtime.py:126 +msgid "problems" +msgstr "feladatok" + +#: judge/models/contest.py:57 judge/models/contest.py:252 +msgid "start time" +msgstr "kezdés" + +#: judge/models/contest.py:58 +msgid "end time" +msgstr "befejezés" + +#: judge/models/contest.py:59 judge/models/problem.py:118 +#: judge/models/problem.py:377 +msgid "time limit" +msgstr "időkorlát" + +#: judge/models/contest.py:60 judge/models/problem.py:136 +msgid "publicly visible" +msgstr "nyilvánosan látható" + +#: judge/models/contest.py:61 +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:64 +msgid "contest rated" +msgstr "értékelt verseny" + +#: judge/models/contest.py:64 +msgid "Whether this contest can be rated." +msgstr "Hogy ez a verseny értékelhető-e." + +#: judge/models/contest.py:66 +msgid "hide scoreboard" +msgstr "" + +#: judge/models/contest.py:67 +msgid "Whether the scoreboard should remain hidden for the duration of the contest." +msgstr "" + +#: judge/models/contest.py:70 +msgid "no comments" +msgstr "nincsenek hozzászólások" + +#: judge/models/contest.py:71 +msgid "Use clarification system instead of comments." +msgstr "A pontosítási rendszer használata hozzászólások helyett." + +#: judge/models/contest.py:73 +msgid "Rating floor for contest" +msgstr "" + +#: judge/models/contest.py:75 +msgid "Rating ceiling for contest" +msgstr "" + +#: judge/models/contest.py:77 +msgid "rate all" +msgstr "összes értékelése" + +#: judge/models/contest.py:77 +msgid "Rate all users who joined." +msgstr "Értékelése az összes felhasználónak, aki csatlakozott." + +#: judge/models/contest.py:78 +msgid "exclude from ratings" +msgstr "kizárás a értékelésből" + +#: judge/models/contest.py:80 +msgid "private to specific users" +msgstr "" + +#: judge/models/contest.py:81 +msgid "private contestants" +msgstr "" + +#: judge/models/contest.py:82 +msgid "If private, only these users may see the contest" +msgstr "" + +#: judge/models/contest.py:84 +msgid "hide problem tags" +msgstr "feladat címkék elrejtése" + +#: judge/models/contest.py:85 +msgid "Whether problem tags should be hidden by default." +msgstr "" + +#: judge/models/contest.py:87 +msgid "run pretests only" +msgstr "csak pretesztek futtatása" + +#: judge/models/contest.py:88 +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:92 judge/models/problem.py:157 +msgid "private to organizations" +msgstr "privát a csoport számára" + +#: judge/models/contest.py:93 judge/models/problem.py:155 +#: judge/models/profile.py:76 +msgid "organizations" +msgstr "csoportok" + +#: judge/models/contest.py:94 +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:95 judge/models/problem.py:145 +msgid "OpenGraph image" +msgstr "OpenGraph kép" + +#: judge/models/contest.py:96 judge/models/profile.py:47 +msgid "Logo override image" +msgstr "" + +#: judge/models/contest.py:98 +msgid "This image will replace the default site logo for users inside the contest." +msgstr "" + +#: judge/models/contest.py:101 +msgid "the amount of live participants" +msgstr "az éles résztvevők száma" + +#: judge/models/contest.py:102 +msgid "contest summary" +msgstr "verseny összefoglaló" + +#: judge/models/contest.py:103 judge/models/problem.py:147 +msgid "Plain-text, shown in meta description tag, e.g. for social media." +msgstr "" + +#: judge/models/contest.py:104 judge/models/profile.py:46 +msgid "access code" +msgstr "hozzáférési kód" + +#: judge/models/contest.py:105 +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:107 judge/models/problem.py:141 +msgid "personae non gratae" +msgstr "nemkívánatos személy" + +#: judge/models/contest.py:108 +msgid "Bans the selected users from joining this contest." +msgstr "" + +#: judge/models/contest.py:109 +msgid "contest format" +msgstr "" + +#: judge/models/contest.py:110 +msgid "The contest format module to use." +msgstr "" + +#: judge/models/contest.py:111 +msgid "contest format configuration" +msgstr "" + +#: judge/models/contest.py:112 +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:233 +msgid "See private contests" +msgstr "Privát versenyek mutatása" + +#: judge/models/contest.py:234 +msgid "Edit own contests" +msgstr "Saját versenyek szerkesztése" + +#: judge/models/contest.py:235 +msgid "Edit all contests" +msgstr "Az összes verseny szerkesztése" + +#: judge/models/contest.py:236 +msgid "Clone contest" +msgstr "" + +#: judge/models/contest.py:237 templates/contest/moss.html:74 +msgid "MOSS contest" +msgstr "" + +#: judge/models/contest.py:238 +msgid "Rate contests" +msgstr "Versenyek értékelése" + +#: judge/models/contest.py:239 +msgid "Contest access codes" +msgstr "Verseny hozzáférési kódok" + +#: judge/models/contest.py:240 +msgid "Create private contests" +msgstr "" + +#: judge/models/contest.py:242 judge/models/contest.py:320 +#: judge/models/contest.py:356 judge/models/contest.py:378 +#: judge/models/submission.py:83 +msgid "contest" +msgstr "verseny" + +#: judge/models/contest.py:243 +msgid "contests" +msgstr "versenyek" + +#: judge/models/contest.py:250 +msgid "associated contest" +msgstr "" + +#: judge/models/contest.py:253 +msgid "score" +msgstr "pontszám" + +#: judge/models/contest.py:254 +msgid "cumulative time" +msgstr "összes idő" + +#: judge/models/contest.py:255 +msgid "virtual participation id" +msgstr "virtuális részvételi azonosító" + +#: judge/models/contest.py:256 +msgid "0 means non-virtual, otherwise the n-th virtual participation" +msgstr "A 0 nem virtuális, egyébként az n. virtuális részvétel" + +#: judge/models/contest.py:257 +msgid "contest format specific data" +msgstr "" + +#: judge/models/contest.py:306 +#, python-format +msgid "%s spectating in %s" +msgstr "%s megfigyel %s-ben" + +#: judge/models/contest.py:308 +#, python-format +msgid "%s in %s, v%d" +msgstr "%s en %s, v%d" + +#: judge/models/contest.py:309 +#, python-format +msgid "%s in %s" +msgstr "%s %s-ben" + +#: judge/models/contest.py:312 +msgid "contest participation" +msgstr "verseny részvétel" + +#: judge/models/contest.py:313 +msgid "contest participations" +msgstr "verseny részvételek" + +#: judge/models/contest.py:319 judge/models/contest.py:340 +#: judge/models/contest.py:379 judge/models/problem.py:352 +#: judge/models/problem.py:357 judge/models/problem.py:375 +#: judge/models/problem_data.py:35 +msgid "problem" +msgstr "feladat" + +#: judge/models/contest.py:321 judge/models/contest.py:344 +#: judge/models/problem.py:129 +msgid "points" +msgstr "pontok" + +#: judge/models/contest.py:322 +msgid "partial" +msgstr "részleges" + +#: judge/models/contest.py:323 judge/models/contest.py:345 +msgid "is pretested" +msgstr "pretesztes-e" + +#: judge/models/contest.py:324 judge/models/interface.py:43 +msgid "order" +msgstr "sorrend" + +#: judge/models/contest.py:325 +msgid "output prefix length override" +msgstr "" + +#: judge/models/contest.py:326 +msgid "Maximum number of submissions for this problem, or 0 for no limit." +msgstr "A feltöltések maximális száma, 0 esetén nincs korlát." + +#: judge/models/contest.py:328 +msgid "Why include a problem you can't submit to?" +msgstr "" + +#: judge/models/contest.py:333 +msgid "contest problem" +msgstr "versenyfeladat" + +#: judge/models/contest.py:334 +msgid "contest problems" +msgstr "versenyfeladatok" + +#: judge/models/contest.py:338 judge/models/submission.py:181 +msgid "submission" +msgstr "feltöltés" + +#: judge/models/contest.py:342 judge/models/contest.py:357 +msgid "participation" +msgstr "részvétel" + +#: judge/models/contest.py:346 +msgid "Whether this submission was ran only on pretests." +msgstr "" + +#: judge/models/contest.py:350 +msgid "contest submission" +msgstr "verseny feltöltés" + +#: judge/models/contest.py:351 +msgid "contest submissions" +msgstr "verseny feltöltések" + +#: judge/models/contest.py:359 +msgid "rank" +msgstr "helyezés" + +#: judge/models/contest.py:360 +msgid "rating" +msgstr "értékelés" + +#: judge/models/contest.py:361 +msgid "volatility" +msgstr "volatilitás" + +#: judge/models/contest.py:362 +msgid "last rated" +msgstr "utolsó értékelt" + +#: judge/models/contest.py:366 +msgid "contest rating" +msgstr "verseny értékelés" + +#: judge/models/contest.py:367 +msgid "contest ratings" +msgstr "verseny értékelések" + +#: judge/models/contest.py:386 +msgid "contest moss result" +msgstr "" + +#: judge/models/contest.py:387 +msgid "contest moss results" +msgstr "" + +#: judge/models/interface.py:24 +msgid "configuration item" +msgstr "konfigurációs elem" + +#: judge/models/interface.py:25 +msgid "miscellaneous configuration" +msgstr "vegyes konfigurációk" + +#: judge/models/interface.py:37 +msgid "navigation item" +msgstr "navigációs elem" + +#: judge/models/interface.py:38 +msgid "navigation bar" +msgstr "navigációs sáv" + +#: judge/models/interface.py:44 +msgid "identifier" +msgstr "azonosító" + +#: judge/models/interface.py:45 +msgid "label" +msgstr "címke" + +#: judge/models/interface.py:47 +msgid "highlight regex" +msgstr "regex kijelölése" + +#: judge/models/interface.py:48 +msgid "parent item" +msgstr "szülő elem" + +#: judge/models/interface.py:66 +msgid "post title" +msgstr "bejegyzés címe" + +#: judge/models/interface.py:67 judge/models/problem.py:395 +msgid "authors" +msgstr "szerzők" + +#: judge/models/interface.py:68 +msgid "slug" +msgstr "csonk" + +#: judge/models/interface.py:69 judge/models/problem.py:393 +msgid "public visibility" +msgstr "láthatóság" + +#: judge/models/interface.py:70 +msgid "sticky" +msgstr "kiemelt" + +#: judge/models/interface.py:71 +msgid "publish after" +msgstr "közzététel ezután" + +#: judge/models/interface.py:72 +msgid "post content" +msgstr "tartalom küldése" + +#: judge/models/interface.py:73 +msgid "post summary" +msgstr "tartalom összefoglalója" + +#: judge/models/interface.py:74 +msgid "openGraph image" +msgstr "openGraph kép" + +#: judge/models/interface.py:91 +msgid "Edit all posts" +msgstr "Összes poszt szerkesztése" + +#: judge/models/interface.py:93 +msgid "blog post" +msgstr "blog poszt" + +#: judge/models/interface.py:94 +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:29 +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:26 +msgid "problem category ID" +msgstr "feladat kategória azonosító" + +#: judge/models/problem.py:27 +msgid "problem category name" +msgstr "feladat kategória név" + +#: judge/models/problem.py:34 +msgid "problem type" +msgstr "feladat típus" + +#: judge/models/problem.py:35 judge/models/problem.py:113 +msgid "problem types" +msgstr "feladat típusok" + +#: judge/models/problem.py:39 +msgid "problem group ID" +msgstr "feladat csoport azonosító" + +#: judge/models/problem.py:40 +msgid "problem group name" +msgstr "feladat csoport név" + +#: judge/models/problem.py:47 judge/models/problem.py:116 +msgid "problem group" +msgstr "feladat csoport" + +#: judge/models/problem.py:48 +msgid "problem groups" +msgstr "feladat csoport nevek" + +#: judge/models/problem.py:52 +msgid "key" +msgstr "kulcs" + +#: judge/models/problem.py:54 +msgid "link" +msgstr "link" + +#: judge/models/problem.py:55 +msgid "full name" +msgstr "teljes név" + +#: judge/models/problem.py:56 judge/models/profile.py:32 +#: judge/models/runtime.py:23 +msgid "short name" +msgstr "rövid név" + +#: judge/models/problem.py:57 +msgid "Displayed on pages under this license" +msgstr "" + +#: judge/models/problem.py:58 +msgid "icon" +msgstr "ikon" + +#: judge/models/problem.py:58 +msgid "URL to the icon" +msgstr "URL az ikonhoz" + +#: judge/models/problem.py:59 +msgid "license text" +msgstr "licenc szöveg" + +#: judge/models/problem.py:68 +msgid "license" +msgstr "licenc" + +#: judge/models/problem.py:69 +msgid "licenses" +msgstr "licencek" + +#: judge/models/problem.py:96 +msgid "problem code" +msgstr "feladat azonosító" + +#: judge/models/problem.py:98 +msgid "A short, unique code for the problem, used in the url after /problem/" +msgstr "" + +#: judge/models/problem.py:100 +msgid "problem name" +msgstr "feladat név" + +#: judge/models/problem.py:101 +msgid "The full name of the problem, as shown in the problem list." +msgstr "" + +#: judge/models/problem.py:103 +msgid "problem body" +msgstr "feladat törzs" + +#: judge/models/problem.py:104 +msgid "creators" +msgstr "szerzők" + +#: judge/models/problem.py:105 +msgid "These users will be able to edit the problem, and be listed as authors." +msgstr "" + +#: judge/models/problem.py:107 +msgid "curators" +msgstr "kurátorok" + +#: judge/models/problem.py:108 +msgid "These users will be able to edit the problem, but not be listed as authors." +msgstr "" + +#: judge/models/problem.py:110 +msgid "testers" +msgstr "tesztelők" + +#: judge/models/problem.py:112 +msgid "These users will be able to view the private problem, but not edit it." +msgstr "" + +#: judge/models/problem.py:114 +msgid "The type of problem, as shown on the problem's page." +msgstr "" + +#: judge/models/problem.py:117 +msgid "The group of problem, shown under Category in the problem list." +msgstr "" + +#: judge/models/problem.py:119 +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:123 judge/models/problem.py:380 +msgid "memory limit" +msgstr "memória korlát" + +#: judge/models/problem.py:124 +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:130 +msgid "Points awarded for problem completion. Points are displayed with a 'p' suffix if partial." +msgstr "" + +#: judge/models/problem.py:133 +msgid "allows partial points" +msgstr "részleges pontok engedélyezése" + +#: judge/models/problem.py:134 +msgid "allowed languages" +msgstr "engedélyezett nyelvek" + +#: judge/models/problem.py:135 +msgid "List of allowed submission languages." +msgstr "" + +#: judge/models/problem.py:137 +msgid "manually managed" +msgstr "manuáisan kezelt" + +#: judge/models/problem.py:138 +msgid "Whether judges should be allowed to manage data or not." +msgstr "" + +#: judge/models/problem.py:139 +msgid "date of publishing" +msgstr "publikálás ideje" + +#: judge/models/problem.py:140 +msgid "Doesn't have magic ability to auto-publish due to backward compatibility" +msgstr "" + +#: judge/models/problem.py:142 +msgid "Bans the selected users from submitting to this problem." +msgstr "" + +#: judge/models/problem.py:144 +msgid "The license under which this problem is published." +msgstr "" + +#: judge/models/problem.py:146 +msgid "problem summary" +msgstr "feladat összefoglaló" + +#: judge/models/problem.py:148 +msgid "number of users" +msgstr "" + +#: judge/models/problem.py:149 +msgid "The number of users who solved the problem." +msgstr "" + +#: judge/models/problem.py:150 +msgid "solve rate" +msgstr "" + +#: judge/models/problem.py:156 +msgid "If private, only these organizations may see the problem." +msgstr "" + +#: judge/models/problem.py:358 judge/models/problem.py:376 +#: judge/models/runtime.py:99 +msgid "language" +msgstr "nyelv" + +#: judge/models/problem.py:359 +msgid "translated name" +msgstr "lefordított név" + +#: judge/models/problem.py:360 +msgid "translated description" +msgstr "lefordított leírás" + +#: judge/models/problem.py:364 +msgid "problem translation" +msgstr "feladat fordítás" + +#: judge/models/problem.py:365 +msgid "problem translations" +msgstr "feladat fordítások" + +#: judge/models/problem.py:369 +msgid "clarified problem" +msgstr "pontosított feladat" + +#: judge/models/problem.py:370 +msgid "clarification body" +msgstr "pontosítás törzse" + +#: judge/models/problem.py:371 +msgid "clarification timestamp" +msgstr "pontosítás időbélyege" + +#: judge/models/problem.py:386 +msgid "language-specific resource limit" +msgstr "nyelv specifikus erőforrás korlát" + +#: judge/models/problem.py:387 +msgid "language-specific resource limits" +msgstr "nyelv specifikus erőforrás korlátok" + +#: judge/models/problem.py:391 +msgid "associated problem" +msgstr "hozzárendelt probléma" + +#: judge/models/problem.py:394 +msgid "publish date" +msgstr "publikálás dátuma" + +#: judge/models/problem.py:396 +msgid "editorial content" +msgstr "megoldási útmutató tartalom" + +#: judge/models/problem.py:412 +msgid "solution" +msgstr "megoldás" + +#: judge/models/problem.py:413 +msgid "solutions" +msgstr "megoldások" + +#: judge/models/problem_data.py:23 +msgid "Standard" +msgstr "Alapértelmezett" + +#: judge/models/problem_data.py:24 +msgid "Floats" +msgstr "Lebegőpontosak" + +#: judge/models/problem_data.py:25 +msgid "Floats (absolute)" +msgstr "Lebegőpontosak (abszolút)" + +#: judge/models/problem_data.py:26 +msgid "Floats (relative)" +msgstr "Lebegőpontosak (relatív)" + +#: judge/models/problem_data.py:27 +msgid "Non-trailing spaces" +msgstr "" + +#: judge/models/problem_data.py:28 +msgid "Unordered" +msgstr "Rendezetlen" + +#: judge/models/problem_data.py:29 +msgid "Byte identical" +msgstr "Bájtonként azonos" + +#: judge/models/problem_data.py:30 +msgid "Line-by-line" +msgstr "" + +#: judge/models/problem_data.py:37 +msgid "data zip file" +msgstr "adat zip fájl" + +#: judge/models/problem_data.py:39 +msgid "generator file" +msgstr "generátor fájl" + +#: judge/models/problem_data.py:41 judge/models/problem_data.py:90 +msgid "output prefix length" +msgstr "kimeneti prefix hossza" + +#: judge/models/problem_data.py:42 judge/models/problem_data.py:91 +msgid "output limit length" +msgstr "kimenet hossz limitje" + +#: judge/models/problem_data.py:43 +msgid "init.yml generation feedback" +msgstr "init.yml generálás visszajelzése" + +#: judge/models/problem_data.py:44 judge/models/problem_data.py:92 +msgid "checker" +msgstr "checker" + +#: judge/models/problem_data.py:45 judge/models/problem_data.py:93 +msgid "checker arguments" +msgstr "checker argumentumai" + +#: judge/models/problem_data.py:46 judge/models/problem_data.py:94 +msgid "checker arguments as a JSON object" +msgstr "chceker argumentumai JSON objektumként" + +#: judge/models/problem_data.py:77 +msgid "problem data set" +msgstr "feladat adathalmaz" + +#: judge/models/problem_data.py:79 +msgid "case position" +msgstr "eset hely" + +#: judge/models/problem_data.py:80 +msgid "case type" +msgstr "eset típus" + +#: judge/models/problem_data.py:81 +msgid "Normal case" +msgstr "Normál eset" + +#: judge/models/problem_data.py:82 +msgid "Batch start" +msgstr "Batch kezdete" + +#: judge/models/problem_data.py:83 +msgid "Batch end" +msgstr "Batch vége" + +#: judge/models/problem_data.py:85 +msgid "input file name" +msgstr "bemeneti fájl név" + +#: judge/models/problem_data.py:86 +msgid "output file name" +msgstr "kimeneti fájl név" + +#: judge/models/problem_data.py:87 +msgid "generator arguments" +msgstr "generátor argumentumai" + +#: judge/models/problem_data.py:88 +msgid "point value" +msgstr "pont érték" + +#: judge/models/problem_data.py:89 +msgid "case is pretest?" +msgstr "ez az eset preteszt?" + +#: judge/models/profile.py:29 +msgid "organization title" +msgstr "csoport neve" + +#: judge/models/profile.py:30 +msgid "organization slug" +msgstr "" + +#: judge/models/profile.py:31 +msgid "Organization name shown in URL" +msgstr "" + +#: judge/models/profile.py:33 +msgid "Displayed beside user name during contests" +msgstr "A felhasználóinév mellett van a versenyek alatt" + +#: judge/models/profile.py:34 +msgid "organization description" +msgstr "csoport leírás" + +#: judge/models/profile.py:35 +msgid "registrant" +msgstr "nyilvántartóba felvett személy" + +#: judge/models/profile.py:36 +msgid "User who registered this organization" +msgstr "Felhasználók akik regisztrálták ezt a csoportot" + +#: judge/models/profile.py:37 +msgid "administrators" +msgstr "adminisztrátorok" + +#: judge/models/profile.py:38 +msgid "Those who can edit this organization" +msgstr "Azok, akik szerkeszteni tudják ezt a csoportot" + +#: judge/models/profile.py:39 +msgid "creation date" +msgstr "létrehozás dátuma" + +#: judge/models/profile.py:40 +msgid "is open organization?" +msgstr "nyílt-e a csoport?" + +#: judge/models/profile.py:41 +msgid "Allow joining organization" +msgstr "A csoportba való belépés engedélyezése" + +#: judge/models/profile.py:42 +msgid "maximum size" +msgstr "maximális méret" + +#: judge/models/profile.py:43 +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:45 +msgid "Student access code" +msgstr "Tanulói hozzáférési kódok" + +#: judge/models/profile.py:49 +msgid "This image will replace the default site logo for users viewing the organization." +msgstr "" + +#: judge/models/profile.py:75 judge/models/profile.py:91 +#: judge/models/profile.py:190 +msgid "organization" +msgstr "csoport" + +#: judge/models/profile.py:80 +msgid "user associated" +msgstr "felhasználóhoz társult" + +#: judge/models/profile.py:81 +msgid "self-description" +msgstr "önleírás" + +#: judge/models/profile.py:82 +msgid "location" +msgstr "helyszín" + +#: judge/models/profile.py:84 +msgid "preferred language" +msgstr "preferált nyelv" + +#: judge/models/profile.py:89 +msgid "last access time" +msgstr "utolsó belépés ideje" + +#: judge/models/profile.py:90 +msgid "last IP" +msgstr "utolsó IP" + +#: judge/models/profile.py:93 +msgid "display rank" +msgstr "megjelenített rang" + +#: judge/models/profile.py:95 +msgid "comment mute" +msgstr "hozzászólás lenémítása" + +#: judge/models/profile.py:95 +msgid "Some users are at their best when silent." +msgstr "Néhány felhasználó a legjobb amikor csendesek." + +#: judge/models/profile.py:97 +msgid "unlisted user" +msgstr "" + +#: judge/models/profile.py:97 +msgid "User will not be ranked." +msgstr "" + +#: judge/models/profile.py:100 +msgid "user script" +msgstr "felhasználói szkript" + +#: judge/models/profile.py:101 +msgid "User-defined JavaScript for site customization." +msgstr "Felhasználó által meghatározott JavaScript a webhely testreszabásához." + +#: judge/models/profile.py:102 +msgid "current contest" +msgstr "jelenlegi verseny" + +#: judge/models/profile.py:104 +msgid "math engine" +msgstr "matek motor" + +#: judge/models/profile.py:106 +msgid "the rendering engine used to render math" +msgstr "a matek ábrákat renderelő motor" + +#: judge/models/profile.py:107 +msgid "2FA enabled" +msgstr "" + +#: judge/models/profile.py:108 +msgid "check to enable TOTP-based two factor authentication" +msgstr "" + +#: judge/models/profile.py:109 +msgid "TOTP key" +msgstr "" + +#: judge/models/profile.py:110 +msgid "32 character base32-encoded key for TOTP" +msgstr "" + +#: judge/models/profile.py:112 +msgid "TOTP key must be empty or base32" +msgstr "" + +#: judge/models/profile.py:113 +msgid "internal notes" +msgstr "" + +#: judge/models/profile.py:114 +msgid "Notes for administrators regarding this user." +msgstr "" + +#: judge/models/profile.py:184 +msgid "user profile" +msgstr "felhasználói profil" + +#: judge/models/profile.py:185 +msgid "user profiles" +msgstr "felhasználói profilok" + +#: judge/models/profile.py:192 +msgid "request time" +msgstr "kérési idő" + +#: judge/models/profile.py:193 +msgid "state" +msgstr "állapot" + +#: judge/models/profile.py:198 +msgid "reason" +msgstr "ok" + +#: judge/models/profile.py:201 +msgid "organization join request" +msgstr "csoport belépési kérelem" + +#: judge/models/profile.py:202 +msgid "organization join requests" +msgstr "csoport belépési kérelmek" + +#: judge/models/runtime.py:18 +msgid "short identifier" +msgstr "rövid azonosító" + +#: judge/models/runtime.py:19 +msgid "The identifier for this language; the same as its executor id for judges." +msgstr "Ennek a nyelvnek az azonosítója ugyanaz mint a bírók végrehajtó id-ja." + +#: judge/models/runtime.py:21 +msgid "long name" +msgstr "hosszú név" + +#: judge/models/runtime.py:22 +msgid "Longer name for the language, e.g. \"Python 2\" or \"C++11\"." +msgstr "" + +#: judge/models/runtime.py:24 +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:28 +msgid "common name" +msgstr "" + +#: judge/models/runtime.py:29 +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:31 +msgid "ace mode name" +msgstr "" + +#: judge/models/runtime.py:32 +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:34 +msgid "pygments name" +msgstr "" + +#: judge/models/runtime.py:35 +msgid "Language ID for Pygments highlighting in source windows." +msgstr "" + +#: judge/models/runtime.py:36 +msgid "code template" +msgstr "kód mintasablon" + +#: judge/models/runtime.py:37 +msgid "Code template to display in submission editor." +msgstr "" + +#: judge/models/runtime.py:38 +msgid "runtime info override" +msgstr "" + +#: judge/models/runtime.py:39 +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:41 +msgid "language description" +msgstr "nyelv leírás" + +#: judge/models/runtime.py:42 +msgid "Use field this to inform users of quirks with your environment, additional restrictions, etc." +msgstr "" + +#: judge/models/runtime.py:44 +msgid "extension" +msgstr "kiterjesztés" + +#: judge/models/runtime.py:45 +msgid "The extension of source files, e.g., \"py\" or \"cpp\"." +msgstr "" + +#: judge/models/runtime.py:100 +msgid "languages" +msgstr "nyelvek" + +#: judge/models/runtime.py:104 +msgid "language to which this runtime belongs" +msgstr "" + +#: judge/models/runtime.py:105 +msgid "judge on which this runtime exists" +msgstr "" + +#: judge/models/runtime.py:106 +msgid "runtime name" +msgstr "runtime név" + +#: judge/models/runtime.py:107 +msgid "runtime version" +msgstr "runtime verzió" + +#: judge/models/runtime.py:108 +msgid "order in which to display this runtime" +msgstr "" + +#: judge/models/runtime.py:112 +msgid "Server name, hostname-style" +msgstr "Szerver név, hosztnév-szerűen" + +#: judge/models/runtime.py:113 +msgid "time of creation" +msgstr "létrehozás dátuma" + +#: judge/models/runtime.py:114 +msgid "A key to authenticated this judge" +msgstr "A tesztelőhöz hozzárendelt kulcs" + +#: judge/models/runtime.py:115 +msgid "authentication key" +msgstr "hitelesítő kulcs" + +#: judge/models/runtime.py:116 +msgid "block judge" +msgstr "" + +#: judge/models/runtime.py:117 +msgid "Whether this judge should be blocked from connecting, even if its key is correct." +msgstr "" + +#: judge/models/runtime.py:119 +msgid "judge online status" +msgstr "tesztelő státusza" + +#: judge/models/runtime.py:120 +msgid "judge start time" +msgstr "tesztelő indítási ideje" + +#: judge/models/runtime.py:121 +msgid "response time" +msgstr "válaszidő" + +#: judge/models/runtime.py:122 +msgid "system load" +msgstr "rendszer terheltsége" + +#: judge/models/runtime.py:123 +msgid "Load for the last minute, divided by processors to be fair." +msgstr "" + +#: judge/models/runtime.py:127 judge/models/runtime.py:167 +msgid "judges" +msgstr "bírók" + +#: judge/models/runtime.py:166 +msgid "judge" +msgstr "bíró" + +#: judge/models/submission.py:20 judge/models/submission.py:47 +#: judge/utils/problems.py:86 +msgid "Accepted" +msgstr "Elfogadva" + +#: judge/models/submission.py:21 judge/models/submission.py:48 +msgid "Wrong Answer" +msgstr "Rossz válasz" + +#: judge/models/submission.py:22 judge/models/submission.py:50 +msgid "Time Limit Exceeded" +msgstr "Időlimit túllépés" + +#: judge/models/submission.py:23 judge/models/submission.py:51 +msgid "Memory Limit Exceeded" +msgstr "Memórialimit túllépés" + +#: judge/models/submission.py:24 judge/models/submission.py:52 +msgid "Output Limit Exceeded" +msgstr "Kimenetlimint túllépés" + +#: judge/models/submission.py:25 judge/models/submission.py:53 +msgid "Invalid Return" +msgstr "Érvénytelen visszatérés" + +#: judge/models/submission.py:26 judge/models/submission.py:54 +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:88 +msgid "Compile Error" +msgstr "Fordítási hiba" + +#: judge/models/submission.py:28 judge/models/submission.py:40 +msgid "Internal Error" +msgstr "Belső hiba" + +#: judge/models/submission.py:29 +msgid "Short circuit" +msgstr "" + +#: judge/models/submission.py:30 judge/models/submission.py:42 +#: judge/models/submission.py:61 +msgid "Aborted" +msgstr "Megszakítva" + +#: judge/models/submission.py:36 judge/models/submission.py:57 +msgid "Queued" +msgstr "Sorba állítva" + +#: judge/models/submission.py:37 judge/models/submission.py:58 +msgid "Processing" +msgstr "Feldolgozás alatt" + +#: judge/models/submission.py:38 judge/models/submission.py:59 +msgid "Grading" +msgstr "Pontozás" + +#: judge/models/submission.py:39 judge/models/submission.py:60 +msgid "Completed" +msgstr "" + +#: judge/models/submission.py:56 +msgid "Internal Error (judging server error)" +msgstr "Belső hiba (tesztelő szerver hiba)" + +#: judge/models/submission.py:66 +msgid "submission time" +msgstr "" + +#: judge/models/submission.py:67 judge/models/submission.py:201 +msgid "execution time" +msgstr "futási idő" + +#: judge/models/submission.py:68 judge/models/submission.py:202 +msgid "memory usage" +msgstr "memória használat" + +#: judge/models/submission.py:69 judge/models/submission.py:203 +msgid "points granted" +msgstr "" + +#: judge/models/submission.py:70 +msgid "submission language" +msgstr "" + +#: judge/models/submission.py:71 +msgid "status" +msgstr "állapot" + +#: judge/models/submission.py:72 +msgid "result" +msgstr "eredmény" + +#: judge/models/submission.py:74 +msgid "compile errors" +msgstr "fordítási hibák" + +#: judge/models/submission.py:76 +msgid "batched cases" +msgstr "" + +#: judge/models/submission.py:77 +msgid "test case points" +msgstr "teszteset pontjai" + +#: judge/models/submission.py:78 +msgid "test case total points" +msgstr "" + +#: judge/models/submission.py:79 +msgid "judged on" +msgstr "ezen tesztelve" + +#: judge/models/submission.py:81 +msgid "was rejudged by admin" +msgstr "" + +#: judge/models/submission.py:82 +msgid "was ran on pretests only" +msgstr "" + +#: judge/models/submission.py:182 templates/contest/moss.html:58 +msgid "submissions" +msgstr "" + +#: judge/models/submission.py:186 judge/models/submission.py:197 +msgid "associated submission" +msgstr "" + +#: judge/models/submission.py:188 +msgid "source code" +msgstr "forráskód" + +#: judge/models/submission.py:199 +msgid "test case ID" +msgstr "teszteset azonosító" + +#: judge/models/submission.py:200 +msgid "status flag" +msgstr "" + +#: judge/models/submission.py:204 +msgid "points possible" +msgstr "" + +#: judge/models/submission.py:205 +msgid "batch number" +msgstr "" + +#: judge/models/submission.py:206 +msgid "judging feedback" +msgstr "tesztelési visszajelzés" + +#: judge/models/submission.py:207 +msgid "extended judging feedback" +msgstr "" + +#: judge/models/submission.py:208 +msgid "program output" +msgstr "program kimenet" + +#: judge/models/submission.py:216 +msgid "submission test case" +msgstr "" + +#: judge/models/submission.py:217 +msgid "submission test cases" +msgstr "" + +#: judge/models/ticket.py:10 +msgid "ticket title" +msgstr "hibajegy címe" + +#: judge/models/ticket.py:11 +msgid "ticket creator" +msgstr "hibajegy készítője" + +#: judge/models/ticket.py:13 +msgid "creation time" +msgstr "létrehozás ideje" + +#: judge/models/ticket.py:14 +msgid "assignees" +msgstr "" + +#: judge/models/ticket.py:15 +msgid "quick notes" +msgstr "" + +#: judge/models/ticket.py:16 +msgid "Staff notes for this issue to aid in processing." +msgstr "" + +#: judge/models/ticket.py:17 +msgid "linked item type" +msgstr "" + +#: judge/models/ticket.py:19 +msgid "linked item ID" +msgstr "" + +#: judge/models/ticket.py:21 +msgid "is ticket open?" +msgstr "nyitva a jegy?" + +#: judge/models/ticket.py:25 +msgid "ticket" +msgstr "hibajegy" + +#: judge/models/ticket.py:27 +msgid "poster" +msgstr "" + +#: judge/models/ticket.py:30 +msgid "message time" +msgstr "" + +#: judge/pdf_problems.py:134 judge/pdf_problems.py:186 +#: judge/pdf_problems.py:246 +msgid "Page [page] of [topage]" +msgstr "" + +#: judge/tasks/moss.py:25 +msgid "Running MOSS" +msgstr "" + +#: judge/tasks/submission.py:43 +msgid "Modifying submissions" +msgstr "" + +#: judge/tasks/submission.py:56 +msgid "Recalculating user points" +msgstr "" + +#: judge/utils/problem_data.py:63 +msgid "Empty batches not allowed." +msgstr "" + +#: 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 +#, python-format +msgid "Input file for case %d does not exist: %s" +msgstr "Bemeneti fájl a %d esetre nem létezik: %s" + +#: judge/utils/problem_data.py:90 +#, python-format +msgid "Output file for case %d does not exist: %s" +msgstr "Kimeneti fájl a %d esetre nem létezik: %s" + +#: judge/utils/problem_data.py:115 +#, python-format +msgid "Batch start case #%d requires points." +msgstr "" + +#: 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 +msgid "How did you corrupt the zip path?" +msgstr "" + +#: judge/utils/problem_data.py:160 +msgid "How did you corrupt the generator path?" +msgstr "" + +#: judge/utils/problems.py:76 +msgid "Can't pass both queryset and keyword filters" +msgstr "" + +#: judge/utils/problems.py:87 +msgid "Wrong" +msgstr "" + +#: judge/utils/problems.py:89 +msgid "Timeout" +msgstr "" + +#: judge/utils/problems.py:90 +msgid "Error" +msgstr "" + +#: 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/timedelta.py:49 +msgctxt "time format with day" +msgid "%d day %h:%m:%s" +msgid_plural "%d days %h:%m:%s" +msgstr[0] "%d nap %h:%m:%s" +msgstr[1] "%d nap %h:%m:%s" + +#: judge/utils/timedelta.py:53 +msgctxt "time format without day" +msgid "%h:%m:%s" +msgstr "%h:%m:%s" + +#: 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] "%d nap %h:%m" +msgstr[1] "%d nap %h:%m" + +#: judge/utils/timedelta.py:61 +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d nap" +msgstr[1] "%d nap" + +#: judge/utils/timedelta.py:63 +msgctxt "hours and minutes" +msgid "%h:%m" +msgstr "%h:%m" + +#: judge/views/blog.py:38 +#, python-format +msgid "Page %d of Posts" +msgstr "" + +#: judge/views/comment.py:27 +msgid "Messing around, are we?" +msgstr "Játszogatunk, he?" + +#: judge/views/comment.py:36 +msgid "You must solve at least one problem before you can vote." +msgstr "" + +#: judge/views/comment.py:63 +msgid "You already voted." +msgstr "Már szavaztál." + +#: judge/views/comment.py:120 judge/views/organization.py:299 +msgid "Edited from site" +msgstr "Szerkesztve az oldalról" + +#: judge/views/comment.py:141 +msgid "Editing comment" +msgstr "Hozzászólás szerkesztése" + +#: judge/views/contests.py:49 judge/views/contests.py:211 +#: judge/views/contests.py:214 judge/views/contests.py:385 +msgid "No such contest" +msgstr "Nincs ilyen verseny" + +#: judge/views/contests.py:50 judge/views/contests.py:212 +#, python-format +msgid "Could not find a contest with the key \"%s\"." +msgstr "Nem található verseny a \"%s\" kulccsal." + +#: judge/views/contests.py:75 +msgid "Contests" +msgstr "Versenyek" + +#: judge/views/contests.py:215 +msgid "Could not find such contest." +msgstr "Nem található ilyen verseny." + +#: judge/views/contests.py:218 +#, python-format +msgid "Access to contest \"%s\" denied" +msgstr "Hozzáférés a \"%s\" versenyhez megtagadva" + +#: judge/views/contests.py:242 +msgid "Clone Contest" +msgstr "" + +#: judge/views/contests.py:305 +msgid "Contest not ongoing" +msgstr "A verseny nincs folyamatban" + +#: judge/views/contests.py:306 +#, python-format +msgid "\"%s\" is not currently ongoing." +msgstr "\"%s\" nincs folyamatban." + +#: judge/views/contests.py:310 +msgid "Already in contest" +msgstr "Már a versenyben vagy" + +#: judge/views/contests.py:311 +#, python-format +msgid "You are already in a contest: \"%s\"." +msgstr "Már a \"%s\" versenyben vagy." + +#: judge/views/contests.py:314 +msgid "Banned from joining" +msgstr "" + +#: judge/views/contests.py:315 +msgid "You have been declared persona non grata for this contest. You are permanently barred from joining this contest." +msgstr "" + +#: judge/views/contests.py:375 +#, 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:386 +#, python-format +msgid "You are not in contest \"%s\"." +msgstr "Nem vagy a \"%s\" versenyben." + +#: judge/views/contests.py:405 +msgid "ContestCalendar requires integer year and month" +msgstr "" + +#: judge/views/contests.py:445 +#, python-format +msgid "Contests in %(month)s" +msgstr "" + +#: judge/views/contests.py:445 +msgid "F Y" +msgstr "" + +#: judge/views/contests.py:531 +msgid "???" +msgstr "???" + +#: judge/views/contests.py:594 +#, python-format +msgid "%s Rankings" +msgstr "" + +#: judge/views/contests.py:610 +#, python-format +msgid "Your participation in %s" +msgstr "" + +#: judge/views/contests.py:611 +#, python-format +msgid "%s's participation in %s" +msgstr "" + +#: judge/views/contests.py:615 +msgid "Live" +msgstr "" + +#: judge/views/contests.py:627 templates/contest/contest-tabs.html:13 +msgid "Participation" +msgstr "" + +#: judge/views/contests.py:654 +#, python-format +msgid "%s MOSS Results" +msgstr "" + +#: judge/views/contests.py:681 +#, python-format +msgid "Running MOSS for %s..." +msgstr "" + +#: judge/views/contests.py:704 +#, python-format +msgid "Contest tag: %s" +msgstr "" + +#: judge/views/error.py:14 +msgid "404 error" +msgstr "404-es hiba" + +#: judge/views/error.py:15 +#, python-format +msgid "Could not find page \"%s\"" +msgstr "Nem található a \"%s\" oldal" + +#: judge/views/error.py:22 +#, python-format +msgid "no permission for %s" +msgstr "" + +#: 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 +msgid "Runtimes" +msgstr "" + +#: judge/views/organization.py:44 judge/views/organization.py:47 +msgid "No such organization" +msgstr "Nincs ilyen csoport" + +#: judge/views/organization.py:45 +#, 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 +msgid "Could not find such organization." +msgstr "Nem található ilyen csoport." + +#: judge/views/organization.py:72 judge/views/register.py:34 +#: templates/organization/list.html:15 templates/user/user-list-tabs.html:5 +msgid "Organizations" +msgstr "Csoportok" + +#: judge/views/organization.py:93 +#, python-format +msgid "%s Members" +msgstr "%s Tagok" + +#: judge/views/organization.py:118 judge/views/organization.py:121 +#: judge/views/organization.py:126 +msgid "Joining organization" +msgstr "Belépés a csoportba" + +#: judge/views/organization.py:118 +msgid "You are already in the organization." +msgstr "Már benne vagy a csoportba." + +#: judge/views/organization.py:121 +msgid "This organization is not open." +msgstr "Ez a csoport nem nyílt." + +#: judge/views/organization.py:138 +msgid "Leaving organization" +msgstr "Csoport elhagyása" + +#: judge/views/organization.py:138 +#, python-format +msgid "You are not in \"%s\"." +msgstr "Nem vagy \"%s\"-ben." + +#: judge/views/organization.py:162 +#, python-format +msgid "Request to join %s" +msgstr "Kérés a \"%s\"-hez való csatlakozásra" + +#: judge/views/organization.py:180 +msgid "Join request detail" +msgstr "Belépési kérés részletei" + +#: judge/views/organization.py:209 +#, python-format +msgid "Managing join requests for %s" +msgstr "%s belépési kéréseinek kezelése" + +#: judge/views/organization.py:240 +#, 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:252 +#, 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:253 +#, 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:283 +#, python-format +msgid "Editing %s" +msgstr "%s szerkesztése" + +#: judge/views/organization.py:307 judge/views/organization.py:315 +msgid "Can't edit organization" +msgstr "Nem lehet szerkeszteni a csoportot" + +#: judge/views/organization.py:308 +msgid "You are not allowed to edit this organization." +msgstr "Nincs jogosultságod szerkeszteni ezt a csoportot." + +#: judge/views/organization.py:316 +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:321 judge/views/organization.py:325 +msgid "Can't kick user" +msgstr "Nem lehet kirúgni a felhasználót" + +#: judge/views/organization.py:322 +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:326 +#, 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:68 +msgid "No such problem" +msgstr "Nincs ilyen feladat" + +#: judge/views/problem.py:69 +#, python-format +msgid "Could not find a problem with the code \"%s\"." +msgstr "" + +#: judge/views/problem.py:111 +#, python-brace-format +msgid "Editorial for {0}" +msgstr "Megoldás útmutató {0}-hez" + +#: judge/views/problem.py:114 +#, python-brace-format +msgid "Editorial for {0}" +msgstr "Megoldási útmutató {0}-hez" + +#: judge/views/problem.py:285 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:546 +msgid "Banned from submitting" +msgstr "Feltöltéstől eltiltott" + +#: judge/views/problem.py:547 +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:560 +msgid "Too many submissions" +msgstr "Túl sok feltöltés" + +#: judge/views/problem.py:561 +msgid "You have exceeded the submission limit for this problem." +msgstr "" + +#: judge/views/problem.py:627 judge/views/problem.py:630 +#, python-format +msgid "Submit to %(problem)s" +msgstr "" + +#: judge/views/problem.py:646 +msgid "Clone Problem" +msgstr "" + +#: judge/views/problem_data.py:37 +msgid "Checker arguments must be a JSON object" +msgstr "" + +#: judge/views/problem_data.py:39 +msgid "Checker arguments is invalid JSON" +msgstr "" + +#: judge/views/problem_data.py:46 +msgid "Your zip file is invalid!" +msgstr "A zip fájlod nem érvényes!" + +#: judge/views/problem_data.py:104 +#, python-brace-format +msgid "Comparing submissions for {0}" +msgstr "" + +#: judge/views/problem_data.py:107 +#, python-brace-format +msgid "Comparing submissions for {0}" +msgstr "" + +#: judge/views/problem_data.py:142 +#, python-brace-format +msgid "Editing data for {0}" +msgstr "" + +#: judge/views/problem_data.py:145 +#, python-format +msgid "Editing data for %s" +msgstr "" + +#: judge/views/problem_data.py:237 judge/views/problem_data.py:238 +#, python-format +msgid "Generated init.yml for %s" +msgstr "init.yml generálva %s-hez" + +#: 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:58 +#, python-format +msgid "Best solutions for %s" +msgstr "Legjobb megoldások %s-hez" + +#: judge/views/ranked_submission.py:61 +#, python-brace-format +msgid "Best solutions for {0}" +msgstr "Legjobb megoldások {0}-hez" + +#: judge/views/ranked_submission.py:71 +#, 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:74 +#, python-format +msgid "Best solutions for problem %(number)s in %(contest)s" +msgstr "" + +#: judge/views/ranked_submission.py:80 +#, python-brace-format +msgid "Best solutions for {0} in {2}" +msgstr "" + +#: judge/views/ranked_submission.py:83 +#, python-brace-format +msgid "Best solutions for problem {0} in {1}" +msgstr "" + +#: judge/views/register.py:27 +msgid "A username must contain letters, numbers, or underscores" +msgstr "" + +#: judge/views/register.py:31 templates/user/edit-profile.html:103 +msgid "Preferred language" +msgstr "Preferált nyelv" + +#: judge/views/register.py:38 +msgid "Subscribe to newsletter?" +msgstr "Feliratkozol a hírlevélre?" + +#: judge/views/register.py:45 +#, 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 +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 +msgid "Registration" +msgstr "Regisztráció" + +#: judge/views/register.py:106 +msgid "Authentication failure" +msgstr "Azonosítási hiba" + +#: judge/views/stats.py:105 +msgid "Language statistics" +msgstr "" + +#: judge/views/status.py:24 templates/submission/list.html:319 +msgid "Status" +msgstr "Státusz" + +#: judge/views/status.py:108 +msgid "Version matrix" +msgstr "Verzió mátrix" + +#: judge/views/submission.py:59 judge/views/submission.py:66 +#, python-format +msgid "Submission of %(problem)s by %(user)s" +msgstr "" + +#: judge/views/submission.py:161 judge/views/submission.py:162 +#: templates/problem/problem.html:127 +msgid "All submissions" +msgstr "Összes beküldés" + +#: judge/views/submission.py:303 +msgid "All my submissions" +msgstr "Összes beküldésem" + +#: judge/views/submission.py:304 +#, python-format +msgid "All submissions by %s" +msgstr "" + +#: judge/views/submission.py:335 +#, python-format +msgid "All submissions for %s" +msgstr "" + +#: judge/views/submission.py:354 +msgid "Must pass a problem" +msgstr "" + +#: judge/views/submission.py:397 +#, python-format +msgid "My submissions for %(problem)s" +msgstr "" + +#: judge/views/submission.py:398 +#, python-format +msgid "%(user)s's submissions for %(problem)s" +msgstr "" + +#: judge/views/submission.py:495 +msgid "Must pass a contest" +msgstr "" + +#: judge/views/submission.py:514 +#, python-brace-format +msgid "{0}'s submissions for {2} in {4}" +msgstr "" + +#: judge/views/submission.py:519 +#, 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 "Hibajegy cím" + +#: judge/views/ticket.py:40 +msgid "Issue description" +msgstr "Probléma leírása" + +#: judge/views/ticket.py:85 judge/views/ticket.py:88 +#, python-format +msgid "New ticket for %s" +msgstr "Új hibajegy %s-hez" + +#: judge/views/ticket.py:139 +#, python-format +msgid "%(title)s - Ticket %(id)d" +msgstr "" + +#: judge/views/ticket.py:248 +#, python-format +msgid "Tickets - Page %(number)d of %(total)d" +msgstr "" + +#: judge/views/ticket.py:297 +#, python-format +msgid "New Ticket: %s" +msgstr "Új Hibajegy: %s" + +#: judge/views/ticket.py:298 +#, python-format +msgid "#%(id)d, assigned to: %(users)s" +msgstr "" + +#: judge/views/ticket.py:300 +msgid ", " +msgstr ", " + +#: judge/views/ticket.py:300 +msgid "no one" +msgstr "" + +#: judge/views/totp.py:42 templates/registration/totp_enable.html:86 +msgid "Enable Two Factor Authentication" +msgstr "" + +#: judge/views/totp.py:89 templates/registration/totp_disable.html:48 +msgid "Disable Two Factor Authentication" +msgstr "" + +#: judge/views/totp.py:103 +msgid "Perform Two Factor Authentication" +msgstr "" + +#: judge/views/user.py:68 +msgid "No such user" +msgstr "Nincs ilyen felhasználó" + +#: judge/views/user.py:68 +#, python-format +msgid "No user handle \"%s\"." +msgstr "" + +#: judge/views/user.py:72 +msgid "My account" +msgstr "Saját fiók" + +#: judge/views/user.py:73 +#, python-format +msgid "User %s" +msgstr "Felhasználó %s" + +#: judge/views/user.py:136 +msgid "M j, Y, G:i" +msgstr "M j, Y, G:i" + +#: judge/views/user.py:221 +msgid "Updated on site" +msgstr "Frissítve az oldalon" + +#: judge/views/user.py:253 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:10 +msgid "Edit profile" +msgstr "Profil szerkesztése" + +#: judge/views/user.py:262 templates/user/user-list-tabs.html:4 +msgid "Leaderboard" +msgstr "Ranglista" + +#: judge/views/widgets.py:48 judge/views/widgets.py:58 +#, python-format +msgid "Invalid upstream data: %s" +msgstr "" + +#: judge/views/widgets.py:68 +msgid "Bad latitude or longitude" +msgstr "Érvénytelen szélességi vagy hosszúsági kör" + +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:13 +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:27 +msgid "Photo" +msgstr "" + +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:14 +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:28 +msgid "Photos" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:9 +msgid "first name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:10 +msgid "last name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:11 +msgid "biography" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/admin.py:24 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:30 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:30 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:30 +msgid "owner" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:12 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:12 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:12 +msgid "name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:19 +msgid "Category of Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:20 +msgid "Categories of Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:26 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:26 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:26 +msgid "title" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:28 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:28 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:28 +msgid "category" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:29 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:29 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:29 +msgid "author" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:31 +msgid "publication date" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:37 +msgid "Book" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:38 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:136 +msgid "Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:19 +msgid "Category of CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:20 +msgid "Categories of CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:36 +msgid "CD" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:37 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:141 +msgid "CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:19 +msgid "Category of DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:20 +msgid "Categories of DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:36 +msgid "DVD" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:37 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:146 +msgid "DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/templates/admin/base_site.html:7 +msgid "Django administration" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/forms.py:12 +#, python-format +msgid "Please enter the correct %(username)s and password for an admin account. Note that both fields may be case-sensitive." +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/forms.py:32 +#, python-format +msgid "Please enter the correct %(username)s and password for an user account. Note that both fields may be case-sensitive." +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:27 +msgid "Site" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:38 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:41 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:130 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:133 +msgid "Dashboard" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:48 +msgid "Applications" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:53 +msgid "Administration" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:64 +msgid "Color theme" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:66 +msgid "Change color theme" +msgstr "" + +#: 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 +msgid "Rate all ratable contests" +msgstr "" + +#: 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 "Felhasználó szerkesztése" + +#: 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 +msgid "Rejudge" +msgstr "Újratesztel" + +#: templates/base.html:214 +#, python-format +msgid "Hello, %(username)s." +msgstr "Heló, %(username)s." + +#: templates/base.html:220 templates/comments/list.html:89 +#: templates/contest/contest-list-tabs.html:24 +#: templates/problem/problem-list-tabs.html:6 +#: templates/submission/info-base.html:12 +#: templates/submission/submission-list-tabs.html:15 +msgid "Admin" +msgstr "Admin" + +#: templates/base.html:229 +msgid "Log out" +msgstr "Kilépés" + +#: templates/base.html:238 +#: templates/registration/password_reset_complete.html:4 +msgid "Log in" +msgstr "" + +#: templates/base.html:239 templates/registration/registration_form.html:177 +msgid "or" +msgstr "vagy" + +#: templates/base.html:240 +msgid "Sign up" +msgstr "" + +#: templates/base.html:252 +msgid "spectating" +msgstr "megfigyelés" + +#: templates/base.html:265 +msgid "This site works best with JavaScript enabled." +msgstr "Az oldal JavaScript engedélyezésével működik a legjobban." + +#: templates/blog/content.html:13 templates/comments/list.html:68 +#: templates/comments/list.html:83 templates/contest/contest-tabs.html:20 +#: 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 +msgid "Edit" +msgstr "Szerkesztés" + +#: templates/blog/content.html:27 +#, python-format +msgid "\n" +" posted on %(time)s\n" +" " +msgstr "" + +#: templates/blog/dashboard.html:21 +#, python-format +msgid "\n" +" on %(time)s\n" +" " +msgstr "" + +#: templates/blog/list.html:85 +msgid "Blog" +msgstr "Blog" + +#: templates/blog/list.html:87 +msgid "Events" +msgstr "Események" + +#: templates/blog/list.html:92 +msgid "News" +msgstr "Hírek" + +#: templates/blog/list.html:106 +#, python-brace-format +msgid "posted on {time}" +msgstr "{time}-kor posztolva" + +#: templates/blog/list.html:130 templates/problem/problem.html:310 +msgid "Clarifications" +msgstr "Pontosítások" + +#: templates/blog/list.html:146 templates/problem/problem.html:321 +msgid "No clarifications have been made at this time." +msgstr "Nem jelentek meg pontosítások még." + +#: templates/blog/list.html:154 +msgid "Ongoing contests" +msgstr "Folyamatban lévő versenyek" + +#: templates/blog/list.html:172 +msgid "Upcoming contests" +msgstr "Közelgő versenyek" + +#: templates/blog/list.html:189 +msgid "Comment stream" +msgstr "Kommentfolyam" + +#: templates/blog/list.html:208 +msgid "New problems" +msgstr "Új feladatok" + +#: templates/blog/list.html:225 +msgid "My open tickets" +msgstr "Nyitott hibajegyeim" + +#: templates/blog/list.html:246 +msgid "New tickets" +msgstr "Új hibajegy" + +#: templates/comments/list.html:2 +msgid "Comments" +msgstr "Hozzászólások" + +#: templates/comments/list.html:18 templates/comments/list.html:27 +msgid "Please login to vote" +msgstr "Jelentkezz be a szavazáshoz" + +#: templates/comments/list.html:40 +#, python-brace-format +msgid "commented on {time}" +msgstr "" + +#: templates/comments/list.html:49 +#, python-format +msgid "edit %(edits)s" +msgstr "" + +#: templates/comments/list.html:51 templates/comments/media-js.html:77 +msgid "edited" +msgstr "szerkesztett" + +#: templates/comments/list.html:60 +msgid "Link" +msgstr "Link" + +#: templates/comments/list.html:73 templates/comments/list.html:80 +msgid "Reply" +msgstr "Válasz" + +#: templates/comments/list.html:86 +msgid "Hide" +msgstr "Elrejtés" + +#: templates/comments/list.html:101 +#, 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:120 +msgid "There are no comments at the moment." +msgstr "" + +#: templates/comments/list.html:126 +msgid "New comment" +msgstr "Új hozzászólás" + +#: templates/comments/list.html:140 +msgid "Invalid comment body." +msgstr "Érvénytelen hozzászólás törzs." + +#: templates/comments/list.html:148 +msgid "Post!" +msgstr "Küld!" + +#: templates/comments/list.html:156 +msgid "Comments are disabled on this page." +msgstr "" + +#: templates/comments/media-js.html:72 +#, python-brace-format +msgid "edit {edits}" +msgstr "" + +#: templates/comments/media-js.html:75 +msgid "original" +msgstr "" + +#: templates/contest/access_code.html:26 +msgid "Invalid access code." +msgstr "" + +#: templates/contest/access_code.html:29 +msgid "Please enter your access code:" +msgstr "" + +#: templates/contest/access_code.html:32 +msgid "Join Contest" +msgstr "" + +#: templates/contest/calendar.html:12 +msgid "Sunday" +msgstr "Vasárnap" + +#: templates/contest/calendar.html:13 +msgid "Monday" +msgstr "Hétfő" + +#: templates/contest/calendar.html:14 +msgid "Tuesday" +msgstr "Kedd" + +#: templates/contest/calendar.html:15 +msgid "Wednesday" +msgstr "Szerda" + +#: templates/contest/calendar.html:16 +msgid "Thursday" +msgstr "Csütörtök" + +#: templates/contest/calendar.html:17 +msgid "Friday" +msgstr "Péntek" + +#: templates/contest/calendar.html:18 +msgid "Saturday" +msgstr "Szombat" + +#: 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 "Előző" + +#: templates/contest/contest-list-tabs.html:10 +msgid "Today" +msgstr "" + +#: templates/contest/contest-list-tabs.html:13 +msgid "Next" +msgstr "Következő" + +#: templates/contest/contest-list-tabs.html:21 +#: templates/problem/problem-list-tabs.html:5 +msgid "List" +msgstr "Lista" + +#: templates/contest/contest-list-tabs.html:22 +msgid "Calendar" +msgstr "Naptár" + +#: templates/contest/contest-tabs.html:4 +msgid "Info" +msgstr "" + +#: templates/contest/contest-tabs.html:8 +msgid "Rankings" +msgstr "" + +#: templates/contest/contest-tabs.html:10 +msgid "Hidden Rankings" +msgstr "" + +#: templates/contest/contest-tabs.html:18 +msgid "MOSS" +msgstr "" + +#: templates/contest/contest-tabs.html:23 +msgid "Clone" +msgstr "" + +#: templates/contest/contest-tabs.html:34 +#: templates/contest/contest-tabs.html:54 +msgid "Leave contest" +msgstr "" + +#: templates/contest/contest-tabs.html:41 templates/contest/list.html:293 +msgid "Virtual join" +msgstr "Virtuális csatlakozás" + +#: templates/contest/contest-tabs.html:52 +msgid "Stop spectating" +msgstr "Felhagyás a megfigyeléssel" + +#: templates/contest/contest-tabs.html:61 +msgid "Spectate contest" +msgstr "" + +#: templates/contest/contest-tabs.html:67 +#: templates/contest/contest-tabs.html:73 +msgid "Join contest" +msgstr "" + +#: templates/contest/contest-tabs.html:82 +msgid "Login to participate" +msgstr "" + +#: templates/contest/contest.html:37 +msgid "Participating virtually." +msgstr "" + +#: templates/contest/contest.html:43 +msgid "Contest is over." +msgstr "A versenynek vége." + +#: templates/contest/contest.html:59 templates/contest/contest.html:63 +msgid "F j, Y, G:i T" +msgstr "F j, Y, G:i T" + +#: 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 +#, python-format +msgid "%(length)s long starting on %(start_time)s" +msgstr "" + +#: templates/contest/contest.html:85 +msgid "AC Rate" +msgstr "AC arány" + +#: templates/contest/contest.html:86 templates/contest/list.html:153 +#: templates/contest/list.html:195 templates/contest/list.html:271 +#: templates/problem/list.html:212 templates/problem/list.html:238 +msgid "Users" +msgstr "Felhasználók" + +#: templates/contest/contest.html:111 +msgid "Editorial" +msgstr "Megoldási útmutató" + +#: templates/contest/list.html:31 templates/contest/media-js.html:9 +msgid "Are you sure you want to join?" +msgstr "Biztos hogy csatlakozni akarsz?" + +#: 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:65 +msgid "hidden" +msgstr "" + +#: templates/contest/list.html:70 +msgid "private" +msgstr "" + +#: templates/contest/list.html:84 +msgid "rated" +msgstr "" + +#: templates/contest/list.html:132 +msgid "Spectate" +msgstr "Megfigyelés" + +#: templates/contest/list.html:138 +msgid "Join" +msgstr "Csatlakozás" + +#: templates/contest/list.html:148 +msgid "Active Contests" +msgstr "" + +#: templates/contest/list.html:152 templates/contest/list.html:194 +#: templates/contest/list.html:232 templates/contest/list.html:270 +msgid "Contest" +msgstr "Verseny" + +#: templates/contest/list.html:190 +msgid "Ongoing Contests" +msgstr "Folyamatban lévő versenyek" + +#: templates/contest/list.html:227 +msgid "Upcoming Contests" +msgstr "Közelgő Versenyek" + +#: templates/contest/list.html:255 +msgid "There are no scheduled contests at this time." +msgstr "Jelenleg nincs ütemezett verseny." + +#: templates/contest/list.html:261 +msgid "Past Contests" +msgstr "Elmúlt Versenyek" + +#: templates/contest/media-js.html:4 +msgid "Are you sure you want to leave?" +msgstr "" + +#: 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 +msgid "Joining a contest starts your timer, after which it becomes unstoppable." +msgstr "" + +#: 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 "Csak a következő csoportok tagjai férhetnek hozzá ehhez a versenyhez:" + +#: templates/contest/ranking-table.html:7 +msgid "Organization" +msgstr "Intézmény" + +#: templates/contest/ranking-table.html:27 +#, python-brace-format +msgid "Started on {time}" +msgstr "" + +#: templates/contest/ranking-table.html:30 +msgid "Participation ended." +msgstr "" + +#: templates/contest/ranking.html:232 +msgid "View user participation" +msgstr "" + +#: templates/contest/ranking.html:236 +msgid "Show organizations" +msgstr "Csoportok mutatása" + +#: templates/license.html:12 +msgid "Source:" +msgstr "Forrás:" + +#: 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 "Hírlevél" + +#: 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 "aktiválás" + +#: templates/newsletter/subscription_unsubscribe_activated.html:8 +msgid "You have successfully been unsubscribed." +msgstr "Sikeresen leiratkoztál." + +#: 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 "Hírlevél leiratkozás" + +#: 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 +msgid "Do you want to unsubscribe from this newsletter?" +msgstr "" + +#: templates/newsletter/subscription_unsubscribe_user.html:21 +msgid "Unsubscribe" +msgstr "Leiratkozás" + +#: 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 +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 +msgid "Update subscription" +msgstr "" + +#: templates/newsletter/subscription_update_activated.html:8 +msgid "Your subscription has successfully been updated." +msgstr "" + +#: 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:34 +#: templates/ticket/edit-notes.html:4 +msgid "Update" +msgstr "Frissít" + +#: 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 "Csoport elhagyása" + +#: templates/organization/home.html:29 +msgid "Join organization" +msgstr "Belépés a csoportba" + +#: templates/organization/home.html:33 +msgid "Request membership" +msgstr "Tagság kérelmezése" + +#: templates/organization/home.html:39 +msgid "Edit organization" +msgstr "Csoport szerkesztése" + +#: templates/organization/home.html:43 +msgid "View requests" +msgstr "Kérések megtekintése" + +#: templates/organization/home.html:50 +msgid "Admin organization" +msgstr "Csoport adminisztrációja" + +#: templates/organization/home.html:55 +msgid "View members" +msgstr "Tagok megtekintése" + +#: templates/organization/list.html:23 templates/status/language-list.html:34 +msgid "Name" +msgstr "Név" + +#: templates/organization/list.html:24 +msgid "Members" +msgstr "Tagok" + +#: templates/organization/new.html:10 templates/ticket/new.html:38 +msgid "Create" +msgstr "Létrehozás" + +#: templates/organization/requests/detail.html:13 +msgid "User:" +msgstr "Felhasználó:" + +#: templates/organization/requests/detail.html:17 +msgid "Organization:" +msgstr "Csoport:" + +#: templates/organization/requests/detail.html:25 +msgid "Time:" +msgstr "Idő:" + +#: templates/organization/requests/detail.html:29 +msgid "Reason:" +msgstr "Ok:" + +#: templates/organization/requests/log.html:11 +#: templates/organization/requests/pending.html:14 +msgid "State" +msgstr "Állapot" + +#: templates/organization/requests/log.html:12 +#: templates/organization/requests/pending.html:15 +msgid "Reason" +msgstr "Ok" + +#: templates/organization/requests/log.html:28 +#: templates/organization/requests/pending.html:37 +msgid "There are no requests to approve." +msgstr "Nincsenek jóváhagyásra váló kérések." + +#: templates/organization/requests/pending.html:17 +#: templates/problem/data.html:401 +msgid "Delete?" +msgstr "Törlés?" + +#: templates/organization/requests/request.html:18 +msgid "Your reason for joining:" +msgstr "A csatlakozás oka:" + +#: templates/organization/requests/request.html:20 +msgid "Request" +msgstr "Kérés" + +#: templates/organization/requests/tabs.html:4 +msgid "Pending" +msgstr "Elbírálás alatt" + +#: templates/organization/requests/tabs.html:7 +msgid "Log" +msgstr "Log" + +#: templates/organization/requests/tabs.html:10 +msgid "Approved" +msgstr "Jóváhagyva" + +#: templates/organization/requests/tabs.html:13 +msgid "Rejected" +msgstr "Elutasítva" + +#: templates/organization/users-table.html:15 +msgid "Kick" +msgstr "Kirúg" + +#: templates/problem/clone.html:37 +msgid "Enter a new code for the cloned problem:" +msgstr "" + +#: templates/problem/data.html:353 +msgid "View YAML" +msgstr "" + +#: templates/problem/data.html:369 +msgid "Show columns:" +msgstr "" + +#: templates/problem/data.html:372 templates/problem/data.html:396 +msgid "Output prefix" +msgstr "" + +#: templates/problem/data.html:376 templates/problem/data.html:397 +msgid "Output limit" +msgstr "Kimenet limit" + +#: templates/problem/data.html:380 templates/problem/data.html:398 +msgid "Checker" +msgstr "Checker" + +#: templates/problem/data.html:384 templates/problem/data.html:399 +msgid "Generator args" +msgstr "Generátor argumentumok" + +#: templates/problem/data.html:391 +msgid "Type" +msgstr "Típus" + +#: templates/problem/data.html:392 +msgid "Input file" +msgstr "Bementi fájl" + +#: templates/problem/data.html:393 +msgid "Output file" +msgstr "Kimeneti fájl" + +#: templates/problem/data.html:395 +msgid "Pretest?" +msgstr "Preteszt?" + +#: templates/problem/data.html:447 templates/problem/submit.html:252 +msgid "Submit!" +msgstr "Beküld!" + +#: templates/problem/data.html:448 +msgid "Add new case" +msgstr "Új eset hozzáadása" + +#: 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 "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/list.html:62 +msgid "Filter by type..." +msgstr "Szűrés típus szerint..." + +#: templates/problem/list.html:185 +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:57 +msgid "Category" +msgstr "Kategória" + +#: templates/problem/list.html:209 templates/problem/list.html:228 +msgid "Types" +msgstr "Típusok" + +#: templates/problem/list.html:235 +#, python-format +msgid "AC %%" +msgstr "AC %%" + +#: 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:142 +msgid "Filter by result:" +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 "Mutasd PDF-ként" + +#: templates/problem/problem.html:101 templates/problem/problem.html:111 +#: templates/problem/problem.html:116 +msgid "Submit solution" +msgstr "Megoldás beküldése" + +#: templates/problem/problem.html:104 +#, python-format +msgid "%(counter)s submission left" +msgid_plural "%(counter)s submissions left" +msgstr[0] "%(counter)s beküldés van hátra" +msgstr[1] "%(counter)s beküldés van hátra" + +#: templates/problem/problem.html:112 +msgid "0 submissions left" +msgstr "0 beküldés van hátra" + +#: templates/problem/problem.html:124 +msgid "My submissions" +msgstr "Beküldéseim" + +#: templates/problem/problem.html:128 +msgid "Best submissions" +msgstr "Legjobb beküldések" + +#: templates/problem/problem.html:132 +msgid "Read editorial" +msgstr "Megoldási útmutató olvasása" + +#: templates/problem/problem.html:137 +msgid "Manage tickets" +msgstr "Hibajegyek kezelése" + +#: templates/problem/problem.html:141 +msgid "Edit problem" +msgstr "Feladat szerkesztése" + +#: templates/problem/problem.html:143 +msgid "Edit test data" +msgstr "Teszt adatok szerkesztése" + +#: templates/problem/problem.html:148 +msgid "My tickets" +msgstr "" + +#: templates/problem/problem.html:156 +msgid "Manage submissions" +msgstr "" + +#: templates/problem/problem.html:162 +msgid "Clone problem" +msgstr "Feladat klónozása" + +#: templates/problem/problem.html:169 +msgid "Points:" +msgstr "Pontok:" + +#: templates/problem/problem.html:172 templates/problem/problem.html:174 +msgid "(partial)" +msgstr "(részleges)" + +#: templates/problem/problem.html:179 +msgid "Time limit:" +msgstr "Időkorlát:" + +#: templates/problem/problem.html:191 +msgid "Memory limit:" +msgstr "Memóriakorlát:" + +#: templates/problem/problem.html:210 +msgid "Author:" +msgid_plural "Authors:" +msgstr[0] "Szerző:" +msgstr[1] "Szerzők:" + +#: templates/problem/problem.html:225 +msgid "Problem type" +msgid_plural "Problem types" +msgstr[0] "Feladat típus" +msgstr[1] "Feladat típusok" + +#: templates/problem/problem.html:238 +msgid "Allowed languages" +msgstr "Engedélyezett nyelvek" + +#: templates/problem/problem.html:246 +#, python-format +msgid "No %(lang)s judge online" +msgstr "Nincs jelenleg online %(lang)s tesztelő" + +#: templates/problem/problem.html:257 +msgid "Judge:" +msgid_plural "Judges:" +msgstr[0] "" +msgstr[1] "" + +#: templates/problem/problem.html:274 +msgid "none available" +msgstr "" + +#: templates/problem/problem.html:299 +msgid "Request clarification" +msgstr "Pontosítást kérek" + +#: templates/problem/problem.html:301 +msgid "Report an issue" +msgstr "Hiba jelentése" + +#: 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 "Feladat keresés" + +#: templates/problem/search-form.html:8 +msgid "Search problems..." +msgstr "Feladatok keresése..." + +#: templates/problem/search-form.html:14 +msgid "Full text search" +msgstr "Szöveg keresése" + +#: templates/problem/search-form.html:21 +msgid "Hide solved problems" +msgstr "" + +#: 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 +msgid "All" +msgstr "" + +#: templates/problem/search-form.html:46 +msgid "Problem types" +msgstr "" + +#: templates/problem/search-form.html:57 +msgid "Point range" +msgstr "" + +#: templates/problem/search-form.html:63 templates/submission/list.html:337 +#: templates/ticket/list.html:248 +msgid "Go" +msgstr "" + +#: templates/problem/search-form.html:64 +msgid "Random" +msgstr "" + +#: templates/problem/submit.html:192 +#, python-format +msgid "Warning! Your default language, %(default_language)s, is unavailable for this problem and has been deselected." +msgstr "" + +#: templates/problem/submit.html:203 +#, python-format +msgid "\n" +" You have %(left)s submission left\n" +" " +msgid_plural "\n" +" You have %(left)s submissions left\n" +" " +msgstr[0] "" +msgstr[1] "" + +#: templates/problem/submit.html:212 +msgid "You have 0 submissions left" +msgstr "" + +#: templates/problem/submit.html:250 +msgid "No judge is available for this problem." +msgstr "" + +#: templates/registration/activate.html:3 +#, python-format +msgid "%(key)s is an invalid activation key." +msgstr "" + +#: templates/registration/activation_complete.html:3 +msgid "Your account has been successfully activated." +msgstr "" + +#: templates/registration/login.html:43 +msgid "Invalid username or password." +msgstr "" + +#: templates/registration/login.html:61 +#: templates/registration/totp_auth.html:39 +msgid "Login!" +msgstr "" + +#: templates/registration/login.html:64 +msgid "Forgot your password?" +msgstr "" + +#: templates/registration/login.html:67 +msgid "Or log in with..." +msgstr "" + +#: templates/registration/logout.html:3 +msgid "See you later!" +msgstr "" + +#: templates/registration/password_change_done.html:3 +msgid "Your password was sucessfully changed." +msgstr "" + +#: templates/registration/password_change_form.html:8 +msgid "Change Password" +msgstr "" + +#: templates/registration/password_reset.html:7 +msgid "Send Reset Email" +msgstr "" + +#: 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_confirm.html:9 +msgid "Reset Password" +msgstr "" + +#: 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 +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 +#, 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 +msgid "Please go to the following page and choose a new password:" +msgstr "" + +#: templates/registration/password_reset_email.txt:7 +msgid "Your username, in case you've forgotten:" +msgstr "" + +#: templates/registration/password_reset_email.txt:9 +msgid "Thanks for using our site!" +msgstr "" + +#: templates/registration/password_reset_email.txt:11 +#, python-format +msgid "The %(site_name)s team" +msgstr "" + +#: 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 +msgid "Continue >" +msgstr "Folytatás >" + +#: 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:166 +msgid "(again, for confirmation)" +msgstr "(újra, megerősítésként)" + +#: templates/registration/registration_form.html:173 +msgid "(select your closest major city)" +msgstr "" + +#: templates/registration/registration_form.html:178 +msgid "pick from map" +msgstr "válassz a térképről" + +#: templates/registration/registration_form.html:183 +msgid "Default language" +msgstr "Alapértelmezett nyelv" + +#: templates/registration/registration_form.html:186 +#: templates/user/edit-profile.html:162 +msgid "Affiliated organizations" +msgstr "Kapcsolódó csoportok" + +#: templates/registration/registration_form.html:192 +#: templates/user/edit-profile.html:121 +msgid "Notify me about upcoming contests" +msgstr "" + +#: templates/registration/registration_form.html:206 +msgid "By registering, you agree to our" +msgstr "" + +#: templates/registration/registration_form.html:207 +msgid "Terms & Conditions" +msgstr "Felhasználási feltételek" + +#: templates/registration/registration_form.html:210 +msgid "Register!" +msgstr "" + +#: templates/registration/totp_auth.html:36 +#: templates/registration/totp_disable.html:45 +#: templates/registration/totp_enable.html:83 +msgid "Enter the 6-digit code generated by your app:" +msgstr "" + +#: templates/registration/totp_auth.html:41 +#, python-format +msgid "If you lost your authentication device, please contact us at %(email)s." +msgstr "" + +#: templates/registration/totp_disable.html:38 +msgid "To protect your account, you must first authenticate before you can disable Two Factor Authentication." +msgstr "" + +#: templates/registration/totp_enable.html:71 +msgid "Scan this code with your authenticator app:" +msgstr "" + +#: templates/registration/totp_enable.html:72 +msgid "QR code" +msgstr "" + +#: templates/registration/totp_enable.html:73 +msgid "Or enter this code manually:" +msgstr "" + +#: templates/stats/base.html:9 templates/submission/list.html:345 +msgid "Statistics" +msgstr "" + +#: templates/stats/language.html:11 +msgid "Submission Statistics" +msgstr "Beküldési statisztikák" + +#: templates/stats/language.html:16 +msgid "Submissions by Language" +msgstr "Beküldések nyelvenként" + +#: templates/stats/language.html:21 +msgid "AC Submissions by Language" +msgstr "" + +#: templates/stats/language.html:26 +msgid "Language AC Rate" +msgstr "" + +#: templates/status/judge-status-table.html:2 +msgid "Judge" +msgstr "Tesztelő" + +#: templates/status/judge-status-table.html:4 +msgid "Online" +msgstr "Elérhető" + +#: templates/status/judge-status-table.html:6 +msgid "Uptime" +msgstr "" + +#: templates/status/judge-status-table.html:7 +msgid "Ping" +msgstr "Ping" + +#: 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 +msgid "N/A" +msgstr "" + +#: templates/status/judge-status-table.html:64 +msgid "There are no judges available at this time." +msgstr "" + +#: templates/status/language-list.html:33 templates/ticket/list.html:261 +msgid "ID" +msgstr "Azonosító" + +#: templates/status/language-list.html:35 +msgid "Runtime Info" +msgstr "" + +#: templates/status/status-tabs.html:4 +msgid "Judges" +msgstr "" + +#: templates/status/status-tabs.html:6 +msgid "Version Matrix" +msgstr "" + +#: templates/submission/internal-error-message.html:8 +msgid "An internal error occurred while grading." +msgstr "" + +#: templates/submission/internal-error-message.html:15 +msgid "Error information" +msgstr "" + +#: templates/submission/list.html:76 +msgid "Filter by status..." +msgstr "" + +#: templates/submission/list.html:82 +msgid "Filter by language..." +msgstr "" + +#: templates/submission/list.html:315 +msgid "Filter submissions" +msgstr "" + +#: templates/submission/list.html:351 +msgid "Total:" +msgstr "" + +#: templates/submission/list.html:361 +msgid "You were disconnected. Refresh to show latest updates." +msgstr "" + +#: templates/submission/row.html:39 +#, python-format +msgid "Case #%(case)s" +msgstr "" + +#: templates/submission/row.html:49 +msgid "view" +msgstr "" + +#: templates/submission/row.html:53 +msgid "rejudge" +msgstr "újratesztel" + +#: templates/submission/row.html:58 +msgid "admin" +msgstr "admin" + +#: templates/submission/source.html:25 +msgid "View status" +msgstr "Állapot megtekintése" + +#: templates/submission/source.html:26 +msgid "View raw source" +msgstr "Nyers forrás megkekintése" + +#: templates/submission/source.html:28 templates/submission/status.html:61 +msgid "Resubmit" +msgstr "Újraküld" + +#: templates/submission/status-testcases.html:10 +msgid "We are waiting for a suitable judge to process your submission..." +msgstr "Egy megfelelő tesztelőre várunk a feltöltés értékeléséhez..." + +#: templates/submission/status-testcases.html:12 +msgid "Your submission is being processed..." +msgstr "A beküldésed feldolgozás alatt áll..." + +#: templates/submission/status-testcases.html:14 +msgid "Compilation Error" +msgstr "Fordítási Hiba" + +#: templates/submission/status-testcases.html:18 +msgid "Compilation Warnings" +msgstr "Fordítási Figyelmeztetések" + +#: templates/submission/status-testcases.html:23 +msgid "Pretest Execution Results" +msgstr "Pretesztek futtatásának eredményei" + +#: templates/submission/status-testcases.html:25 +msgid "Execution Results" +msgstr "" + +#: templates/submission/status-testcases.html:31 +msgid "Batch " +msgstr "" + +#: templates/submission/status-testcases.html:43 +msgid "Case" +msgstr "Eset" + +#: templates/submission/status-testcases.html:45 +msgid "Pretest" +msgstr "Preteszt" + +#: templates/submission/status-testcases.html:47 +msgid "Test case" +msgstr "Teszt eset" + +#: templates/submission/status-testcases.html:79 +msgid "Your output (clipped)" +msgstr "A kimeneted (levágva)" + +#: templates/submission/status-testcases.html:90 +msgid "Judge feedback" +msgstr "" + +#: templates/submission/status-testcases.html:106 +msgid "Resources:" +msgstr "" + +#: templates/submission/status-testcases.html:115 +msgid "Final pretest score:" +msgstr "Végső preteszt pontszám:" + +#: templates/submission/status-testcases.html:117 +msgid "Final score:" +msgstr "Végső pontszám:" + +#: templates/submission/status-testcases.html:131 +msgid "Passing pretests does not guarantee a full score on system tests." +msgstr "" + +#: templates/submission/status-testcases.html:134 +msgid "Submission aborted!" +msgstr "" + +#: templates/submission/status.html:59 +msgid "View source" +msgstr "Forráskód megtekintése" + +#: templates/submission/status.html:88 +msgid "Abort" +msgstr "Megszakít" + +#: templates/submission/submission-list-tabs.html:6 +msgid "Mine" +msgstr "Saját" + +#: templates/submission/submission-list-tabs.html:9 +msgid "Best" +msgstr "Legjobb" + +#: templates/submission/submission-list-tabs.html:12 +#, python-format +msgid "%(user)s's" +msgstr "" + +#: templates/ticket/list.html:135 templates/ticket/ticket.html:257 +msgid "Reopened: " +msgstr "Újranyitva: " + +#: templates/ticket/list.html:138 templates/ticket/ticket.html:258 +msgid "Closed: " +msgstr "Lezárva: " + +#: templates/ticket/list.html:221 +msgid "Use desktop notification" +msgstr "Asztali értesítés használata" + +#: templates/ticket/list.html:227 +msgid "Show my tickets only" +msgstr "Csak a saját hibajegyek mutatása" + +#: templates/ticket/list.html:231 +msgid "Filing user" +msgstr "" + +#: templates/ticket/list.html:240 +msgid "Assignee" +msgstr "" + +#: templates/ticket/list.html:262 +msgid "Title" +msgstr "" + +#: templates/ticket/list.html:264 templates/ticket/ticket.html:304 +msgid "Assignees" +msgstr "" + +#: templates/ticket/new_problem.html:7 +msgid "Thanks for opening a ticket!" +msgstr "" + +#: 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 +msgid "Associated object" +msgstr "" + +#: templates/ticket/ticket.html:309 +msgid "No one is assigned." +msgstr "" + +#: templates/ticket/ticket.html:315 +msgid "Close ticket" +msgstr "" + +#: templates/ticket/ticket.html:317 +msgid "Reopen ticket" +msgstr "" + +#: templates/ticket/ticket.html:321 +msgid "Assignee notes" +msgstr "" + +#: templates/ticket/ticket.html:328 templates/widgets/select_all.html:4 +msgid "Nothing here." +msgstr "" + +#: templates/ticket/ticket.html:378 +msgid "Post" +msgstr "" + +#: templates/user/base-users-table.html:3 +msgid "Rank" +msgstr "" + +#: templates/user/base-users.html:14 templates/user/base-users.html:69 +msgid "Search by handle..." +msgstr "" + +#: templates/user/edit-profile.html:90 +msgid "Self-description" +msgstr "" + +#: templates/user/edit-profile.html:98 +msgid "Select your closest major city" +msgstr "" + +#: templates/user/edit-profile.html:107 +msgid "Editor theme" +msgstr "" + +#: templates/user/edit-profile.html:112 +msgid "Math engine" +msgstr "Matek motor" + +#: templates/user/edit-profile.html:136 templates/user/edit-profile.html:137 +msgid "Change your avatar" +msgstr "" + +#: templates/user/edit-profile.html:143 +msgid "Change your password" +msgstr "" + +#: templates/user/edit-profile.html:150 +msgid "Two Factor Authentication is enabled." +msgstr "" + +#: templates/user/edit-profile.html:153 +msgid "Two Factor Authentication is disabled." +msgstr "" + +#: templates/user/edit-profile.html:170 +msgid "User-script" +msgstr "" + +#: templates/user/edit-profile.html:174 +msgid "Update profile" +msgstr "" + +#: templates/user/pp-row.html:22 +#, python-format +msgid "\n" +" weighted %(weight)s%%\n" +" " +msgstr "" + +#: templates/user/pp-row.html:27 +#, python-format +msgid "%(pp).1fpp" +msgstr "" + +#: templates/user/pp-row.html:29 +#, python-format +msgid "%(pp).0fpp" +msgstr "" + +#: templates/user/user-about.html:14 +msgid "From" +msgstr "" + +#: 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:40 +msgid "You have not shared any information." +msgstr "" + +#: templates/user/user-about.html:42 +msgid "This user has not shared any information." +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:53 +msgid "Total points:" +msgstr "" + +#: templates/user/user-base.html:68 +msgid "Rank by rating:" +msgstr "" + +#: templates/user/user-base.html:70 +msgid "Rating:" +msgstr "" + +#: templates/user/user-base.html:71 +msgid "Volatility:" +msgstr "" + +#: templates/user/user-base.html:72 +msgid "Min. rating:" +msgstr "" + +#: templates/user/user-base.html:73 +msgid "Max rating:" +msgstr "" + +#: templates/user/user-problems.html:35 +msgid "Points Breakdown" +msgstr "" + +#: templates/user/user-problems.html:41 +msgid "Load more..." +msgstr "Továbbiak betöltése..." + +#: templates/user/user-problems.html:45 +msgid "This user has not yet solved any problems." +msgstr "" + +#: templates/user/user-problems.html:51 +msgid "Authored Problems" +msgstr "Létrehozott feladatok" + +#: templates/user/user-problems.html:83 +msgid "Hide problems I've solved" +msgstr "" + +#: templates/user/user-problems.html:93 +#, python-format +msgid "%(points).1f points" +msgstr "" + +#: templates/user/user-problems.html:99 +msgid "Score" +msgstr "Pont" + +#: templates/user/user-problems.html:110 +#, python-format +msgid "%(points)s / %(total)s" +msgstr "" + +#: templates/user/user-tabs.html:7 +msgid "Impersonate" +msgstr "" + +#: templates/user/user-tabs.html:13 +msgid "Admin User" +msgstr "" + +#: templates/user/user-tabs.html:16 +msgid "Admin Profile" +msgstr "" + +#: templates/widgets/select_all.html:8 +msgid "Check all" +msgstr "Az összes kijelölése" + diff --git a/locale/hu/LC_MESSAGES/djangojs.po b/locale/hu/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..83fa1a0 --- /dev/null +++ b/locale/hu/LC_MESSAGES/djangojs.po @@ -0,0 +1,30 @@ +msgid "" +msgstr "" +"Project-Id-Version: dmoj\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-10-01 23:12+0000\n" +"PO-Revision-Date: 2019-11-11 22:05\n" +"Last-Translator: Icyene\n" +"Language-Team: Hungarian\n" +"Language: hu_HU\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: crowdin.com\n" +"X-Crowdin-Project: dmoj\n" +"X-Crowdin-Language: hu\n" +"X-Crowdin-File: djangojs.po\n" + +#: resources/common.js:207 +msgctxt "time format with day" +msgid "%d day %h:%m:%s" +msgid_plural "%d days %h:%m:%s" +msgstr[0] "%d nap %h:%m:%s" +msgstr[1] "%d nap %h:%m:%s" + +#: resources/common.js:210 +msgctxt "time format without day" +msgid "%h:%m:%s" +msgstr "%h:%m:%s" + diff --git a/locale/it/LC_MESSAGES/django.po b/locale/it/LC_MESSAGES/django.po new file mode 100644 index 0000000..a0ad7cc --- /dev/null +++ b/locale/it/LC_MESSAGES/django.po @@ -0,0 +1,4531 @@ +msgid "" +msgstr "" +"Project-Id-Version: dmoj\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-11-11 21:54+0000\n" +"PO-Revision-Date: 2019-11-11 22:05\n" +"Last-Translator: Icyene\n" +"Language-Team: Italian\n" +"Language: it_IT\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: crowdin.com\n" +"X-Crowdin-Project: dmoj\n" +"X-Crowdin-Language: it\n" +"X-Crowdin-File: django.po\n" + +#: dmoj/settings.py:337 +msgid "German" +msgstr "" + +#: dmoj/settings.py:338 +msgid "English" +msgstr "" + +#: dmoj/settings.py:339 +msgid "Spanish" +msgstr "" + +#: dmoj/settings.py:340 +msgid "French" +msgstr "" + +#: dmoj/settings.py:341 +msgid "Croatian" +msgstr "" + +#: dmoj/settings.py:342 +msgid "Hungarian" +msgstr "" + +#: dmoj/settings.py:343 +msgid "Japanese" +msgstr "" + +#: dmoj/settings.py:344 +msgid "Korean" +msgstr "" + +#: dmoj/settings.py:345 +msgid "Brazilian Portuguese" +msgstr "" + +#: dmoj/settings.py:346 +msgid "Romanian" +msgstr "" + +#: dmoj/settings.py:347 +msgid "Russian" +msgstr "" + +#: dmoj/settings.py:348 +msgid "Serbian (Latin)" +msgstr "" + +#: dmoj/settings.py:349 +msgid "Turkish" +msgstr "" + +#: dmoj/settings.py:350 +msgid "Vietnamese" +msgstr "" + +#: dmoj/settings.py:351 +msgid "Simplified Chinese" +msgstr "" + +#: dmoj/urls.py:54 +msgid "Login" +msgstr "" + +#: dmoj/urls.py:102 templates/base.html:190 +msgid "Home" +msgstr "" + +#: 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 +msgid "Hide comments" +msgstr "" + +#: 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 +msgid "Unhide comments" +msgstr "" + +#: judge/admin/comments.py:58 +msgid "Associated page" +msgstr "" + +#: judge/admin/contest.py:29 +msgid "Included contests" +msgstr "" + +#: judge/admin/contest.py:65 templates/contest/contest.html:83 +#: templates/contest/moss.html:43 templates/problem/list.html:206 +#: templates/problem/list.html:221 templates/user/user-problems.html:56 +#: templates/user/user-problems.html:98 +msgid "Problem" +msgstr "" + +#: judge/admin/contest.py:113 +msgid "Settings" +msgstr "" + +#: judge/admin/contest.py:115 +msgid "Scheduling" +msgstr "" + +#: judge/admin/contest.py:116 +msgid "Details" +msgstr "" + +#: judge/admin/contest.py:117 +msgid "Format" +msgstr "" + +#: judge/admin/contest.py:118 templates/contest/ranking-table.html:5 +msgid "Rating" +msgstr "" + +#: judge/admin/contest.py:119 +msgid "Access" +msgstr "" + +#: judge/admin/contest.py:121 judge/admin/problem.py:131 +msgid "Justice" +msgstr "" + +#: judge/admin/contest.py:159 +#, 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:162 +msgid "Mark contests as visible" +msgstr "" + +#: judge/admin/contest.py:166 +#, 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:169 +msgid "Mark contests as hidden" +msgstr "" + +#: judge/admin/contest.py:180 judge/admin/submission.py:149 +#: judge/admin/submission.py:171 +msgid "You do not have the permission to rejudge submissions." +msgstr "" + +#: judge/admin/contest.py:187 judge/admin/submission.py:155 +msgid "You do not have the permission to rejudge THAT many submissions." +msgstr "" + +#: judge/admin/contest.py:194 judge/admin/submission.py:164 +#, 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:265 +#, python-format +msgid "%d participation recalculated." +msgid_plural "%d participations recalculated." +msgstr[0] "" +msgstr[1] "" + +#: judge/admin/contest.py:268 +msgid "Recalculate results" +msgstr "" + +#: judge/admin/contest.py:272 judge/admin/organization.py:65 +msgid "username" +msgstr "" + +#: judge/admin/contest.py:277 templates/base.html:258 +msgid "virtual" +msgstr "" + +#: judge/admin/interface.py:28 judge/models/interface.py:46 +msgid "link path" +msgstr "" + +#: judge/admin/interface.py:62 +msgid "Content" +msgstr "" + +#: judge/admin/interface.py:63 +msgid "Summary" +msgstr "" + +#: judge/admin/interface.py:107 judge/models/contest.py:251 +#: judge/models/contest.py:355 judge/models/profile.py:189 +msgid "user" +msgstr "" + +#: judge/admin/interface.py:148 +msgid "object" +msgstr "" + +#: judge/admin/organization.py:34 judge/admin/problem.py:171 +#: judge/admin/profile.py:78 +msgid "View on site" +msgstr "" + +#: judge/admin/problem.py:28 +msgid "Describe the changes you made (optional)" +msgstr "" + +#: judge/admin/problem.py:126 +msgid "Social Media" +msgstr "" + +#: judge/admin/problem.py:127 +msgid "Taxonomy" +msgstr "" + +#: judge/admin/problem.py:128 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:58 +msgid "Points" +msgstr "" + +#: judge/admin/problem.py:129 +msgid "Limits" +msgstr "" + +#: judge/admin/problem.py:130 judge/admin/submission.py:232 +#: templates/stats/base.html:14 templates/submission/list.html:328 +msgid "Language" +msgstr "" + +#: judge/admin/problem.py:132 +msgid "History" +msgstr "" + +#: judge/admin/problem.py:168 +msgid "Authors" +msgstr "" + +#: judge/admin/problem.py:183 +#, 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:187 +msgid "Mark problems as public" +msgstr "" + +#: judge/admin/problem.py:193 +#, 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:197 +msgid "Mark problems as private" +msgstr "" + +#: judge/admin/profile.py:32 +msgid "timezone" +msgstr "" + +#: judge/admin/profile.py:84 judge/admin/submission.py:211 +#: templates/organization/requests/log.html:9 +#: templates/organization/requests/pending.html:12 +#: templates/ticket/list.html:263 +msgid "User" +msgstr "" + +#: judge/admin/profile.py:89 templates/registration/registration_form.html:145 +msgid "Email" +msgstr "" + +#: judge/admin/profile.py:94 judge/views/register.py:29 +#: templates/registration/registration_form.html:173 +#: templates/user/edit-profile.html:99 +msgid "Timezone" +msgstr "" + +#: judge/admin/profile.py:99 +msgid "date joined" +msgstr "" + +#: judge/admin/profile.py:106 +#, python-format +msgid "%d user have scores recalculated." +msgid_plural "%d users have scores recalculated." +msgstr[0] "" +msgstr[1] "" + +#: judge/admin/profile.py:109 +msgid "Recalculate scores" +msgstr "" + +#: judge/admin/runtime.py:19 +msgid "Disallowed problems" +msgstr "" + +#: judge/admin/runtime.py:22 +msgid "These problems are NOT allowed to be submitted in this language" +msgstr "" + +#: judge/admin/runtime.py:83 +msgid "Description" +msgstr "" + +#: judge/admin/runtime.py:84 +msgid "Information" +msgstr "" + +#: judge/admin/runtime.py:85 +msgid "Capabilities" +msgstr "" + +#: judge/admin/submission.py:23 judge/admin/submission.py:42 +#: judge/admin/submission.py:221 +msgid "None" +msgstr "" + +#: judge/admin/submission.py:23 +msgid "Not done" +msgstr "" + +#: judge/admin/submission.py:23 +msgid "Exceptional" +msgstr "" + +#: judge/admin/submission.py:42 +msgid "Unaccepted" +msgstr "" + +#: judge/admin/submission.py:89 +#, python-format +msgctxt "contest problem" +msgid "%(problem)s in %(contest)s" +msgstr "" + +#: judge/admin/submission.py:167 +msgid "Rejudge the selected submissions" +msgstr "" + +#: judge/admin/submission.py:193 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:196 +msgid "Rescore the selected submissions" +msgstr "" + +#: judge/admin/submission.py:200 +msgid "Problem code" +msgstr "" + +#: judge/admin/submission.py:205 +msgid "Problem name" +msgstr "" + +#: judge/admin/submission.py:215 templates/organization/requests/log.html:10 +#: templates/organization/requests/pending.html:13 +msgid "Time" +msgstr "" + +#: judge/admin/submission.py:223 +#, python-format +msgid "%d KB" +msgstr "" + +#: judge/admin/submission.py:225 +#, python-format +msgid "%.2f MB" +msgstr "" + +#: judge/admin/submission.py:227 +msgid "Memory" +msgstr "" + +#: judge/admin/taxon.py:11 judge/admin/taxon.py:34 +msgid "Included problems" +msgstr "" + +#: judge/admin/taxon.py:14 +msgid "These problems are included in this group of problems" +msgstr "" + +#: judge/admin/taxon.py:37 +msgid "These problems are included in this type of problems" +msgstr "" + +#: judge/apps.py:8 +msgid "Online Judge" +msgstr "" + +#: judge/comments.py:41 +msgid "Comment body" +msgstr "" + +#: judge/comments.py:47 judge/views/ticket.py:46 +msgid "Your part is silent, little toad." +msgstr "" + +#: judge/comments.py:50 templates/comments/list.html:131 +msgid "You need to have solved at least one problem before your voice can be heard." +msgstr "" + +#: judge/comments.py:92 +msgid "Posted comment" +msgstr "" + +#: judge/contest_format/atcoder.py:19 +msgid "AtCoder" +msgstr "" + +#: judge/contest_format/default.py:18 +msgid "Default" +msgstr "" + +#: judge/contest_format/ecoo.py:19 +msgid "ECOO" +msgstr "" + +#: judge/contest_format/ioi.py:19 +msgid "IOI" +msgstr "" + +#: judge/forms.py:27 +msgid "Subscribe to contest updates" +msgstr "" + +#: judge/forms.py:28 +msgid "Enable experimental features" +msgstr "" + +#: judge/forms.py:57 judge/views/organization.py:127 +#, python-brace-format +msgid "You may not be part of more than {count} public organizations." +msgstr "" + +#: judge/forms.py:107 judge/views/register.py:26 +#: templates/registration/registration_form.html:139 +#: templates/user/base-users-table.html:5 +msgid "Username" +msgstr "" + +#: judge/forms.py:108 templates/registration/registration_form.html:151 +#: templates/registration/registration_form.html:165 +msgid "Password" +msgstr "" + +#: judge/forms.py:130 +msgid "Two Factor Authentication tokens must be 6 decimal digits." +msgstr "" + +#: judge/forms.py:139 templates/registration/totp_auth.html:32 +msgid "Invalid Two Factor Authentication token." +msgstr "" + +#: judge/forms.py:143 judge/models/problem.py:97 +msgid "Problem code must be ^[a-z0-9]+$" +msgstr "" + +#: judge/forms.py:148 +msgid "Problem with code already exists." +msgstr "" + +#: judge/forms.py:153 judge/models/contest.py:51 +msgid "Contest id must be ^[a-z0-9]+$" +msgstr "" + +#: judge/forms.py:158 +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:59 +msgid "Leave as LaTeX" +msgstr "" + +#: judge/models/choices.py:60 +msgid "SVG with PNG fallback" +msgstr "" + +#: judge/models/choices.py:61 +msgid "MathML only" +msgstr "" + +#: judge/models/choices.py:62 +msgid "MathJax with SVG/PNG fallback" +msgstr "" + +#: judge/models/choices.py:63 +msgid "Detect best quality" +msgstr "" + +#: judge/models/comment.py:25 +msgid "Page code must be ^[pcs]:[a-z0-9]+$|^b:\\d+$" +msgstr "" + +#: judge/models/comment.py:41 +msgid "commenter" +msgstr "" + +#: judge/models/comment.py:42 +msgid "posted time" +msgstr "" + +#: judge/models/comment.py:43 judge/models/comment.py:176 +msgid "associated page" +msgstr "" + +#: judge/models/comment.py:45 +msgid "votes" +msgstr "" + +#: judge/models/comment.py:46 +msgid "body of comment" +msgstr "" + +#: judge/models/comment.py:47 +msgid "hide the comment" +msgstr "" + +#: judge/models/comment.py:48 +msgid "parent" +msgstr "" + +#: judge/models/comment.py:53 +msgid "comment" +msgstr "" + +#: judge/models/comment.py:54 +msgid "comments" +msgstr "" + +#: judge/models/comment.py:136 judge/models/problem.py:406 +#, python-format +msgid "Editorial for %s" +msgstr "" + +#: judge/models/comment.py:171 +msgid "comment vote" +msgstr "" + +#: judge/models/comment.py:172 +msgid "comment votes" +msgstr "" + +#: judge/models/comment.py:181 +msgid "Override comment lock" +msgstr "" + +#: judge/models/contest.py:21 +msgid "Invalid colour." +msgstr "" + +#: judge/models/contest.py:23 +msgid "tag name" +msgstr "" + +#: judge/models/contest.py:24 +msgid "Lowercase letters and hyphens only." +msgstr "" + +#: judge/models/contest.py:25 +msgid "tag colour" +msgstr "" + +#: judge/models/contest.py:26 +msgid "tag description" +msgstr "" + +#: judge/models/contest.py:45 +msgid "contest tag" +msgstr "" + +#: judge/models/contest.py:46 judge/models/contest.py:100 +msgid "contest tags" +msgstr "" + +#: judge/models/contest.py:50 +msgid "contest id" +msgstr "" + +#: judge/models/contest.py:52 +msgid "contest name" +msgstr "" + +#: judge/models/contest.py:53 +msgid "These people will be able to edit the contest." +msgstr "" + +#: judge/models/contest.py:55 judge/models/runtime.py:124 +#: src/dmoj-wpadmin/test_project/apps/books/admin.py:20 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:27 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:27 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:27 +msgid "description" +msgstr "" + +#: judge/models/contest.py:56 judge/models/problem.py:353 +#: judge/models/runtime.py:126 +msgid "problems" +msgstr "" + +#: judge/models/contest.py:57 judge/models/contest.py:252 +msgid "start time" +msgstr "" + +#: judge/models/contest.py:58 +msgid "end time" +msgstr "" + +#: judge/models/contest.py:59 judge/models/problem.py:118 +#: judge/models/problem.py:377 +msgid "time limit" +msgstr "" + +#: judge/models/contest.py:60 judge/models/problem.py:136 +msgid "publicly visible" +msgstr "" + +#: judge/models/contest.py:61 +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:64 +msgid "contest rated" +msgstr "" + +#: judge/models/contest.py:64 +msgid "Whether this contest can be rated." +msgstr "" + +#: judge/models/contest.py:66 +msgid "hide scoreboard" +msgstr "" + +#: judge/models/contest.py:67 +msgid "Whether the scoreboard should remain hidden for the duration of the contest." +msgstr "" + +#: judge/models/contest.py:70 +msgid "no comments" +msgstr "" + +#: judge/models/contest.py:71 +msgid "Use clarification system instead of comments." +msgstr "" + +#: judge/models/contest.py:73 +msgid "Rating floor for contest" +msgstr "" + +#: judge/models/contest.py:75 +msgid "Rating ceiling for contest" +msgstr "" + +#: judge/models/contest.py:77 +msgid "rate all" +msgstr "" + +#: judge/models/contest.py:77 +msgid "Rate all users who joined." +msgstr "" + +#: judge/models/contest.py:78 +msgid "exclude from ratings" +msgstr "" + +#: judge/models/contest.py:80 +msgid "private to specific users" +msgstr "" + +#: judge/models/contest.py:81 +msgid "private contestants" +msgstr "" + +#: judge/models/contest.py:82 +msgid "If private, only these users may see the contest" +msgstr "" + +#: judge/models/contest.py:84 +msgid "hide problem tags" +msgstr "" + +#: judge/models/contest.py:85 +msgid "Whether problem tags should be hidden by default." +msgstr "" + +#: judge/models/contest.py:87 +msgid "run pretests only" +msgstr "" + +#: judge/models/contest.py:88 +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:92 judge/models/problem.py:157 +msgid "private to organizations" +msgstr "" + +#: judge/models/contest.py:93 judge/models/problem.py:155 +#: judge/models/profile.py:76 +msgid "organizations" +msgstr "" + +#: judge/models/contest.py:94 +msgid "If private, only these organizations may see the contest" +msgstr "" + +#: judge/models/contest.py:95 judge/models/problem.py:145 +msgid "OpenGraph image" +msgstr "" + +#: judge/models/contest.py:96 judge/models/profile.py:47 +msgid "Logo override image" +msgstr "" + +#: judge/models/contest.py:98 +msgid "This image will replace the default site logo for users inside the contest." +msgstr "" + +#: judge/models/contest.py:101 +msgid "the amount of live participants" +msgstr "" + +#: judge/models/contest.py:102 +msgid "contest summary" +msgstr "" + +#: judge/models/contest.py:103 judge/models/problem.py:147 +msgid "Plain-text, shown in meta description tag, e.g. for social media." +msgstr "" + +#: judge/models/contest.py:104 judge/models/profile.py:46 +msgid "access code" +msgstr "" + +#: judge/models/contest.py:105 +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:107 judge/models/problem.py:141 +msgid "personae non gratae" +msgstr "" + +#: judge/models/contest.py:108 +msgid "Bans the selected users from joining this contest." +msgstr "" + +#: judge/models/contest.py:109 +msgid "contest format" +msgstr "" + +#: judge/models/contest.py:110 +msgid "The contest format module to use." +msgstr "" + +#: judge/models/contest.py:111 +msgid "contest format configuration" +msgstr "" + +#: judge/models/contest.py:112 +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:233 +msgid "See private contests" +msgstr "" + +#: judge/models/contest.py:234 +msgid "Edit own contests" +msgstr "" + +#: judge/models/contest.py:235 +msgid "Edit all contests" +msgstr "" + +#: judge/models/contest.py:236 +msgid "Clone contest" +msgstr "" + +#: judge/models/contest.py:237 templates/contest/moss.html:74 +msgid "MOSS contest" +msgstr "" + +#: judge/models/contest.py:238 +msgid "Rate contests" +msgstr "" + +#: judge/models/contest.py:239 +msgid "Contest access codes" +msgstr "" + +#: judge/models/contest.py:240 +msgid "Create private contests" +msgstr "" + +#: judge/models/contest.py:242 judge/models/contest.py:320 +#: judge/models/contest.py:356 judge/models/contest.py:378 +#: judge/models/submission.py:83 +msgid "contest" +msgstr "" + +#: judge/models/contest.py:243 +msgid "contests" +msgstr "" + +#: judge/models/contest.py:250 +msgid "associated contest" +msgstr "" + +#: judge/models/contest.py:253 +msgid "score" +msgstr "" + +#: judge/models/contest.py:254 +msgid "cumulative time" +msgstr "" + +#: judge/models/contest.py:255 +msgid "virtual participation id" +msgstr "" + +#: judge/models/contest.py:256 +msgid "0 means non-virtual, otherwise the n-th virtual participation" +msgstr "" + +#: judge/models/contest.py:257 +msgid "contest format specific data" +msgstr "" + +#: judge/models/contest.py:306 +#, python-format +msgid "%s spectating in %s" +msgstr "" + +#: judge/models/contest.py:308 +#, python-format +msgid "%s in %s, v%d" +msgstr "" + +#: judge/models/contest.py:309 +#, python-format +msgid "%s in %s" +msgstr "" + +#: judge/models/contest.py:312 +msgid "contest participation" +msgstr "" + +#: judge/models/contest.py:313 +msgid "contest participations" +msgstr "" + +#: judge/models/contest.py:319 judge/models/contest.py:340 +#: judge/models/contest.py:379 judge/models/problem.py:352 +#: judge/models/problem.py:357 judge/models/problem.py:375 +#: judge/models/problem_data.py:35 +msgid "problem" +msgstr "" + +#: judge/models/contest.py:321 judge/models/contest.py:344 +#: judge/models/problem.py:129 +msgid "points" +msgstr "" + +#: judge/models/contest.py:322 +msgid "partial" +msgstr "" + +#: judge/models/contest.py:323 judge/models/contest.py:345 +msgid "is pretested" +msgstr "" + +#: judge/models/contest.py:324 judge/models/interface.py:43 +msgid "order" +msgstr "" + +#: judge/models/contest.py:325 +msgid "output prefix length override" +msgstr "" + +#: judge/models/contest.py:326 +msgid "Maximum number of submissions for this problem, or 0 for no limit." +msgstr "" + +#: judge/models/contest.py:328 +msgid "Why include a problem you can't submit to?" +msgstr "" + +#: judge/models/contest.py:333 +msgid "contest problem" +msgstr "" + +#: judge/models/contest.py:334 +msgid "contest problems" +msgstr "" + +#: judge/models/contest.py:338 judge/models/submission.py:181 +msgid "submission" +msgstr "" + +#: judge/models/contest.py:342 judge/models/contest.py:357 +msgid "participation" +msgstr "" + +#: judge/models/contest.py:346 +msgid "Whether this submission was ran only on pretests." +msgstr "" + +#: judge/models/contest.py:350 +msgid "contest submission" +msgstr "" + +#: judge/models/contest.py:351 +msgid "contest submissions" +msgstr "" + +#: judge/models/contest.py:359 +msgid "rank" +msgstr "" + +#: judge/models/contest.py:360 +msgid "rating" +msgstr "" + +#: judge/models/contest.py:361 +msgid "volatility" +msgstr "" + +#: judge/models/contest.py:362 +msgid "last rated" +msgstr "" + +#: judge/models/contest.py:366 +msgid "contest rating" +msgstr "" + +#: judge/models/contest.py:367 +msgid "contest ratings" +msgstr "" + +#: judge/models/contest.py:386 +msgid "contest moss result" +msgstr "" + +#: judge/models/contest.py:387 +msgid "contest moss results" +msgstr "" + +#: judge/models/interface.py:24 +msgid "configuration item" +msgstr "" + +#: judge/models/interface.py:25 +msgid "miscellaneous configuration" +msgstr "" + +#: judge/models/interface.py:37 +msgid "navigation item" +msgstr "" + +#: judge/models/interface.py:38 +msgid "navigation bar" +msgstr "" + +#: judge/models/interface.py:44 +msgid "identifier" +msgstr "" + +#: judge/models/interface.py:45 +msgid "label" +msgstr "" + +#: judge/models/interface.py:47 +msgid "highlight regex" +msgstr "" + +#: judge/models/interface.py:48 +msgid "parent item" +msgstr "" + +#: judge/models/interface.py:66 +msgid "post title" +msgstr "" + +#: judge/models/interface.py:67 judge/models/problem.py:395 +msgid "authors" +msgstr "" + +#: judge/models/interface.py:68 +msgid "slug" +msgstr "" + +#: judge/models/interface.py:69 judge/models/problem.py:393 +msgid "public visibility" +msgstr "" + +#: judge/models/interface.py:70 +msgid "sticky" +msgstr "" + +#: judge/models/interface.py:71 +msgid "publish after" +msgstr "" + +#: judge/models/interface.py:72 +msgid "post content" +msgstr "" + +#: judge/models/interface.py:73 +msgid "post summary" +msgstr "" + +#: judge/models/interface.py:74 +msgid "openGraph image" +msgstr "" + +#: judge/models/interface.py:91 +msgid "Edit all posts" +msgstr "" + +#: judge/models/interface.py:93 +msgid "blog post" +msgstr "" + +#: judge/models/interface.py:94 +msgid "blog posts" +msgstr "" + +#: judge/models/message.py:11 +msgid "message title" +msgstr "" + +#: judge/models/message.py:12 judge/models/ticket.py:29 +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:26 +msgid "problem category ID" +msgstr "" + +#: judge/models/problem.py:27 +msgid "problem category name" +msgstr "" + +#: judge/models/problem.py:34 +msgid "problem type" +msgstr "" + +#: judge/models/problem.py:35 judge/models/problem.py:113 +msgid "problem types" +msgstr "" + +#: judge/models/problem.py:39 +msgid "problem group ID" +msgstr "" + +#: judge/models/problem.py:40 +msgid "problem group name" +msgstr "" + +#: judge/models/problem.py:47 judge/models/problem.py:116 +msgid "problem group" +msgstr "" + +#: judge/models/problem.py:48 +msgid "problem groups" +msgstr "" + +#: judge/models/problem.py:52 +msgid "key" +msgstr "" + +#: judge/models/problem.py:54 +msgid "link" +msgstr "" + +#: judge/models/problem.py:55 +msgid "full name" +msgstr "" + +#: judge/models/problem.py:56 judge/models/profile.py:32 +#: judge/models/runtime.py:23 +msgid "short name" +msgstr "" + +#: judge/models/problem.py:57 +msgid "Displayed on pages under this license" +msgstr "" + +#: judge/models/problem.py:58 +msgid "icon" +msgstr "" + +#: judge/models/problem.py:58 +msgid "URL to the icon" +msgstr "" + +#: judge/models/problem.py:59 +msgid "license text" +msgstr "" + +#: judge/models/problem.py:68 +msgid "license" +msgstr "" + +#: judge/models/problem.py:69 +msgid "licenses" +msgstr "" + +#: judge/models/problem.py:96 +msgid "problem code" +msgstr "" + +#: judge/models/problem.py:98 +msgid "A short, unique code for the problem, used in the url after /problem/" +msgstr "" + +#: judge/models/problem.py:100 +msgid "problem name" +msgstr "" + +#: judge/models/problem.py:101 +msgid "The full name of the problem, as shown in the problem list." +msgstr "" + +#: judge/models/problem.py:103 +msgid "problem body" +msgstr "" + +#: judge/models/problem.py:104 +msgid "creators" +msgstr "" + +#: judge/models/problem.py:105 +msgid "These users will be able to edit the problem, and be listed as authors." +msgstr "" + +#: judge/models/problem.py:107 +msgid "curators" +msgstr "" + +#: judge/models/problem.py:108 +msgid "These users will be able to edit the problem, but not be listed as authors." +msgstr "" + +#: judge/models/problem.py:110 +msgid "testers" +msgstr "" + +#: judge/models/problem.py:112 +msgid "These users will be able to view the private problem, but not edit it." +msgstr "" + +#: judge/models/problem.py:114 +msgid "The type of problem, as shown on the problem's page." +msgstr "" + +#: judge/models/problem.py:117 +msgid "The group of problem, shown under Category in the problem list." +msgstr "" + +#: judge/models/problem.py:119 +msgid "The time limit for this problem, in seconds. Fractional seconds (e.g. 1.5) are supported." +msgstr "" + +#: judge/models/problem.py:123 judge/models/problem.py:380 +msgid "memory limit" +msgstr "" + +#: judge/models/problem.py:124 +msgid "The memory limit for this problem, in kilobytes (e.g. 64mb = 65536 kilobytes)." +msgstr "" + +#: judge/models/problem.py:130 +msgid "Points awarded for problem completion. Points are displayed with a 'p' suffix if partial." +msgstr "" + +#: judge/models/problem.py:133 +msgid "allows partial points" +msgstr "" + +#: judge/models/problem.py:134 +msgid "allowed languages" +msgstr "" + +#: judge/models/problem.py:135 +msgid "List of allowed submission languages." +msgstr "" + +#: judge/models/problem.py:137 +msgid "manually managed" +msgstr "" + +#: judge/models/problem.py:138 +msgid "Whether judges should be allowed to manage data or not." +msgstr "" + +#: judge/models/problem.py:139 +msgid "date of publishing" +msgstr "" + +#: judge/models/problem.py:140 +msgid "Doesn't have magic ability to auto-publish due to backward compatibility" +msgstr "" + +#: judge/models/problem.py:142 +msgid "Bans the selected users from submitting to this problem." +msgstr "" + +#: judge/models/problem.py:144 +msgid "The license under which this problem is published." +msgstr "" + +#: judge/models/problem.py:146 +msgid "problem summary" +msgstr "" + +#: judge/models/problem.py:148 +msgid "number of users" +msgstr "" + +#: judge/models/problem.py:149 +msgid "The number of users who solved the problem." +msgstr "" + +#: judge/models/problem.py:150 +msgid "solve rate" +msgstr "" + +#: judge/models/problem.py:156 +msgid "If private, only these organizations may see the problem." +msgstr "" + +#: judge/models/problem.py:358 judge/models/problem.py:376 +#: judge/models/runtime.py:99 +msgid "language" +msgstr "" + +#: judge/models/problem.py:359 +msgid "translated name" +msgstr "" + +#: judge/models/problem.py:360 +msgid "translated description" +msgstr "" + +#: judge/models/problem.py:364 +msgid "problem translation" +msgstr "" + +#: judge/models/problem.py:365 +msgid "problem translations" +msgstr "" + +#: judge/models/problem.py:369 +msgid "clarified problem" +msgstr "" + +#: judge/models/problem.py:370 +msgid "clarification body" +msgstr "" + +#: judge/models/problem.py:371 +msgid "clarification timestamp" +msgstr "" + +#: judge/models/problem.py:386 +msgid "language-specific resource limit" +msgstr "" + +#: judge/models/problem.py:387 +msgid "language-specific resource limits" +msgstr "" + +#: judge/models/problem.py:391 +msgid "associated problem" +msgstr "" + +#: judge/models/problem.py:394 +msgid "publish date" +msgstr "" + +#: judge/models/problem.py:396 +msgid "editorial content" +msgstr "" + +#: judge/models/problem.py:412 +msgid "solution" +msgstr "" + +#: judge/models/problem.py:413 +msgid "solutions" +msgstr "" + +#: judge/models/problem_data.py:23 +msgid "Standard" +msgstr "" + +#: judge/models/problem_data.py:24 +msgid "Floats" +msgstr "" + +#: judge/models/problem_data.py:25 +msgid "Floats (absolute)" +msgstr "" + +#: judge/models/problem_data.py:26 +msgid "Floats (relative)" +msgstr "" + +#: judge/models/problem_data.py:27 +msgid "Non-trailing spaces" +msgstr "" + +#: judge/models/problem_data.py:28 +msgid "Unordered" +msgstr "" + +#: judge/models/problem_data.py:29 +msgid "Byte identical" +msgstr "" + +#: 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:39 +msgid "generator file" +msgstr "" + +#: judge/models/problem_data.py:41 judge/models/problem_data.py:90 +msgid "output prefix length" +msgstr "" + +#: judge/models/problem_data.py:42 judge/models/problem_data.py:91 +msgid "output limit length" +msgstr "" + +#: judge/models/problem_data.py:43 +msgid "init.yml generation feedback" +msgstr "" + +#: judge/models/problem_data.py:44 judge/models/problem_data.py:92 +msgid "checker" +msgstr "" + +#: judge/models/problem_data.py:45 judge/models/problem_data.py:93 +msgid "checker arguments" +msgstr "" + +#: 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:77 +msgid "problem data set" +msgstr "" + +#: judge/models/problem_data.py:79 +msgid "case position" +msgstr "" + +#: judge/models/problem_data.py:80 +msgid "case type" +msgstr "" + +#: judge/models/problem_data.py:81 +msgid "Normal case" +msgstr "" + +#: judge/models/problem_data.py:82 +msgid "Batch start" +msgstr "" + +#: judge/models/problem_data.py:83 +msgid "Batch end" +msgstr "" + +#: judge/models/problem_data.py:85 +msgid "input file name" +msgstr "" + +#: judge/models/problem_data.py:86 +msgid "output file name" +msgstr "" + +#: judge/models/problem_data.py:87 +msgid "generator arguments" +msgstr "" + +#: judge/models/problem_data.py:88 +msgid "point value" +msgstr "" + +#: judge/models/problem_data.py:89 +msgid "case is pretest?" +msgstr "" + +#: judge/models/profile.py:29 +msgid "organization title" +msgstr "" + +#: judge/models/profile.py:30 +msgid "organization slug" +msgstr "" + +#: judge/models/profile.py:31 +msgid "Organization name shown in URL" +msgstr "" + +#: judge/models/profile.py:33 +msgid "Displayed beside user name during contests" +msgstr "" + +#: judge/models/profile.py:34 +msgid "organization description" +msgstr "" + +#: judge/models/profile.py:35 +msgid "registrant" +msgstr "" + +#: judge/models/profile.py:36 +msgid "User who registered this organization" +msgstr "" + +#: judge/models/profile.py:37 +msgid "administrators" +msgstr "" + +#: judge/models/profile.py:38 +msgid "Those who can edit this organization" +msgstr "" + +#: judge/models/profile.py:39 +msgid "creation date" +msgstr "" + +#: judge/models/profile.py:40 +msgid "is open organization?" +msgstr "" + +#: judge/models/profile.py:41 +msgid "Allow joining organization" +msgstr "" + +#: judge/models/profile.py:42 +msgid "maximum size" +msgstr "" + +#: judge/models/profile.py:43 +msgid "Maximum amount of users in this organization, only applicable to private organizations" +msgstr "" + +#: judge/models/profile.py:45 +msgid "Student access code" +msgstr "" + +#: judge/models/profile.py:49 +msgid "This image will replace the default site logo for users viewing the organization." +msgstr "" + +#: judge/models/profile.py:75 judge/models/profile.py:91 +#: judge/models/profile.py:190 +msgid "organization" +msgstr "" + +#: judge/models/profile.py:80 +msgid "user associated" +msgstr "" + +#: judge/models/profile.py:81 +msgid "self-description" +msgstr "" + +#: judge/models/profile.py:82 +msgid "location" +msgstr "" + +#: judge/models/profile.py:84 +msgid "preferred language" +msgstr "" + +#: judge/models/profile.py:89 +msgid "last access time" +msgstr "" + +#: judge/models/profile.py:90 +msgid "last IP" +msgstr "" + +#: judge/models/profile.py:93 +msgid "display rank" +msgstr "" + +#: judge/models/profile.py:95 +msgid "comment mute" +msgstr "" + +#: judge/models/profile.py:95 +msgid "Some users are at their best when silent." +msgstr "" + +#: judge/models/profile.py:97 +msgid "unlisted user" +msgstr "" + +#: judge/models/profile.py:97 +msgid "User will not be ranked." +msgstr "" + +#: judge/models/profile.py:100 +msgid "user script" +msgstr "" + +#: judge/models/profile.py:101 +msgid "User-defined JavaScript for site customization." +msgstr "" + +#: judge/models/profile.py:102 +msgid "current contest" +msgstr "" + +#: judge/models/profile.py:104 +msgid "math engine" +msgstr "" + +#: judge/models/profile.py:106 +msgid "the rendering engine used to render math" +msgstr "" + +#: judge/models/profile.py:107 +msgid "2FA enabled" +msgstr "" + +#: judge/models/profile.py:108 +msgid "check to enable TOTP-based two factor authentication" +msgstr "" + +#: judge/models/profile.py:109 +msgid "TOTP key" +msgstr "" + +#: judge/models/profile.py:110 +msgid "32 character base32-encoded key for TOTP" +msgstr "" + +#: judge/models/profile.py:112 +msgid "TOTP key must be empty or base32" +msgstr "" + +#: judge/models/profile.py:113 +msgid "internal notes" +msgstr "" + +#: judge/models/profile.py:114 +msgid "Notes for administrators regarding this user." +msgstr "" + +#: judge/models/profile.py:184 +msgid "user profile" +msgstr "" + +#: judge/models/profile.py:185 +msgid "user profiles" +msgstr "" + +#: judge/models/profile.py:192 +msgid "request time" +msgstr "" + +#: judge/models/profile.py:193 +msgid "state" +msgstr "" + +#: judge/models/profile.py:198 +msgid "reason" +msgstr "" + +#: judge/models/profile.py:201 +msgid "organization join request" +msgstr "" + +#: judge/models/profile.py:202 +msgid "organization join requests" +msgstr "" + +#: judge/models/runtime.py:18 +msgid "short identifier" +msgstr "" + +#: judge/models/runtime.py:19 +msgid "The identifier for this language; the same as its executor id for judges." +msgstr "" + +#: judge/models/runtime.py:21 +msgid "long name" +msgstr "" + +#: judge/models/runtime.py:22 +msgid "Longer name for the language, e.g. \"Python 2\" or \"C++11\"." +msgstr "" + +#: judge/models/runtime.py:24 +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:28 +msgid "common name" +msgstr "" + +#: judge/models/runtime.py:29 +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:31 +msgid "ace mode name" +msgstr "" + +#: judge/models/runtime.py:32 +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:34 +msgid "pygments name" +msgstr "" + +#: judge/models/runtime.py:35 +msgid "Language ID for Pygments highlighting in source windows." +msgstr "" + +#: judge/models/runtime.py:36 +msgid "code template" +msgstr "" + +#: judge/models/runtime.py:37 +msgid "Code template to display in submission editor." +msgstr "" + +#: judge/models/runtime.py:38 +msgid "runtime info override" +msgstr "" + +#: judge/models/runtime.py:39 +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:41 +msgid "language description" +msgstr "" + +#: judge/models/runtime.py:42 +msgid "Use field this to inform users of quirks with your environment, additional restrictions, etc." +msgstr "" + +#: judge/models/runtime.py:44 +msgid "extension" +msgstr "" + +#: judge/models/runtime.py:45 +msgid "The extension of source files, e.g., \"py\" or \"cpp\"." +msgstr "" + +#: judge/models/runtime.py:100 +msgid "languages" +msgstr "" + +#: judge/models/runtime.py:104 +msgid "language to which this runtime belongs" +msgstr "" + +#: judge/models/runtime.py:105 +msgid "judge on which this runtime exists" +msgstr "" + +#: judge/models/runtime.py:106 +msgid "runtime name" +msgstr "" + +#: judge/models/runtime.py:107 +msgid "runtime version" +msgstr "" + +#: judge/models/runtime.py:108 +msgid "order in which to display this runtime" +msgstr "" + +#: judge/models/runtime.py:112 +msgid "Server name, hostname-style" +msgstr "" + +#: judge/models/runtime.py:113 +msgid "time of creation" +msgstr "" + +#: judge/models/runtime.py:114 +msgid "A key to authenticated this judge" +msgstr "" + +#: judge/models/runtime.py:115 +msgid "authentication key" +msgstr "" + +#: judge/models/runtime.py:116 +msgid "block judge" +msgstr "" + +#: judge/models/runtime.py:117 +msgid "Whether this judge should be blocked from connecting, even if its key is correct." +msgstr "" + +#: judge/models/runtime.py:119 +msgid "judge online status" +msgstr "" + +#: judge/models/runtime.py:120 +msgid "judge start time" +msgstr "" + +#: judge/models/runtime.py:121 +msgid "response time" +msgstr "" + +#: judge/models/runtime.py:122 +msgid "system load" +msgstr "" + +#: judge/models/runtime.py:123 +msgid "Load for the last minute, divided by processors to be fair." +msgstr "" + +#: judge/models/runtime.py:127 judge/models/runtime.py:167 +msgid "judges" +msgstr "" + +#: judge/models/runtime.py:166 +msgid "judge" +msgstr "" + +#: judge/models/submission.py:20 judge/models/submission.py:47 +#: judge/utils/problems.py:86 +msgid "Accepted" +msgstr "" + +#: judge/models/submission.py:21 judge/models/submission.py:48 +msgid "Wrong Answer" +msgstr "" + +#: judge/models/submission.py:22 judge/models/submission.py:50 +msgid "Time Limit Exceeded" +msgstr "" + +#: judge/models/submission.py:23 judge/models/submission.py:51 +msgid "Memory Limit Exceeded" +msgstr "" + +#: judge/models/submission.py:24 judge/models/submission.py:52 +msgid "Output Limit Exceeded" +msgstr "" + +#: judge/models/submission.py:25 judge/models/submission.py:53 +msgid "Invalid Return" +msgstr "" + +#: judge/models/submission.py:26 judge/models/submission.py:54 +msgid "Runtime Error" +msgstr "" + +#: judge/models/submission.py:27 judge/models/submission.py:41 +#: judge/models/submission.py:55 judge/utils/problems.py:88 +msgid "Compile Error" +msgstr "" + +#: judge/models/submission.py:28 judge/models/submission.py:40 +msgid "Internal Error" +msgstr "" + +#: judge/models/submission.py:29 +msgid "Short circuit" +msgstr "" + +#: judge/models/submission.py:30 judge/models/submission.py:42 +#: judge/models/submission.py:61 +msgid "Aborted" +msgstr "" + +#: judge/models/submission.py:36 judge/models/submission.py:57 +msgid "Queued" +msgstr "" + +#: judge/models/submission.py:37 judge/models/submission.py:58 +msgid "Processing" +msgstr "" + +#: judge/models/submission.py:38 judge/models/submission.py:59 +msgid "Grading" +msgstr "" + +#: judge/models/submission.py:39 judge/models/submission.py:60 +msgid "Completed" +msgstr "" + +#: judge/models/submission.py:56 +msgid "Internal Error (judging server error)" +msgstr "" + +#: judge/models/submission.py:66 +msgid "submission time" +msgstr "" + +#: judge/models/submission.py:67 judge/models/submission.py:201 +msgid "execution time" +msgstr "" + +#: judge/models/submission.py:68 judge/models/submission.py:202 +msgid "memory usage" +msgstr "" + +#: judge/models/submission.py:69 judge/models/submission.py:203 +msgid "points granted" +msgstr "" + +#: judge/models/submission.py:70 +msgid "submission language" +msgstr "" + +#: judge/models/submission.py:71 +msgid "status" +msgstr "" + +#: judge/models/submission.py:72 +msgid "result" +msgstr "" + +#: judge/models/submission.py:74 +msgid "compile errors" +msgstr "" + +#: judge/models/submission.py:76 +msgid "batched cases" +msgstr "" + +#: judge/models/submission.py:77 +msgid "test case points" +msgstr "" + +#: judge/models/submission.py:78 +msgid "test case total points" +msgstr "" + +#: judge/models/submission.py:79 +msgid "judged on" +msgstr "" + +#: judge/models/submission.py:81 +msgid "was rejudged by admin" +msgstr "" + +#: judge/models/submission.py:82 +msgid "was ran on pretests only" +msgstr "" + +#: judge/models/submission.py:182 templates/contest/moss.html:58 +msgid "submissions" +msgstr "" + +#: judge/models/submission.py:186 judge/models/submission.py:197 +msgid "associated submission" +msgstr "" + +#: judge/models/submission.py:188 +msgid "source code" +msgstr "" + +#: judge/models/submission.py:199 +msgid "test case ID" +msgstr "" + +#: judge/models/submission.py:200 +msgid "status flag" +msgstr "" + +#: judge/models/submission.py:204 +msgid "points possible" +msgstr "" + +#: judge/models/submission.py:205 +msgid "batch number" +msgstr "" + +#: judge/models/submission.py:206 +msgid "judging feedback" +msgstr "" + +#: judge/models/submission.py:207 +msgid "extended judging feedback" +msgstr "" + +#: judge/models/submission.py:208 +msgid "program output" +msgstr "" + +#: judge/models/submission.py:216 +msgid "submission test case" +msgstr "" + +#: judge/models/submission.py:217 +msgid "submission test cases" +msgstr "" + +#: judge/models/ticket.py:10 +msgid "ticket title" +msgstr "" + +#: judge/models/ticket.py:11 +msgid "ticket creator" +msgstr "" + +#: judge/models/ticket.py:13 +msgid "creation time" +msgstr "" + +#: judge/models/ticket.py:14 +msgid "assignees" +msgstr "" + +#: judge/models/ticket.py:15 +msgid "quick notes" +msgstr "" + +#: judge/models/ticket.py:16 +msgid "Staff notes for this issue to aid in processing." +msgstr "" + +#: judge/models/ticket.py:17 +msgid "linked item type" +msgstr "" + +#: judge/models/ticket.py:19 +msgid "linked item ID" +msgstr "" + +#: judge/models/ticket.py:21 +msgid "is ticket open?" +msgstr "" + +#: judge/models/ticket.py:25 +msgid "ticket" +msgstr "" + +#: judge/models/ticket.py:27 +msgid "poster" +msgstr "" + +#: judge/models/ticket.py:30 +msgid "message time" +msgstr "" + +#: judge/pdf_problems.py:134 judge/pdf_problems.py:186 +#: judge/pdf_problems.py:246 +msgid "Page [page] of [topage]" +msgstr "" + +#: judge/tasks/moss.py:25 +msgid "Running MOSS" +msgstr "" + +#: judge/tasks/submission.py:43 +msgid "Modifying submissions" +msgstr "" + +#: judge/tasks/submission.py:56 +msgid "Recalculating user points" +msgstr "" + +#: judge/utils/problem_data.py:63 +msgid "Empty batches not allowed." +msgstr "" + +#: 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 +#, python-format +msgid "Input file for case %d does not exist: %s" +msgstr "" + +#: 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 +#, python-format +msgid "Batch start case #%d requires points." +msgstr "" + +#: 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 +msgid "How did you corrupt the zip path?" +msgstr "" + +#: judge/utils/problem_data.py:160 +msgid "How did you corrupt the generator path?" +msgstr "" + +#: judge/utils/problems.py:76 +msgid "Can't pass both queryset and keyword filters" +msgstr "" + +#: judge/utils/problems.py:87 +msgid "Wrong" +msgstr "" + +#: judge/utils/problems.py:89 +msgid "Timeout" +msgstr "" + +#: judge/utils/problems.py:90 +msgid "Error" +msgstr "" + +#: 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/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:38 +#, python-format +msgid "Page %d of Posts" +msgstr "" + +#: judge/views/comment.py:27 +msgid "Messing around, are we?" +msgstr "" + +#: judge/views/comment.py:36 +msgid "You must solve at least one problem before you can vote." +msgstr "" + +#: judge/views/comment.py:63 +msgid "You already voted." +msgstr "" + +#: judge/views/comment.py:120 judge/views/organization.py:299 +msgid "Edited from site" +msgstr "" + +#: judge/views/comment.py:141 +msgid "Editing comment" +msgstr "" + +#: judge/views/contests.py:49 judge/views/contests.py:211 +#: judge/views/contests.py:214 judge/views/contests.py:385 +msgid "No such contest" +msgstr "" + +#: judge/views/contests.py:50 judge/views/contests.py:212 +#, python-format +msgid "Could not find a contest with the key \"%s\"." +msgstr "" + +#: judge/views/contests.py:75 +msgid "Contests" +msgstr "" + +#: judge/views/contests.py:215 +msgid "Could not find such contest." +msgstr "" + +#: judge/views/contests.py:218 +#, python-format +msgid "Access to contest \"%s\" denied" +msgstr "" + +#: judge/views/contests.py:242 +msgid "Clone Contest" +msgstr "" + +#: judge/views/contests.py:305 +msgid "Contest not ongoing" +msgstr "" + +#: judge/views/contests.py:306 +#, python-format +msgid "\"%s\" is not currently ongoing." +msgstr "" + +#: judge/views/contests.py:310 +msgid "Already in contest" +msgstr "" + +#: judge/views/contests.py:311 +#, python-format +msgid "You are already in a contest: \"%s\"." +msgstr "" + +#: judge/views/contests.py:314 +msgid "Banned from joining" +msgstr "" + +#: judge/views/contests.py:315 +msgid "You have been declared persona non grata for this contest. You are permanently barred from joining this contest." +msgstr "" + +#: judge/views/contests.py:375 +#, python-format +msgid "Enter access code for \"%s\"" +msgstr "" + +#: judge/views/contests.py:386 +#, python-format +msgid "You are not in contest \"%s\"." +msgstr "" + +#: judge/views/contests.py:405 +msgid "ContestCalendar requires integer year and month" +msgstr "" + +#: judge/views/contests.py:445 +#, python-format +msgid "Contests in %(month)s" +msgstr "" + +#: judge/views/contests.py:445 +msgid "F Y" +msgstr "" + +#: judge/views/contests.py:531 +msgid "???" +msgstr "" + +#: judge/views/contests.py:594 +#, python-format +msgid "%s Rankings" +msgstr "" + +#: judge/views/contests.py:610 +#, python-format +msgid "Your participation in %s" +msgstr "" + +#: judge/views/contests.py:611 +#, python-format +msgid "%s's participation in %s" +msgstr "" + +#: judge/views/contests.py:615 +msgid "Live" +msgstr "" + +#: judge/views/contests.py:627 templates/contest/contest-tabs.html:13 +msgid "Participation" +msgstr "" + +#: judge/views/contests.py:654 +#, python-format +msgid "%s MOSS Results" +msgstr "" + +#: judge/views/contests.py:681 +#, python-format +msgid "Running MOSS for %s..." +msgstr "" + +#: judge/views/contests.py:704 +#, python-format +msgid "Contest tag: %s" +msgstr "" + +#: judge/views/error.py:14 +msgid "404 error" +msgstr "" + +#: judge/views/error.py:15 +#, python-format +msgid "Could not find page \"%s\"" +msgstr "" + +#: judge/views/error.py:22 +#, python-format +msgid "no permission for %s" +msgstr "" + +#: 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 +msgid "Runtimes" +msgstr "" + +#: judge/views/organization.py:44 judge/views/organization.py:47 +msgid "No such organization" +msgstr "" + +#: judge/views/organization.py:45 +#, python-format +msgid "Could not find an organization with the key \"%s\"." +msgstr "" + +#: judge/views/organization.py:48 +msgid "Could not find such organization." +msgstr "" + +#: judge/views/organization.py:72 judge/views/register.py:34 +#: templates/organization/list.html:15 templates/user/user-list-tabs.html:5 +msgid "Organizations" +msgstr "" + +#: judge/views/organization.py:93 +#, python-format +msgid "%s Members" +msgstr "" + +#: judge/views/organization.py:118 judge/views/organization.py:121 +#: judge/views/organization.py:126 +msgid "Joining organization" +msgstr "" + +#: judge/views/organization.py:118 +msgid "You are already in the organization." +msgstr "" + +#: judge/views/organization.py:121 +msgid "This organization is not open." +msgstr "" + +#: judge/views/organization.py:138 +msgid "Leaving organization" +msgstr "" + +#: judge/views/organization.py:138 +#, python-format +msgid "You are not in \"%s\"." +msgstr "" + +#: judge/views/organization.py:162 +#, python-format +msgid "Request to join %s" +msgstr "" + +#: judge/views/organization.py:180 +msgid "Join request detail" +msgstr "" + +#: judge/views/organization.py:209 +#, python-format +msgid "Managing join requests for %s" +msgstr "" + +#: judge/views/organization.py:240 +#, python-format +msgid "Your organization can only receive %d more members. You cannot approve %d users." +msgstr "" + +#: judge/views/organization.py:252 +#, python-format +msgid "Approved %d user." +msgid_plural "Approved %d users." +msgstr[0] "" +msgstr[1] "" + +#: judge/views/organization.py:253 +#, python-format +msgid "Rejected %d user." +msgid_plural "Rejected %d users." +msgstr[0] "" +msgstr[1] "" + +#: judge/views/organization.py:283 +#, python-format +msgid "Editing %s" +msgstr "" + +#: judge/views/organization.py:307 judge/views/organization.py:315 +msgid "Can't edit organization" +msgstr "" + +#: judge/views/organization.py:308 +msgid "You are not allowed to edit this organization." +msgstr "" + +#: judge/views/organization.py:316 +msgid "You are not allowed to kick people from this organization." +msgstr "" + +#: judge/views/organization.py:321 judge/views/organization.py:325 +msgid "Can't kick user" +msgstr "" + +#: judge/views/organization.py:322 +msgid "The user you are trying to kick does not exist!" +msgstr "" + +#: judge/views/organization.py:326 +#, python-format +msgid "The user you are trying to kick is not in organization: %s." +msgstr "" + +#: judge/views/problem.py:68 +msgid "No such problem" +msgstr "" + +#: judge/views/problem.py:69 +#, python-format +msgid "Could not find a problem with the code \"%s\"." +msgstr "" + +#: judge/views/problem.py:111 +#, python-brace-format +msgid "Editorial for {0}" +msgstr "" + +#: judge/views/problem.py:114 +#, python-brace-format +msgid "Editorial for {0}" +msgstr "" + +#: judge/views/problem.py:285 templates/contest/contest.html:79 +#: templates/user/user-tabs.html:5 templates/user/users-table.html:23 +msgid "Problems" +msgstr "" + +#: judge/views/problem.py:546 +msgid "Banned from submitting" +msgstr "" + +#: judge/views/problem.py:547 +msgid "You have been declared persona non grata for this problem. You are permanently barred from submitting this problem." +msgstr "" + +#: judge/views/problem.py:560 +msgid "Too many submissions" +msgstr "" + +#: judge/views/problem.py:561 +msgid "You have exceeded the submission limit for this problem." +msgstr "" + +#: judge/views/problem.py:627 judge/views/problem.py:630 +#, python-format +msgid "Submit to %(problem)s" +msgstr "" + +#: judge/views/problem.py:646 +msgid "Clone Problem" +msgstr "" + +#: judge/views/problem_data.py:37 +msgid "Checker arguments must be a JSON object" +msgstr "" + +#: judge/views/problem_data.py:39 +msgid "Checker arguments is invalid JSON" +msgstr "" + +#: judge/views/problem_data.py:46 +msgid "Your zip file is invalid!" +msgstr "" + +#: judge/views/problem_data.py:104 +#, python-brace-format +msgid "Comparing submissions for {0}" +msgstr "" + +#: judge/views/problem_data.py:107 +#, python-brace-format +msgid "Comparing submissions for {0}" +msgstr "" + +#: judge/views/problem_data.py:142 +#, python-brace-format +msgid "Editing data for {0}" +msgstr "" + +#: judge/views/problem_data.py:145 +#, python-format +msgid "Editing data for %s" +msgstr "" + +#: judge/views/problem_data.py:237 judge/views/problem_data.py:238 +#, python-format +msgid "Generated init.yml for %s" +msgstr "" + +#: 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:58 +#, python-format +msgid "Best solutions for %s" +msgstr "" + +#: judge/views/ranked_submission.py:61 +#, python-brace-format +msgid "Best solutions for {0}" +msgstr "" + +#: judge/views/ranked_submission.py:71 +#, python-format +msgid "Best solutions for %(problem)s in %(contest)s" +msgstr "" + +#: judge/views/ranked_submission.py:74 +#, python-format +msgid "Best solutions for problem %(number)s in %(contest)s" +msgstr "" + +#: judge/views/ranked_submission.py:80 +#, python-brace-format +msgid "Best solutions for {0} in {2}" +msgstr "" + +#: judge/views/ranked_submission.py:83 +#, python-brace-format +msgid "Best solutions for problem {0} in {1}" +msgstr "" + +#: judge/views/register.py:27 +msgid "A username must contain letters, numbers, or underscores" +msgstr "" + +#: judge/views/register.py:31 templates/user/edit-profile.html:103 +msgid "Preferred language" +msgstr "" + +#: judge/views/register.py:38 +msgid "Subscribe to newsletter?" +msgstr "" + +#: judge/views/register.py:45 +#, python-format +msgid "The email address \"%s\" is already taken. Only one registration is allowed per address." +msgstr "" + +#: judge/views/register.py:51 +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 +msgid "Registration" +msgstr "" + +#: judge/views/register.py:106 +msgid "Authentication failure" +msgstr "" + +#: judge/views/stats.py:105 +msgid "Language statistics" +msgstr "" + +#: judge/views/status.py:24 templates/submission/list.html:319 +msgid "Status" +msgstr "" + +#: judge/views/status.py:108 +msgid "Version matrix" +msgstr "" + +#: judge/views/submission.py:59 judge/views/submission.py:66 +#, python-format +msgid "Submission of %(problem)s by %(user)s" +msgstr "" + +#: judge/views/submission.py:161 judge/views/submission.py:162 +#: templates/problem/problem.html:127 +msgid "All submissions" +msgstr "" + +#: judge/views/submission.py:303 +msgid "All my submissions" +msgstr "" + +#: judge/views/submission.py:304 +#, python-format +msgid "All submissions by %s" +msgstr "" + +#: judge/views/submission.py:335 +#, python-format +msgid "All submissions for %s" +msgstr "" + +#: judge/views/submission.py:354 +msgid "Must pass a problem" +msgstr "" + +#: judge/views/submission.py:397 +#, python-format +msgid "My submissions for %(problem)s" +msgstr "" + +#: judge/views/submission.py:398 +#, python-format +msgid "%(user)s's submissions for %(problem)s" +msgstr "" + +#: judge/views/submission.py:495 +msgid "Must pass a contest" +msgstr "" + +#: judge/views/submission.py:514 +#, python-brace-format +msgid "{0}'s submissions for {2} in {4}" +msgstr "" + +#: judge/views/submission.py:519 +#, 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 "" + +#: judge/views/ticket.py:40 +msgid "Issue description" +msgstr "" + +#: judge/views/ticket.py:85 judge/views/ticket.py:88 +#, python-format +msgid "New ticket for %s" +msgstr "" + +#: judge/views/ticket.py:139 +#, python-format +msgid "%(title)s - Ticket %(id)d" +msgstr "" + +#: judge/views/ticket.py:248 +#, python-format +msgid "Tickets - Page %(number)d of %(total)d" +msgstr "" + +#: judge/views/ticket.py:297 +#, python-format +msgid "New Ticket: %s" +msgstr "" + +#: judge/views/ticket.py:298 +#, python-format +msgid "#%(id)d, assigned to: %(users)s" +msgstr "" + +#: judge/views/ticket.py:300 +msgid ", " +msgstr "" + +#: judge/views/ticket.py:300 +msgid "no one" +msgstr "" + +#: judge/views/totp.py:42 templates/registration/totp_enable.html:86 +msgid "Enable Two Factor Authentication" +msgstr "" + +#: judge/views/totp.py:89 templates/registration/totp_disable.html:48 +msgid "Disable Two Factor Authentication" +msgstr "" + +#: judge/views/totp.py:103 +msgid "Perform Two Factor Authentication" +msgstr "" + +#: judge/views/user.py:68 +msgid "No such user" +msgstr "" + +#: judge/views/user.py:68 +#, python-format +msgid "No user handle \"%s\"." +msgstr "" + +#: judge/views/user.py:72 +msgid "My account" +msgstr "" + +#: judge/views/user.py:73 +#, python-format +msgid "User %s" +msgstr "" + +#: judge/views/user.py:136 +msgid "M j, Y, G:i" +msgstr "" + +#: judge/views/user.py:221 +msgid "Updated on site" +msgstr "" + +#: judge/views/user.py:253 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:10 +msgid "Edit profile" +msgstr "" + +#: judge/views/user.py:262 templates/user/user-list-tabs.html:4 +msgid "Leaderboard" +msgstr "" + +#: judge/views/widgets.py:48 judge/views/widgets.py:58 +#, python-format +msgid "Invalid upstream data: %s" +msgstr "" + +#: judge/views/widgets.py:68 +msgid "Bad latitude or longitude" +msgstr "" + +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:13 +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:27 +msgid "Photo" +msgstr "" + +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:14 +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:28 +msgid "Photos" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:9 +msgid "first name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:10 +msgid "last name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:11 +msgid "biography" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/admin.py:24 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:30 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:30 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:30 +msgid "owner" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:12 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:12 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:12 +msgid "name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:19 +msgid "Category of Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:20 +msgid "Categories of Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:26 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:26 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:26 +msgid "title" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:28 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:28 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:28 +msgid "category" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:29 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:29 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:29 +msgid "author" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:31 +msgid "publication date" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:37 +msgid "Book" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:38 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:136 +msgid "Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:19 +msgid "Category of CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:20 +msgid "Categories of CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:36 +msgid "CD" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:37 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:141 +msgid "CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:19 +msgid "Category of DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:20 +msgid "Categories of DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:36 +msgid "DVD" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:37 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:146 +msgid "DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/templates/admin/base_site.html:7 +msgid "Django administration" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/forms.py:12 +#, python-format +msgid "Please enter the correct %(username)s and password for an admin account. Note that both fields may be case-sensitive." +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/forms.py:32 +#, python-format +msgid "Please enter the correct %(username)s and password for an user account. Note that both fields may be case-sensitive." +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:27 +msgid "Site" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:38 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:41 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:130 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:133 +msgid "Dashboard" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:48 +msgid "Applications" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:53 +msgid "Administration" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:64 +msgid "Color theme" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:66 +msgid "Change color theme" +msgstr "" + +#: 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 +msgid "Rate all ratable contests" +msgstr "" + +#: 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 +msgid "Rejudge" +msgstr "" + +#: templates/base.html:214 +#, python-format +msgid "Hello, %(username)s." +msgstr "" + +#: templates/base.html:220 templates/comments/list.html:89 +#: templates/contest/contest-list-tabs.html:24 +#: templates/problem/problem-list-tabs.html:6 +#: templates/submission/info-base.html:12 +#: templates/submission/submission-list-tabs.html:15 +msgid "Admin" +msgstr "" + +#: templates/base.html:229 +msgid "Log out" +msgstr "" + +#: templates/base.html:238 +#: templates/registration/password_reset_complete.html:4 +msgid "Log in" +msgstr "" + +#: templates/base.html:239 templates/registration/registration_form.html:177 +msgid "or" +msgstr "" + +#: templates/base.html:240 +msgid "Sign up" +msgstr "" + +#: templates/base.html:252 +msgid "spectating" +msgstr "" + +#: 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:20 +#: 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 +msgid "Edit" +msgstr "" + +#: templates/blog/content.html:27 +#, python-format +msgid "\n" +" posted on %(time)s\n" +" " +msgstr "" + +#: templates/blog/dashboard.html:21 +#, python-format +msgid "\n" +" on %(time)s\n" +" " +msgstr "" + +#: templates/blog/list.html:85 +msgid "Blog" +msgstr "" + +#: templates/blog/list.html:87 +msgid "Events" +msgstr "" + +#: templates/blog/list.html:92 +msgid "News" +msgstr "" + +#: templates/blog/list.html:106 +#, python-brace-format +msgid "posted on {time}" +msgstr "" + +#: templates/blog/list.html:130 templates/problem/problem.html:310 +msgid "Clarifications" +msgstr "" + +#: templates/blog/list.html:146 templates/problem/problem.html:321 +msgid "No clarifications have been made at this time." +msgstr "" + +#: templates/blog/list.html:154 +msgid "Ongoing contests" +msgstr "" + +#: templates/blog/list.html:172 +msgid "Upcoming contests" +msgstr "" + +#: templates/blog/list.html:189 +msgid "Comment stream" +msgstr "" + +#: templates/blog/list.html:208 +msgid "New problems" +msgstr "" + +#: templates/blog/list.html:225 +msgid "My open tickets" +msgstr "" + +#: templates/blog/list.html:246 +msgid "New tickets" +msgstr "" + +#: templates/comments/list.html:2 +msgid "Comments" +msgstr "" + +#: templates/comments/list.html:18 templates/comments/list.html:27 +msgid "Please login to vote" +msgstr "" + +#: templates/comments/list.html:40 +#, python-brace-format +msgid "commented on {time}" +msgstr "" + +#: templates/comments/list.html:49 +#, python-format +msgid "edit %(edits)s" +msgstr "" + +#: templates/comments/list.html:51 templates/comments/media-js.html:77 +msgid "edited" +msgstr "" + +#: templates/comments/list.html:60 +msgid "Link" +msgstr "" + +#: templates/comments/list.html:73 templates/comments/list.html:80 +msgid "Reply" +msgstr "" + +#: templates/comments/list.html:86 +msgid "Hide" +msgstr "" + +#: templates/comments/list.html:101 +#, 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:120 +msgid "There are no comments at the moment." +msgstr "" + +#: templates/comments/list.html:126 +msgid "New comment" +msgstr "" + +#: templates/comments/list.html:140 +msgid "Invalid comment body." +msgstr "" + +#: templates/comments/list.html:148 +msgid "Post!" +msgstr "" + +#: templates/comments/list.html:156 +msgid "Comments are disabled on this page." +msgstr "" + +#: templates/comments/media-js.html:72 +#, python-brace-format +msgid "edit {edits}" +msgstr "" + +#: templates/comments/media-js.html:75 +msgid "original" +msgstr "" + +#: templates/contest/access_code.html:26 +msgid "Invalid access code." +msgstr "" + +#: templates/contest/access_code.html:29 +msgid "Please enter your access code:" +msgstr "" + +#: templates/contest/access_code.html:32 +msgid "Join Contest" +msgstr "" + +#: templates/contest/calendar.html:12 +msgid "Sunday" +msgstr "" + +#: templates/contest/calendar.html:13 +msgid "Monday" +msgstr "" + +#: templates/contest/calendar.html:14 +msgid "Tuesday" +msgstr "" + +#: templates/contest/calendar.html:15 +msgid "Wednesday" +msgstr "" + +#: templates/contest/calendar.html:16 +msgid "Thursday" +msgstr "" + +#: templates/contest/calendar.html:17 +msgid "Friday" +msgstr "" + +#: templates/contest/calendar.html:18 +msgid "Saturday" +msgstr "" + +#: 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 +msgid "Today" +msgstr "" + +#: templates/contest/contest-list-tabs.html:13 +msgid "Next" +msgstr "" + +#: templates/contest/contest-list-tabs.html:21 +#: templates/problem/problem-list-tabs.html:5 +msgid "List" +msgstr "" + +#: templates/contest/contest-list-tabs.html:22 +msgid "Calendar" +msgstr "" + +#: templates/contest/contest-tabs.html:4 +msgid "Info" +msgstr "" + +#: templates/contest/contest-tabs.html:8 +msgid "Rankings" +msgstr "" + +#: templates/contest/contest-tabs.html:10 +msgid "Hidden Rankings" +msgstr "" + +#: templates/contest/contest-tabs.html:18 +msgid "MOSS" +msgstr "" + +#: templates/contest/contest-tabs.html:23 +msgid "Clone" +msgstr "" + +#: templates/contest/contest-tabs.html:34 +#: templates/contest/contest-tabs.html:54 +msgid "Leave contest" +msgstr "" + +#: templates/contest/contest-tabs.html:41 templates/contest/list.html:293 +msgid "Virtual join" +msgstr "" + +#: templates/contest/contest-tabs.html:52 +msgid "Stop spectating" +msgstr "" + +#: templates/contest/contest-tabs.html:61 +msgid "Spectate contest" +msgstr "" + +#: templates/contest/contest-tabs.html:67 +#: templates/contest/contest-tabs.html:73 +msgid "Join contest" +msgstr "" + +#: templates/contest/contest-tabs.html:82 +msgid "Login to participate" +msgstr "" + +#: templates/contest/contest.html:37 +msgid "Participating virtually." +msgstr "" + +#: templates/contest/contest.html:43 +msgid "Contest is over." +msgstr "" + +#: templates/contest/contest.html:59 templates/contest/contest.html:63 +msgid "F j, Y, G:i T" +msgstr "" + +#: 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 +#, python-format +msgid "%(length)s long starting on %(start_time)s" +msgstr "" + +#: templates/contest/contest.html:85 +msgid "AC Rate" +msgstr "" + +#: templates/contest/contest.html:86 templates/contest/list.html:153 +#: templates/contest/list.html:195 templates/contest/list.html:271 +#: templates/problem/list.html:212 templates/problem/list.html:238 +msgid "Users" +msgstr "" + +#: templates/contest/contest.html:111 +msgid "Editorial" +msgstr "" + +#: templates/contest/list.html:31 templates/contest/media-js.html:9 +msgid "Are you sure you want to join?" +msgstr "" + +#: 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:65 +msgid "hidden" +msgstr "" + +#: templates/contest/list.html:70 +msgid "private" +msgstr "" + +#: templates/contest/list.html:84 +msgid "rated" +msgstr "" + +#: templates/contest/list.html:132 +msgid "Spectate" +msgstr "" + +#: templates/contest/list.html:138 +msgid "Join" +msgstr "" + +#: templates/contest/list.html:148 +msgid "Active Contests" +msgstr "" + +#: templates/contest/list.html:152 templates/contest/list.html:194 +#: templates/contest/list.html:232 templates/contest/list.html:270 +msgid "Contest" +msgstr "" + +#: templates/contest/list.html:190 +msgid "Ongoing Contests" +msgstr "" + +#: templates/contest/list.html:227 +msgid "Upcoming Contests" +msgstr "" + +#: templates/contest/list.html:255 +msgid "There are no scheduled contests at this time." +msgstr "" + +#: templates/contest/list.html:261 +msgid "Past Contests" +msgstr "" + +#: templates/contest/media-js.html:4 +msgid "Are you sure you want to leave?" +msgstr "" + +#: 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 +msgid "Joining a contest starts your timer, after which it becomes unstoppable." +msgstr "" + +#: 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:7 +msgid "Organization" +msgstr "" + +#: templates/contest/ranking-table.html:27 +#, python-brace-format +msgid "Started on {time}" +msgstr "" + +#: templates/contest/ranking-table.html:30 +msgid "Participation ended." +msgstr "" + +#: templates/contest/ranking.html:232 +msgid "View user participation" +msgstr "" + +#: templates/contest/ranking.html:236 +msgid "Show organizations" +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 +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 +msgid "activate" +msgstr "" + +#: 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 +msgid "Newsletter unsubscribe" +msgstr "" + +#: 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 +msgid "Do you want to unsubscribe from this newsletter?" +msgstr "" + +#: 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 +msgid "Newsletter update" +msgstr "" + +#: 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 +msgid "Update subscription" +msgstr "" + +#: templates/newsletter/subscription_update_activated.html:8 +msgid "Your subscription has successfully been updated." +msgstr "" + +#: 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:34 +#: templates/ticket/edit-notes.html:4 +msgid "Update" +msgstr "" + +#: 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:29 +msgid "Join organization" +msgstr "" + +#: templates/organization/home.html:33 +msgid "Request membership" +msgstr "" + +#: templates/organization/home.html:39 +msgid "Edit organization" +msgstr "" + +#: templates/organization/home.html:43 +msgid "View requests" +msgstr "" + +#: templates/organization/home.html:50 +msgid "Admin organization" +msgstr "" + +#: templates/organization/home.html:55 +msgid "View members" +msgstr "" + +#: templates/organization/list.html:23 templates/status/language-list.html:34 +msgid "Name" +msgstr "" + +#: templates/organization/list.html:24 +msgid "Members" +msgstr "" + +#: templates/organization/new.html:10 templates/ticket/new.html:38 +msgid "Create" +msgstr "" + +#: templates/organization/requests/detail.html:13 +msgid "User:" +msgstr "" + +#: templates/organization/requests/detail.html:17 +msgid "Organization:" +msgstr "" + +#: templates/organization/requests/detail.html:25 +msgid "Time:" +msgstr "" + +#: templates/organization/requests/detail.html:29 +msgid "Reason:" +msgstr "" + +#: 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:15 +msgid "Reason" +msgstr "" + +#: 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:17 +#: templates/problem/data.html:401 +msgid "Delete?" +msgstr "" + +#: templates/organization/requests/request.html:18 +msgid "Your reason for joining:" +msgstr "" + +#: templates/organization/requests/request.html:20 +msgid "Request" +msgstr "" + +#: templates/organization/requests/tabs.html:4 +msgid "Pending" +msgstr "" + +#: templates/organization/requests/tabs.html:7 +msgid "Log" +msgstr "" + +#: templates/organization/requests/tabs.html:10 +msgid "Approved" +msgstr "" + +#: templates/organization/requests/tabs.html:13 +msgid "Rejected" +msgstr "" + +#: templates/organization/users-table.html:15 +msgid "Kick" +msgstr "" + +#: templates/problem/clone.html:37 +msgid "Enter a new code for the cloned problem:" +msgstr "" + +#: templates/problem/data.html:353 +msgid "View YAML" +msgstr "" + +#: templates/problem/data.html:369 +msgid "Show columns:" +msgstr "" + +#: templates/problem/data.html:372 templates/problem/data.html:396 +msgid "Output prefix" +msgstr "" + +#: templates/problem/data.html:376 templates/problem/data.html:397 +msgid "Output limit" +msgstr "" + +#: templates/problem/data.html:380 templates/problem/data.html:398 +msgid "Checker" +msgstr "" + +#: templates/problem/data.html:384 templates/problem/data.html:399 +msgid "Generator args" +msgstr "" + +#: templates/problem/data.html:391 +msgid "Type" +msgstr "" + +#: templates/problem/data.html:392 +msgid "Input file" +msgstr "" + +#: templates/problem/data.html:393 +msgid "Output file" +msgstr "" + +#: templates/problem/data.html:395 +msgid "Pretest?" +msgstr "" + +#: templates/problem/data.html:447 templates/problem/submit.html:252 +msgid "Submit!" +msgstr "" + +#: templates/problem/data.html:448 +msgid "Add new case" +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 editorialist.

Submitting an official solution before solving the problem yourself is a bannable offence." +msgstr "" + +#: templates/problem/list.html:62 +msgid "Filter by type..." +msgstr "" + +#: templates/problem/list.html:185 +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:57 +msgid "Category" +msgstr "" + +#: templates/problem/list.html:209 templates/problem/list.html:228 +msgid "Types" +msgstr "" + +#: templates/problem/list.html:235 +#, python-format +msgid "AC %%" +msgstr "" + +#: 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:142 +msgid "Filter by result:" +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:101 templates/problem/problem.html:111 +#: templates/problem/problem.html:116 +msgid "Submit solution" +msgstr "" + +#: 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:112 +msgid "0 submissions left" +msgstr "" + +#: templates/problem/problem.html:124 +msgid "My submissions" +msgstr "" + +#: templates/problem/problem.html:128 +msgid "Best submissions" +msgstr "" + +#: templates/problem/problem.html:132 +msgid "Read editorial" +msgstr "" + +#: templates/problem/problem.html:137 +msgid "Manage tickets" +msgstr "" + +#: templates/problem/problem.html:141 +msgid "Edit problem" +msgstr "" + +#: templates/problem/problem.html:143 +msgid "Edit test data" +msgstr "" + +#: templates/problem/problem.html:148 +msgid "My tickets" +msgstr "" + +#: templates/problem/problem.html:156 +msgid "Manage submissions" +msgstr "" + +#: templates/problem/problem.html:162 +msgid "Clone problem" +msgstr "" + +#: templates/problem/problem.html:169 +msgid "Points:" +msgstr "" + +#: templates/problem/problem.html:172 templates/problem/problem.html:174 +msgid "(partial)" +msgstr "" + +#: templates/problem/problem.html:179 +msgid "Time limit:" +msgstr "" + +#: templates/problem/problem.html:191 +msgid "Memory limit:" +msgstr "" + +#: templates/problem/problem.html:210 +msgid "Author:" +msgid_plural "Authors:" +msgstr[0] "" +msgstr[1] "" + +#: templates/problem/problem.html:225 +msgid "Problem type" +msgid_plural "Problem types" +msgstr[0] "" +msgstr[1] "" + +#: templates/problem/problem.html:238 +msgid "Allowed languages" +msgstr "" + +#: templates/problem/problem.html:246 +#, python-format +msgid "No %(lang)s judge online" +msgstr "" + +#: templates/problem/problem.html:257 +msgid "Judge:" +msgid_plural "Judges:" +msgstr[0] "" +msgstr[1] "" + +#: templates/problem/problem.html:274 +msgid "none available" +msgstr "" + +#: templates/problem/problem.html:299 +msgid "Request clarification" +msgstr "" + +#: templates/problem/problem.html:301 +msgid "Report an issue" +msgstr "" + +#: 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 +msgid "Search problems..." +msgstr "" + +#: templates/problem/search-form.html:14 +msgid "Full text search" +msgstr "" + +#: templates/problem/search-form.html:21 +msgid "Hide solved problems" +msgstr "" + +#: 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 +msgid "All" +msgstr "" + +#: templates/problem/search-form.html:46 +msgid "Problem types" +msgstr "" + +#: templates/problem/search-form.html:57 +msgid "Point range" +msgstr "" + +#: templates/problem/search-form.html:63 templates/submission/list.html:337 +#: templates/ticket/list.html:248 +msgid "Go" +msgstr "" + +#: templates/problem/search-form.html:64 +msgid "Random" +msgstr "" + +#: templates/problem/submit.html:192 +#, python-format +msgid "Warning! Your default language, %(default_language)s, is unavailable for this problem and has been deselected." +msgstr "" + +#: templates/problem/submit.html:203 +#, python-format +msgid "\n" +" You have %(left)s submission left\n" +" " +msgid_plural "\n" +" You have %(left)s submissions left\n" +" " +msgstr[0] "" +msgstr[1] "" + +#: templates/problem/submit.html:212 +msgid "You have 0 submissions left" +msgstr "" + +#: templates/problem/submit.html:250 +msgid "No judge is available for this problem." +msgstr "" + +#: templates/registration/activate.html:3 +#, python-format +msgid "%(key)s is an invalid activation key." +msgstr "" + +#: templates/registration/activation_complete.html:3 +msgid "Your account has been successfully activated." +msgstr "" + +#: templates/registration/login.html:43 +msgid "Invalid username or password." +msgstr "" + +#: templates/registration/login.html:61 +#: templates/registration/totp_auth.html:39 +msgid "Login!" +msgstr "" + +#: templates/registration/login.html:64 +msgid "Forgot your password?" +msgstr "" + +#: templates/registration/login.html:67 +msgid "Or log in with..." +msgstr "" + +#: templates/registration/logout.html:3 +msgid "See you later!" +msgstr "" + +#: templates/registration/password_change_done.html:3 +msgid "Your password was sucessfully changed." +msgstr "" + +#: templates/registration/password_change_form.html:8 +msgid "Change Password" +msgstr "" + +#: templates/registration/password_reset.html:7 +msgid "Send Reset Email" +msgstr "" + +#: 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_confirm.html:9 +msgid "Reset Password" +msgstr "" + +#: 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 +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 +#, 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 +msgid "Please go to the following page and choose a new password:" +msgstr "" + +#: templates/registration/password_reset_email.txt:7 +msgid "Your username, in case you've forgotten:" +msgstr "" + +#: templates/registration/password_reset_email.txt:9 +msgid "Thanks for using our site!" +msgstr "" + +#: templates/registration/password_reset_email.txt:11 +#, python-format +msgid "The %(site_name)s team" +msgstr "" + +#: 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 +msgid "Continue >" +msgstr "" + +#: 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:166 +msgid "(again, for confirmation)" +msgstr "" + +#: templates/registration/registration_form.html:173 +msgid "(select your closest major city)" +msgstr "" + +#: templates/registration/registration_form.html:178 +msgid "pick from map" +msgstr "" + +#: templates/registration/registration_form.html:183 +msgid "Default language" +msgstr "" + +#: templates/registration/registration_form.html:186 +#: templates/user/edit-profile.html:162 +msgid "Affiliated organizations" +msgstr "" + +#: templates/registration/registration_form.html:192 +#: templates/user/edit-profile.html:121 +msgid "Notify me about upcoming contests" +msgstr "" + +#: templates/registration/registration_form.html:206 +msgid "By registering, you agree to our" +msgstr "" + +#: templates/registration/registration_form.html:207 +msgid "Terms & Conditions" +msgstr "" + +#: templates/registration/registration_form.html:210 +msgid "Register!" +msgstr "" + +#: templates/registration/totp_auth.html:36 +#: templates/registration/totp_disable.html:45 +#: templates/registration/totp_enable.html:83 +msgid "Enter the 6-digit code generated by your app:" +msgstr "" + +#: templates/registration/totp_auth.html:41 +#, python-format +msgid "If you lost your authentication device, please contact us at %(email)s." +msgstr "" + +#: templates/registration/totp_disable.html:38 +msgid "To protect your account, you must first authenticate before you can disable Two Factor Authentication." +msgstr "" + +#: templates/registration/totp_enable.html:71 +msgid "Scan this code with your authenticator app:" +msgstr "" + +#: templates/registration/totp_enable.html:72 +msgid "QR code" +msgstr "" + +#: templates/registration/totp_enable.html:73 +msgid "Or enter this code manually:" +msgstr "" + +#: templates/stats/base.html:9 templates/submission/list.html:345 +msgid "Statistics" +msgstr "" + +#: templates/stats/language.html:11 +msgid "Submission Statistics" +msgstr "" + +#: templates/stats/language.html:16 +msgid "Submissions by Language" +msgstr "" + +#: templates/stats/language.html:21 +msgid "AC Submissions by Language" +msgstr "" + +#: templates/stats/language.html:26 +msgid "Language AC Rate" +msgstr "" + +#: templates/status/judge-status-table.html:2 +msgid "Judge" +msgstr "" + +#: templates/status/judge-status-table.html:4 +msgid "Online" +msgstr "" + +#: templates/status/judge-status-table.html:6 +msgid "Uptime" +msgstr "" + +#: templates/status/judge-status-table.html:7 +msgid "Ping" +msgstr "" + +#: 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 +msgid "N/A" +msgstr "" + +#: templates/status/judge-status-table.html:64 +msgid "There are no judges available at this time." +msgstr "" + +#: templates/status/language-list.html:33 templates/ticket/list.html:261 +msgid "ID" +msgstr "" + +#: templates/status/language-list.html:35 +msgid "Runtime Info" +msgstr "" + +#: templates/status/status-tabs.html:4 +msgid "Judges" +msgstr "" + +#: templates/status/status-tabs.html:6 +msgid "Version Matrix" +msgstr "" + +#: templates/submission/internal-error-message.html:8 +msgid "An internal error occurred while grading." +msgstr "" + +#: templates/submission/internal-error-message.html:15 +msgid "Error information" +msgstr "" + +#: templates/submission/list.html:76 +msgid "Filter by status..." +msgstr "" + +#: templates/submission/list.html:82 +msgid "Filter by language..." +msgstr "" + +#: templates/submission/list.html:315 +msgid "Filter submissions" +msgstr "" + +#: templates/submission/list.html:351 +msgid "Total:" +msgstr "" + +#: templates/submission/list.html:361 +msgid "You were disconnected. Refresh to show latest updates." +msgstr "" + +#: templates/submission/row.html:39 +#, python-format +msgid "Case #%(case)s" +msgstr "" + +#: templates/submission/row.html:49 +msgid "view" +msgstr "" + +#: templates/submission/row.html:53 +msgid "rejudge" +msgstr "" + +#: templates/submission/row.html:58 +msgid "admin" +msgstr "" + +#: templates/submission/source.html:25 +msgid "View status" +msgstr "" + +#: templates/submission/source.html:26 +msgid "View raw source" +msgstr "" + +#: templates/submission/source.html:28 templates/submission/status.html:61 +msgid "Resubmit" +msgstr "" + +#: 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 +msgid "Your submission is being processed..." +msgstr "" + +#: templates/submission/status-testcases.html:14 +msgid "Compilation Error" +msgstr "" + +#: templates/submission/status-testcases.html:18 +msgid "Compilation Warnings" +msgstr "" + +#: templates/submission/status-testcases.html:23 +msgid "Pretest Execution Results" +msgstr "" + +#: templates/submission/status-testcases.html:25 +msgid "Execution Results" +msgstr "" + +#: templates/submission/status-testcases.html:31 +msgid "Batch " +msgstr "" + +#: templates/submission/status-testcases.html:43 +msgid "Case" +msgstr "" + +#: templates/submission/status-testcases.html:45 +msgid "Pretest" +msgstr "" + +#: templates/submission/status-testcases.html:47 +msgid "Test case" +msgstr "" + +#: templates/submission/status-testcases.html:79 +msgid "Your output (clipped)" +msgstr "" + +#: templates/submission/status-testcases.html:90 +msgid "Judge feedback" +msgstr "" + +#: templates/submission/status-testcases.html:106 +msgid "Resources:" +msgstr "" + +#: templates/submission/status-testcases.html:115 +msgid "Final pretest score:" +msgstr "" + +#: templates/submission/status-testcases.html:117 +msgid "Final score:" +msgstr "" + +#: templates/submission/status-testcases.html:131 +msgid "Passing pretests does not guarantee a full score on system tests." +msgstr "" + +#: templates/submission/status-testcases.html:134 +msgid "Submission aborted!" +msgstr "" + +#: templates/submission/status.html:59 +msgid "View source" +msgstr "" + +#: templates/submission/status.html:88 +msgid "Abort" +msgstr "" + +#: templates/submission/submission-list-tabs.html:6 +msgid "Mine" +msgstr "" + +#: templates/submission/submission-list-tabs.html:9 +msgid "Best" +msgstr "" + +#: templates/submission/submission-list-tabs.html:12 +#, python-format +msgid "%(user)s's" +msgstr "" + +#: templates/ticket/list.html:135 templates/ticket/ticket.html:257 +msgid "Reopened: " +msgstr "" + +#: templates/ticket/list.html:138 templates/ticket/ticket.html:258 +msgid "Closed: " +msgstr "" + +#: templates/ticket/list.html:221 +msgid "Use desktop notification" +msgstr "" + +#: templates/ticket/list.html:227 +msgid "Show my tickets only" +msgstr "" + +#: templates/ticket/list.html:231 +msgid "Filing user" +msgstr "" + +#: templates/ticket/list.html:240 +msgid "Assignee" +msgstr "" + +#: templates/ticket/list.html:262 +msgid "Title" +msgstr "" + +#: templates/ticket/list.html:264 templates/ticket/ticket.html:304 +msgid "Assignees" +msgstr "" + +#: templates/ticket/new_problem.html:7 +msgid "Thanks for opening a ticket!" +msgstr "" + +#: 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 +msgid "Associated object" +msgstr "" + +#: templates/ticket/ticket.html:309 +msgid "No one is assigned." +msgstr "" + +#: templates/ticket/ticket.html:315 +msgid "Close ticket" +msgstr "" + +#: templates/ticket/ticket.html:317 +msgid "Reopen ticket" +msgstr "" + +#: templates/ticket/ticket.html:321 +msgid "Assignee notes" +msgstr "" + +#: templates/ticket/ticket.html:328 templates/widgets/select_all.html:4 +msgid "Nothing here." +msgstr "" + +#: templates/ticket/ticket.html:378 +msgid "Post" +msgstr "" + +#: templates/user/base-users-table.html:3 +msgid "Rank" +msgstr "" + +#: templates/user/base-users.html:14 templates/user/base-users.html:69 +msgid "Search by handle..." +msgstr "" + +#: templates/user/edit-profile.html:90 +msgid "Self-description" +msgstr "" + +#: templates/user/edit-profile.html:98 +msgid "Select your closest major city" +msgstr "" + +#: templates/user/edit-profile.html:107 +msgid "Editor theme" +msgstr "" + +#: templates/user/edit-profile.html:112 +msgid "Math engine" +msgstr "" + +#: templates/user/edit-profile.html:136 templates/user/edit-profile.html:137 +msgid "Change your avatar" +msgstr "" + +#: templates/user/edit-profile.html:143 +msgid "Change your password" +msgstr "" + +#: templates/user/edit-profile.html:150 +msgid "Two Factor Authentication is enabled." +msgstr "" + +#: templates/user/edit-profile.html:153 +msgid "Two Factor Authentication is disabled." +msgstr "" + +#: templates/user/edit-profile.html:170 +msgid "User-script" +msgstr "" + +#: templates/user/edit-profile.html:174 +msgid "Update profile" +msgstr "" + +#: templates/user/pp-row.html:22 +#, python-format +msgid "\n" +" weighted %(weight)s%%\n" +" " +msgstr "" + +#: templates/user/pp-row.html:27 +#, python-format +msgid "%(pp).1fpp" +msgstr "" + +#: templates/user/pp-row.html:29 +#, python-format +msgid "%(pp).0fpp" +msgstr "" + +#: templates/user/user-about.html:14 +msgid "From" +msgstr "" + +#: 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:40 +msgid "You have not shared any information." +msgstr "" + +#: templates/user/user-about.html:42 +msgid "This user has not shared any information." +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:53 +msgid "Total points:" +msgstr "" + +#: templates/user/user-base.html:68 +msgid "Rank by rating:" +msgstr "" + +#: templates/user/user-base.html:70 +msgid "Rating:" +msgstr "" + +#: templates/user/user-base.html:71 +msgid "Volatility:" +msgstr "" + +#: templates/user/user-base.html:72 +msgid "Min. rating:" +msgstr "" + +#: templates/user/user-base.html:73 +msgid "Max rating:" +msgstr "" + +#: templates/user/user-problems.html:35 +msgid "Points Breakdown" +msgstr "" + +#: templates/user/user-problems.html:41 +msgid "Load more..." +msgstr "" + +#: templates/user/user-problems.html:45 +msgid "This user has not yet solved any problems." +msgstr "" + +#: templates/user/user-problems.html:51 +msgid "Authored Problems" +msgstr "" + +#: templates/user/user-problems.html:83 +msgid "Hide problems I've solved" +msgstr "" + +#: templates/user/user-problems.html:93 +#, python-format +msgid "%(points).1f points" +msgstr "" + +#: templates/user/user-problems.html:99 +msgid "Score" +msgstr "" + +#: templates/user/user-problems.html:110 +#, python-format +msgid "%(points)s / %(total)s" +msgstr "" + +#: templates/user/user-tabs.html:7 +msgid "Impersonate" +msgstr "" + +#: templates/user/user-tabs.html:13 +msgid "Admin User" +msgstr "" + +#: templates/user/user-tabs.html:16 +msgid "Admin Profile" +msgstr "" + +#: templates/widgets/select_all.html:8 +msgid "Check all" +msgstr "" + diff --git a/locale/it/LC_MESSAGES/djangojs.po b/locale/it/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..958375c --- /dev/null +++ b/locale/it/LC_MESSAGES/djangojs.po @@ -0,0 +1,30 @@ +msgid "" +msgstr "" +"Project-Id-Version: dmoj\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-10-01 23:12+0000\n" +"PO-Revision-Date: 2019-11-11 22:05\n" +"Last-Translator: Icyene\n" +"Language-Team: Italian\n" +"Language: it_IT\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: crowdin.com\n" +"X-Crowdin-Project: dmoj\n" +"X-Crowdin-Language: it\n" +"X-Crowdin-File: djangojs.po\n" + +#: 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:210 +msgctxt "time format without day" +msgid "%h:%m:%s" +msgstr "" + diff --git a/locale/ja/LC_MESSAGES/django.po b/locale/ja/LC_MESSAGES/django.po new file mode 100644 index 0000000..44fa3a1 --- /dev/null +++ b/locale/ja/LC_MESSAGES/django.po @@ -0,0 +1,4518 @@ +msgid "" +msgstr "" +"Project-Id-Version: dmoj\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-11-11 21:54+0000\n" +"PO-Revision-Date: 2019-11-11 22:05\n" +"Last-Translator: Icyene\n" +"Language-Team: Japanese\n" +"Language: ja_JP\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: crowdin.com\n" +"X-Crowdin-Project: dmoj\n" +"X-Crowdin-Language: ja\n" +"X-Crowdin-File: django.po\n" + +#: dmoj/settings.py:337 +msgid "German" +msgstr "ドイツ語" + +#: dmoj/settings.py:338 +msgid "English" +msgstr "英語" + +#: dmoj/settings.py:339 +msgid "Spanish" +msgstr "スペイン語" + +#: dmoj/settings.py:340 +msgid "French" +msgstr "フランス語" + +#: dmoj/settings.py:341 +msgid "Croatian" +msgstr "クロアチア語" + +#: dmoj/settings.py:342 +msgid "Hungarian" +msgstr "ハンガリー語" + +#: dmoj/settings.py:343 +msgid "Japanese" +msgstr "日本語" + +#: dmoj/settings.py:344 +msgid "Korean" +msgstr "韓国語" + +#: dmoj/settings.py:345 +msgid "Brazilian Portuguese" +msgstr "" + +#: dmoj/settings.py:346 +msgid "Romanian" +msgstr "ルーマニア語" + +#: dmoj/settings.py:347 +msgid "Russian" +msgstr "ロシア語" + +#: dmoj/settings.py:348 +msgid "Serbian (Latin)" +msgstr "セルビア語(ラテン)" + +#: dmoj/settings.py:349 +msgid "Turkish" +msgstr "トルコ語" + +#: dmoj/settings.py:350 +msgid "Vietnamese" +msgstr "ベトナム語" + +#: dmoj/settings.py:351 +msgid "Simplified Chinese" +msgstr "簡体字中国語" + +#: dmoj/urls.py:54 +msgid "Login" +msgstr "ログイン" + +#: dmoj/urls.py:102 templates/base.html:190 +msgid "Home" +msgstr "ホーム" + +#: judge/admin/comments.py:40 +#, python-format +msgid "%d comment successfully hidden." +msgid_plural "%d comments successfully hidden." +msgstr[0] "%d コメントを正常に非表示にしました。" + +#: judge/admin/comments.py:43 +msgid "Hide comments" +msgstr "コメントを非表示にする" + +#: judge/admin/comments.py:47 +#, python-format +msgid "%d comment successfully unhidden." +msgid_plural "%d comments successfully unhidden." +msgstr[0] "%d コメントの非表示を正常に解除しました。" + +#: judge/admin/comments.py:50 +msgid "Unhide comments" +msgstr "コメントの非表示を解除する" + +#: judge/admin/comments.py:58 +msgid "Associated page" +msgstr "関連するページ" + +#: judge/admin/contest.py:29 +msgid "Included contests" +msgstr "含まれているコンテスト" + +#: judge/admin/contest.py:65 templates/contest/contest.html:83 +#: templates/contest/moss.html:43 templates/problem/list.html:206 +#: templates/problem/list.html:221 templates/user/user-problems.html:56 +#: templates/user/user-problems.html:98 +msgid "Problem" +msgstr "課題" + +#: judge/admin/contest.py:113 +msgid "Settings" +msgstr "設定" + +#: judge/admin/contest.py:115 +msgid "Scheduling" +msgstr "スケジュール" + +#: judge/admin/contest.py:116 +msgid "Details" +msgstr "詳細" + +#: judge/admin/contest.py:117 +msgid "Format" +msgstr "フォーマット" + +#: judge/admin/contest.py:118 templates/contest/ranking-table.html:5 +msgid "Rating" +msgstr "評価" + +#: judge/admin/contest.py:119 +msgid "Access" +msgstr "アクセス" + +#: judge/admin/contest.py:121 judge/admin/problem.py:131 +msgid "Justice" +msgstr "正義" + +#: judge/admin/contest.py:159 +#, python-format +msgid "%d contest successfully marked as visible." +msgid_plural "%d contests successfully marked as visible." +msgstr[0] "%d 個の課題を公開しました。" + +#: judge/admin/contest.py:162 +msgid "Mark contests as visible" +msgstr "課題を公開する" + +#: judge/admin/contest.py:166 +#, python-format +msgid "%d contest successfully marked as hidden." +msgid_plural "%d contests successfully marked as hidden." +msgstr[0] "%d 個の課題を非公開としました。" + +#: judge/admin/contest.py:169 +msgid "Mark contests as hidden" +msgstr "課題を非公開にする" + +#: judge/admin/contest.py:180 judge/admin/submission.py:149 +#: judge/admin/submission.py:171 +msgid "You do not have the permission to rejudge submissions." +msgstr "あなたには提出物を再判定する権限がありません。" + +#: judge/admin/contest.py:187 judge/admin/submission.py:155 +msgid "You do not have the permission to rejudge THAT many submissions." +msgstr "あなたには、それら多くの提出物を再判定する権限がありません。" + +#: judge/admin/contest.py:194 judge/admin/submission.py:164 +#, 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:265 +#, python-format +msgid "%d participation recalculated." +msgid_plural "%d participations recalculated." +msgstr[0] "%d 人の参加者を再計算。" + +#: judge/admin/contest.py:268 +msgid "Recalculate results" +msgstr "再計算の結果" + +#: judge/admin/contest.py:272 judge/admin/organization.py:65 +msgid "username" +msgstr "利用者名" + +#: judge/admin/contest.py:277 templates/base.html:258 +msgid "virtual" +msgstr "仮想" + +#: judge/admin/interface.py:28 judge/models/interface.py:46 +msgid "link path" +msgstr "リンクパス" + +#: judge/admin/interface.py:62 +msgid "Content" +msgstr "内容" + +#: judge/admin/interface.py:63 +msgid "Summary" +msgstr "概要" + +#: judge/admin/interface.py:107 judge/models/contest.py:251 +#: judge/models/contest.py:355 judge/models/profile.py:189 +msgid "user" +msgstr "利用者" + +#: judge/admin/interface.py:148 +msgid "object" +msgstr "" + +#: judge/admin/organization.py:34 judge/admin/problem.py:171 +#: judge/admin/profile.py:78 +msgid "View on site" +msgstr "サイト上で表示する" + +#: judge/admin/problem.py:28 +msgid "Describe the changes you made (optional)" +msgstr "あなたの変更を記述する(オプショナル)" + +#: judge/admin/problem.py:126 +msgid "Social Media" +msgstr "ソーシャルメディア" + +#: judge/admin/problem.py:127 +msgid "Taxonomy" +msgstr "分類" + +#: judge/admin/problem.py:128 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:58 +msgid "Points" +msgstr "点数" + +#: judge/admin/problem.py:129 +msgid "Limits" +msgstr "制限" + +#: judge/admin/problem.py:130 judge/admin/submission.py:232 +#: templates/stats/base.html:14 templates/submission/list.html:328 +msgid "Language" +msgstr "言語" + +#: judge/admin/problem.py:132 +msgid "History" +msgstr "履歴" + +#: judge/admin/problem.py:168 +msgid "Authors" +msgstr "著者" + +#: judge/admin/problem.py:183 +#, python-format +msgid "%d problem successfully marked as public." +msgid_plural "%d problems successfully marked as public." +msgstr[0] "%d 個の課題はパブリックとして印付けられました。" + +#: judge/admin/problem.py:187 +msgid "Mark problems as public" +msgstr "課題をパブリックに印付けます。" + +#: judge/admin/problem.py:193 +#, python-format +msgid "%d problem successfully marked as private." +msgid_plural "%d problems successfully marked as private." +msgstr[0] "%d 個の課題はプライベートとして印付けられました。" + +#: judge/admin/problem.py:197 +msgid "Mark problems as private" +msgstr "課題をプライベートに印付けます" + +#: judge/admin/profile.py:32 +msgid "timezone" +msgstr "時間帯" + +#: judge/admin/profile.py:84 judge/admin/submission.py:211 +#: templates/organization/requests/log.html:9 +#: templates/organization/requests/pending.html:12 +#: templates/ticket/list.html:263 +msgid "User" +msgstr "利用者" + +#: judge/admin/profile.py:89 templates/registration/registration_form.html:145 +msgid "Email" +msgstr "電子メール" + +#: judge/admin/profile.py:94 judge/views/register.py:29 +#: templates/registration/registration_form.html:173 +#: templates/user/edit-profile.html:99 +msgid "Timezone" +msgstr "時間帯" + +#: judge/admin/profile.py:99 +msgid "date joined" +msgstr "入会日" + +#: judge/admin/profile.py:106 +#, python-format +msgid "%d user have scores recalculated." +msgid_plural "%d users have scores recalculated." +msgstr[0] "%d 人の利用者の得点が再計算されました。" + +#: judge/admin/profile.py:109 +msgid "Recalculate scores" +msgstr "得点を再計算する" + +#: judge/admin/runtime.py:19 +msgid "Disallowed problems" +msgstr "許可されていない課題" + +#: judge/admin/runtime.py:22 +msgid "These problems are NOT allowed to be submitted in this language" +msgstr "それらの課題は、この言語での提出は許可されていません" + +#: judge/admin/runtime.py:83 +msgid "Description" +msgstr "説明" + +#: judge/admin/runtime.py:84 +msgid "Information" +msgstr "情報" + +#: judge/admin/runtime.py:85 +msgid "Capabilities" +msgstr "機能" + +#: judge/admin/submission.py:23 judge/admin/submission.py:42 +#: judge/admin/submission.py:221 +msgid "None" +msgstr "なし" + +#: judge/admin/submission.py:23 +msgid "Not done" +msgstr "未完了" + +#: judge/admin/submission.py:23 +msgid "Exceptional" +msgstr "例外" + +#: judge/admin/submission.py:42 +msgid "Unaccepted" +msgstr "合格しなかった" + +#: judge/admin/submission.py:89 +#, python-format +msgctxt "contest problem" +msgid "%(problem)s in %(contest)s" +msgstr "%(contest)s 中の %(problem)s" + +#: judge/admin/submission.py:167 +msgid "Rejudge the selected submissions" +msgstr "選択された提出物を再判定する" + +#: judge/admin/submission.py:193 judge/views/problem_manage.py:128 +#, python-format +msgid "%d submission were successfully rescored." +msgid_plural "%d submissions were successfully rescored." +msgstr[0] "%d 個の提出物が正常に再採点されました。" + +#: judge/admin/submission.py:196 +msgid "Rescore the selected submissions" +msgstr "選択した提出物を再採点する" + +#: judge/admin/submission.py:200 +msgid "Problem code" +msgstr "課題のコード" + +#: judge/admin/submission.py:205 +msgid "Problem name" +msgstr "課題名" + +#: judge/admin/submission.py:215 templates/organization/requests/log.html:10 +#: templates/organization/requests/pending.html:13 +msgid "Time" +msgstr "時間" + +#: judge/admin/submission.py:223 +#, python-format +msgid "%d KB" +msgstr "%d KB" + +#: judge/admin/submission.py:225 +#, python-format +msgid "%.2f MB" +msgstr "%.2f MB" + +#: judge/admin/submission.py:227 +msgid "Memory" +msgstr "メモリ" + +#: judge/admin/taxon.py:11 judge/admin/taxon.py:34 +msgid "Included problems" +msgstr "含まれる課題" + +#: judge/admin/taxon.py:14 +msgid "These problems are included in this group of problems" +msgstr "これらの課題は、この課題グループに含まれている" + +#: judge/admin/taxon.py:37 +msgid "These problems are included in this type of problems" +msgstr "これらの課題は、この課題タイプに含まれている" + +#: judge/apps.py:8 +msgid "Online Judge" +msgstr "オンライン判定" + +#: judge/comments.py:41 +msgid "Comment body" +msgstr "コメント本文" + +#: judge/comments.py:47 judge/views/ticket.py:46 +msgid "Your part is silent, little toad." +msgstr "お黙り、ヒキガエル。" + +#: judge/comments.py:50 templates/comments/list.html:131 +msgid "You need to have solved at least one problem before your voice can be heard." +msgstr "コメントを書くには、少なくとも1度は課題を解く必要があります。" + +#: judge/comments.py:92 +msgid "Posted comment" +msgstr "投稿されたコメント" + +#: judge/contest_format/atcoder.py:19 +msgid "AtCoder" +msgstr "" + +#: judge/contest_format/default.py:18 +msgid "Default" +msgstr "既定値" + +#: judge/contest_format/ecoo.py:19 +msgid "ECOO" +msgstr "" + +#: judge/contest_format/ioi.py:19 +msgid "IOI" +msgstr "" + +#: judge/forms.py:27 +msgid "Subscribe to contest updates" +msgstr "コンテストの更新を購読する" + +#: judge/forms.py:28 +msgid "Enable experimental features" +msgstr "実験的な機能を有効化する" + +#: judge/forms.py:57 judge/views/organization.py:127 +#, python-brace-format +msgid "You may not be part of more than {count} public organizations." +msgstr "あなたは {count} 個以上の公開組織に参加できない場合があります。" + +#: judge/forms.py:107 judge/views/register.py:26 +#: templates/registration/registration_form.html:139 +#: templates/user/base-users-table.html:5 +msgid "Username" +msgstr "利用者名" + +#: judge/forms.py:108 templates/registration/registration_form.html:151 +#: templates/registration/registration_form.html:165 +msgid "Password" +msgstr "パスワード" + +#: judge/forms.py:130 +msgid "Two Factor Authentication tokens must be 6 decimal digits." +msgstr "二要素認証のトークンは6桁の数字でなければなりません。" + +#: judge/forms.py:139 templates/registration/totp_auth.html:32 +msgid "Invalid Two Factor Authentication token." +msgstr "無効な二要素認証トークンです。" + +#: judge/forms.py:143 judge/models/problem.py:97 +msgid "Problem code must be ^[a-z0-9]+$" +msgstr "課題のコードは ^[a-z0-9]+$ でなければなりません" + +#: judge/forms.py:148 +msgid "Problem with code already exists." +msgstr "このコードを使用している問題はすでに存在しています。" + +#: judge/forms.py:153 judge/models/contest.py:51 +msgid "Contest id must be ^[a-z0-9]+$" +msgstr "コンテスト id は ^[a-z0-9]+$ でなければなりません" + +#: judge/forms.py:158 +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 "N j, Y, g:i a" + +#: judge/jinja2/datetime.py:26 +#, python-brace-format +msgid "{time}" +msgstr "{time}" + +#: judge/jinja2/datetime.py:26 +#, python-brace-format +msgid "on {time}" +msgstr "{time} 時点" + +#: judge/models/choices.py:59 +msgid "Leave as LaTeX" +msgstr "LaTeX のまま" + +#: judge/models/choices.py:60 +msgid "SVG with PNG fallback" +msgstr "PNG フォールバックのある SVG" + +#: judge/models/choices.py:61 +msgid "MathML only" +msgstr "MathML のみ" + +#: judge/models/choices.py:62 +msgid "MathJax with SVG/PNG fallback" +msgstr "SVG/PNG フォールバックのある MathJax" + +#: judge/models/choices.py:63 +msgid "Detect best quality" +msgstr "最高品質を検出する" + +#: judge/models/comment.py:25 +msgid "Page code must be ^[pcs]:[a-z0-9]+$|^b:\\d+$" +msgstr "ページコードは ^[pcs]:[a-z0-9]+$|^b:\\d+$ でなければなりません。" + +#: judge/models/comment.py:41 +msgid "commenter" +msgstr "コメンター" + +#: judge/models/comment.py:42 +msgid "posted time" +msgstr "投稿時刻" + +#: judge/models/comment.py:43 judge/models/comment.py:176 +msgid "associated page" +msgstr "関連するページ" + +#: judge/models/comment.py:45 +msgid "votes" +msgstr "投票" + +#: judge/models/comment.py:46 +msgid "body of comment" +msgstr "コメント本文" + +#: judge/models/comment.py:47 +msgid "hide the comment" +msgstr "コメントを非表示にする" + +#: judge/models/comment.py:48 +msgid "parent" +msgstr "親" + +#: judge/models/comment.py:53 +msgid "comment" +msgstr "コメント" + +#: judge/models/comment.py:54 +msgid "comments" +msgstr "コメント" + +#: judge/models/comment.py:136 judge/models/problem.py:406 +#, python-format +msgid "Editorial for %s" +msgstr "%s の論説" + +#: judge/models/comment.py:171 +msgid "comment vote" +msgstr "コメント投票" + +#: judge/models/comment.py:172 +msgid "comment votes" +msgstr "コメント投票" + +#: judge/models/comment.py:181 +msgid "Override comment lock" +msgstr "" + +#: judge/models/contest.py:21 +msgid "Invalid colour." +msgstr "不正な色。" + +#: judge/models/contest.py:23 +msgid "tag name" +msgstr "タグ名" + +#: judge/models/contest.py:24 +msgid "Lowercase letters and hyphens only." +msgstr "小文字とハイフンのみです。" + +#: judge/models/contest.py:25 +msgid "tag colour" +msgstr "タグの色" + +#: judge/models/contest.py:26 +msgid "tag description" +msgstr "タグの説明" + +#: judge/models/contest.py:45 +msgid "contest tag" +msgstr "コンテストのタグ" + +#: judge/models/contest.py:46 judge/models/contest.py:100 +msgid "contest tags" +msgstr "コンテストのタグ" + +#: judge/models/contest.py:50 +msgid "contest id" +msgstr "コンテスト id" + +#: judge/models/contest.py:52 +msgid "contest name" +msgstr "コンテスト名" + +#: judge/models/contest.py:53 +msgid "These people will be able to edit the contest." +msgstr "これらの人々 は、コンテストを編集することができます。" + +#: judge/models/contest.py:55 judge/models/runtime.py:124 +#: src/dmoj-wpadmin/test_project/apps/books/admin.py:20 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:27 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:27 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:27 +msgid "description" +msgstr "説明" + +#: judge/models/contest.py:56 judge/models/problem.py:353 +#: judge/models/runtime.py:126 +msgid "problems" +msgstr "課題" + +#: judge/models/contest.py:57 judge/models/contest.py:252 +msgid "start time" +msgstr "開始時刻" + +#: judge/models/contest.py:58 +msgid "end time" +msgstr "終了時刻" + +#: judge/models/contest.py:59 judge/models/problem.py:118 +#: judge/models/problem.py:377 +msgid "time limit" +msgstr "時間制限" + +#: judge/models/contest.py:60 judge/models/problem.py:136 +msgid "publicly visible" +msgstr "公開されています" + +#: judge/models/contest.py:61 +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:64 +msgid "contest rated" +msgstr "評価されているコンテスト" + +#: judge/models/contest.py:64 +msgid "Whether this contest can be rated." +msgstr "このコンテストを評価できるようにするか。" + +#: judge/models/contest.py:66 +msgid "hide scoreboard" +msgstr "得点表を非表示にする" + +#: judge/models/contest.py:67 +msgid "Whether the scoreboard should remain hidden for the duration of the contest." +msgstr "コンテスト中に得点表を非表示にしておくべきかどうか" + +#: judge/models/contest.py:70 +msgid "no comments" +msgstr "コメントがありません" + +#: judge/models/contest.py:71 +msgid "Use clarification system instead of comments." +msgstr "コメントではなく解説システムを使う。" + +#: judge/models/contest.py:73 +msgid "Rating floor for contest" +msgstr "" + +#: judge/models/contest.py:75 +msgid "Rating ceiling for contest" +msgstr "" + +#: judge/models/contest.py:77 +msgid "rate all" +msgstr "全てを評価する" + +#: judge/models/contest.py:77 +msgid "Rate all users who joined." +msgstr "参加している全ての利用者を評価する。" + +#: judge/models/contest.py:78 +msgid "exclude from ratings" +msgstr "評価から除外する" + +#: judge/models/contest.py:80 +msgid "private to specific users" +msgstr "" + +#: judge/models/contest.py:81 +msgid "private contestants" +msgstr "プライベートな参加者" + +#: judge/models/contest.py:82 +msgid "If private, only these users may see the contest" +msgstr "もしプライベートであれば、その参加者のみがコンテストを見ることができます。" + +#: judge/models/contest.py:84 +msgid "hide problem tags" +msgstr "課題のタグを非表示にする" + +#: judge/models/contest.py:85 +msgid "Whether problem tags should be hidden by default." +msgstr "課題タグをデフォルトで非表示にするかどうか" + +#: judge/models/contest.py:87 +msgid "run pretests only" +msgstr "予備テストのみ実行する" + +#: judge/models/contest.py:88 +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:92 judge/models/problem.py:157 +msgid "private to organizations" +msgstr "組織へプライベートにする" + +#: judge/models/contest.py:93 judge/models/problem.py:155 +#: judge/models/profile.py:76 +msgid "organizations" +msgstr "組織" + +#: judge/models/contest.py:94 +msgid "If private, only these organizations may see the contest" +msgstr "もしプライベートであれば、組織の者だけがコンテストを見ることができます" + +#: judge/models/contest.py:95 judge/models/problem.py:145 +msgid "OpenGraph image" +msgstr "OpenGraph 画像" + +#: judge/models/contest.py:96 judge/models/profile.py:47 +msgid "Logo override image" +msgstr "" + +#: judge/models/contest.py:98 +msgid "This image will replace the default site logo for users inside the contest." +msgstr "" + +#: judge/models/contest.py:101 +msgid "the amount of live participants" +msgstr "ライブ参加者の人数" + +#: judge/models/contest.py:102 +msgid "contest summary" +msgstr "コンテスト概要" + +#: judge/models/contest.py:103 judge/models/problem.py:147 +msgid "Plain-text, shown in meta description tag, e.g. for social media." +msgstr "ソーシャルメディアなどのメタ説明タグに表示されるプレーンテキスト。" + +#: judge/models/contest.py:104 judge/models/profile.py:46 +msgid "access code" +msgstr "アクセスコード" + +#: judge/models/contest.py:105 +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:107 judge/models/problem.py:141 +msgid "personae non gratae" +msgstr "感謝しない人" + +#: judge/models/contest.py:108 +msgid "Bans the selected users from joining this contest." +msgstr "選択した利用者の、このコンテストへの参加を禁止する。" + +#: judge/models/contest.py:109 +msgid "contest format" +msgstr "" + +#: judge/models/contest.py:110 +msgid "The contest format module to use." +msgstr "" + +#: judge/models/contest.py:111 +msgid "contest format configuration" +msgstr "" + +#: judge/models/contest.py:112 +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:233 +msgid "See private contests" +msgstr "プライベートのコンテストを見る" + +#: judge/models/contest.py:234 +msgid "Edit own contests" +msgstr "自分のコンテストを編集する" + +#: judge/models/contest.py:235 +msgid "Edit all contests" +msgstr "全てのコンテストを編集する" + +#: judge/models/contest.py:236 +msgid "Clone contest" +msgstr "" + +#: judge/models/contest.py:237 templates/contest/moss.html:74 +msgid "MOSS contest" +msgstr "" + +#: judge/models/contest.py:238 +msgid "Rate contests" +msgstr "コンテストを評価する" + +#: judge/models/contest.py:239 +msgid "Contest access codes" +msgstr "コンテストのアクセス コード" + +#: judge/models/contest.py:240 +msgid "Create private contests" +msgstr "プライベートなコンテストの生成" + +#: judge/models/contest.py:242 judge/models/contest.py:320 +#: judge/models/contest.py:356 judge/models/contest.py:378 +#: judge/models/submission.py:83 +msgid "contest" +msgstr "コンテスト" + +#: judge/models/contest.py:243 +msgid "contests" +msgstr "コンテスト" + +#: judge/models/contest.py:250 +msgid "associated contest" +msgstr "関連するコンテスト" + +#: judge/models/contest.py:253 +msgid "score" +msgstr "得点" + +#: judge/models/contest.py:254 +msgid "cumulative time" +msgstr "累積時間" + +#: judge/models/contest.py:255 +msgid "virtual participation id" +msgstr "仮想参加 id" + +#: judge/models/contest.py:256 +msgid "0 means non-virtual, otherwise the n-th virtual participation" +msgstr "0 は仮想参加者がおらず、そうでなければn人の仮想参加者がいます" + +#: judge/models/contest.py:257 +msgid "contest format specific data" +msgstr "" + +#: judge/models/contest.py:306 +#, python-format +msgid "%s spectating in %s" +msgstr "%s は %s を観戦している" + +#: judge/models/contest.py:308 +#, python-format +msgid "%s in %s, v%d" +msgstr "%s は %s 中で v%d として参加" + +#: judge/models/contest.py:309 +#, python-format +msgid "%s in %s" +msgstr "%s は %s に参加" + +#: judge/models/contest.py:312 +msgid "contest participation" +msgstr "コンテスト参加者" + +#: judge/models/contest.py:313 +msgid "contest participations" +msgstr "コンテスト参加者" + +#: judge/models/contest.py:319 judge/models/contest.py:340 +#: judge/models/contest.py:379 judge/models/problem.py:352 +#: judge/models/problem.py:357 judge/models/problem.py:375 +#: judge/models/problem_data.py:35 +msgid "problem" +msgstr "課題" + +#: judge/models/contest.py:321 judge/models/contest.py:344 +#: judge/models/problem.py:129 +msgid "points" +msgstr "点数" + +#: judge/models/contest.py:322 +msgid "partial" +msgstr "部分点" + +#: judge/models/contest.py:323 judge/models/contest.py:345 +msgid "is pretested" +msgstr "予備テストされているか" + +#: judge/models/contest.py:324 judge/models/interface.py:43 +msgid "order" +msgstr "順番" + +#: judge/models/contest.py:325 +msgid "output prefix length override" +msgstr "出力プレフィックス長のオーバーライド" + +#: judge/models/contest.py:326 +msgid "Maximum number of submissions for this problem, or 0 for no limit." +msgstr "この課題への提出物の最大数、制限なしの場合は 0 。" + +#: judge/models/contest.py:328 +msgid "Why include a problem you can't submit to?" +msgstr "なぜあなたが提出できない課題を含むのか?" + +#: judge/models/contest.py:333 +msgid "contest problem" +msgstr "コンテストの課題" + +#: judge/models/contest.py:334 +msgid "contest problems" +msgstr "コンテストの課題" + +#: judge/models/contest.py:338 judge/models/submission.py:181 +msgid "submission" +msgstr "提出" + +#: judge/models/contest.py:342 judge/models/contest.py:357 +msgid "participation" +msgstr "参加者" + +#: judge/models/contest.py:346 +msgid "Whether this submission was ran only on pretests." +msgstr "この提出物が予備テストだけを実行したのかどうか。" + +#: judge/models/contest.py:350 +msgid "contest submission" +msgstr "コンテスト提出" + +#: judge/models/contest.py:351 +msgid "contest submissions" +msgstr "コンテスト提出" + +#: judge/models/contest.py:359 +msgid "rank" +msgstr "順位" + +#: judge/models/contest.py:360 +msgid "rating" +msgstr "評価" + +#: judge/models/contest.py:361 +msgid "volatility" +msgstr "変動率" + +#: judge/models/contest.py:362 +msgid "last rated" +msgstr "最後の評価" + +#: judge/models/contest.py:366 +msgid "contest rating" +msgstr "コンテストの評価" + +#: judge/models/contest.py:367 +msgid "contest ratings" +msgstr "コンテストの評価" + +#: judge/models/contest.py:386 +msgid "contest moss result" +msgstr "" + +#: judge/models/contest.py:387 +msgid "contest moss results" +msgstr "" + +#: judge/models/interface.py:24 +msgid "configuration item" +msgstr "構成項目" + +#: judge/models/interface.py:25 +msgid "miscellaneous configuration" +msgstr "その他の構成" + +#: judge/models/interface.py:37 +msgid "navigation item" +msgstr "ナビゲーションアイテム" + +#: judge/models/interface.py:38 +msgid "navigation bar" +msgstr "ナビゲーションバー" + +#: judge/models/interface.py:44 +msgid "identifier" +msgstr "識別子" + +#: judge/models/interface.py:45 +msgid "label" +msgstr "ラベル" + +#: judge/models/interface.py:47 +msgid "highlight regex" +msgstr "正規表現を強調表示する" + +#: judge/models/interface.py:48 +msgid "parent item" +msgstr "親項目" + +#: judge/models/interface.py:66 +msgid "post title" +msgstr "投稿の題目" + +#: judge/models/interface.py:67 judge/models/problem.py:395 +msgid "authors" +msgstr "著者" + +#: judge/models/interface.py:68 +msgid "slug" +msgstr "スラグ" + +#: judge/models/interface.py:69 judge/models/problem.py:393 +msgid "public visibility" +msgstr "一般公開" + +#: judge/models/interface.py:70 +msgid "sticky" +msgstr "スティッキー" + +#: judge/models/interface.py:71 +msgid "publish after" +msgstr "後に発行する" + +#: judge/models/interface.py:72 +msgid "post content" +msgstr "投稿内容" + +#: judge/models/interface.py:73 +msgid "post summary" +msgstr "投稿の概要" + +#: judge/models/interface.py:74 +msgid "openGraph image" +msgstr "openGraph 画像" + +#: judge/models/interface.py:91 +msgid "Edit all posts" +msgstr "すべての投稿を編集する" + +#: judge/models/interface.py:93 +msgid "blog post" +msgstr "ブログ投稿" + +#: judge/models/interface.py:94 +msgid "blog posts" +msgstr "ブログ投稿" + +#: judge/models/message.py:11 +msgid "message title" +msgstr "メッセージ題目" + +#: judge/models/message.py:12 judge/models/ticket.py:29 +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:26 +msgid "problem category ID" +msgstr "課題分類 ID" + +#: judge/models/problem.py:27 +msgid "problem category name" +msgstr "課題分類名" + +#: judge/models/problem.py:34 +msgid "problem type" +msgstr "課題のタイプ" + +#: judge/models/problem.py:35 judge/models/problem.py:113 +msgid "problem types" +msgstr "課題のタイプ" + +#: judge/models/problem.py:39 +msgid "problem group ID" +msgstr "課題のグループ ID" + +#: judge/models/problem.py:40 +msgid "problem group name" +msgstr "課題のグループ名" + +#: judge/models/problem.py:47 judge/models/problem.py:116 +msgid "problem group" +msgstr "課題グループ" + +#: judge/models/problem.py:48 +msgid "problem groups" +msgstr "課題グループ" + +#: judge/models/problem.py:52 +msgid "key" +msgstr "鍵" + +#: judge/models/problem.py:54 +msgid "link" +msgstr "リンク" + +#: judge/models/problem.py:55 +msgid "full name" +msgstr "氏名" + +#: judge/models/problem.py:56 judge/models/profile.py:32 +#: judge/models/runtime.py:23 +msgid "short name" +msgstr "短縮名" + +#: judge/models/problem.py:57 +msgid "Displayed on pages under this license" +msgstr "このライセンスの下でページに表示される" + +#: judge/models/problem.py:58 +msgid "icon" +msgstr "アイコン" + +#: judge/models/problem.py:58 +msgid "URL to the icon" +msgstr "アイコンへの URL" + +#: judge/models/problem.py:59 +msgid "license text" +msgstr "ライセンス本文" + +#: judge/models/problem.py:68 +msgid "license" +msgstr "ライセンス" + +#: judge/models/problem.py:69 +msgid "licenses" +msgstr "ライセンス" + +#: judge/models/problem.py:96 +msgid "problem code" +msgstr "課題のコード" + +#: judge/models/problem.py:98 +msgid "A short, unique code for the problem, used in the url after /problem/" +msgstr "問題に対する短くて唯一なコード、URL で /problem/ の後に使用される" + +#: judge/models/problem.py:100 +msgid "problem name" +msgstr "課題名" + +#: judge/models/problem.py:101 +msgid "The full name of the problem, as shown in the problem list." +msgstr "" + +#: judge/models/problem.py:103 +msgid "problem body" +msgstr "課題本文" + +#: judge/models/problem.py:104 +msgid "creators" +msgstr "作成者" + +#: judge/models/problem.py:105 +msgid "These users will be able to edit the problem, and be listed as authors." +msgstr "" + +#: judge/models/problem.py:107 +msgid "curators" +msgstr "キュレーター" + +#: judge/models/problem.py:108 +msgid "These users will be able to edit the problem, but not be listed as authors." +msgstr "" + +#: judge/models/problem.py:110 +msgid "testers" +msgstr "テスター" + +#: judge/models/problem.py:112 +msgid "These users will be able to view the private problem, but not edit it." +msgstr "" + +#: judge/models/problem.py:114 +msgid "The type of problem, as shown on the problem's page." +msgstr "" + +#: judge/models/problem.py:117 +msgid "The group of problem, shown under Category in the problem list." +msgstr "" + +#: judge/models/problem.py:119 +msgid "The time limit for this problem, in seconds. Fractional seconds (e.g. 1.5) are supported." +msgstr "この課題の秒単位での制限時間。小数秒(例えば1.5)はサポートされています。" + +#: judge/models/problem.py:123 judge/models/problem.py:380 +msgid "memory limit" +msgstr "メモリ制限" + +#: judge/models/problem.py:124 +msgid "The memory limit for this problem, in kilobytes (e.g. 64mb = 65536 kilobytes)." +msgstr "この課題のメモリ制限、キロバイト単位(例えば 64 mb = 65536 キロバイト)。" + +#: judge/models/problem.py:130 +msgid "Points awarded for problem completion. Points are displayed with a 'p' suffix if partial." +msgstr "" + +#: judge/models/problem.py:133 +msgid "allows partial points" +msgstr "部分点を許す" + +#: judge/models/problem.py:134 +msgid "allowed languages" +msgstr "許可されている言語" + +#: judge/models/problem.py:135 +msgid "List of allowed submission languages." +msgstr "" + +#: judge/models/problem.py:137 +msgid "manually managed" +msgstr "手動で管理されている" + +#: judge/models/problem.py:138 +msgid "Whether judges should be allowed to manage data or not." +msgstr "" + +#: judge/models/problem.py:139 +msgid "date of publishing" +msgstr "発行年月日" + +#: judge/models/problem.py:140 +msgid "Doesn't have magic ability to auto-publish due to backward compatibility" +msgstr "下位互換性を保つのために自動発行する魔法のような能力は持ちません。" + +#: judge/models/problem.py:142 +msgid "Bans the selected users from submitting to this problem." +msgstr "" + +#: judge/models/problem.py:144 +msgid "The license under which this problem is published." +msgstr "" + +#: judge/models/problem.py:146 +msgid "problem summary" +msgstr "課題の概要" + +#: judge/models/problem.py:148 +msgid "number of users" +msgstr "" + +#: judge/models/problem.py:149 +msgid "The number of users who solved the problem." +msgstr "" + +#: judge/models/problem.py:150 +msgid "solve rate" +msgstr "" + +#: judge/models/problem.py:156 +msgid "If private, only these organizations may see the problem." +msgstr "" + +#: judge/models/problem.py:358 judge/models/problem.py:376 +#: judge/models/runtime.py:99 +msgid "language" +msgstr "言語" + +#: judge/models/problem.py:359 +msgid "translated name" +msgstr "翻訳された名前" + +#: judge/models/problem.py:360 +msgid "translated description" +msgstr "翻訳された説明" + +#: judge/models/problem.py:364 +msgid "problem translation" +msgstr "翻訳された課題" + +#: judge/models/problem.py:365 +msgid "problem translations" +msgstr "翻訳された課題" + +#: judge/models/problem.py:369 +msgid "clarified problem" +msgstr "解説された課題" + +#: judge/models/problem.py:370 +msgid "clarification body" +msgstr "解説本文" + +#: judge/models/problem.py:371 +msgid "clarification timestamp" +msgstr "解説のタイムスタンプ" + +#: judge/models/problem.py:386 +msgid "language-specific resource limit" +msgstr "言語固有のリソース制限" + +#: judge/models/problem.py:387 +msgid "language-specific resource limits" +msgstr "言語固有のリソース制限" + +#: judge/models/problem.py:391 +msgid "associated problem" +msgstr "関連する課題" + +#: judge/models/problem.py:394 +msgid "publish date" +msgstr "発行日" + +#: judge/models/problem.py:396 +msgid "editorial content" +msgstr "編集内容" + +#: judge/models/problem.py:412 +msgid "solution" +msgstr "解答" + +#: judge/models/problem.py:413 +msgid "solutions" +msgstr "解答" + +#: judge/models/problem_data.py:23 +msgid "Standard" +msgstr "標準" + +#: judge/models/problem_data.py:24 +msgid "Floats" +msgstr "実数" + +#: judge/models/problem_data.py:25 +msgid "Floats (absolute)" +msgstr "実数(絶対値)" + +#: judge/models/problem_data.py:26 +msgid "Floats (relative)" +msgstr "実数(相対値)" + +#: judge/models/problem_data.py:27 +msgid "Non-trailing spaces" +msgstr "非末尾スペース" + +#: judge/models/problem_data.py:28 +msgid "Unordered" +msgstr "順不同" + +#: judge/models/problem_data.py:29 +msgid "Byte identical" +msgstr "バイト一致" + +#: judge/models/problem_data.py:30 +msgid "Line-by-line" +msgstr "" + +#: judge/models/problem_data.py:37 +msgid "data zip file" +msgstr "データの zip ファイル" + +#: judge/models/problem_data.py:39 +msgid "generator file" +msgstr "ジェネレータファイル" + +#: judge/models/problem_data.py:41 judge/models/problem_data.py:90 +msgid "output prefix length" +msgstr "出力プレフィクス長" + +#: judge/models/problem_data.py:42 judge/models/problem_data.py:91 +msgid "output limit length" +msgstr "出力制限長" + +#: judge/models/problem_data.py:43 +msgid "init.yml generation feedback" +msgstr "init.yml 生成のフィードバック" + +#: judge/models/problem_data.py:44 judge/models/problem_data.py:92 +msgid "checker" +msgstr "チェッカー" + +#: judge/models/problem_data.py:45 judge/models/problem_data.py:93 +msgid "checker arguments" +msgstr "チェッカー引数" + +#: judge/models/problem_data.py:46 judge/models/problem_data.py:94 +msgid "checker arguments as a JSON object" +msgstr "JSON オブジェクトとしてのチェッカー引数" + +#: judge/models/problem_data.py:77 +msgid "problem data set" +msgstr "課題データセット" + +#: judge/models/problem_data.py:79 +msgid "case position" +msgstr "ケースの位置" + +#: judge/models/problem_data.py:80 +msgid "case type" +msgstr "ケースのタイプ" + +#: judge/models/problem_data.py:81 +msgid "Normal case" +msgstr "標準のケース" + +#: judge/models/problem_data.py:82 +msgid "Batch start" +msgstr "バッチ開始" + +#: judge/models/problem_data.py:83 +msgid "Batch end" +msgstr "バッチ終了" + +#: judge/models/problem_data.py:85 +msgid "input file name" +msgstr "入力ファイル名" + +#: judge/models/problem_data.py:86 +msgid "output file name" +msgstr "出力ファイル名" + +#: judge/models/problem_data.py:87 +msgid "generator arguments" +msgstr "ジェネレーターの引数" + +#: judge/models/problem_data.py:88 +msgid "point value" +msgstr "点数" + +#: judge/models/problem_data.py:89 +msgid "case is pretest?" +msgstr "予備テストのケースか?" + +#: judge/models/profile.py:29 +msgid "organization title" +msgstr "組織の名称" + +#: judge/models/profile.py:30 +msgid "organization slug" +msgstr "" + +#: judge/models/profile.py:31 +msgid "Organization name shown in URL" +msgstr "" + +#: judge/models/profile.py:33 +msgid "Displayed beside user name during contests" +msgstr "コンテスト中に利用者名の横に表示されます" + +#: judge/models/profile.py:34 +msgid "organization description" +msgstr "組織の説明" + +#: judge/models/profile.py:35 +msgid "registrant" +msgstr "登録者" + +#: judge/models/profile.py:36 +msgid "User who registered this organization" +msgstr "この組織を登録した利用者" + +#: judge/models/profile.py:37 +msgid "administrators" +msgstr "管理者" + +#: judge/models/profile.py:38 +msgid "Those who can edit this organization" +msgstr "この組織を編集できる人" + +#: judge/models/profile.py:39 +msgid "creation date" +msgstr "作成日" + +#: judge/models/profile.py:40 +msgid "is open organization?" +msgstr "オープンな組織か?" + +#: judge/models/profile.py:41 +msgid "Allow joining organization" +msgstr "組織への参加を許可する" + +#: judge/models/profile.py:42 +msgid "maximum size" +msgstr "最大サイズ" + +#: judge/models/profile.py:43 +msgid "Maximum amount of users in this organization, only applicable to private organizations" +msgstr "この組織の最大利用者数、プライベートな組織にのみ適用される" + +#: judge/models/profile.py:45 +msgid "Student access code" +msgstr "学生のアクセスコード" + +#: judge/models/profile.py:49 +msgid "This image will replace the default site logo for users viewing the organization." +msgstr "" + +#: judge/models/profile.py:75 judge/models/profile.py:91 +#: judge/models/profile.py:190 +msgid "organization" +msgstr "組織" + +#: judge/models/profile.py:80 +msgid "user associated" +msgstr "関連する利用者" + +#: judge/models/profile.py:81 +msgid "self-description" +msgstr "自己紹介" + +#: judge/models/profile.py:82 +msgid "location" +msgstr "位置" + +#: judge/models/profile.py:84 +msgid "preferred language" +msgstr "好みの言語" + +#: judge/models/profile.py:89 +msgid "last access time" +msgstr "最終アクセス時刻" + +#: judge/models/profile.py:90 +msgid "last IP" +msgstr "最終 IP アドレス" + +#: judge/models/profile.py:93 +msgid "display rank" +msgstr "順位を表示する" + +#: judge/models/profile.py:95 +msgid "comment mute" +msgstr "コメントミュート" + +#: judge/models/profile.py:95 +msgid "Some users are at their best when silent." +msgstr "ある利用者は沈黙の時に能力を発揮する" + +#: judge/models/profile.py:97 +msgid "unlisted user" +msgstr "" + +#: judge/models/profile.py:97 +msgid "User will not be ranked." +msgstr "" + +#: judge/models/profile.py:100 +msgid "user script" +msgstr "利用者スクリプト" + +#: judge/models/profile.py:101 +msgid "User-defined JavaScript for site customization." +msgstr "サイトのカスタマイズするためのユーザー定義 JavaScript。" + +#: judge/models/profile.py:102 +msgid "current contest" +msgstr "現在のコンテスト" + +#: judge/models/profile.py:104 +msgid "math engine" +msgstr "数式エンジン" + +#: judge/models/profile.py:106 +msgid "the rendering engine used to render math" +msgstr "数式の表示に使用されるレンダリングエンジン" + +#: judge/models/profile.py:107 +msgid "2FA enabled" +msgstr "" + +#: judge/models/profile.py:108 +msgid "check to enable TOTP-based two factor authentication" +msgstr "" + +#: judge/models/profile.py:109 +msgid "TOTP key" +msgstr "" + +#: judge/models/profile.py:110 +msgid "32 character base32-encoded key for TOTP" +msgstr "" + +#: judge/models/profile.py:112 +msgid "TOTP key must be empty or base32" +msgstr "" + +#: judge/models/profile.py:113 +msgid "internal notes" +msgstr "内部メモ" + +#: judge/models/profile.py:114 +msgid "Notes for administrators regarding this user." +msgstr "" + +#: judge/models/profile.py:184 +msgid "user profile" +msgstr "ユーザープロフィール" + +#: judge/models/profile.py:185 +msgid "user profiles" +msgstr "ユーザープロフィール" + +#: judge/models/profile.py:192 +msgid "request time" +msgstr "要求時刻" + +#: judge/models/profile.py:193 +msgid "state" +msgstr "状態" + +#: judge/models/profile.py:198 +msgid "reason" +msgstr "理由" + +#: judge/models/profile.py:201 +msgid "organization join request" +msgstr "組織への参加要求" + +#: judge/models/profile.py:202 +msgid "organization join requests" +msgstr "組織への参加要求" + +#: judge/models/runtime.py:18 +msgid "short identifier" +msgstr "短い識別子" + +#: judge/models/runtime.py:19 +msgid "The identifier for this language; the same as its executor id for judges." +msgstr "この言語の識別子であり、判定器の実行者idと同じです。" + +#: judge/models/runtime.py:21 +msgid "long name" +msgstr "長い名前" + +#: judge/models/runtime.py:22 +msgid "Longer name for the language, e.g. \"Python 2\" or \"C++11\"." +msgstr "その言語の長い名前、例えば \"Python 2\" や \"C++11\" など。" + +#: judge/models/runtime.py:24 +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 "公開表示するための、より読みやすく短い名前、例えば \"PY2\" や \"C++11\" など。空白のままなら、短い識別子がデフォルトになります。" + +#: judge/models/runtime.py:28 +msgid "common name" +msgstr "一般名" + +#: judge/models/runtime.py:29 +msgid "Common name for the language. For example, the common name for C++03, C++11, and C++14 would be \"C++\"" +msgstr "言語の一般名。例えば C++03, C++11, C++14 の一般名は \"C++\"です。" + +#: judge/models/runtime.py:31 +msgid "ace mode name" +msgstr "ace のモード名" + +#: judge/models/runtime.py:32 +msgid "Language ID for Ace.js editor highlighting, appended to \"mode-\" to determine the Ace JavaScript file to use, e.g., \"python\"." +msgstr "Ace.jsエディタがハイライト表示するための言語IDである。\"mode-\" に繋げ、Ace JavaScript ファイルが利用する。例えば \"python\"。" + +#: judge/models/runtime.py:34 +msgid "pygments name" +msgstr "pygments 名" + +#: judge/models/runtime.py:35 +msgid "Language ID for Pygments highlighting in source windows." +msgstr "ソースウィンドウ中で Pygments 強調表示するための言語 ID。" + +#: judge/models/runtime.py:36 +msgid "code template" +msgstr "コードテンプレート" + +#: judge/models/runtime.py:37 +msgid "Code template to display in submission editor." +msgstr "提出物エディタに表示するコードテンプレート。" + +#: judge/models/runtime.py:38 +msgid "runtime info override" +msgstr "ランタイム情報の上書き" + +#: judge/models/runtime.py:39 +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:41 +msgid "language description" +msgstr "言語の説明" + +#: judge/models/runtime.py:42 +msgid "Use field this to inform users of quirks with your environment, additional restrictions, etc." +msgstr "このフィールドは、あなたの環境の独自性や追加の制限などを利用者に知らせるために使ってください。" + +#: judge/models/runtime.py:44 +msgid "extension" +msgstr "拡張子" + +#: judge/models/runtime.py:45 +msgid "The extension of source files, e.g., \"py\" or \"cpp\"." +msgstr "ソースファイルの拡張子、例えば \"py\" や \"cpp\"。" + +#: judge/models/runtime.py:100 +msgid "languages" +msgstr "言語" + +#: judge/models/runtime.py:104 +msgid "language to which this runtime belongs" +msgstr "このランタイムが属する言語" + +#: judge/models/runtime.py:105 +msgid "judge on which this runtime exists" +msgstr "このランタイムが存在する判定器" + +#: judge/models/runtime.py:106 +msgid "runtime name" +msgstr "ランタイム名" + +#: judge/models/runtime.py:107 +msgid "runtime version" +msgstr "ランタイムのバージョン" + +#: judge/models/runtime.py:108 +msgid "order in which to display this runtime" +msgstr "このランタイムを表示する順序" + +#: judge/models/runtime.py:112 +msgid "Server name, hostname-style" +msgstr "サーバー名、ホスト名形式" + +#: judge/models/runtime.py:113 +msgid "time of creation" +msgstr "作成日" + +#: judge/models/runtime.py:114 +msgid "A key to authenticated this judge" +msgstr "この判定器を認証する鍵" + +#: judge/models/runtime.py:115 +msgid "authentication key" +msgstr "認証鍵" + +#: judge/models/runtime.py:116 +msgid "block judge" +msgstr "" + +#: judge/models/runtime.py:117 +msgid "Whether this judge should be blocked from connecting, even if its key is correct." +msgstr "" + +#: judge/models/runtime.py:119 +msgid "judge online status" +msgstr "判定器のオンライン状態" + +#: judge/models/runtime.py:120 +msgid "judge start time" +msgstr "判定器の開始時刻" + +#: judge/models/runtime.py:121 +msgid "response time" +msgstr "応答時間" + +#: judge/models/runtime.py:122 +msgid "system load" +msgstr "システム負荷" + +#: judge/models/runtime.py:123 +msgid "Load for the last minute, divided by processors to be fair." +msgstr "最近1分の負荷、公平のためプロセッサ数で割ってある。" + +#: judge/models/runtime.py:127 judge/models/runtime.py:167 +msgid "judges" +msgstr "判定器" + +#: judge/models/runtime.py:166 +msgid "judge" +msgstr "判定器" + +#: judge/models/submission.py:20 judge/models/submission.py:47 +#: judge/utils/problems.py:86 +msgid "Accepted" +msgstr "合格した" + +#: judge/models/submission.py:21 judge/models/submission.py:48 +msgid "Wrong Answer" +msgstr "間違った解答" + +#: judge/models/submission.py:22 judge/models/submission.py:50 +msgid "Time Limit Exceeded" +msgstr "時間制限を超過しました" + +#: judge/models/submission.py:23 judge/models/submission.py:51 +msgid "Memory Limit Exceeded" +msgstr "メモリの制限を超過しました" + +#: judge/models/submission.py:24 judge/models/submission.py:52 +msgid "Output Limit Exceeded" +msgstr "出力制限を超過しました" + +#: judge/models/submission.py:25 judge/models/submission.py:53 +msgid "Invalid Return" +msgstr "不正な戻り値" + +#: judge/models/submission.py:26 judge/models/submission.py:54 +msgid "Runtime Error" +msgstr "ランタイムエラー" + +#: judge/models/submission.py:27 judge/models/submission.py:41 +#: judge/models/submission.py:55 judge/utils/problems.py:88 +msgid "Compile Error" +msgstr "コンパイル エラー" + +#: judge/models/submission.py:28 judge/models/submission.py:40 +msgid "Internal Error" +msgstr "内部エラー" + +#: judge/models/submission.py:29 +msgid "Short circuit" +msgstr "短絡" + +#: judge/models/submission.py:30 judge/models/submission.py:42 +#: judge/models/submission.py:61 +msgid "Aborted" +msgstr "中断された" + +#: judge/models/submission.py:36 judge/models/submission.py:57 +msgid "Queued" +msgstr "順番待ち" + +#: judge/models/submission.py:37 judge/models/submission.py:58 +msgid "Processing" +msgstr "処理中" + +#: judge/models/submission.py:38 judge/models/submission.py:59 +msgid "Grading" +msgstr "採点中" + +#: judge/models/submission.py:39 judge/models/submission.py:60 +msgid "Completed" +msgstr "完了" + +#: judge/models/submission.py:56 +msgid "Internal Error (judging server error)" +msgstr "内部エラー(判定サーバエラー)" + +#: judge/models/submission.py:66 +msgid "submission time" +msgstr "提出時刻" + +#: judge/models/submission.py:67 judge/models/submission.py:201 +msgid "execution time" +msgstr "実行時間" + +#: judge/models/submission.py:68 judge/models/submission.py:202 +msgid "memory usage" +msgstr "メモリ使用量" + +#: judge/models/submission.py:69 judge/models/submission.py:203 +msgid "points granted" +msgstr "付与された点数" + +#: judge/models/submission.py:70 +msgid "submission language" +msgstr "提出言語" + +#: judge/models/submission.py:71 +msgid "status" +msgstr "状態" + +#: judge/models/submission.py:72 +msgid "result" +msgstr "結果" + +#: judge/models/submission.py:74 +msgid "compile errors" +msgstr "コンパイルエラー" + +#: judge/models/submission.py:76 +msgid "batched cases" +msgstr "バッチのケース" + +#: judge/models/submission.py:77 +msgid "test case points" +msgstr "テストケースの点数" + +#: judge/models/submission.py:78 +msgid "test case total points" +msgstr "テストケースの合計点" + +#: judge/models/submission.py:79 +msgid "judged on" +msgstr "判定された" + +#: judge/models/submission.py:81 +msgid "was rejudged by admin" +msgstr "管理者により再判定された" + +#: judge/models/submission.py:82 +msgid "was ran on pretests only" +msgstr "予備テストのみ実行された" + +#: judge/models/submission.py:182 templates/contest/moss.html:58 +msgid "submissions" +msgstr "提出" + +#: judge/models/submission.py:186 judge/models/submission.py:197 +msgid "associated submission" +msgstr "関連する提出物" + +#: judge/models/submission.py:188 +msgid "source code" +msgstr "ソースコード" + +#: judge/models/submission.py:199 +msgid "test case ID" +msgstr "テストケースの ID" + +#: judge/models/submission.py:200 +msgid "status flag" +msgstr "状態フラグ" + +#: judge/models/submission.py:204 +msgid "points possible" +msgstr "可能な点数" + +#: judge/models/submission.py:205 +msgid "batch number" +msgstr "バッチ番号" + +#: judge/models/submission.py:206 +msgid "judging feedback" +msgstr "判定のフィードバック" + +#: judge/models/submission.py:207 +msgid "extended judging feedback" +msgstr "" + +#: judge/models/submission.py:208 +msgid "program output" +msgstr "プログラムの出力" + +#: judge/models/submission.py:216 +msgid "submission test case" +msgstr "提出テストケース" + +#: judge/models/submission.py:217 +msgid "submission test cases" +msgstr "提出テストケース" + +#: judge/models/ticket.py:10 +msgid "ticket title" +msgstr "チケットの題目" + +#: judge/models/ticket.py:11 +msgid "ticket creator" +msgstr "チケット作成者" + +#: judge/models/ticket.py:13 +msgid "creation time" +msgstr "作成時刻" + +#: judge/models/ticket.py:14 +msgid "assignees" +msgstr "担当者" + +#: judge/models/ticket.py:15 +msgid "quick notes" +msgstr "クイックノート" + +#: judge/models/ticket.py:16 +msgid "Staff notes for this issue to aid in processing." +msgstr "この問題の処理を支援するためのスタッフノート" + +#: judge/models/ticket.py:17 +msgid "linked item type" +msgstr "リンクされた項目タイプ" + +#: judge/models/ticket.py:19 +msgid "linked item ID" +msgstr "リンクされた項目 ID" + +#: judge/models/ticket.py:21 +msgid "is ticket open?" +msgstr "チケットはオープンか?" + +#: judge/models/ticket.py:25 +msgid "ticket" +msgstr "チケット" + +#: judge/models/ticket.py:27 +msgid "poster" +msgstr "投稿者" + +#: judge/models/ticket.py:30 +msgid "message time" +msgstr "メッセージの時刻" + +#: judge/pdf_problems.py:134 judge/pdf_problems.py:186 +#: judge/pdf_problems.py:246 +msgid "Page [page] of [topage]" +msgstr "ページ [page] / [topage]" + +#: judge/tasks/moss.py:25 +msgid "Running MOSS" +msgstr "" + +#: judge/tasks/submission.py:43 +msgid "Modifying submissions" +msgstr "" + +#: judge/tasks/submission.py:56 +msgid "Recalculating user points" +msgstr "" + +#: judge/utils/problem_data.py:63 +msgid "Empty batches not allowed." +msgstr "空のバッチは、許可されていません。" + +#: judge/utils/problem_data.py:82 +#, python-format +msgid "Points must be defined for non-batch case #%d." +msgstr "非バッチケース #%d のために点数が定義されなければなりません。" + +#: judge/utils/problem_data.py:87 +#, python-format +msgid "Input file for case %d does not exist: %s" +msgstr "ケース %d の入力ファイルが存在しません: %s" + +#: judge/utils/problem_data.py:90 +#, python-format +msgid "Output file for case %d does not exist: %s" +msgstr "ケース %d の出力ファイルが存在しません: %s" + +#: judge/utils/problem_data.py:115 +#, python-format +msgid "Batch start case #%d requires points." +msgstr "ケース #%d のバッチ開始には点数が必要です。" + +#: judge/utils/problem_data.py:136 +#, python-format +msgid "Attempt to end batch outside of one in case #%d" +msgstr "ケース #%d の外でバッチの終了を試みる。" + +#: judge/utils/problem_data.py:154 +msgid "How did you corrupt the zip path?" +msgstr "どのようにあなたが zip パスを破損したか?" + +#: judge/utils/problem_data.py:160 +msgid "How did you corrupt the generator path?" +msgstr "どのようにあなたがジェネレータのパスを破損したか?" + +#: judge/utils/problems.py:76 +msgid "Can't pass both queryset and keyword filters" +msgstr "問合せセットと絞り込みキーワードの両方は渡せません。" + +#: judge/utils/problems.py:87 +msgid "Wrong" +msgstr "" + +#: judge/utils/problems.py:89 +msgid "Timeout" +msgstr "" + +#: judge/utils/problems.py:90 +msgid "Error" +msgstr "" + +#: 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/timedelta.py:49 +msgctxt "time format with day" +msgid "%d day %h:%m:%s" +msgid_plural "%d days %h:%m:%s" +msgstr[0] "%d 日 %h:%m:%s" + +#: judge/utils/timedelta.py:53 +msgctxt "time format without day" +msgid "%h:%m:%s" +msgstr "%h:%m:%s" + +#: 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] "%d 日 %h:%m" + +#: judge/utils/timedelta.py:61 +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d 日" + +#: judge/utils/timedelta.py:63 +msgctxt "hours and minutes" +msgid "%h:%m" +msgstr "%h:%m" + +#: judge/views/blog.py:38 +#, python-format +msgid "Page %d of Posts" +msgstr "投稿のページ %d" + +#: judge/views/comment.py:27 +msgid "Messing around, are we?" +msgstr "私たちはめちゃくちゃですか?" + +#: judge/views/comment.py:36 +msgid "You must solve at least one problem before you can vote." +msgstr "" + +#: judge/views/comment.py:63 +msgid "You already voted." +msgstr "あなたは既に投票しました。" + +#: judge/views/comment.py:120 judge/views/organization.py:299 +msgid "Edited from site" +msgstr "サイトから編集された" + +#: judge/views/comment.py:141 +msgid "Editing comment" +msgstr "コメントの編集" + +#: judge/views/contests.py:49 judge/views/contests.py:211 +#: judge/views/contests.py:214 judge/views/contests.py:385 +msgid "No such contest" +msgstr "そのようなコンテストはありません" + +#: judge/views/contests.py:50 judge/views/contests.py:212 +#, python-format +msgid "Could not find a contest with the key \"%s\"." +msgstr "鍵 \"%s\" を持つコンテストは見つかりませんでした。" + +#: judge/views/contests.py:75 +msgid "Contests" +msgstr "コンテスト" + +#: judge/views/contests.py:215 +msgid "Could not find such contest." +msgstr "このようなコンテストは見つかりませんでした。" + +#: judge/views/contests.py:218 +#, python-format +msgid "Access to contest \"%s\" denied" +msgstr "コンテスト \"%s\" へのアクセスは拒否されました" + +#: judge/views/contests.py:242 +msgid "Clone Contest" +msgstr "" + +#: judge/views/contests.py:305 +msgid "Contest not ongoing" +msgstr "開催中ではないコンテスト" + +#: judge/views/contests.py:306 +#, python-format +msgid "\"%s\" is not currently ongoing." +msgstr "\"%s\" は現在開催中ではありません。" + +#: judge/views/contests.py:310 +msgid "Already in contest" +msgstr "既にコンテストに参加しています" + +#: judge/views/contests.py:311 +#, python-format +msgid "You are already in a contest: \"%s\"." +msgstr "あなたは既にコンテストに参加しています: \"%s\"。" + +#: judge/views/contests.py:314 +msgid "Banned from joining" +msgstr "" + +#: judge/views/contests.py:315 +msgid "You have been declared persona non grata for this contest. You are permanently barred from joining this contest." +msgstr "" + +#: judge/views/contests.py:375 +#, python-format +msgid "Enter access code for \"%s\"" +msgstr "\"%s\" のアクセスコードを入力してください" + +#: judge/views/contests.py:386 +#, python-format +msgid "You are not in contest \"%s\"." +msgstr "あなたはコンテストに参加していません: \"%s\"。" + +#: judge/views/contests.py:405 +msgid "ContestCalendar requires integer year and month" +msgstr "" + +#: judge/views/contests.py:445 +#, python-format +msgid "Contests in %(month)s" +msgstr "%(month)s 年のコンテスト" + +#: judge/views/contests.py:445 +msgid "F Y" +msgstr "" + +#: judge/views/contests.py:531 +msgid "???" +msgstr "???" + +#: judge/views/contests.py:594 +#, python-format +msgid "%s Rankings" +msgstr "%s 順位表" + +#: judge/views/contests.py:610 +#, python-format +msgid "Your participation in %s" +msgstr "あなたの %s への参加" + +#: judge/views/contests.py:611 +#, python-format +msgid "%s's participation in %s" +msgstr "%s の %s への参加" + +#: judge/views/contests.py:615 +msgid "Live" +msgstr "ライブ" + +#: judge/views/contests.py:627 templates/contest/contest-tabs.html:13 +msgid "Participation" +msgstr "参加" + +#: judge/views/contests.py:654 +#, python-format +msgid "%s MOSS Results" +msgstr "" + +#: judge/views/contests.py:681 +#, python-format +msgid "Running MOSS for %s..." +msgstr "" + +#: judge/views/contests.py:704 +#, python-format +msgid "Contest tag: %s" +msgstr "コンテストタグ: %s" + +#: judge/views/error.py:14 +msgid "404 error" +msgstr "404エラー" + +#: judge/views/error.py:15 +#, python-format +msgid "Could not find page \"%s\"" +msgstr "ページ \"%s\" が見つかりませんでした" + +#: judge/views/error.py:22 +#, python-format +msgid "no permission for %s" +msgstr "%s への許可がありません" + +#: judge/views/error.py:30 +#, python-format +msgid "corrupt page %s" +msgstr "破損ページ %s" + +#: 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:44 judge/views/organization.py:47 +msgid "No such organization" +msgstr "このような組織はありません" + +#: judge/views/organization.py:45 +#, python-format +msgid "Could not find an organization with the key \"%s\"." +msgstr "鍵 \"%s\" を持つ組織は見つかりませんでした。" + +#: judge/views/organization.py:48 +msgid "Could not find such organization." +msgstr "このような組織を見つけることができませんでした。" + +#: judge/views/organization.py:72 judge/views/register.py:34 +#: templates/organization/list.html:15 templates/user/user-list-tabs.html:5 +msgid "Organizations" +msgstr "組織" + +#: judge/views/organization.py:93 +#, python-format +msgid "%s Members" +msgstr "%s のメンバー" + +#: judge/views/organization.py:118 judge/views/organization.py:121 +#: judge/views/organization.py:126 +msgid "Joining organization" +msgstr "所属している組織" + +#: judge/views/organization.py:118 +msgid "You are already in the organization." +msgstr "あなたは、既にこの組織にしょぞくしています。" + +#: judge/views/organization.py:121 +msgid "This organization is not open." +msgstr "この組織は公開ではありません。" + +#: judge/views/organization.py:138 +msgid "Leaving organization" +msgstr "組織から脱退する" + +#: judge/views/organization.py:138 +#, python-format +msgid "You are not in \"%s\"." +msgstr "あなたは \"%s\" に所属していません。" + +#: judge/views/organization.py:162 +#, python-format +msgid "Request to join %s" +msgstr "%s への参加を申し込む" + +#: judge/views/organization.py:180 +msgid "Join request detail" +msgstr "参加申込みの詳細" + +#: judge/views/organization.py:209 +#, python-format +msgid "Managing join requests for %s" +msgstr "%s への参加申込みを管理する" + +#: judge/views/organization.py:240 +#, python-format +msgid "Your organization can only receive %d more members. You cannot approve %d users." +msgstr "あなたの組織はあと %d 人のメンバーしか受け入れられません。あなたは %d 人の利用者を承認できません。" + +#: judge/views/organization.py:252 +#, python-format +msgid "Approved %d user." +msgid_plural "Approved %d users." +msgstr[0] "%d 人の利用者を承認しました。" + +#: judge/views/organization.py:253 +#, python-format +msgid "Rejected %d user." +msgid_plural "Rejected %d users." +msgstr[0] "%d 人の利用者を拒否しました。" + +#: judge/views/organization.py:283 +#, python-format +msgid "Editing %s" +msgstr "%s を編集" + +#: judge/views/organization.py:307 judge/views/organization.py:315 +msgid "Can't edit organization" +msgstr "組織を編集できません" + +#: judge/views/organization.py:308 +msgid "You are not allowed to edit this organization." +msgstr "あなたは、この組織を編集することは許可されていません。" + +#: judge/views/organization.py:316 +msgid "You are not allowed to kick people from this organization." +msgstr "あなたはこの組織から人を追い出すことを許可されていません。" + +#: judge/views/organization.py:321 judge/views/organization.py:325 +msgid "Can't kick user" +msgstr "利用者を追い出せません" + +#: judge/views/organization.py:322 +msgid "The user you are trying to kick does not exist!" +msgstr "あなたが追い出そうとしている利用者は存在しません!" + +#: judge/views/organization.py:326 +#, python-format +msgid "The user you are trying to kick is not in organization: %s." +msgstr "あなたが追い出そうとしているユーザは組織内にいません: %s 。" + +#: judge/views/problem.py:68 +msgid "No such problem" +msgstr "そのような課題はありません" + +#: judge/views/problem.py:69 +#, python-format +msgid "Could not find a problem with the code \"%s\"." +msgstr "コード \"%s\" を有する課題は見つかりませんでした。" + +#: judge/views/problem.py:111 +#, python-brace-format +msgid "Editorial for {0}" +msgstr "{0} の論説" + +#: judge/views/problem.py:114 +#, python-brace-format +msgid "Editorial for {0}" +msgstr "{0} の論説" + +#: judge/views/problem.py:285 templates/contest/contest.html:79 +#: templates/user/user-tabs.html:5 templates/user/users-table.html:23 +msgid "Problems" +msgstr "課題" + +#: judge/views/problem.py:546 +msgid "Banned from submitting" +msgstr "提出が禁止された" + +#: judge/views/problem.py:547 +msgid "You have been declared persona non grata for this problem. You are permanently barred from submitting this problem." +msgstr "あなたはこの課題に感謝しない人として宣言されている。あなたはこの課題に提出することを永続的に禁止されている。" + +#: judge/views/problem.py:560 +msgid "Too many submissions" +msgstr "提出物が多過ぎます" + +#: judge/views/problem.py:561 +msgid "You have exceeded the submission limit for this problem." +msgstr "あなたは、この課題の提出制限を超えました" + +#: judge/views/problem.py:627 judge/views/problem.py:630 +#, python-format +msgid "Submit to %(problem)s" +msgstr "%(problem)s に提出する" + +#: judge/views/problem.py:646 +msgid "Clone Problem" +msgstr "" + +#: judge/views/problem_data.py:37 +msgid "Checker arguments must be a JSON object" +msgstr "ジェッカー引数は JSON オブジェクトでなければなりません。" + +#: judge/views/problem_data.py:39 +msgid "Checker arguments is invalid JSON" +msgstr "チェッカー引数は不正な JSON です" + +#: judge/views/problem_data.py:46 +msgid "Your zip file is invalid!" +msgstr "あなたの zip ファイルは不正です!" + +#: judge/views/problem_data.py:104 +#, python-brace-format +msgid "Comparing submissions for {0}" +msgstr "{0} への提出物の比較" + +#: judge/views/problem_data.py:107 +#, python-brace-format +msgid "Comparing submissions for {0}" +msgstr "{0} への提出物の比較" + +#: judge/views/problem_data.py:142 +#, python-brace-format +msgid "Editing data for {0}" +msgstr "{0} のデータの編集" + +#: judge/views/problem_data.py:145 +#, python-format +msgid "Editing data for %s" +msgstr "%s のデータの編集" + +#: judge/views/problem_data.py:237 judge/views/problem_data.py:238 +#, python-format +msgid "Generated init.yml for %s" +msgstr "%s への生成された init.yml" + +#: 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] "" + +#: judge/views/ranked_submission.py:58 +#, python-format +msgid "Best solutions for %s" +msgstr "%s の最優秀解答" + +#: judge/views/ranked_submission.py:61 +#, python-brace-format +msgid "Best solutions for {0}" +msgstr "{0} の最優秀解答" + +#: judge/views/ranked_submission.py:71 +#, python-format +msgid "Best solutions for %(problem)s in %(contest)s" +msgstr "%(contest)s 中の %(problem)s への最優秀解答" + +#: judge/views/ranked_submission.py:74 +#, python-format +msgid "Best solutions for problem %(number)s in %(contest)s" +msgstr "%(contest)s の課題 %(number)s への最優秀解答" + +#: judge/views/ranked_submission.py:80 +#, python-brace-format +msgid "Best solutions for {0} in {2}" +msgstr "{2} 中の {0} への最優秀解答" + +#: judge/views/ranked_submission.py:83 +#, python-brace-format +msgid "Best solutions for problem {0} in {1}" +msgstr "{1} 中の課題 {0} への最優秀解答" + +#: judge/views/register.py:27 +msgid "A username must contain letters, numbers, or underscores" +msgstr "利用者名は文字、数字またはアンダースコアを含めることができます。" + +#: judge/views/register.py:31 templates/user/edit-profile.html:103 +msgid "Preferred language" +msgstr "好みの言語" + +#: judge/views/register.py:38 +msgid "Subscribe to newsletter?" +msgstr "ニュースレターを購読しますか?" + +#: judge/views/register.py:45 +#, 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 +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 +msgid "Registration" +msgstr "登録" + +#: judge/views/register.py:106 +msgid "Authentication failure" +msgstr "認証の失敗" + +#: judge/views/stats.py:105 +msgid "Language statistics" +msgstr "言語の統計" + +#: judge/views/status.py:24 templates/submission/list.html:319 +msgid "Status" +msgstr "状態" + +#: judge/views/status.py:108 +msgid "Version matrix" +msgstr "バージョンマトリックス" + +#: judge/views/submission.py:59 judge/views/submission.py:66 +#, python-format +msgid "Submission of %(problem)s by %(user)s" +msgstr "%(user)s による %(problem)s への提出物" + +#: judge/views/submission.py:161 judge/views/submission.py:162 +#: templates/problem/problem.html:127 +msgid "All submissions" +msgstr "全ての提出物" + +#: judge/views/submission.py:303 +msgid "All my submissions" +msgstr "私の全ての提出物" + +#: judge/views/submission.py:304 +#, python-format +msgid "All submissions by %s" +msgstr "%s による全ての提出物" + +#: judge/views/submission.py:335 +#, python-format +msgid "All submissions for %s" +msgstr "%s への全ての提出物" + +#: judge/views/submission.py:354 +msgid "Must pass a problem" +msgstr "課題を通過しなければなりません" + +#: judge/views/submission.py:397 +#, python-format +msgid "My submissions for %(problem)s" +msgstr "%(problem)s への私の提出物" + +#: judge/views/submission.py:398 +#, python-format +msgid "%(user)s's submissions for %(problem)s" +msgstr "%(problem)s への %(user)s による提出物" + +#: judge/views/submission.py:495 +msgid "Must pass a contest" +msgstr "コンテストを通過しなければなりません" + +#: judge/views/submission.py:514 +#, python-brace-format +msgid "{0}'s submissions for {2} in {4}" +msgstr "{4} 中の {2} への {0} による提出物" + +#: judge/views/submission.py:519 +#, python-brace-format +msgid "{0}'s submissions for problem {2} in {3}" +msgstr "{3} 中の課題 {2} への {0} による提出物" + +#: judge/views/ticket.py:33 judge/views/ticket.py:39 +msgid "Ticket title" +msgstr "チケットの題目" + +#: judge/views/ticket.py:40 +msgid "Issue description" +msgstr "問題の説明" + +#: judge/views/ticket.py:85 judge/views/ticket.py:88 +#, python-format +msgid "New ticket for %s" +msgstr "%s への新しいチケット" + +#: judge/views/ticket.py:139 +#, python-format +msgid "%(title)s - Ticket %(id)d" +msgstr "%(title)s - チケット %(id)d" + +#: judge/views/ticket.py:248 +#, python-format +msgid "Tickets - Page %(number)d of %(total)d" +msgstr "チケットのページ %(number)d / %(total)d" + +#: judge/views/ticket.py:297 +#, python-format +msgid "New Ticket: %s" +msgstr "新しいチケット: %s" + +#: judge/views/ticket.py:298 +#, python-format +msgid "#%(id)d, assigned to: %(users)s" +msgstr "#%(id)d, %(users)s に割り当てられた" + +#: judge/views/ticket.py:300 +msgid ", " +msgstr "、" + +#: judge/views/ticket.py:300 +msgid "no one" +msgstr "誰もいません" + +#: judge/views/totp.py:42 templates/registration/totp_enable.html:86 +msgid "Enable Two Factor Authentication" +msgstr "" + +#: judge/views/totp.py:89 templates/registration/totp_disable.html:48 +msgid "Disable Two Factor Authentication" +msgstr "" + +#: judge/views/totp.py:103 +msgid "Perform Two Factor Authentication" +msgstr "" + +#: judge/views/user.py:68 +msgid "No such user" +msgstr "そのような利用者はいません" + +#: judge/views/user.py:68 +#, python-format +msgid "No user handle \"%s\"." +msgstr "利用者ハンドル \"%s\" はありません。" + +#: judge/views/user.py:72 +msgid "My account" +msgstr "自分のアカウント" + +#: judge/views/user.py:73 +#, python-format +msgid "User %s" +msgstr "利用者 %s" + +#: judge/views/user.py:136 +msgid "M j, Y, G:i" +msgstr "M j, Y, G:i" + +#: judge/views/user.py:221 +msgid "Updated on site" +msgstr "サイトで更新された" + +#: judge/views/user.py:253 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:10 +msgid "Edit profile" +msgstr "プロフィールを編集する" + +#: judge/views/user.py:262 templates/user/user-list-tabs.html:4 +msgid "Leaderboard" +msgstr "リーダーボード" + +#: judge/views/widgets.py:48 judge/views/widgets.py:58 +#, python-format +msgid "Invalid upstream data: %s" +msgstr "不正な上流データ: %s" + +#: judge/views/widgets.py:68 +msgid "Bad latitude or longitude" +msgstr "悪い緯度または経度です" + +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:13 +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:27 +msgid "Photo" +msgstr "" + +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:14 +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:28 +msgid "Photos" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:9 +msgid "first name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:10 +msgid "last name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:11 +msgid "biography" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/admin.py:24 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:30 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:30 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:30 +msgid "owner" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:12 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:12 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:12 +msgid "name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:19 +msgid "Category of Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:20 +msgid "Categories of Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:26 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:26 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:26 +msgid "title" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:28 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:28 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:28 +msgid "category" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:29 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:29 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:29 +msgid "author" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:31 +msgid "publication date" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:37 +msgid "Book" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:38 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:136 +msgid "Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:19 +msgid "Category of CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:20 +msgid "Categories of CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:36 +msgid "CD" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:37 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:141 +msgid "CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:19 +msgid "Category of DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:20 +msgid "Categories of DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:36 +msgid "DVD" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:37 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:146 +msgid "DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/templates/admin/base_site.html:7 +msgid "Django administration" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/forms.py:12 +#, python-format +msgid "Please enter the correct %(username)s and password for an admin account. Note that both fields may be case-sensitive." +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/forms.py:32 +#, python-format +msgid "Please enter the correct %(username)s and password for an user account. Note that both fields may be case-sensitive." +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:27 +msgid "Site" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:38 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:41 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:130 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:133 +msgid "Dashboard" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:48 +msgid "Applications" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:53 +msgid "Administration" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:64 +msgid "Color theme" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:66 +msgid "Change color theme" +msgstr "" + +#: 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 +msgid "Rate all ratable contests" +msgstr "すべての評価可能なコンテストを評価する" + +#: 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 +msgid "Rejudge" +msgstr "再判定" + +#: templates/base.html:214 +#, python-format +msgid "Hello, %(username)s." +msgstr "こんにちは、%(username)s。" + +#: templates/base.html:220 templates/comments/list.html:89 +#: templates/contest/contest-list-tabs.html:24 +#: templates/problem/problem-list-tabs.html:6 +#: templates/submission/info-base.html:12 +#: templates/submission/submission-list-tabs.html:15 +msgid "Admin" +msgstr "管理" + +#: templates/base.html:229 +msgid "Log out" +msgstr "ログアウト" + +#: templates/base.html:238 +#: templates/registration/password_reset_complete.html:4 +msgid "Log in" +msgstr "ログイン" + +#: templates/base.html:239 templates/registration/registration_form.html:177 +msgid "or" +msgstr "または" + +#: templates/base.html:240 +msgid "Sign up" +msgstr "" + +#: templates/base.html:252 +msgid "spectating" +msgstr "観戦中" + +#: templates/base.html:265 +msgid "This site works best with JavaScript enabled." +msgstr "このサイトはJavaScriptを有効にすると最適に動作します。" + +#: templates/blog/content.html:13 templates/comments/list.html:68 +#: templates/comments/list.html:83 templates/contest/contest-tabs.html:20 +#: 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 +msgid "Edit" +msgstr "編集" + +#: templates/blog/content.html:27 +#, python-format +msgid "\n" +" posted on %(time)s\n" +" " +msgstr "\n" +" %(time)s に投稿された \n" +" " + +#: templates/blog/dashboard.html:21 +#, python-format +msgid "\n" +" on %(time)s\n" +" " +msgstr "\n" +" %(time)s にて \n" +" " + +#: templates/blog/list.html:85 +msgid "Blog" +msgstr "ブログ" + +#: templates/blog/list.html:87 +msgid "Events" +msgstr "イベント" + +#: templates/blog/list.html:92 +msgid "News" +msgstr "お知らせ" + +#: templates/blog/list.html:106 +#, python-brace-format +msgid "posted on {time}" +msgstr "{time} に投稿された" + +#: templates/blog/list.html:130 templates/problem/problem.html:310 +msgid "Clarifications" +msgstr "解説" + +#: templates/blog/list.html:146 templates/problem/problem.html:321 +msgid "No clarifications have been made at this time." +msgstr "現時点では何も解説されていません。" + +#: templates/blog/list.html:154 +msgid "Ongoing contests" +msgstr "開催中のコンテスト" + +#: templates/blog/list.html:172 +msgid "Upcoming contests" +msgstr "近日開催予定のコンテスト" + +#: templates/blog/list.html:189 +msgid "Comment stream" +msgstr "コメントストリーム" + +#: templates/blog/list.html:208 +msgid "New problems" +msgstr "新しい課題" + +#: templates/blog/list.html:225 +msgid "My open tickets" +msgstr "私のオープンチケット" + +#: templates/blog/list.html:246 +msgid "New tickets" +msgstr "新しいチケット" + +#: templates/comments/list.html:2 +msgid "Comments" +msgstr "コメント" + +#: templates/comments/list.html:18 templates/comments/list.html:27 +msgid "Please login to vote" +msgstr "投票するにはログインしてください" + +#: templates/comments/list.html:40 +#, python-brace-format +msgid "commented on {time}" +msgstr "{time} にコメントされた" + +#: templates/comments/list.html:49 +#, python-format +msgid "edit %(edits)s" +msgstr "%(edits)s を編集する" + +#: templates/comments/list.html:51 templates/comments/media-js.html:77 +msgid "edited" +msgstr "編集された" + +#: templates/comments/list.html:60 +msgid "Link" +msgstr "リンク" + +#: templates/comments/list.html:73 templates/comments/list.html:80 +msgid "Reply" +msgstr "返信" + +#: templates/comments/list.html:86 +msgid "Hide" +msgstr "非表示" + +#: templates/comments/list.html:101 +#, 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:120 +msgid "There are no comments at the moment." +msgstr "現時点でコメントはありません。" + +#: templates/comments/list.html:126 +msgid "New comment" +msgstr "新しいコメント" + +#: templates/comments/list.html:140 +msgid "Invalid comment body." +msgstr "不正なコメント本文。" + +#: templates/comments/list.html:148 +msgid "Post!" +msgstr "投稿!" + +#: templates/comments/list.html:156 +msgid "Comments are disabled on this page." +msgstr "" + +#: templates/comments/media-js.html:72 +#, python-brace-format +msgid "edit {edits}" +msgstr "{edits} を編集する" + +#: templates/comments/media-js.html:75 +msgid "original" +msgstr "オリジナル" + +#: templates/contest/access_code.html:26 +msgid "Invalid access code." +msgstr "不正なアクセスコード。" + +#: templates/contest/access_code.html:29 +msgid "Please enter your access code:" +msgstr "あなたのアクセスコードを入力して下さい。" + +#: templates/contest/access_code.html:32 +msgid "Join Contest" +msgstr "コンテストに参加する" + +#: templates/contest/calendar.html:12 +msgid "Sunday" +msgstr "日曜日" + +#: templates/contest/calendar.html:13 +msgid "Monday" +msgstr "月曜日" + +#: templates/contest/calendar.html:14 +msgid "Tuesday" +msgstr "火曜日" + +#: templates/contest/calendar.html:15 +msgid "Wednesday" +msgstr "水曜日" + +#: templates/contest/calendar.html:16 +msgid "Thursday" +msgstr "木曜日" + +#: templates/contest/calendar.html:17 +msgid "Friday" +msgstr "金曜日" + +#: templates/contest/calendar.html:18 +msgid "Saturday" +msgstr "土曜日" + +#: 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 +msgid "Today" +msgstr "" + +#: templates/contest/contest-list-tabs.html:13 +msgid "Next" +msgstr "次へ" + +#: templates/contest/contest-list-tabs.html:21 +#: templates/problem/problem-list-tabs.html:5 +msgid "List" +msgstr "一覧" + +#: templates/contest/contest-list-tabs.html:22 +msgid "Calendar" +msgstr "カレンダー" + +#: templates/contest/contest-tabs.html:4 +msgid "Info" +msgstr "情報" + +#: templates/contest/contest-tabs.html:8 +msgid "Rankings" +msgstr "順位表" + +#: templates/contest/contest-tabs.html:10 +msgid "Hidden Rankings" +msgstr "非表示の順位表" + +#: templates/contest/contest-tabs.html:18 +msgid "MOSS" +msgstr "" + +#: templates/contest/contest-tabs.html:23 +msgid "Clone" +msgstr "" + +#: templates/contest/contest-tabs.html:34 +#: templates/contest/contest-tabs.html:54 +msgid "Leave contest" +msgstr "コンテストから脱退する" + +#: templates/contest/contest-tabs.html:41 templates/contest/list.html:293 +msgid "Virtual join" +msgstr "仮想参加" + +#: templates/contest/contest-tabs.html:52 +msgid "Stop spectating" +msgstr "観戦を停止する" + +#: templates/contest/contest-tabs.html:61 +msgid "Spectate contest" +msgstr "コンテストを観戦する" + +#: templates/contest/contest-tabs.html:67 +#: templates/contest/contest-tabs.html:73 +msgid "Join contest" +msgstr "コンテストに参加する" + +#: templates/contest/contest-tabs.html:82 +msgid "Login to participate" +msgstr "参加するためにログインする" + +#: templates/contest/contest.html:37 +msgid "Participating virtually." +msgstr "仮想的に参加している" + +#: templates/contest/contest.html:43 +msgid "Contest is over." +msgstr "コンテストは終了しました。" + +#: templates/contest/contest.html:59 templates/contest/contest.html:63 +msgid "F j, Y, G:i T" +msgstr "F j, Y, G:i T" + +#: templates/contest/contest.html:59 +#, python-format +msgid "%(time_limit)s window between %(start_time)s and %(end_time)s" +msgstr "%(time_limit)s 窓は %(start_time)s から %(end_time)s まで" + +#: templates/contest/contest.html:63 +#, python-format +msgid "%(length)s long starting on %(start_time)s" +msgstr "開始時刻 %(start_time)s まであと %(length)s" + +#: templates/contest/contest.html:85 +msgid "AC Rate" +msgstr "受理率" + +#: templates/contest/contest.html:86 templates/contest/list.html:153 +#: templates/contest/list.html:195 templates/contest/list.html:271 +#: templates/problem/list.html:212 templates/problem/list.html:238 +msgid "Users" +msgstr "利用者" + +#: templates/contest/contest.html:111 +msgid "Editorial" +msgstr "論説" + +#: templates/contest/list.html:31 templates/contest/media-js.html:9 +msgid "Are you sure you want to join?" +msgstr "あなたは本当に参加したいですか?" + +#: 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:65 +msgid "hidden" +msgstr "" + +#: templates/contest/list.html:70 +msgid "private" +msgstr "" + +#: templates/contest/list.html:84 +msgid "rated" +msgstr "" + +#: templates/contest/list.html:132 +msgid "Spectate" +msgstr "観戦する" + +#: templates/contest/list.html:138 +msgid "Join" +msgstr "参加する" + +#: templates/contest/list.html:148 +msgid "Active Contests" +msgstr "" + +#: templates/contest/list.html:152 templates/contest/list.html:194 +#: templates/contest/list.html:232 templates/contest/list.html:270 +msgid "Contest" +msgstr "コンテスト" + +#: templates/contest/list.html:190 +msgid "Ongoing Contests" +msgstr "開催中のコンテスト" + +#: templates/contest/list.html:227 +msgid "Upcoming Contests" +msgstr "近日開催予定のコンテスト" + +#: templates/contest/list.html:255 +msgid "There are no scheduled contests at this time." +msgstr "現在スケジュールされているコンテストはありません。" + +#: templates/contest/list.html:261 +msgid "Past Contests" +msgstr "過去のコンテスト" + +#: templates/contest/media-js.html:4 +msgid "Are you sure you want to leave?" +msgstr "あなたは本当に脱退したいですか?" + +#: 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 +msgid "Joining a contest starts your timer, after which it becomes unstoppable." +msgstr "コンテストに参加するとあなたのタイマーがスタートし、その後は止められなくなります。" + +#: 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:7 +msgid "Organization" +msgstr "組織" + +#: templates/contest/ranking-table.html:27 +#, python-brace-format +msgid "Started on {time}" +msgstr "{time} に開始した" + +#: templates/contest/ranking-table.html:30 +msgid "Participation ended." +msgstr "参加が終了しました。" + +#: templates/contest/ranking.html:232 +msgid "View user participation" +msgstr "利用者の参加を見る" + +#: templates/contest/ranking.html:236 +msgid "Show organizations" +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 +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 +msgid "activate" +msgstr "有効化" + +#: 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 +msgid "Newsletter unsubscribe" +msgstr "ニュースレターの登録を解除する" + +#: 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 +msgid "Do you want to unsubscribe from this newsletter?" +msgstr "このニュースレターの購読を解除しますか?" + +#: 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 +msgid "Newsletter update" +msgstr "ニュースレター更新" + +#: 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 +msgid "Update subscription" +msgstr "購読の更新" + +#: templates/newsletter/subscription_update_activated.html:8 +msgid "Your subscription has successfully been updated." +msgstr "あなたの購読は正常に更新されました。" + +#: 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:34 +#: templates/ticket/edit-notes.html:4 +msgid "Update" +msgstr "更新" + +#: 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:29 +msgid "Join organization" +msgstr "組織に参加する" + +#: templates/organization/home.html:33 +msgid "Request membership" +msgstr "メンバーシップを要求する" + +#: templates/organization/home.html:39 +msgid "Edit organization" +msgstr "組織を編集する" + +#: templates/organization/home.html:43 +msgid "View requests" +msgstr "要求を表示する" + +#: templates/organization/home.html:50 +msgid "Admin organization" +msgstr "組織を管理する" + +#: templates/organization/home.html:55 +msgid "View members" +msgstr "メンバーを表示する" + +#: templates/organization/list.html:23 templates/status/language-list.html:34 +msgid "Name" +msgstr "名前" + +#: templates/organization/list.html:24 +msgid "Members" +msgstr "メンバー" + +#: templates/organization/new.html:10 templates/ticket/new.html:38 +msgid "Create" +msgstr "作成" + +#: templates/organization/requests/detail.html:13 +msgid "User:" +msgstr "利用者:" + +#: templates/organization/requests/detail.html:17 +msgid "Organization:" +msgstr "組織:" + +#: templates/organization/requests/detail.html:25 +msgid "Time:" +msgstr "時刻:" + +#: templates/organization/requests/detail.html:29 +msgid "Reason:" +msgstr "理由:" + +#: 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:15 +msgid "Reason" +msgstr "理由" + +#: 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:17 +#: templates/problem/data.html:401 +msgid "Delete?" +msgstr "削除しますか?" + +#: templates/organization/requests/request.html:18 +msgid "Your reason for joining:" +msgstr "参加するためのあなたの理由:" + +#: templates/organization/requests/request.html:20 +msgid "Request" +msgstr "要求" + +#: templates/organization/requests/tabs.html:4 +msgid "Pending" +msgstr "保留中" + +#: templates/organization/requests/tabs.html:7 +msgid "Log" +msgstr "ログ" + +#: templates/organization/requests/tabs.html:10 +msgid "Approved" +msgstr "承認済" + +#: templates/organization/requests/tabs.html:13 +msgid "Rejected" +msgstr "却下された" + +#: templates/organization/users-table.html:15 +msgid "Kick" +msgstr "追い出す" + +#: templates/problem/clone.html:37 +msgid "Enter a new code for the cloned problem:" +msgstr "" + +#: templates/problem/data.html:353 +msgid "View YAML" +msgstr "YAML を見る" + +#: templates/problem/data.html:369 +msgid "Show columns:" +msgstr "カラムを表示:" + +#: templates/problem/data.html:372 templates/problem/data.html:396 +msgid "Output prefix" +msgstr "出力プレフィクス" + +#: templates/problem/data.html:376 templates/problem/data.html:397 +msgid "Output limit" +msgstr "出力制限" + +#: templates/problem/data.html:380 templates/problem/data.html:398 +msgid "Checker" +msgstr "チェッカー" + +#: templates/problem/data.html:384 templates/problem/data.html:399 +msgid "Generator args" +msgstr "ジェネレータの引数" + +#: templates/problem/data.html:391 +msgid "Type" +msgstr "タイプ" + +#: templates/problem/data.html:392 +msgid "Input file" +msgstr "入力ファイル" + +#: templates/problem/data.html:393 +msgid "Output file" +msgstr "出力ファイル" + +#: templates/problem/data.html:395 +msgid "Pretest?" +msgstr "事前テストか?" + +#: templates/problem/data.html:447 templates/problem/submit.html:252 +msgid "Submit!" +msgstr "提出!" + +#: templates/problem/data.html:448 +msgid "Add new case" +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 editorialist.

Submitting an official solution before solving the problem yourself is a bannable offence." +msgstr "この論説は、つまずいた時に限って使用し、ここからコードをコピーアンドペーストしないようにすることを覚えておいて下さい。課題と論説の著者に敬意を表してください。

自身で課題を解く前に公式の解答を提出することは禁止されています。" + +#: templates/problem/list.html:62 +msgid "Filter by type..." +msgstr "タイプで絞り込む..." + +#: templates/problem/list.html:185 +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:57 +msgid "Category" +msgstr "カテゴリ" + +#: templates/problem/list.html:209 templates/problem/list.html:228 +msgid "Types" +msgstr "タイプ" + +#: templates/problem/list.html:235 +#, python-format +msgid "AC %%" +msgstr "受理 %%" + +#: 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:142 +msgid "Filter by result:" +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 "PDF として表示する" + +#: templates/problem/problem.html:101 templates/problem/problem.html:111 +#: templates/problem/problem.html:116 +msgid "Submit solution" +msgstr "解答を提出する" + +#: templates/problem/problem.html:104 +#, python-format +msgid "%(counter)s submission left" +msgid_plural "%(counter)s submissions left" +msgstr[0] "%(counter)s 個の提出物が残っています" + +#: templates/problem/problem.html:112 +msgid "0 submissions left" +msgstr "提出物が残っていません" + +#: templates/problem/problem.html:124 +msgid "My submissions" +msgstr "私の提出物" + +#: templates/problem/problem.html:128 +msgid "Best submissions" +msgstr "最優秀提出物" + +#: templates/problem/problem.html:132 +msgid "Read editorial" +msgstr "論説を読む" + +#: templates/problem/problem.html:137 +msgid "Manage tickets" +msgstr "チケットを管理する" + +#: templates/problem/problem.html:141 +msgid "Edit problem" +msgstr "課題を編集する" + +#: templates/problem/problem.html:143 +msgid "Edit test data" +msgstr "テストデータを編集する" + +#: templates/problem/problem.html:148 +msgid "My tickets" +msgstr "" + +#: templates/problem/problem.html:156 +msgid "Manage submissions" +msgstr "" + +#: templates/problem/problem.html:162 +msgid "Clone problem" +msgstr "課題を複製する" + +#: templates/problem/problem.html:169 +msgid "Points:" +msgstr "点数:" + +#: templates/problem/problem.html:172 templates/problem/problem.html:174 +msgid "(partial)" +msgstr "(部分点)" + +#: templates/problem/problem.html:179 +msgid "Time limit:" +msgstr "制限時間:" + +#: templates/problem/problem.html:191 +msgid "Memory limit:" +msgstr "メモリ制限:" + +#: templates/problem/problem.html:210 +msgid "Author:" +msgid_plural "Authors:" +msgstr[0] "著者:" + +#: templates/problem/problem.html:225 +msgid "Problem type" +msgid_plural "Problem types" +msgstr[0] "課題のタイプ" + +#: templates/problem/problem.html:238 +msgid "Allowed languages" +msgstr "許可されている言語" + +#: templates/problem/problem.html:246 +#, python-format +msgid "No %(lang)s judge online" +msgstr "%(lang)s はオンライン判定されません" + +#: templates/problem/problem.html:257 +msgid "Judge:" +msgid_plural "Judges:" +msgstr[0] "" + +#: templates/problem/problem.html:274 +msgid "none available" +msgstr "" + +#: templates/problem/problem.html:299 +msgid "Request clarification" +msgstr "解説を要求する" + +#: templates/problem/problem.html:301 +msgid "Report an issue" +msgstr "問題を報告する" + +#: 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 +msgid "Search problems..." +msgstr "問題を検索する..." + +#: templates/problem/search-form.html:14 +msgid "Full text search" +msgstr "全文検索" + +#: templates/problem/search-form.html:21 +msgid "Hide solved problems" +msgstr "解いた課題を非表示にする" + +#: 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 +msgid "All" +msgstr "全て" + +#: templates/problem/search-form.html:46 +msgid "Problem types" +msgstr "課題のタイプ" + +#: templates/problem/search-form.html:57 +msgid "Point range" +msgstr "点数の範囲" + +#: templates/problem/search-form.html:63 templates/submission/list.html:337 +#: templates/ticket/list.html:248 +msgid "Go" +msgstr "実行する" + +#: templates/problem/search-form.html:64 +msgid "Random" +msgstr "ランダム" + +#: templates/problem/submit.html:192 +#, python-format +msgid "Warning! Your default language, %(default_language)s, is unavailable for this problem and has been deselected." +msgstr "警告! あなたのデフォルト言語 %(default_language)s はこの課題に利用可能ではないので選択を解除しました。" + +#: templates/problem/submit.html:203 +#, python-format +msgid "\n" +" You have %(left)s submission left\n" +" " +msgid_plural "\n" +" You have %(left)s submissions left\n" +" " +msgstr[0] "\n" +" あなたは提出物 %(left)s が残っています \n" +" " + +#: templates/problem/submit.html:212 +msgid "You have 0 submissions left" +msgstr "あなたには提出物が残っていません" + +#: templates/problem/submit.html:250 +msgid "No judge is available for this problem." +msgstr "この課題は判定器が利用可能ではありません。" + +#: templates/registration/activate.html:3 +#, python-format +msgid "%(key)s is an invalid activation key." +msgstr "%(key)s は無効な有効化鍵です。" + +#: templates/registration/activation_complete.html:3 +msgid "Your account has been successfully activated." +msgstr "あなたのアカウントは正常に有効化されました。" + +#: templates/registration/login.html:43 +msgid "Invalid username or password." +msgstr "不正な利用者名またはパスワードです。" + +#: templates/registration/login.html:61 +#: templates/registration/totp_auth.html:39 +msgid "Login!" +msgstr "ログイン!" + +#: templates/registration/login.html:64 +msgid "Forgot your password?" +msgstr "パスワードを忘れましたか?" + +#: templates/registration/login.html:67 +msgid "Or log in with..." +msgstr "または次でログイン..." + +#: templates/registration/logout.html:3 +msgid "See you later!" +msgstr "また会いましょう!" + +#: templates/registration/password_change_done.html:3 +msgid "Your password was sucessfully changed." +msgstr "あなたのパスワードは正常に変更されました。" + +#: templates/registration/password_change_form.html:8 +msgid "Change Password" +msgstr "パスワードを変更する" + +#: templates/registration/password_reset.html:7 +msgid "Send Reset Email" +msgstr "リセットの電子メールを送信する" + +#: 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_confirm.html:9 +msgid "Reset Password" +msgstr "パスワードをリセットする" + +#: 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 +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 +#, python-format +msgid "You're receiving this email because you requested a password reset for your user account at %(site_name)s." +msgstr "あなたが %(site_name)s の利用者アカウントのパスワードリセットを要求したため、この電子メールが届いています。" + +#: 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 +msgid "Your username, in case you've forgotten:" +msgstr "あなたの利用者名、もし忘れたのであれば:" + +#: templates/registration/password_reset_email.txt:9 +msgid "Thanks for using our site!" +msgstr "私たちのサイトを利用してくれてありがとう!" + +#: templates/registration/password_reset_email.txt:11 +#, python-format +msgid "The %(site_name)s team" +msgstr "%(site_name)s チーム" + +#: templates/registration/password_reset_subject.txt:1 +#, python-format +msgid "Password reset on %(site_name)s" +msgstr "%(site_name)s のパスワードをリセットする" + +#: templates/registration/profile_creation.html:36 +#: templates/registration/username_select.html:7 +msgid "Continue >" +msgstr "続行 >" + +#: 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:166 +msgid "(again, for confirmation)" +msgstr "(もう1度、確認のため)" + +#: templates/registration/registration_form.html:173 +msgid "(select your closest major city)" +msgstr "(最寄りの大都市を選択してください)" + +#: templates/registration/registration_form.html:178 +msgid "pick from map" +msgstr "地図から選ぶ" + +#: templates/registration/registration_form.html:183 +msgid "Default language" +msgstr "デフォルトの言語" + +#: templates/registration/registration_form.html:186 +#: templates/user/edit-profile.html:162 +msgid "Affiliated organizations" +msgstr "所属組織" + +#: templates/registration/registration_form.html:192 +#: templates/user/edit-profile.html:121 +msgid "Notify me about upcoming contests" +msgstr "まもなく開催予定のコンテストを通知する" + +#: templates/registration/registration_form.html:206 +msgid "By registering, you agree to our" +msgstr "登録することで、あなたは同意することになります" + +#: templates/registration/registration_form.html:207 +msgid "Terms & Conditions" +msgstr "利用規約・条件" + +#: templates/registration/registration_form.html:210 +msgid "Register!" +msgstr "登録!" + +#: templates/registration/totp_auth.html:36 +#: templates/registration/totp_disable.html:45 +#: templates/registration/totp_enable.html:83 +msgid "Enter the 6-digit code generated by your app:" +msgstr "" + +#: templates/registration/totp_auth.html:41 +#, python-format +msgid "If you lost your authentication device, please contact us at %(email)s." +msgstr "" + +#: templates/registration/totp_disable.html:38 +msgid "To protect your account, you must first authenticate before you can disable Two Factor Authentication." +msgstr "" + +#: templates/registration/totp_enable.html:71 +msgid "Scan this code with your authenticator app:" +msgstr "" + +#: templates/registration/totp_enable.html:72 +msgid "QR code" +msgstr "" + +#: templates/registration/totp_enable.html:73 +msgid "Or enter this code manually:" +msgstr "" + +#: templates/stats/base.html:9 templates/submission/list.html:345 +msgid "Statistics" +msgstr "統計" + +#: templates/stats/language.html:11 +msgid "Submission Statistics" +msgstr "提出物の統計" + +#: templates/stats/language.html:16 +msgid "Submissions by Language" +msgstr "言語ごとの提出物" + +#: templates/stats/language.html:21 +msgid "AC Submissions by Language" +msgstr "言語ごとの受理された提出物" + +#: templates/stats/language.html:26 +msgid "Language AC Rate" +msgstr "言語の受理割合" + +#: templates/status/judge-status-table.html:2 +msgid "Judge" +msgstr "判定器" + +#: templates/status/judge-status-table.html:4 +msgid "Online" +msgstr "オンライン" + +#: templates/status/judge-status-table.html:6 +msgid "Uptime" +msgstr "稼働時間" + +#: templates/status/judge-status-table.html:7 +msgid "Ping" +msgstr "ピン" + +#: 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 +msgid "N/A" +msgstr "該当なし" + +#: templates/status/judge-status-table.html:64 +msgid "There are no judges available at this time." +msgstr "現在利用できる判定器はありません。" + +#: templates/status/language-list.html:33 templates/ticket/list.html:261 +msgid "ID" +msgstr "ID" + +#: templates/status/language-list.html:35 +msgid "Runtime Info" +msgstr "ランタイム情報" + +#: templates/status/status-tabs.html:4 +msgid "Judges" +msgstr "判定器" + +#: templates/status/status-tabs.html:6 +msgid "Version Matrix" +msgstr "バージョンマトリックス" + +#: templates/submission/internal-error-message.html:8 +msgid "An internal error occurred while grading." +msgstr "採点中に内部エラーが発生しました。" + +#: templates/submission/internal-error-message.html:15 +msgid "Error information" +msgstr "エラー情報" + +#: templates/submission/list.html:76 +msgid "Filter by status..." +msgstr "状態で絞り込む..." + +#: templates/submission/list.html:82 +msgid "Filter by language..." +msgstr "言語で絞り込む..." + +#: templates/submission/list.html:315 +msgid "Filter submissions" +msgstr "提出物を絞り込む" + +#: templates/submission/list.html:351 +msgid "Total:" +msgstr "" + +#: templates/submission/list.html:361 +msgid "You were disconnected. Refresh to show latest updates." +msgstr "あなたは切断されました。最終更新を表示するためにリフレッシュして下さい。" + +#: templates/submission/row.html:39 +#, python-format +msgid "Case #%(case)s" +msgstr "ケース #%(case)s" + +#: templates/submission/row.html:49 +msgid "view" +msgstr "表示" + +#: templates/submission/row.html:53 +msgid "rejudge" +msgstr "再判定" + +#: templates/submission/row.html:58 +msgid "admin" +msgstr "管理" + +#: templates/submission/source.html:25 +msgid "View status" +msgstr "状態を表示する" + +#: templates/submission/source.html:26 +msgid "View raw source" +msgstr "生のソースを表示する" + +#: templates/submission/source.html:28 templates/submission/status.html:61 +msgid "Resubmit" +msgstr "再提出する" + +#: 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 +msgid "Your submission is being processed..." +msgstr "あなたの提出物は処理されています..." + +#: templates/submission/status-testcases.html:14 +msgid "Compilation Error" +msgstr "コンパイルエラー" + +#: templates/submission/status-testcases.html:18 +msgid "Compilation Warnings" +msgstr "コンパイル警告" + +#: templates/submission/status-testcases.html:23 +msgid "Pretest Execution Results" +msgstr "事前テストの実行結果" + +#: templates/submission/status-testcases.html:25 +msgid "Execution Results" +msgstr "実行結果" + +#: templates/submission/status-testcases.html:31 +msgid "Batch " +msgstr "バッチ" + +#: templates/submission/status-testcases.html:43 +msgid "Case" +msgstr "ケース\n" +"Vaka" + +#: templates/submission/status-testcases.html:45 +msgid "Pretest" +msgstr "事前テスト" + +#: templates/submission/status-testcases.html:47 +msgid "Test case" +msgstr "テストケース" + +#: templates/submission/status-testcases.html:79 +msgid "Your output (clipped)" +msgstr "あなたの出力(切り取ってある)" + +#: templates/submission/status-testcases.html:90 +msgid "Judge feedback" +msgstr "" + +#: templates/submission/status-testcases.html:106 +msgid "Resources:" +msgstr "" + +#: templates/submission/status-testcases.html:115 +msgid "Final pretest score:" +msgstr "最終の予備テスト点数:" + +#: templates/submission/status-testcases.html:117 +msgid "Final score:" +msgstr "最終得点:" + +#: templates/submission/status-testcases.html:131 +msgid "Passing pretests does not guarantee a full score on system tests." +msgstr "予備テストに通過したことは、システムテストでの満点を保証するものではありません。" + +#: templates/submission/status-testcases.html:134 +msgid "Submission aborted!" +msgstr "提出が中断された!" + +#: templates/submission/status.html:59 +msgid "View source" +msgstr "ソースを表示する" + +#: templates/submission/status.html:88 +msgid "Abort" +msgstr "中断する" + +#: templates/submission/submission-list-tabs.html:6 +msgid "Mine" +msgstr "私の" + +#: templates/submission/submission-list-tabs.html:9 +msgid "Best" +msgstr "最優秀" + +#: templates/submission/submission-list-tabs.html:12 +#, python-format +msgid "%(user)s's" +msgstr "%(user)s" + +#: templates/ticket/list.html:135 templates/ticket/ticket.html:257 +msgid "Reopened: " +msgstr "再オープンしました:" + +#: templates/ticket/list.html:138 templates/ticket/ticket.html:258 +msgid "Closed: " +msgstr "閉じられました:" + +#: templates/ticket/list.html:221 +msgid "Use desktop notification" +msgstr "デスクトップ通知を利用する" + +#: templates/ticket/list.html:227 +msgid "Show my tickets only" +msgstr "私のチケットだけを表示する" + +#: templates/ticket/list.html:231 +msgid "Filing user" +msgstr "利用者を埋める" + +#: templates/ticket/list.html:240 +msgid "Assignee" +msgstr "担当者" + +#: templates/ticket/list.html:262 +msgid "Title" +msgstr "題目" + +#: templates/ticket/list.html:264 templates/ticket/ticket.html:304 +msgid "Assignees" +msgstr "担当者" + +#: templates/ticket/new_problem.html:7 +msgid "Thanks for opening a ticket!" +msgstr "チケットを開いてくれてありがとう!" + +#: 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 +msgid "Associated object" +msgstr "関連するオブジェクト" + +#: templates/ticket/ticket.html:309 +msgid "No one is assigned." +msgstr "誰も割り当てられていません。" + +#: templates/ticket/ticket.html:315 +msgid "Close ticket" +msgstr "チケットを閉じる" + +#: templates/ticket/ticket.html:317 +msgid "Reopen ticket" +msgstr "チケットを再度開く" + +#: templates/ticket/ticket.html:321 +msgid "Assignee notes" +msgstr "担当者メモ" + +#: templates/ticket/ticket.html:328 templates/widgets/select_all.html:4 +msgid "Nothing here." +msgstr "何もありません。" + +#: templates/ticket/ticket.html:378 +msgid "Post" +msgstr "投稿する" + +#: templates/user/base-users-table.html:3 +msgid "Rank" +msgstr "ランク" + +#: templates/user/base-users.html:14 templates/user/base-users.html:69 +msgid "Search by handle..." +msgstr "ハンドルで検索..." + +#: templates/user/edit-profile.html:90 +msgid "Self-description" +msgstr "自己紹介" + +#: templates/user/edit-profile.html:98 +msgid "Select your closest major city" +msgstr "最寄りの大都市を選択してください" + +#: templates/user/edit-profile.html:107 +msgid "Editor theme" +msgstr "エディタのテーマ" + +#: templates/user/edit-profile.html:112 +msgid "Math engine" +msgstr "数式エンジン" + +#: templates/user/edit-profile.html:136 templates/user/edit-profile.html:137 +msgid "Change your avatar" +msgstr "アバターを変更する" + +#: templates/user/edit-profile.html:143 +msgid "Change your password" +msgstr "パスワードを変更する" + +#: templates/user/edit-profile.html:150 +msgid "Two Factor Authentication is enabled." +msgstr "" + +#: templates/user/edit-profile.html:153 +msgid "Two Factor Authentication is disabled." +msgstr "" + +#: templates/user/edit-profile.html:170 +msgid "User-script" +msgstr "利用者スクリプト" + +#: templates/user/edit-profile.html:174 +msgid "Update profile" +msgstr "プロフィールの更新" + +#: templates/user/pp-row.html:22 +#, python-format +msgid "\n" +" weighted %(weight)s%%\n" +" " +msgstr "\n" +" 重み %(weight)s%%\n" +" " + +#: templates/user/pp-row.html:27 +#, python-format +msgid "%(pp).1fpp" +msgstr "%(pp).1fpp" + +#: templates/user/pp-row.html:29 +#, python-format +msgid "%(pp).0fpp" +msgstr "%(pp).0fpp" + +#: templates/user/user-about.html:14 +msgid "From" +msgstr "差出人" + +#: 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:40 +msgid "You have not shared any information." +msgstr "あなたは、いかなる情報も共有していません。" + +#: templates/user/user-about.html:42 +msgid "This user has not shared any information." +msgstr "この利用者は、いかなる情報も共有していません。" + +#: templates/user/user-base.html:42 +#, python-format +msgid "%(counter)s problem solved" +msgid_plural "%(counter)s problems solved" +msgstr[0] "" + +#: templates/user/user-base.html:50 +msgid "Rank by points:" +msgstr "点数による順位:" + +#: templates/user/user-base.html:53 +msgid "Total points:" +msgstr "合計点:" + +#: templates/user/user-base.html:68 +msgid "Rank by rating:" +msgstr "評価による順位:" + +#: templates/user/user-base.html:70 +msgid "Rating:" +msgstr "評価:" + +#: templates/user/user-base.html:71 +msgid "Volatility:" +msgstr "変動率:" + +#: templates/user/user-base.html:72 +msgid "Min. rating:" +msgstr "最小の評価:" + +#: templates/user/user-base.html:73 +msgid "Max rating:" +msgstr "最大の評価:" + +#: templates/user/user-problems.html:35 +msgid "Points Breakdown" +msgstr "点数の内訳" + +#: templates/user/user-problems.html:41 +msgid "Load more..." +msgstr "さらに読み込む..." + +#: templates/user/user-problems.html:45 +msgid "This user has not yet solved any problems." +msgstr "この利用者は、まだどの課題も解いていません。" + +#: templates/user/user-problems.html:51 +msgid "Authored Problems" +msgstr "作成された課題" + +#: templates/user/user-problems.html:83 +msgid "Hide problems I've solved" +msgstr "自分が解いた課題を非表示にする" + +#: templates/user/user-problems.html:93 +#, python-format +msgid "%(points).1f points" +msgstr "%(points).1f 点" + +#: templates/user/user-problems.html:99 +msgid "Score" +msgstr "得点" + +#: templates/user/user-problems.html:110 +#, python-format +msgid "%(points)s / %(total)s" +msgstr "%(points)s / %(total)s" + +#: templates/user/user-tabs.html:7 +msgid "Impersonate" +msgstr "なりすまし" + +#: templates/user/user-tabs.html:13 +msgid "Admin User" +msgstr "管理者" + +#: templates/user/user-tabs.html:16 +msgid "Admin Profile" +msgstr "管理者プロフィール" + +#: templates/widgets/select_all.html:8 +msgid "Check all" +msgstr "すべてをチェックする" + diff --git a/locale/ja/LC_MESSAGES/djangojs.po b/locale/ja/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..236f5d4 --- /dev/null +++ b/locale/ja/LC_MESSAGES/djangojs.po @@ -0,0 +1,29 @@ +msgid "" +msgstr "" +"Project-Id-Version: dmoj\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-10-01 23:12+0000\n" +"PO-Revision-Date: 2019-11-11 22:05\n" +"Last-Translator: Icyene\n" +"Language-Team: Japanese\n" +"Language: ja_JP\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: crowdin.com\n" +"X-Crowdin-Project: dmoj\n" +"X-Crowdin-Language: ja\n" +"X-Crowdin-File: djangojs.po\n" + +#: resources/common.js:207 +msgctxt "time format with day" +msgid "%d day %h:%m:%s" +msgid_plural "%d days %h:%m:%s" +msgstr[0] "%d 日 %h:%m:%s" + +#: resources/common.js:210 +msgctxt "time format without day" +msgid "%h:%m:%s" +msgstr "%h:%m:%s" + diff --git a/locale/ko/LC_MESSAGES/django.po b/locale/ko/LC_MESSAGES/django.po new file mode 100644 index 0000000..46ebfea --- /dev/null +++ b/locale/ko/LC_MESSAGES/django.po @@ -0,0 +1,4509 @@ +msgid "" +msgstr "" +"Project-Id-Version: dmoj\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-11-11 21:54+0000\n" +"PO-Revision-Date: 2019-11-11 22:05\n" +"Last-Translator: Icyene\n" +"Language-Team: Korean\n" +"Language: ko_KR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: crowdin.com\n" +"X-Crowdin-Project: dmoj\n" +"X-Crowdin-Language: ko\n" +"X-Crowdin-File: django.po\n" + +#: dmoj/settings.py:337 +msgid "German" +msgstr "독일어" + +#: dmoj/settings.py:338 +msgid "English" +msgstr "영어" + +#: dmoj/settings.py:339 +msgid "Spanish" +msgstr "스페인어" + +#: dmoj/settings.py:340 +msgid "French" +msgstr "프랑스어" + +#: dmoj/settings.py:341 +msgid "Croatian" +msgstr "크로아티아어" + +#: dmoj/settings.py:342 +msgid "Hungarian" +msgstr "헝가리어" + +#: dmoj/settings.py:343 +msgid "Japanese" +msgstr "" + +#: dmoj/settings.py:344 +msgid "Korean" +msgstr "한국어" + +#: dmoj/settings.py:345 +msgid "Brazilian Portuguese" +msgstr "" + +#: dmoj/settings.py:346 +msgid "Romanian" +msgstr "루마니아어" + +#: dmoj/settings.py:347 +msgid "Russian" +msgstr "러시아어" + +#: dmoj/settings.py:348 +msgid "Serbian (Latin)" +msgstr "세르비아어(라틴문자)" + +#: dmoj/settings.py:349 +msgid "Turkish" +msgstr "터키어" + +#: dmoj/settings.py:350 +msgid "Vietnamese" +msgstr "베트남어" + +#: dmoj/settings.py:351 +msgid "Simplified Chinese" +msgstr "중국어(간체)" + +#: dmoj/urls.py:54 +msgid "Login" +msgstr "로그인" + +#: dmoj/urls.py:102 templates/base.html:190 +msgid "Home" +msgstr "메인" + +#: judge/admin/comments.py:40 +#, python-format +msgid "%d comment successfully hidden." +msgid_plural "%d comments successfully hidden." +msgstr[0] "%d개의 코멘트가 숨겨졌습니다." + +#: judge/admin/comments.py:43 +msgid "Hide comments" +msgstr "코멘트 숨기기" + +#: judge/admin/comments.py:47 +#, python-format +msgid "%d comment successfully unhidden." +msgid_plural "%d comments successfully unhidden." +msgstr[0] "%d개의 코멘트가 숨겨졌습니다." + +#: judge/admin/comments.py:50 +msgid "Unhide comments" +msgstr "코멘트 보이기" + +#: judge/admin/comments.py:58 +msgid "Associated page" +msgstr "관련 페이지" + +#: judge/admin/contest.py:29 +msgid "Included contests" +msgstr "포함된 대회" + +#: judge/admin/contest.py:65 templates/contest/contest.html:83 +#: templates/contest/moss.html:43 templates/problem/list.html:206 +#: templates/problem/list.html:221 templates/user/user-problems.html:56 +#: templates/user/user-problems.html:98 +msgid "Problem" +msgstr "문제" + +#: judge/admin/contest.py:113 +msgid "Settings" +msgstr "" + +#: judge/admin/contest.py:115 +msgid "Scheduling" +msgstr "Scheduling" + +#: judge/admin/contest.py:116 +msgid "Details" +msgstr "세부사항" + +#: judge/admin/contest.py:117 +msgid "Format" +msgstr "" + +#: judge/admin/contest.py:118 templates/contest/ranking-table.html:5 +msgid "Rating" +msgstr "순위" + +#: judge/admin/contest.py:119 +msgid "Access" +msgstr "" + +#: judge/admin/contest.py:121 judge/admin/problem.py:131 +msgid "Justice" +msgstr "정의" + +#: judge/admin/contest.py:159 +#, python-format +msgid "%d contest successfully marked as visible." +msgid_plural "%d contests successfully marked as visible." +msgstr[0] "" + +#: judge/admin/contest.py:162 +msgid "Mark contests as visible" +msgstr "" + +#: judge/admin/contest.py:166 +#, python-format +msgid "%d contest successfully marked as hidden." +msgid_plural "%d contests successfully marked as hidden." +msgstr[0] "" + +#: judge/admin/contest.py:169 +msgid "Mark contests as hidden" +msgstr "" + +#: judge/admin/contest.py:180 judge/admin/submission.py:149 +#: judge/admin/submission.py:171 +msgid "You do not have the permission to rejudge submissions." +msgstr "재채점할 권한이 없습니다." + +#: judge/admin/contest.py:187 judge/admin/submission.py:155 +msgid "You do not have the permission to rejudge THAT many submissions." +msgstr "재채점 가능 개수를 초과하였습니다." + +#: judge/admin/contest.py:194 judge/admin/submission.py:164 +#, 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:265 +#, python-format +msgid "%d participation recalculated." +msgid_plural "%d participations recalculated." +msgstr[0] "" + +#: judge/admin/contest.py:268 +msgid "Recalculate results" +msgstr "" + +#: judge/admin/contest.py:272 judge/admin/organization.py:65 +msgid "username" +msgstr "사용자 이름" + +#: judge/admin/contest.py:277 templates/base.html:258 +msgid "virtual" +msgstr "가상" + +#: judge/admin/interface.py:28 judge/models/interface.py:46 +msgid "link path" +msgstr "링크 경로" + +#: judge/admin/interface.py:62 +msgid "Content" +msgstr "내용" + +#: judge/admin/interface.py:63 +msgid "Summary" +msgstr "요약" + +#: judge/admin/interface.py:107 judge/models/contest.py:251 +#: judge/models/contest.py:355 judge/models/profile.py:189 +msgid "user" +msgstr "사용자" + +#: judge/admin/interface.py:148 +msgid "object" +msgstr "" + +#: judge/admin/organization.py:34 judge/admin/problem.py:171 +#: judge/admin/profile.py:78 +msgid "View on site" +msgstr "사이트에서 보기" + +#: judge/admin/problem.py:28 +msgid "Describe the changes you made (optional)" +msgstr "변경 사항을 설명하세요. (선택사항)" + +#: judge/admin/problem.py:126 +msgid "Social Media" +msgstr "SNS" + +#: judge/admin/problem.py:127 +msgid "Taxonomy" +msgstr "분류" + +#: judge/admin/problem.py:128 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:58 +msgid "Points" +msgstr "포인트" + +#: judge/admin/problem.py:129 +msgid "Limits" +msgstr "제한" + +#: judge/admin/problem.py:130 judge/admin/submission.py:232 +#: templates/stats/base.html:14 templates/submission/list.html:328 +msgid "Language" +msgstr "언어" + +#: judge/admin/problem.py:132 +msgid "History" +msgstr "히스토리" + +#: judge/admin/problem.py:168 +msgid "Authors" +msgstr "저자" + +#: judge/admin/problem.py:183 +#, python-format +msgid "%d problem successfully marked as public." +msgid_plural "%d problems successfully marked as public." +msgstr[0] "%d개의 문제가 공개로 전환되었습니다." + +#: judge/admin/problem.py:187 +msgid "Mark problems as public" +msgstr "공개로 설정" + +#: judge/admin/problem.py:193 +#, python-format +msgid "%d problem successfully marked as private." +msgid_plural "%d problems successfully marked as private." +msgstr[0] "%d개의 문제가 비공개로 전환되었습니다." + +#: judge/admin/problem.py:197 +msgid "Mark problems as private" +msgstr "비공개로 설정" + +#: judge/admin/profile.py:32 +msgid "timezone" +msgstr "" + +#: judge/admin/profile.py:84 judge/admin/submission.py:211 +#: templates/organization/requests/log.html:9 +#: templates/organization/requests/pending.html:12 +#: templates/ticket/list.html:263 +msgid "User" +msgstr "사용자" + +#: judge/admin/profile.py:89 templates/registration/registration_form.html:145 +msgid "Email" +msgstr "이메일" + +#: judge/admin/profile.py:94 judge/views/register.py:29 +#: templates/registration/registration_form.html:173 +#: templates/user/edit-profile.html:99 +msgid "Timezone" +msgstr "시간대" + +#: judge/admin/profile.py:99 +msgid "date joined" +msgstr "가입한 날짜" + +#: judge/admin/profile.py:106 +#, python-format +msgid "%d user have scores recalculated." +msgid_plural "%d users have scores recalculated." +msgstr[0] "%d명의 사용자 점수가 재계산되었습니다." + +#: judge/admin/profile.py:109 +msgid "Recalculate scores" +msgstr "점수 재계산" + +#: judge/admin/runtime.py:19 +msgid "Disallowed problems" +msgstr "허가되지 않은 문제" + +#: judge/admin/runtime.py:22 +msgid "These problems are NOT allowed to be submitted in this language" +msgstr "이 문제는 이 언어로는 제출이 불가합니다." + +#: judge/admin/runtime.py:83 +msgid "Description" +msgstr "설명" + +#: judge/admin/runtime.py:84 +msgid "Information" +msgstr "정보" + +#: judge/admin/runtime.py:85 +msgid "Capabilities" +msgstr "기능" + +#: judge/admin/submission.py:23 judge/admin/submission.py:42 +#: judge/admin/submission.py:221 +msgid "None" +msgstr "없음" + +#: judge/admin/submission.py:23 +msgid "Not done" +msgstr "완료되지 않음" + +#: judge/admin/submission.py:23 +msgid "Exceptional" +msgstr "예외" + +#: judge/admin/submission.py:42 +msgid "Unaccepted" +msgstr "틀림" + +#: judge/admin/submission.py:89 +#, python-format +msgctxt "contest problem" +msgid "%(problem)s in %(contest)s" +msgstr "%(problem)s 대회의 문제 %(contest)s" + +#: judge/admin/submission.py:167 +msgid "Rejudge the selected submissions" +msgstr "선택한 제출 재채점" + +#: judge/admin/submission.py:193 judge/views/problem_manage.py:128 +#, python-format +msgid "%d submission were successfully rescored." +msgid_plural "%d submissions were successfully rescored." +msgstr[0] "%d개의 제출이 성공적으로 재채점되었습니다." + +#: judge/admin/submission.py:196 +msgid "Rescore the selected submissions" +msgstr "재채점" + +#: judge/admin/submission.py:200 +msgid "Problem code" +msgstr "문제 코드" + +#: judge/admin/submission.py:205 +msgid "Problem name" +msgstr "문제 이름" + +#: judge/admin/submission.py:215 templates/organization/requests/log.html:10 +#: templates/organization/requests/pending.html:13 +msgid "Time" +msgstr "시간" + +#: judge/admin/submission.py:223 +#, python-format +msgid "%d KB" +msgstr "%d KB" + +#: judge/admin/submission.py:225 +#, python-format +msgid "%.2f MB" +msgstr "%.2f MB" + +#: judge/admin/submission.py:227 +msgid "Memory" +msgstr "Memory" + +#: judge/admin/taxon.py:11 judge/admin/taxon.py:34 +msgid "Included problems" +msgstr "포함된 문제" + +#: judge/admin/taxon.py:14 +msgid "These problems are included in this group of problems" +msgstr "이 문제들은 그룹에 포함되어 있습니다." + +#: judge/admin/taxon.py:37 +msgid "These problems are included in this type of problems" +msgstr "이 문제들은 이러한 문제 유형에 포함되어 있습니다." + +#: judge/apps.py:8 +msgid "Online Judge" +msgstr "Online Judge" + +#: judge/comments.py:41 +msgid "Comment body" +msgstr "코멘트 본문" + +#: judge/comments.py:47 judge/views/ticket.py:46 +msgid "Your part is silent, little toad." +msgstr "침묵하세요." + +#: judge/comments.py:50 templates/comments/list.html:131 +msgid "You need to have solved at least one problem before your voice can be heard." +msgstr "최소 1개 이상의 문제를 해결해야 합니다." + +#: judge/comments.py:92 +msgid "Posted comment" +msgstr "게시된 코멘트" + +#: judge/contest_format/atcoder.py:19 +msgid "AtCoder" +msgstr "" + +#: judge/contest_format/default.py:18 +msgid "Default" +msgstr "" + +#: judge/contest_format/ecoo.py:19 +msgid "ECOO" +msgstr "" + +#: judge/contest_format/ioi.py:19 +msgid "IOI" +msgstr "" + +#: judge/forms.py:27 +msgid "Subscribe to contest updates" +msgstr "대회 업데이트를 구독하세요." + +#: judge/forms.py:28 +msgid "Enable experimental features" +msgstr "베타 기능 활성화" + +#: judge/forms.py:57 judge/views/organization.py:127 +#, python-brace-format +msgid "You may not be part of more than {count} public organizations." +msgstr "{count}개보다 많은 공개 조직에 소속될 수 없습니다." + +#: judge/forms.py:107 judge/views/register.py:26 +#: templates/registration/registration_form.html:139 +#: templates/user/base-users-table.html:5 +msgid "Username" +msgstr "사용자 이름" + +#: judge/forms.py:108 templates/registration/registration_form.html:151 +#: templates/registration/registration_form.html:165 +msgid "Password" +msgstr "비밀번호" + +#: judge/forms.py:130 +msgid "Two Factor Authentication tokens must be 6 decimal digits." +msgstr "" + +#: judge/forms.py:139 templates/registration/totp_auth.html:32 +msgid "Invalid Two Factor Authentication token." +msgstr "" + +#: judge/forms.py:143 judge/models/problem.py:97 +msgid "Problem code must be ^[a-z0-9]+$" +msgstr "" + +#: judge/forms.py:148 +msgid "Problem with code already exists." +msgstr "" + +#: judge/forms.py:153 judge/models/contest.py:51 +msgid "Contest id must be ^[a-z0-9]+$" +msgstr "Contest id must be ^[a-z0-9]+$" + +#: judge/forms.py:158 +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:59 +msgid "Leave as LaTeX" +msgstr "Leave as LaTeX" + +#: judge/models/choices.py:60 +msgid "SVG with PNG fallback" +msgstr "SVG with PNG fallback" + +#: judge/models/choices.py:61 +msgid "MathML only" +msgstr "MathML Only" + +#: judge/models/choices.py:62 +msgid "MathJax with SVG/PNG fallback" +msgstr "MathJax with SVG/PNG fallback" + +#: judge/models/choices.py:63 +msgid "Detect best quality" +msgstr "" + +#: judge/models/comment.py:25 +msgid "Page code must be ^[pcs]:[a-z0-9]+$|^b:\\d+$" +msgstr "" + +#: judge/models/comment.py:41 +msgid "commenter" +msgstr "코멘터" + +#: judge/models/comment.py:42 +msgid "posted time" +msgstr "게시 시각" + +#: judge/models/comment.py:43 judge/models/comment.py:176 +msgid "associated page" +msgstr "" + +#: judge/models/comment.py:45 +msgid "votes" +msgstr "표" + +#: judge/models/comment.py:46 +msgid "body of comment" +msgstr "코멘트 본문" + +#: judge/models/comment.py:47 +msgid "hide the comment" +msgstr "코멘트 숨기기" + +#: judge/models/comment.py:48 +msgid "parent" +msgstr "부모" + +#: judge/models/comment.py:53 +msgid "comment" +msgstr "코멘트" + +#: judge/models/comment.py:54 +msgid "comments" +msgstr "코멘트" + +#: judge/models/comment.py:136 judge/models/problem.py:406 +#, python-format +msgid "Editorial for %s" +msgstr "" + +#: judge/models/comment.py:171 +msgid "comment vote" +msgstr "코멘트 투표" + +#: judge/models/comment.py:172 +msgid "comment votes" +msgstr "코멘트 투표" + +#: judge/models/comment.py:181 +msgid "Override comment lock" +msgstr "" + +#: judge/models/contest.py:21 +msgid "Invalid colour." +msgstr "잘못된 색상" + +#: judge/models/contest.py:23 +msgid "tag name" +msgstr "태그 이름" + +#: judge/models/contest.py:24 +msgid "Lowercase letters and hyphens only." +msgstr "소문자와 하이픈만 사용가능합니다." + +#: judge/models/contest.py:25 +msgid "tag colour" +msgstr "태그 색상" + +#: judge/models/contest.py:26 +msgid "tag description" +msgstr "태그 설명" + +#: judge/models/contest.py:45 +msgid "contest tag" +msgstr "대회 태그" + +#: judge/models/contest.py:46 judge/models/contest.py:100 +msgid "contest tags" +msgstr "대회 태그" + +#: judge/models/contest.py:50 +msgid "contest id" +msgstr "대회 id" + +#: judge/models/contest.py:52 +msgid "contest name" +msgstr "대회 이름" + +#: judge/models/contest.py:53 +msgid "These people will be able to edit the contest." +msgstr "이 사람들은 대회를 편집할 권한이 있습니다." + +#: judge/models/contest.py:55 judge/models/runtime.py:124 +#: src/dmoj-wpadmin/test_project/apps/books/admin.py:20 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:27 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:27 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:27 +msgid "description" +msgstr "설명" + +#: judge/models/contest.py:56 judge/models/problem.py:353 +#: judge/models/runtime.py:126 +msgid "problems" +msgstr "문제" + +#: judge/models/contest.py:57 judge/models/contest.py:252 +msgid "start time" +msgstr "시작 시각" + +#: judge/models/contest.py:58 +msgid "end time" +msgstr "종료 시각" + +#: judge/models/contest.py:59 judge/models/problem.py:118 +#: judge/models/problem.py:377 +msgid "time limit" +msgstr "시간 제한" + +#: judge/models/contest.py:60 judge/models/problem.py:136 +msgid "publicly visible" +msgstr "공개" + +#: judge/models/contest.py:61 +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:64 +msgid "contest rated" +msgstr "대회 순위" + +#: judge/models/contest.py:64 +msgid "Whether this contest can be rated." +msgstr "대회 순위 표시 여부" + +#: judge/models/contest.py:66 +msgid "hide scoreboard" +msgstr "" + +#: judge/models/contest.py:67 +msgid "Whether the scoreboard should remain hidden for the duration of the contest." +msgstr "" + +#: judge/models/contest.py:70 +msgid "no comments" +msgstr "코멘트 없음" + +#: judge/models/contest.py:71 +msgid "Use clarification system instead of comments." +msgstr "코멘트 대신 수정 시스템을 사용하세요." + +#: judge/models/contest.py:73 +msgid "Rating floor for contest" +msgstr "" + +#: judge/models/contest.py:75 +msgid "Rating ceiling for contest" +msgstr "" + +#: judge/models/contest.py:77 +msgid "rate all" +msgstr "모든 순위" + +#: judge/models/contest.py:77 +msgid "Rate all users who joined." +msgstr "참가한 모든 사용자에 대한 순위" + +#: judge/models/contest.py:78 +msgid "exclude from ratings" +msgstr "순위에서 제외" + +#: judge/models/contest.py:80 +msgid "private to specific users" +msgstr "" + +#: judge/models/contest.py:81 +msgid "private contestants" +msgstr "" + +#: judge/models/contest.py:82 +msgid "If private, only these users may see the contest" +msgstr "" + +#: judge/models/contest.py:84 +msgid "hide problem tags" +msgstr "문제 태그 숨기기" + +#: judge/models/contest.py:85 +msgid "Whether problem tags should be hidden by default." +msgstr "문제 태그 공개 여부 기본값" + +#: judge/models/contest.py:87 +msgid "run pretests only" +msgstr "pretests만 실행" + +#: judge/models/contest.py:88 +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:92 judge/models/problem.py:157 +msgid "private to organizations" +msgstr "조직에 비공개" + +#: judge/models/contest.py:93 judge/models/problem.py:155 +#: judge/models/profile.py:76 +msgid "organizations" +msgstr "조직" + +#: judge/models/contest.py:94 +msgid "If private, only these organizations may see the contest" +msgstr "비공개로 설정 시, 이 조직만 대회를 볼 수 있습니다." + +#: judge/models/contest.py:95 judge/models/problem.py:145 +msgid "OpenGraph image" +msgstr "OpenGraph 이미지" + +#: judge/models/contest.py:96 judge/models/profile.py:47 +msgid "Logo override image" +msgstr "" + +#: judge/models/contest.py:98 +msgid "This image will replace the default site logo for users inside the contest." +msgstr "" + +#: judge/models/contest.py:101 +msgid "the amount of live participants" +msgstr "현재 접속되어 있는 참가자 수" + +#: judge/models/contest.py:102 +msgid "contest summary" +msgstr "대회 요약" + +#: judge/models/contest.py:103 judge/models/problem.py:147 +msgid "Plain-text, shown in meta description tag, e.g. for social media." +msgstr "" + +#: judge/models/contest.py:104 judge/models/profile.py:46 +msgid "access code" +msgstr "액세스 코드" + +#: judge/models/contest.py:105 +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:107 judge/models/problem.py:141 +msgid "personae non gratae" +msgstr "" + +#: judge/models/contest.py:108 +msgid "Bans the selected users from joining this contest." +msgstr "" + +#: judge/models/contest.py:109 +msgid "contest format" +msgstr "" + +#: judge/models/contest.py:110 +msgid "The contest format module to use." +msgstr "" + +#: judge/models/contest.py:111 +msgid "contest format configuration" +msgstr "" + +#: judge/models/contest.py:112 +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:233 +msgid "See private contests" +msgstr "" + +#: judge/models/contest.py:234 +msgid "Edit own contests" +msgstr "" + +#: judge/models/contest.py:235 +msgid "Edit all contests" +msgstr "" + +#: judge/models/contest.py:236 +msgid "Clone contest" +msgstr "" + +#: judge/models/contest.py:237 templates/contest/moss.html:74 +msgid "MOSS contest" +msgstr "" + +#: judge/models/contest.py:238 +msgid "Rate contests" +msgstr "" + +#: judge/models/contest.py:239 +msgid "Contest access codes" +msgstr "" + +#: judge/models/contest.py:240 +msgid "Create private contests" +msgstr "" + +#: judge/models/contest.py:242 judge/models/contest.py:320 +#: judge/models/contest.py:356 judge/models/contest.py:378 +#: judge/models/submission.py:83 +msgid "contest" +msgstr "대회" + +#: judge/models/contest.py:243 +msgid "contests" +msgstr "대회" + +#: judge/models/contest.py:250 +msgid "associated contest" +msgstr "관련된 대회" + +#: judge/models/contest.py:253 +msgid "score" +msgstr "점수" + +#: judge/models/contest.py:254 +msgid "cumulative time" +msgstr "누적 시간" + +#: judge/models/contest.py:255 +msgid "virtual participation id" +msgstr "가상 참여 id" + +#: judge/models/contest.py:256 +msgid "0 means non-virtual, otherwise the n-th virtual participation" +msgstr "" + +#: judge/models/contest.py:257 +msgid "contest format specific data" +msgstr "" + +#: judge/models/contest.py:306 +#, python-format +msgid "%s spectating in %s" +msgstr "" + +#: judge/models/contest.py:308 +#, python-format +msgid "%s in %s, v%d" +msgstr "" + +#: judge/models/contest.py:309 +#, python-format +msgid "%s in %s" +msgstr "%s에서 %s" + +#: judge/models/contest.py:312 +msgid "contest participation" +msgstr "대회 참가" + +#: judge/models/contest.py:313 +msgid "contest participations" +msgstr "대회 참가자" + +#: judge/models/contest.py:319 judge/models/contest.py:340 +#: judge/models/contest.py:379 judge/models/problem.py:352 +#: judge/models/problem.py:357 judge/models/problem.py:375 +#: judge/models/problem_data.py:35 +msgid "problem" +msgstr "문제" + +#: judge/models/contest.py:321 judge/models/contest.py:344 +#: judge/models/problem.py:129 +msgid "points" +msgstr "점수" + +#: judge/models/contest.py:322 +msgid "partial" +msgstr "부분" + +#: judge/models/contest.py:323 judge/models/contest.py:345 +msgid "is pretested" +msgstr "pretested 됨" + +#: judge/models/contest.py:324 judge/models/interface.py:43 +msgid "order" +msgstr "순서" + +#: judge/models/contest.py:325 +msgid "output prefix length override" +msgstr "출력 접두사 길이 재정의" + +#: judge/models/contest.py:326 +msgid "Maximum number of submissions for this problem, or 0 for no limit." +msgstr "" + +#: judge/models/contest.py:328 +msgid "Why include a problem you can't submit to?" +msgstr "" + +#: judge/models/contest.py:333 +msgid "contest problem" +msgstr "대회 문제" + +#: judge/models/contest.py:334 +msgid "contest problems" +msgstr "대회 문제" + +#: judge/models/contest.py:338 judge/models/submission.py:181 +msgid "submission" +msgstr "제출" + +#: judge/models/contest.py:342 judge/models/contest.py:357 +msgid "participation" +msgstr "참가 여부" + +#: judge/models/contest.py:346 +msgid "Whether this submission was ran only on pretests." +msgstr "Pretests에서만 이 제출이 실행되었는지 여부" + +#: judge/models/contest.py:350 +msgid "contest submission" +msgstr "대회 제출" + +#: judge/models/contest.py:351 +msgid "contest submissions" +msgstr "대회 제출" + +#: judge/models/contest.py:359 +msgid "rank" +msgstr "등수" + +#: judge/models/contest.py:360 +msgid "rating" +msgstr "순위" + +#: judge/models/contest.py:361 +msgid "volatility" +msgstr "변동" + +#: judge/models/contest.py:362 +msgid "last rated" +msgstr "최근 순위" + +#: judge/models/contest.py:366 +msgid "contest rating" +msgstr "대회 순위" + +#: judge/models/contest.py:367 +msgid "contest ratings" +msgstr "대회 순위" + +#: judge/models/contest.py:386 +msgid "contest moss result" +msgstr "" + +#: judge/models/contest.py:387 +msgid "contest moss results" +msgstr "" + +#: judge/models/interface.py:24 +msgid "configuration item" +msgstr "설정 항목" + +#: judge/models/interface.py:25 +msgid "miscellaneous configuration" +msgstr "기타 설정" + +#: judge/models/interface.py:37 +msgid "navigation item" +msgstr "탐색 항목" + +#: judge/models/interface.py:38 +msgid "navigation bar" +msgstr "내비게이션 바" + +#: judge/models/interface.py:44 +msgid "identifier" +msgstr "식별자" + +#: judge/models/interface.py:45 +msgid "label" +msgstr "label" + +#: judge/models/interface.py:47 +msgid "highlight regex" +msgstr "highlight regex" + +#: judge/models/interface.py:48 +msgid "parent item" +msgstr "부모 항목" + +#: judge/models/interface.py:66 +msgid "post title" +msgstr "게시물 제목" + +#: judge/models/interface.py:67 judge/models/problem.py:395 +msgid "authors" +msgstr "저자" + +#: judge/models/interface.py:68 +msgid "slug" +msgstr "slug" + +#: judge/models/interface.py:69 judge/models/problem.py:393 +msgid "public visibility" +msgstr "공개 여부" + +#: judge/models/interface.py:70 +msgid "sticky" +msgstr "sticky" + +#: judge/models/interface.py:71 +msgid "publish after" +msgstr "후 게시" + +#: judge/models/interface.py:72 +msgid "post content" +msgstr "게시물 내용" + +#: judge/models/interface.py:73 +msgid "post summary" +msgstr "게시물 요약" + +#: judge/models/interface.py:74 +msgid "openGraph image" +msgstr "openGraph 이미지" + +#: judge/models/interface.py:91 +msgid "Edit all posts" +msgstr "" + +#: judge/models/interface.py:93 +msgid "blog post" +msgstr "블로그 게시물" + +#: judge/models/interface.py:94 +msgid "blog posts" +msgstr "블로그 게시물" + +#: judge/models/message.py:11 +msgid "message title" +msgstr "메시지 제목" + +#: judge/models/message.py:12 judge/models/ticket.py:29 +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:26 +msgid "problem category ID" +msgstr "문제 범주 ID" + +#: judge/models/problem.py:27 +msgid "problem category name" +msgstr "문제 범주 이름" + +#: judge/models/problem.py:34 +msgid "problem type" +msgstr "문제 유형" + +#: judge/models/problem.py:35 judge/models/problem.py:113 +msgid "problem types" +msgstr "문제 유형" + +#: judge/models/problem.py:39 +msgid "problem group ID" +msgstr "문제 그룹 ID" + +#: judge/models/problem.py:40 +msgid "problem group name" +msgstr "문제 그룹" + +#: judge/models/problem.py:47 judge/models/problem.py:116 +msgid "problem group" +msgstr "문제 그룹" + +#: judge/models/problem.py:48 +msgid "problem groups" +msgstr "문제 그룹" + +#: judge/models/problem.py:52 +msgid "key" +msgstr "key" + +#: judge/models/problem.py:54 +msgid "link" +msgstr "링크" + +#: judge/models/problem.py:55 +msgid "full name" +msgstr "전체 이름" + +#: judge/models/problem.py:56 judge/models/profile.py:32 +#: judge/models/runtime.py:23 +msgid "short name" +msgstr "짧은 이름" + +#: judge/models/problem.py:57 +msgid "Displayed on pages under this license" +msgstr "이 라이센스에 의해 표시됨" + +#: judge/models/problem.py:58 +msgid "icon" +msgstr "아이콘" + +#: judge/models/problem.py:58 +msgid "URL to the icon" +msgstr "아이콘 URL" + +#: judge/models/problem.py:59 +msgid "license text" +msgstr "라이센스 내용" + +#: judge/models/problem.py:68 +msgid "license" +msgstr "라이센스" + +#: judge/models/problem.py:69 +msgid "licenses" +msgstr "라이센스" + +#: judge/models/problem.py:96 +msgid "problem code" +msgstr "문제 코드" + +#: judge/models/problem.py:98 +msgid "A short, unique code for the problem, used in the url after /problem/" +msgstr "" + +#: judge/models/problem.py:100 +msgid "problem name" +msgstr "문제 이름" + +#: judge/models/problem.py:101 +msgid "The full name of the problem, as shown in the problem list." +msgstr "" + +#: judge/models/problem.py:103 +msgid "problem body" +msgstr "문제 본문" + +#: judge/models/problem.py:104 +msgid "creators" +msgstr "제작자" + +#: judge/models/problem.py:105 +msgid "These users will be able to edit the problem, and be listed as authors." +msgstr "" + +#: judge/models/problem.py:107 +msgid "curators" +msgstr "curators" + +#: judge/models/problem.py:108 +msgid "These users will be able to edit the problem, but not be listed as authors." +msgstr "" + +#: judge/models/problem.py:110 +msgid "testers" +msgstr "testers" + +#: judge/models/problem.py:112 +msgid "These users will be able to view the private problem, but not edit it." +msgstr "" + +#: judge/models/problem.py:114 +msgid "The type of problem, as shown on the problem's page." +msgstr "" + +#: judge/models/problem.py:117 +msgid "The group of problem, shown under Category in the problem list." +msgstr "" + +#: judge/models/problem.py:119 +msgid "The time limit for this problem, in seconds. Fractional seconds (e.g. 1.5) are supported." +msgstr "" + +#: judge/models/problem.py:123 judge/models/problem.py:380 +msgid "memory limit" +msgstr "메모리 제한" + +#: judge/models/problem.py:124 +msgid "The memory limit for this problem, in kilobytes (e.g. 64mb = 65536 kilobytes)." +msgstr "" + +#: judge/models/problem.py:130 +msgid "Points awarded for problem completion. Points are displayed with a 'p' suffix if partial." +msgstr "" + +#: judge/models/problem.py:133 +msgid "allows partial points" +msgstr "부분 점수 허용" + +#: judge/models/problem.py:134 +msgid "allowed languages" +msgstr "허용된 언어" + +#: judge/models/problem.py:135 +msgid "List of allowed submission languages." +msgstr "" + +#: judge/models/problem.py:137 +msgid "manually managed" +msgstr "수동으로 관리됨" + +#: judge/models/problem.py:138 +msgid "Whether judges should be allowed to manage data or not." +msgstr "" + +#: judge/models/problem.py:139 +msgid "date of publishing" +msgstr "게시 날짜" + +#: judge/models/problem.py:140 +msgid "Doesn't have magic ability to auto-publish due to backward compatibility" +msgstr "" + +#: judge/models/problem.py:142 +msgid "Bans the selected users from submitting to this problem." +msgstr "" + +#: judge/models/problem.py:144 +msgid "The license under which this problem is published." +msgstr "" + +#: judge/models/problem.py:146 +msgid "problem summary" +msgstr "문제 요약" + +#: judge/models/problem.py:148 +msgid "number of users" +msgstr "" + +#: judge/models/problem.py:149 +msgid "The number of users who solved the problem." +msgstr "" + +#: judge/models/problem.py:150 +msgid "solve rate" +msgstr "" + +#: judge/models/problem.py:156 +msgid "If private, only these organizations may see the problem." +msgstr "" + +#: judge/models/problem.py:358 judge/models/problem.py:376 +#: judge/models/runtime.py:99 +msgid "language" +msgstr "언어" + +#: judge/models/problem.py:359 +msgid "translated name" +msgstr "번역된 이름" + +#: judge/models/problem.py:360 +msgid "translated description" +msgstr "번역된 설명" + +#: judge/models/problem.py:364 +msgid "problem translation" +msgstr "문제 번역" + +#: judge/models/problem.py:365 +msgid "problem translations" +msgstr "문제 번역" + +#: judge/models/problem.py:369 +msgid "clarified problem" +msgstr "수정된 문제" + +#: judge/models/problem.py:370 +msgid "clarification body" +msgstr "수정사항" + +#: judge/models/problem.py:371 +msgid "clarification timestamp" +msgstr "수정 타임스탬프" + +#: judge/models/problem.py:386 +msgid "language-specific resource limit" +msgstr "특정 언어 리소스 제한" + +#: judge/models/problem.py:387 +msgid "language-specific resource limits" +msgstr "특정 언어 리소스 제한" + +#: judge/models/problem.py:391 +msgid "associated problem" +msgstr "관련된 문제" + +#: judge/models/problem.py:394 +msgid "publish date" +msgstr "" + +#: judge/models/problem.py:396 +msgid "editorial content" +msgstr "" + +#: judge/models/problem.py:412 +msgid "solution" +msgstr "솔루션" + +#: judge/models/problem.py:413 +msgid "solutions" +msgstr "솔루션" + +#: judge/models/problem_data.py:23 +msgid "Standard" +msgstr "표준" + +#: judge/models/problem_data.py:24 +msgid "Floats" +msgstr "Floats" + +#: judge/models/problem_data.py:25 +msgid "Floats (absolute)" +msgstr "Floats (absolute)" + +#: judge/models/problem_data.py:26 +msgid "Floats (relative)" +msgstr "Floats (relative)" + +#: judge/models/problem_data.py:27 +msgid "Non-trailing spaces" +msgstr "" + +#: judge/models/problem_data.py:28 +msgid "Unordered" +msgstr "정렬되지 않은" + +#: judge/models/problem_data.py:29 +msgid "Byte identical" +msgstr "바이트 단위로 동일" + +#: 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:39 +msgid "generator file" +msgstr "generator 파일" + +#: judge/models/problem_data.py:41 judge/models/problem_data.py:90 +msgid "output prefix length" +msgstr "출력 접두사 길이" + +#: judge/models/problem_data.py:42 judge/models/problem_data.py:91 +msgid "output limit length" +msgstr "출력 길이 제한" + +#: judge/models/problem_data.py:43 +msgid "init.yml generation feedback" +msgstr "init.yml generation 피드백" + +#: judge/models/problem_data.py:44 judge/models/problem_data.py:92 +msgid "checker" +msgstr "checker" + +#: judge/models/problem_data.py:45 judge/models/problem_data.py:93 +msgid "checker arguments" +msgstr "checker arguments" + +#: judge/models/problem_data.py:46 judge/models/problem_data.py:94 +msgid "checker arguments as a JSON object" +msgstr "checker arguments as a JSON object" + +#: judge/models/problem_data.py:77 +msgid "problem data set" +msgstr "채점 데이터" + +#: judge/models/problem_data.py:79 +msgid "case position" +msgstr "case position" + +#: judge/models/problem_data.py:80 +msgid "case type" +msgstr "데이터 유형" + +#: judge/models/problem_data.py:81 +msgid "Normal case" +msgstr "일반 테스트 케이스" + +#: judge/models/problem_data.py:82 +msgid "Batch start" +msgstr "Batch 시작" + +#: judge/models/problem_data.py:83 +msgid "Batch end" +msgstr "Batch 종료" + +#: judge/models/problem_data.py:85 +msgid "input file name" +msgstr "입력 파일 이름" + +#: judge/models/problem_data.py:86 +msgid "output file name" +msgstr "출력 파일 이름" + +#: judge/models/problem_data.py:87 +msgid "generator arguments" +msgstr "" + +#: judge/models/problem_data.py:88 +msgid "point value" +msgstr "" + +#: judge/models/problem_data.py:89 +msgid "case is pretest?" +msgstr "" + +#: judge/models/profile.py:29 +msgid "organization title" +msgstr "조직 이름" + +#: judge/models/profile.py:30 +msgid "organization slug" +msgstr "" + +#: judge/models/profile.py:31 +msgid "Organization name shown in URL" +msgstr "" + +#: judge/models/profile.py:33 +msgid "Displayed beside user name during contests" +msgstr "대회 동안 사용자 이름 옆에 표시됩니다." + +#: judge/models/profile.py:34 +msgid "organization description" +msgstr "조직 설명" + +#: judge/models/profile.py:35 +msgid "registrant" +msgstr "등록자" + +#: judge/models/profile.py:36 +msgid "User who registered this organization" +msgstr "이 조직에 등록된 사용자" + +#: judge/models/profile.py:37 +msgid "administrators" +msgstr "관리자" + +#: judge/models/profile.py:38 +msgid "Those who can edit this organization" +msgstr "이 조직을 편집할 수 있는 사람" + +#: judge/models/profile.py:39 +msgid "creation date" +msgstr "만든 날짜" + +#: judge/models/profile.py:40 +msgid "is open organization?" +msgstr "공개 조직인가?" + +#: judge/models/profile.py:41 +msgid "Allow joining organization" +msgstr "조직 가입 허용" + +#: judge/models/profile.py:42 +msgid "maximum size" +msgstr "최대 크기" + +#: judge/models/profile.py:43 +msgid "Maximum amount of users in this organization, only applicable to private organizations" +msgstr "이 조직의 최대 인원수(비공개 조직에만 적용)" + +#: judge/models/profile.py:45 +msgid "Student access code" +msgstr "학생 엑세스 코드" + +#: judge/models/profile.py:49 +msgid "This image will replace the default site logo for users viewing the organization." +msgstr "" + +#: judge/models/profile.py:75 judge/models/profile.py:91 +#: judge/models/profile.py:190 +msgid "organization" +msgstr "조직" + +#: judge/models/profile.py:80 +msgid "user associated" +msgstr "연결된 사용자" + +#: judge/models/profile.py:81 +msgid "self-description" +msgstr "자기소개" + +#: judge/models/profile.py:82 +msgid "location" +msgstr "위치" + +#: judge/models/profile.py:84 +msgid "preferred language" +msgstr "기본 설정 언어" + +#: judge/models/profile.py:89 +msgid "last access time" +msgstr "마지막 접속 시간" + +#: judge/models/profile.py:90 +msgid "last IP" +msgstr "마지막 IP" + +#: judge/models/profile.py:93 +msgid "display rank" +msgstr "순위 표시" + +#: judge/models/profile.py:95 +msgid "comment mute" +msgstr "코멘트 음소거" + +#: judge/models/profile.py:95 +msgid "Some users are at their best when silent." +msgstr "" + +#: judge/models/profile.py:97 +msgid "unlisted user" +msgstr "" + +#: judge/models/profile.py:97 +msgid "User will not be ranked." +msgstr "" + +#: judge/models/profile.py:100 +msgid "user script" +msgstr "사용자 스크립트" + +#: judge/models/profile.py:101 +msgid "User-defined JavaScript for site customization." +msgstr "사이트 수정을 위한 사용자 자바스크립트입니다." + +#: judge/models/profile.py:102 +msgid "current contest" +msgstr "현재 대회" + +#: judge/models/profile.py:104 +msgid "math engine" +msgstr "math engine" + +#: judge/models/profile.py:106 +msgid "the rendering engine used to render math" +msgstr "" + +#: judge/models/profile.py:107 +msgid "2FA enabled" +msgstr "" + +#: judge/models/profile.py:108 +msgid "check to enable TOTP-based two factor authentication" +msgstr "" + +#: judge/models/profile.py:109 +msgid "TOTP key" +msgstr "" + +#: judge/models/profile.py:110 +msgid "32 character base32-encoded key for TOTP" +msgstr "" + +#: judge/models/profile.py:112 +msgid "TOTP key must be empty or base32" +msgstr "" + +#: judge/models/profile.py:113 +msgid "internal notes" +msgstr "" + +#: judge/models/profile.py:114 +msgid "Notes for administrators regarding this user." +msgstr "" + +#: judge/models/profile.py:184 +msgid "user profile" +msgstr "사용자 프로파일" + +#: judge/models/profile.py:185 +msgid "user profiles" +msgstr "사용자 프로파일" + +#: judge/models/profile.py:192 +msgid "request time" +msgstr "요청 시간" + +#: judge/models/profile.py:193 +msgid "state" +msgstr "상태" + +#: judge/models/profile.py:198 +msgid "reason" +msgstr "이유" + +#: judge/models/profile.py:201 +msgid "organization join request" +msgstr "조직 가입 요청" + +#: judge/models/profile.py:202 +msgid "organization join requests" +msgstr "조직 가입 요청" + +#: judge/models/runtime.py:18 +msgid "short identifier" +msgstr "짧은 식별자" + +#: judge/models/runtime.py:19 +msgid "The identifier for this language; the same as its executor id for judges." +msgstr "이 언어의 식별자는 judge의 실행 식별자와 동일합니다." + +#: judge/models/runtime.py:21 +msgid "long name" +msgstr "긴 이름" + +#: judge/models/runtime.py:22 +msgid "Longer name for the language, e.g. \"Python 2\" or \"C++11\"." +msgstr "언어의 긴 이름(예시: \"Python 2\", \"C++11\")" + +#: judge/models/runtime.py:24 +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 "짧고 가독성 높은 공개용 이름(예시: \"PY2\", \"C++1\"), 빈칸시 기본값" + +#: judge/models/runtime.py:28 +msgid "common name" +msgstr "흔한 이름" + +#: judge/models/runtime.py:29 +msgid "Common name for the language. For example, the common name for C++03, C++11, and C++14 would be \"C++\"" +msgstr "이 언어의 흔한 이름(예를 들면 C++03, C++11, C++14의 경우 C++)" + +#: judge/models/runtime.py:31 +msgid "ace mode name" +msgstr "ace mode 이름" + +#: judge/models/runtime.py:32 +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:34 +msgid "pygments name" +msgstr "" + +#: judge/models/runtime.py:35 +msgid "Language ID for Pygments highlighting in source windows." +msgstr "" + +#: judge/models/runtime.py:36 +msgid "code template" +msgstr "코드 템플릿" + +#: judge/models/runtime.py:37 +msgid "Code template to display in submission editor." +msgstr "제출 에디터에 표시할 코드 템플릿" + +#: judge/models/runtime.py:38 +msgid "runtime info override" +msgstr "런타임 정보 무시" + +#: judge/models/runtime.py:39 +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:41 +msgid "language description" +msgstr "언어 설명" + +#: judge/models/runtime.py:42 +msgid "Use field this to inform users of quirks with your environment, additional restrictions, etc." +msgstr "" + +#: judge/models/runtime.py:44 +msgid "extension" +msgstr "확장" + +#: judge/models/runtime.py:45 +msgid "The extension of source files, e.g., \"py\" or \"cpp\"." +msgstr "소스 파일 확장자" + +#: judge/models/runtime.py:100 +msgid "languages" +msgstr "언어" + +#: judge/models/runtime.py:104 +msgid "language to which this runtime belongs" +msgstr "이 런타임에 속해 있는 언어" + +#: judge/models/runtime.py:105 +msgid "judge on which this runtime exists" +msgstr "judge on which this runtime exists" + +#: judge/models/runtime.py:106 +msgid "runtime name" +msgstr "런타임 이름" + +#: judge/models/runtime.py:107 +msgid "runtime version" +msgstr "런타임 버전" + +#: judge/models/runtime.py:108 +msgid "order in which to display this runtime" +msgstr "런타임 표시 순서" + +#: judge/models/runtime.py:112 +msgid "Server name, hostname-style" +msgstr "서버 이름" + +#: judge/models/runtime.py:113 +msgid "time of creation" +msgstr "생성 날짜" + +#: judge/models/runtime.py:114 +msgid "A key to authenticated this judge" +msgstr "A key to authenticated this judge" + +#: judge/models/runtime.py:115 +msgid "authentication key" +msgstr "authentication key" + +#: judge/models/runtime.py:116 +msgid "block judge" +msgstr "" + +#: judge/models/runtime.py:117 +msgid "Whether this judge should be blocked from connecting, even if its key is correct." +msgstr "" + +#: judge/models/runtime.py:119 +msgid "judge online status" +msgstr "judge 상태" + +#: judge/models/runtime.py:120 +msgid "judge start time" +msgstr "judge 시작 시간" + +#: judge/models/runtime.py:121 +msgid "response time" +msgstr "응답 시간" + +#: judge/models/runtime.py:122 +msgid "system load" +msgstr "시스템 로드" + +#: judge/models/runtime.py:123 +msgid "Load for the last minute, divided by processors to be fair." +msgstr "1분간의 로드율(프로세서 수로 나눔)" + +#: judge/models/runtime.py:127 judge/models/runtime.py:167 +msgid "judges" +msgstr "채점기" + +#: judge/models/runtime.py:166 +msgid "judge" +msgstr "채점" + +#: judge/models/submission.py:20 judge/models/submission.py:47 +#: judge/utils/problems.py:86 +msgid "Accepted" +msgstr "통과" + +#: judge/models/submission.py:21 judge/models/submission.py:48 +msgid "Wrong Answer" +msgstr "오답" + +#: judge/models/submission.py:22 judge/models/submission.py:50 +msgid "Time Limit Exceeded" +msgstr "시간 제한 초과" + +#: judge/models/submission.py:23 judge/models/submission.py:51 +msgid "Memory Limit Exceeded" +msgstr "메모리 제한 초과" + +#: judge/models/submission.py:24 judge/models/submission.py:52 +msgid "Output Limit Exceeded" +msgstr "출력 제한 초과" + +#: judge/models/submission.py:25 judge/models/submission.py:53 +msgid "Invalid Return" +msgstr "잘못된 반환" + +#: judge/models/submission.py:26 judge/models/submission.py:54 +msgid "Runtime Error" +msgstr "런타임 에러" + +#: judge/models/submission.py:27 judge/models/submission.py:41 +#: judge/models/submission.py:55 judge/utils/problems.py:88 +msgid "Compile Error" +msgstr "컴파일 에러" + +#: judge/models/submission.py:28 judge/models/submission.py:40 +msgid "Internal Error" +msgstr "내부 에러" + +#: judge/models/submission.py:29 +msgid "Short circuit" +msgstr "Short circuit" + +#: judge/models/submission.py:30 judge/models/submission.py:42 +#: judge/models/submission.py:61 +msgid "Aborted" +msgstr "취소됨" + +#: judge/models/submission.py:36 judge/models/submission.py:57 +msgid "Queued" +msgstr "대기열에 있음" + +#: judge/models/submission.py:37 judge/models/submission.py:58 +msgid "Processing" +msgstr "처리중" + +#: judge/models/submission.py:38 judge/models/submission.py:59 +msgid "Grading" +msgstr "채점중" + +#: judge/models/submission.py:39 judge/models/submission.py:60 +msgid "Completed" +msgstr "완료" + +#: judge/models/submission.py:56 +msgid "Internal Error (judging server error)" +msgstr "" + +#: judge/models/submission.py:66 +msgid "submission time" +msgstr "제출 시간" + +#: judge/models/submission.py:67 judge/models/submission.py:201 +msgid "execution time" +msgstr "실행 시간" + +#: judge/models/submission.py:68 judge/models/submission.py:202 +msgid "memory usage" +msgstr "메모리 사용량" + +#: judge/models/submission.py:69 judge/models/submission.py:203 +msgid "points granted" +msgstr "획득 포인트" + +#: judge/models/submission.py:70 +msgid "submission language" +msgstr "제출 언어" + +#: judge/models/submission.py:71 +msgid "status" +msgstr "상태" + +#: judge/models/submission.py:72 +msgid "result" +msgstr "결과" + +#: judge/models/submission.py:74 +msgid "compile errors" +msgstr "컴파일 에러" + +#: judge/models/submission.py:76 +msgid "batched cases" +msgstr "batched 테스트 케이스" + +#: judge/models/submission.py:77 +msgid "test case points" +msgstr "테스크 케이스 점수" + +#: judge/models/submission.py:78 +msgid "test case total points" +msgstr "테스트 케이스 총 점수" + +#: judge/models/submission.py:79 +msgid "judged on" +msgstr "" + +#: judge/models/submission.py:81 +msgid "was rejudged by admin" +msgstr "관리자에 의해 재채점" + +#: judge/models/submission.py:82 +msgid "was ran on pretests only" +msgstr "pretest에서만 채점됨" + +#: judge/models/submission.py:182 templates/contest/moss.html:58 +msgid "submissions" +msgstr "제출" + +#: judge/models/submission.py:186 judge/models/submission.py:197 +msgid "associated submission" +msgstr "관련된 제출" + +#: judge/models/submission.py:188 +msgid "source code" +msgstr "소스 코드" + +#: judge/models/submission.py:199 +msgid "test case ID" +msgstr "test case ID" + +#: judge/models/submission.py:200 +msgid "status flag" +msgstr "상태 flag" + +#: judge/models/submission.py:204 +msgid "points possible" +msgstr "획득 가능한 포인트" + +#: judge/models/submission.py:205 +msgid "batch number" +msgstr "batch number" + +#: judge/models/submission.py:206 +msgid "judging feedback" +msgstr "채점 피드백" + +#: judge/models/submission.py:207 +msgid "extended judging feedback" +msgstr "" + +#: judge/models/submission.py:208 +msgid "program output" +msgstr "프로그램 출력" + +#: judge/models/submission.py:216 +msgid "submission test case" +msgstr "제출 테스트 케이스" + +#: judge/models/submission.py:217 +msgid "submission test cases" +msgstr "제출 테스트 케이스" + +#: judge/models/ticket.py:10 +msgid "ticket title" +msgstr "ticket 제목" + +#: judge/models/ticket.py:11 +msgid "ticket creator" +msgstr "ticket creator" + +#: judge/models/ticket.py:13 +msgid "creation time" +msgstr "작성일" + +#: judge/models/ticket.py:14 +msgid "assignees" +msgstr "담당자" + +#: judge/models/ticket.py:15 +msgid "quick notes" +msgstr "빠른 메모" + +#: judge/models/ticket.py:16 +msgid "Staff notes for this issue to aid in processing." +msgstr "문제 처리를 위한 관리자 노트" + +#: judge/models/ticket.py:17 +msgid "linked item type" +msgstr "연결된 아이템 종류" + +#: judge/models/ticket.py:19 +msgid "linked item ID" +msgstr "연결된 항목 ID" + +#: judge/models/ticket.py:21 +msgid "is ticket open?" +msgstr "is ticket open?" + +#: judge/models/ticket.py:25 +msgid "ticket" +msgstr "티켓" + +#: judge/models/ticket.py:27 +msgid "poster" +msgstr "포스터" + +#: judge/models/ticket.py:30 +msgid "message time" +msgstr "메시지 시간" + +#: judge/pdf_problems.py:134 judge/pdf_problems.py:186 +#: judge/pdf_problems.py:246 +msgid "Page [page] of [topage]" +msgstr "[topage]의 페이지 [page]" + +#: judge/tasks/moss.py:25 +msgid "Running MOSS" +msgstr "" + +#: judge/tasks/submission.py:43 +msgid "Modifying submissions" +msgstr "" + +#: judge/tasks/submission.py:56 +msgid "Recalculating user points" +msgstr "" + +#: judge/utils/problem_data.py:63 +msgid "Empty batches not allowed." +msgstr "빈 batches는 허용되지 않습니다." + +#: 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 +#, python-format +msgid "Input file for case %d does not exist: %s" +msgstr "테스트 케이스 %d에 대한 입력 파일이 존재하지 않습니다.: %s" + +#: judge/utils/problem_data.py:90 +#, python-format +msgid "Output file for case %d does not exist: %s" +msgstr "테스트 케이스 %d에 대한 출력 파일이 존재하지 않습니다.: %s" + +#: judge/utils/problem_data.py:115 +#, python-format +msgid "Batch start case #%d requires points." +msgstr "" + +#: 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 +msgid "How did you corrupt the zip path?" +msgstr "압축 파일 경로를 어떻게 손상하셨나요?" + +#: judge/utils/problem_data.py:160 +msgid "How did you corrupt the generator path?" +msgstr "" + +#: judge/utils/problems.py:76 +msgid "Can't pass both queryset and keyword filters" +msgstr "" + +#: judge/utils/problems.py:87 +msgid "Wrong" +msgstr "" + +#: judge/utils/problems.py:89 +msgid "Timeout" +msgstr "" + +#: judge/utils/problems.py:90 +msgid "Error" +msgstr "" + +#: 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/timedelta.py:49 +msgctxt "time format with day" +msgid "%d day %h:%m:%s" +msgid_plural "%d days %h:%m:%s" +msgstr[0] "%d 일 %h:%m:%s" + +#: judge/utils/timedelta.py:53 +msgctxt "time format without day" +msgid "%h:%m:%s" +msgstr "%h:%m:%s" + +#: 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] "%d 일 %h:%m" + +#: judge/utils/timedelta.py:61 +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d일" + +#: judge/utils/timedelta.py:63 +msgctxt "hours and minutes" +msgid "%h:%m" +msgstr "%h:%m" + +#: judge/views/blog.py:38 +#, python-format +msgid "Page %d of Posts" +msgstr "게시물 %d 페이지" + +#: judge/views/comment.py:27 +msgid "Messing around, are we?" +msgstr "" + +#: judge/views/comment.py:36 +msgid "You must solve at least one problem before you can vote." +msgstr "" + +#: judge/views/comment.py:63 +msgid "You already voted." +msgstr "이미 투표하셨습니다." + +#: judge/views/comment.py:120 judge/views/organization.py:299 +msgid "Edited from site" +msgstr "사이트에서 편집" + +#: judge/views/comment.py:141 +msgid "Editing comment" +msgstr "" + +#: judge/views/contests.py:49 judge/views/contests.py:211 +#: judge/views/contests.py:214 judge/views/contests.py:385 +msgid "No such contest" +msgstr "그런 대회는 존재하지 않습니다." + +#: judge/views/contests.py:50 judge/views/contests.py:212 +#, python-format +msgid "Could not find a contest with the key \"%s\"." +msgstr "키 %s로는 대회를 찾을 수 없습니다." + +#: judge/views/contests.py:75 +msgid "Contests" +msgstr "대회" + +#: judge/views/contests.py:215 +msgid "Could not find such contest." +msgstr "그런 대회를 찾을 수 있습니다." + +#: judge/views/contests.py:218 +#, python-format +msgid "Access to contest \"%s\" denied" +msgstr "%s 대회 접근이 거부되었습니다." + +#: judge/views/contests.py:242 +msgid "Clone Contest" +msgstr "" + +#: judge/views/contests.py:305 +msgid "Contest not ongoing" +msgstr "현재 진행중인 대회가 아닙니다." + +#: judge/views/contests.py:306 +#, python-format +msgid "\"%s\" is not currently ongoing." +msgstr "%s는 현재 진행중이 아닙니다." + +#: judge/views/contests.py:310 +msgid "Already in contest" +msgstr "대회에 이미 있습니다." + +#: judge/views/contests.py:311 +#, python-format +msgid "You are already in a contest: \"%s\"." +msgstr "현재 대회 %s에 이미 참가해 있습니다." + +#: judge/views/contests.py:314 +msgid "Banned from joining" +msgstr "" + +#: judge/views/contests.py:315 +msgid "You have been declared persona non grata for this contest. You are permanently barred from joining this contest." +msgstr "" + +#: judge/views/contests.py:375 +#, python-format +msgid "Enter access code for \"%s\"" +msgstr "" + +#: judge/views/contests.py:386 +#, python-format +msgid "You are not in contest \"%s\"." +msgstr "현재 대회 %s에 참가중이 아닙니다." + +#: judge/views/contests.py:405 +msgid "ContestCalendar requires integer year and month" +msgstr "" + +#: judge/views/contests.py:445 +#, python-format +msgid "Contests in %(month)s" +msgstr "" + +#: judge/views/contests.py:445 +msgid "F Y" +msgstr "" + +#: judge/views/contests.py:531 +msgid "???" +msgstr "" + +#: judge/views/contests.py:594 +#, python-format +msgid "%s Rankings" +msgstr "%s 순위" + +#: judge/views/contests.py:610 +#, python-format +msgid "Your participation in %s" +msgstr "%s에 대한 당신의 참가" + +#: judge/views/contests.py:611 +#, python-format +msgid "%s's participation in %s" +msgstr "%s's %s에 대한 참가" + +#: judge/views/contests.py:615 +msgid "Live" +msgstr "실시간" + +#: judge/views/contests.py:627 templates/contest/contest-tabs.html:13 +msgid "Participation" +msgstr "참여" + +#: judge/views/contests.py:654 +#, python-format +msgid "%s MOSS Results" +msgstr "" + +#: judge/views/contests.py:681 +#, python-format +msgid "Running MOSS for %s..." +msgstr "" + +#: judge/views/contests.py:704 +#, python-format +msgid "Contest tag: %s" +msgstr "대회 태그: %s" + +#: judge/views/error.py:14 +msgid "404 error" +msgstr "404 Error!!!" + +#: judge/views/error.py:15 +#, python-format +msgid "Could not find page \"%s\"" +msgstr "%s 페이지를 찾을 수 없습니다." + +#: judge/views/error.py:22 +#, python-format +msgid "no permission for %s" +msgstr "%s에 대한 접근 권한이 없습니다." + +#: judge/views/error.py:30 +#, python-format +msgid "corrupt page %s" +msgstr "손상된 페이지 %s" + +#: 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:44 judge/views/organization.py:47 +msgid "No such organization" +msgstr "존재하지 않는 조직" + +#: judge/views/organization.py:45 +#, python-format +msgid "Could not find an organization with the key \"%s\"." +msgstr "%s 조직을 찾을 수 없습니다." + +#: judge/views/organization.py:48 +msgid "Could not find such organization." +msgstr "그러한 조직을 찾을 수 없습니다." + +#: judge/views/organization.py:72 judge/views/register.py:34 +#: templates/organization/list.html:15 templates/user/user-list-tabs.html:5 +msgid "Organizations" +msgstr "조직" + +#: judge/views/organization.py:93 +#, python-format +msgid "%s Members" +msgstr "%s 멤버" + +#: judge/views/organization.py:118 judge/views/organization.py:121 +#: judge/views/organization.py:126 +msgid "Joining organization" +msgstr "조직 가입" + +#: judge/views/organization.py:118 +msgid "You are already in the organization." +msgstr "이미 조직에 가입되어 있습니다." + +#: judge/views/organization.py:121 +msgid "This organization is not open." +msgstr "이 조직은 공개되어 있지 않습니다." + +#: judge/views/organization.py:138 +msgid "Leaving organization" +msgstr "조직 탈퇴" + +#: judge/views/organization.py:138 +#, python-format +msgid "You are not in \"%s\"." +msgstr "%s에 있지 않습니다." + +#: judge/views/organization.py:162 +#, python-format +msgid "Request to join %s" +msgstr "%s 가입 신청" + +#: judge/views/organization.py:180 +msgid "Join request detail" +msgstr "가입 신청 세부 사항" + +#: judge/views/organization.py:209 +#, python-format +msgid "Managing join requests for %s" +msgstr "%s 가입 신청 가입" + +#: judge/views/organization.py:240 +#, python-format +msgid "Your organization can only receive %d more members. You cannot approve %d users." +msgstr "당신의 조직은 %d명의 회원만 더 가입이 가능합니다. %d명의 사용자 가입 승인이 불가합니다." + +#: judge/views/organization.py:252 +#, python-format +msgid "Approved %d user." +msgid_plural "Approved %d users." +msgstr[0] "%d명 사용자 승인" + +#: judge/views/organization.py:253 +#, python-format +msgid "Rejected %d user." +msgid_plural "Rejected %d users." +msgstr[0] "%d명 거부" + +#: judge/views/organization.py:283 +#, python-format +msgid "Editing %s" +msgstr "%s 편집중" + +#: judge/views/organization.py:307 judge/views/organization.py:315 +msgid "Can't edit organization" +msgstr "조직 편집이 불가합니다." + +#: judge/views/organization.py:308 +msgid "You are not allowed to edit this organization." +msgstr "조직을 편집할 권한이 없습니다." + +#: judge/views/organization.py:316 +msgid "You are not allowed to kick people from this organization." +msgstr "조직 사용자를 탈퇴시킬 권한이 없습니다." + +#: judge/views/organization.py:321 judge/views/organization.py:325 +msgid "Can't kick user" +msgstr "이 사용자를 탈퇴시킬 수 없습니다." + +#: judge/views/organization.py:322 +msgid "The user you are trying to kick does not exist!" +msgstr "탈퇴시키려는 사용자가 존재하지 않습니다." + +#: judge/views/organization.py:326 +#, python-format +msgid "The user you are trying to kick is not in organization: %s." +msgstr "" + +#: judge/views/problem.py:68 +msgid "No such problem" +msgstr "존재하지 않는 문제" + +#: judge/views/problem.py:69 +#, python-format +msgid "Could not find a problem with the code \"%s\"." +msgstr "%s 문제를 찾을 수 없습니다." + +#: judge/views/problem.py:111 +#, python-brace-format +msgid "Editorial for {0}" +msgstr "" + +#: judge/views/problem.py:114 +#, python-brace-format +msgid "Editorial for {0}" +msgstr "" + +#: judge/views/problem.py:285 templates/contest/contest.html:79 +#: templates/user/user-tabs.html:5 templates/user/users-table.html:23 +msgid "Problems" +msgstr "문제" + +#: judge/views/problem.py:546 +msgid "Banned from submitting" +msgstr "" + +#: judge/views/problem.py:547 +msgid "You have been declared persona non grata for this problem. You are permanently barred from submitting this problem." +msgstr "" + +#: judge/views/problem.py:560 +msgid "Too many submissions" +msgstr "" + +#: judge/views/problem.py:561 +msgid "You have exceeded the submission limit for this problem." +msgstr "" + +#: judge/views/problem.py:627 judge/views/problem.py:630 +#, python-format +msgid "Submit to %(problem)s" +msgstr "" + +#: judge/views/problem.py:646 +msgid "Clone Problem" +msgstr "" + +#: judge/views/problem_data.py:37 +msgid "Checker arguments must be a JSON object" +msgstr "Checker arguments must be a JSON object" + +#: judge/views/problem_data.py:39 +msgid "Checker arguments is invalid JSON" +msgstr "" + +#: judge/views/problem_data.py:46 +msgid "Your zip file is invalid!" +msgstr "Zip 파일이 올바르지 않습니다." + +#: judge/views/problem_data.py:104 +#, python-brace-format +msgid "Comparing submissions for {0}" +msgstr "" + +#: judge/views/problem_data.py:107 +#, python-brace-format +msgid "Comparing submissions for {0}" +msgstr "" + +#: judge/views/problem_data.py:142 +#, python-brace-format +msgid "Editing data for {0}" +msgstr "" + +#: judge/views/problem_data.py:145 +#, python-format +msgid "Editing data for %s" +msgstr "" + +#: judge/views/problem_data.py:237 judge/views/problem_data.py:238 +#, python-format +msgid "Generated init.yml for %s" +msgstr "" + +#: 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] "" + +#: judge/views/ranked_submission.py:58 +#, python-format +msgid "Best solutions for %s" +msgstr "%s를 위한 best 솔루션" + +#: judge/views/ranked_submission.py:61 +#, python-brace-format +msgid "Best solutions for {0}" +msgstr "" + +#: judge/views/ranked_submission.py:71 +#, python-format +msgid "Best solutions for %(problem)s in %(contest)s" +msgstr "" + +#: judge/views/ranked_submission.py:74 +#, python-format +msgid "Best solutions for problem %(number)s in %(contest)s" +msgstr "" + +#: judge/views/ranked_submission.py:80 +#, python-brace-format +msgid "Best solutions for {0} in {2}" +msgstr "" + +#: judge/views/ranked_submission.py:83 +#, python-brace-format +msgid "Best solutions for problem {0} in {1}" +msgstr "" + +#: judge/views/register.py:27 +msgid "A username must contain letters, numbers, or underscores" +msgstr "사용자 이름은 문자, 숫자, 또는 밑줄을 포함해야 합니다." + +#: judge/views/register.py:31 templates/user/edit-profile.html:103 +msgid "Preferred language" +msgstr "선호하는 언어" + +#: judge/views/register.py:38 +msgid "Subscribe to newsletter?" +msgstr "뉴스레터에 구독하시겠습니까?" + +#: judge/views/register.py:45 +#, python-format +msgid "The email address \"%s\" is already taken. Only one registration is allowed per address." +msgstr "이메일 주소 %s는 사용중입니다. 하나의 주소에 대해 한번만 가입이 허용됩니다." + +#: judge/views/register.py:51 +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 +msgid "Registration" +msgstr "회원가입" + +#: judge/views/register.py:106 +msgid "Authentication failure" +msgstr "인증 실패" + +#: judge/views/stats.py:105 +msgid "Language statistics" +msgstr "언어 통계" + +#: judge/views/status.py:24 templates/submission/list.html:319 +msgid "Status" +msgstr "현재 상태" + +#: judge/views/status.py:108 +msgid "Version matrix" +msgstr "" + +#: judge/views/submission.py:59 judge/views/submission.py:66 +#, python-format +msgid "Submission of %(problem)s by %(user)s" +msgstr "" + +#: judge/views/submission.py:161 judge/views/submission.py:162 +#: templates/problem/problem.html:127 +msgid "All submissions" +msgstr "모든 제출들" + +#: judge/views/submission.py:303 +msgid "All my submissions" +msgstr "내 모든 제출들" + +#: judge/views/submission.py:304 +#, python-format +msgid "All submissions by %s" +msgstr "" + +#: judge/views/submission.py:335 +#, python-format +msgid "All submissions for %s" +msgstr "" + +#: judge/views/submission.py:354 +msgid "Must pass a problem" +msgstr "" + +#: judge/views/submission.py:397 +#, python-format +msgid "My submissions for %(problem)s" +msgstr "%(problem)s에 대한 나의 제출" + +#: judge/views/submission.py:398 +#, python-format +msgid "%(user)s's submissions for %(problem)s" +msgstr "%(problem)s에 대한 %(user)s의 제출" + +#: judge/views/submission.py:495 +msgid "Must pass a contest" +msgstr "대회를 통화해야한다" + +#: judge/views/submission.py:514 +#, python-brace-format +msgid "{0}'s submissions for {2} in {4}" +msgstr "{0}'s submissions for {2} in {4}" + +#: judge/views/submission.py:519 +#, python-brace-format +msgid "{0}'s submissions for problem {2} in {3}" +msgstr "{0}'s submissions for problem {2} in {3}" + +#: judge/views/ticket.py:33 judge/views/ticket.py:39 +msgid "Ticket title" +msgstr "" + +#: judge/views/ticket.py:40 +msgid "Issue description" +msgstr "" + +#: judge/views/ticket.py:85 judge/views/ticket.py:88 +#, python-format +msgid "New ticket for %s" +msgstr "" + +#: judge/views/ticket.py:139 +#, python-format +msgid "%(title)s - Ticket %(id)d" +msgstr "" + +#: judge/views/ticket.py:248 +#, python-format +msgid "Tickets - Page %(number)d of %(total)d" +msgstr "" + +#: judge/views/ticket.py:297 +#, python-format +msgid "New Ticket: %s" +msgstr "" + +#: judge/views/ticket.py:298 +#, python-format +msgid "#%(id)d, assigned to: %(users)s" +msgstr "" + +#: judge/views/ticket.py:300 +msgid ", " +msgstr "" + +#: judge/views/ticket.py:300 +msgid "no one" +msgstr "" + +#: judge/views/totp.py:42 templates/registration/totp_enable.html:86 +msgid "Enable Two Factor Authentication" +msgstr "" + +#: judge/views/totp.py:89 templates/registration/totp_disable.html:48 +msgid "Disable Two Factor Authentication" +msgstr "" + +#: judge/views/totp.py:103 +msgid "Perform Two Factor Authentication" +msgstr "" + +#: judge/views/user.py:68 +msgid "No such user" +msgstr "" + +#: judge/views/user.py:68 +#, python-format +msgid "No user handle \"%s\"." +msgstr "" + +#: judge/views/user.py:72 +msgid "My account" +msgstr "" + +#: judge/views/user.py:73 +#, python-format +msgid "User %s" +msgstr "" + +#: judge/views/user.py:136 +msgid "M j, Y, G:i" +msgstr "" + +#: judge/views/user.py:221 +msgid "Updated on site" +msgstr "" + +#: judge/views/user.py:253 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:10 +msgid "Edit profile" +msgstr "" + +#: judge/views/user.py:262 templates/user/user-list-tabs.html:4 +msgid "Leaderboard" +msgstr "" + +#: judge/views/widgets.py:48 judge/views/widgets.py:58 +#, python-format +msgid "Invalid upstream data: %s" +msgstr "" + +#: judge/views/widgets.py:68 +msgid "Bad latitude or longitude" +msgstr "" + +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:13 +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:27 +msgid "Photo" +msgstr "" + +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:14 +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:28 +msgid "Photos" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:9 +msgid "first name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:10 +msgid "last name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:11 +msgid "biography" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/admin.py:24 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:30 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:30 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:30 +msgid "owner" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:12 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:12 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:12 +msgid "name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:19 +msgid "Category of Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:20 +msgid "Categories of Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:26 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:26 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:26 +msgid "title" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:28 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:28 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:28 +msgid "category" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:29 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:29 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:29 +msgid "author" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:31 +msgid "publication date" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:37 +msgid "Book" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:38 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:136 +msgid "Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:19 +msgid "Category of CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:20 +msgid "Categories of CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:36 +msgid "CD" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:37 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:141 +msgid "CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:19 +msgid "Category of DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:20 +msgid "Categories of DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:36 +msgid "DVD" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:37 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:146 +msgid "DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/templates/admin/base_site.html:7 +msgid "Django administration" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/forms.py:12 +#, python-format +msgid "Please enter the correct %(username)s and password for an admin account. Note that both fields may be case-sensitive." +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/forms.py:32 +#, python-format +msgid "Please enter the correct %(username)s and password for an user account. Note that both fields may be case-sensitive." +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:27 +msgid "Site" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:38 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:41 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:130 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:133 +msgid "Dashboard" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:48 +msgid "Applications" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:53 +msgid "Administration" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:64 +msgid "Color theme" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:66 +msgid "Change color theme" +msgstr "" + +#: 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 +msgid "Rate all ratable contests" +msgstr "" + +#: 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 +msgid "Rejudge" +msgstr "재체점" + +#: templates/base.html:214 +#, python-format +msgid "Hello, %(username)s." +msgstr "" + +#: templates/base.html:220 templates/comments/list.html:89 +#: templates/contest/contest-list-tabs.html:24 +#: templates/problem/problem-list-tabs.html:6 +#: templates/submission/info-base.html:12 +#: templates/submission/submission-list-tabs.html:15 +msgid "Admin" +msgstr "관리자" + +#: templates/base.html:229 +msgid "Log out" +msgstr "로그아웃" + +#: templates/base.html:238 +#: templates/registration/password_reset_complete.html:4 +msgid "Log in" +msgstr "" + +#: templates/base.html:239 templates/registration/registration_form.html:177 +msgid "or" +msgstr "" + +#: templates/base.html:240 +msgid "Sign up" +msgstr "" + +#: templates/base.html:252 +msgid "spectating" +msgstr "관전" + +#: 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:20 +#: 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 +msgid "Edit" +msgstr "" + +#: templates/blog/content.html:27 +#, python-format +msgid "\n" +" posted on %(time)s\n" +" " +msgstr "" + +#: templates/blog/dashboard.html:21 +#, python-format +msgid "\n" +" on %(time)s\n" +" " +msgstr "" + +#: templates/blog/list.html:85 +msgid "Blog" +msgstr "" + +#: templates/blog/list.html:87 +msgid "Events" +msgstr "" + +#: templates/blog/list.html:92 +msgid "News" +msgstr "" + +#: templates/blog/list.html:106 +#, python-brace-format +msgid "posted on {time}" +msgstr "" + +#: templates/blog/list.html:130 templates/problem/problem.html:310 +msgid "Clarifications" +msgstr "" + +#: templates/blog/list.html:146 templates/problem/problem.html:321 +msgid "No clarifications have been made at this time." +msgstr "" + +#: templates/blog/list.html:154 +msgid "Ongoing contests" +msgstr "" + +#: templates/blog/list.html:172 +msgid "Upcoming contests" +msgstr "" + +#: templates/blog/list.html:189 +msgid "Comment stream" +msgstr "" + +#: templates/blog/list.html:208 +msgid "New problems" +msgstr "" + +#: templates/blog/list.html:225 +msgid "My open tickets" +msgstr "" + +#: templates/blog/list.html:246 +msgid "New tickets" +msgstr "" + +#: templates/comments/list.html:2 +msgid "Comments" +msgstr "" + +#: templates/comments/list.html:18 templates/comments/list.html:27 +msgid "Please login to vote" +msgstr "" + +#: templates/comments/list.html:40 +#, python-brace-format +msgid "commented on {time}" +msgstr "" + +#: templates/comments/list.html:49 +#, python-format +msgid "edit %(edits)s" +msgstr "" + +#: templates/comments/list.html:51 templates/comments/media-js.html:77 +msgid "edited" +msgstr "" + +#: templates/comments/list.html:60 +msgid "Link" +msgstr "" + +#: templates/comments/list.html:73 templates/comments/list.html:80 +msgid "Reply" +msgstr "" + +#: templates/comments/list.html:86 +msgid "Hide" +msgstr "" + +#: templates/comments/list.html:101 +#, 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:120 +msgid "There are no comments at the moment." +msgstr "" + +#: templates/comments/list.html:126 +msgid "New comment" +msgstr "" + +#: templates/comments/list.html:140 +msgid "Invalid comment body." +msgstr "" + +#: templates/comments/list.html:148 +msgid "Post!" +msgstr "" + +#: templates/comments/list.html:156 +msgid "Comments are disabled on this page." +msgstr "" + +#: templates/comments/media-js.html:72 +#, python-brace-format +msgid "edit {edits}" +msgstr "" + +#: templates/comments/media-js.html:75 +msgid "original" +msgstr "" + +#: templates/contest/access_code.html:26 +msgid "Invalid access code." +msgstr "" + +#: templates/contest/access_code.html:29 +msgid "Please enter your access code:" +msgstr "" + +#: templates/contest/access_code.html:32 +msgid "Join Contest" +msgstr "" + +#: templates/contest/calendar.html:12 +msgid "Sunday" +msgstr "" + +#: templates/contest/calendar.html:13 +msgid "Monday" +msgstr "" + +#: templates/contest/calendar.html:14 +msgid "Tuesday" +msgstr "" + +#: templates/contest/calendar.html:15 +msgid "Wednesday" +msgstr "" + +#: templates/contest/calendar.html:16 +msgid "Thursday" +msgstr "" + +#: templates/contest/calendar.html:17 +msgid "Friday" +msgstr "" + +#: templates/contest/calendar.html:18 +msgid "Saturday" +msgstr "" + +#: 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 +msgid "Today" +msgstr "" + +#: templates/contest/contest-list-tabs.html:13 +msgid "Next" +msgstr "" + +#: templates/contest/contest-list-tabs.html:21 +#: templates/problem/problem-list-tabs.html:5 +msgid "List" +msgstr "" + +#: templates/contest/contest-list-tabs.html:22 +msgid "Calendar" +msgstr "" + +#: templates/contest/contest-tabs.html:4 +msgid "Info" +msgstr "" + +#: templates/contest/contest-tabs.html:8 +msgid "Rankings" +msgstr "" + +#: templates/contest/contest-tabs.html:10 +msgid "Hidden Rankings" +msgstr "" + +#: templates/contest/contest-tabs.html:18 +msgid "MOSS" +msgstr "" + +#: templates/contest/contest-tabs.html:23 +msgid "Clone" +msgstr "" + +#: templates/contest/contest-tabs.html:34 +#: templates/contest/contest-tabs.html:54 +msgid "Leave contest" +msgstr "" + +#: templates/contest/contest-tabs.html:41 templates/contest/list.html:293 +msgid "Virtual join" +msgstr "" + +#: templates/contest/contest-tabs.html:52 +msgid "Stop spectating" +msgstr "" + +#: templates/contest/contest-tabs.html:61 +msgid "Spectate contest" +msgstr "" + +#: templates/contest/contest-tabs.html:67 +#: templates/contest/contest-tabs.html:73 +msgid "Join contest" +msgstr "" + +#: templates/contest/contest-tabs.html:82 +msgid "Login to participate" +msgstr "" + +#: templates/contest/contest.html:37 +msgid "Participating virtually." +msgstr "" + +#: templates/contest/contest.html:43 +msgid "Contest is over." +msgstr "" + +#: templates/contest/contest.html:59 templates/contest/contest.html:63 +msgid "F j, Y, G:i T" +msgstr "" + +#: 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 +#, python-format +msgid "%(length)s long starting on %(start_time)s" +msgstr "" + +#: templates/contest/contest.html:85 +msgid "AC Rate" +msgstr "" + +#: templates/contest/contest.html:86 templates/contest/list.html:153 +#: templates/contest/list.html:195 templates/contest/list.html:271 +#: templates/problem/list.html:212 templates/problem/list.html:238 +msgid "Users" +msgstr "" + +#: templates/contest/contest.html:111 +msgid "Editorial" +msgstr "" + +#: templates/contest/list.html:31 templates/contest/media-js.html:9 +msgid "Are you sure you want to join?" +msgstr "" + +#: 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:65 +msgid "hidden" +msgstr "" + +#: templates/contest/list.html:70 +msgid "private" +msgstr "" + +#: templates/contest/list.html:84 +msgid "rated" +msgstr "" + +#: templates/contest/list.html:132 +msgid "Spectate" +msgstr "" + +#: templates/contest/list.html:138 +msgid "Join" +msgstr "" + +#: templates/contest/list.html:148 +msgid "Active Contests" +msgstr "" + +#: templates/contest/list.html:152 templates/contest/list.html:194 +#: templates/contest/list.html:232 templates/contest/list.html:270 +msgid "Contest" +msgstr "" + +#: templates/contest/list.html:190 +msgid "Ongoing Contests" +msgstr "" + +#: templates/contest/list.html:227 +msgid "Upcoming Contests" +msgstr "" + +#: templates/contest/list.html:255 +msgid "There are no scheduled contests at this time." +msgstr "" + +#: templates/contest/list.html:261 +msgid "Past Contests" +msgstr "" + +#: templates/contest/media-js.html:4 +msgid "Are you sure you want to leave?" +msgstr "" + +#: 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 +msgid "Joining a contest starts your timer, after which it becomes unstoppable." +msgstr "" + +#: 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:7 +msgid "Organization" +msgstr "그룹" + +#: templates/contest/ranking-table.html:27 +#, python-brace-format +msgid "Started on {time}" +msgstr "" + +#: templates/contest/ranking-table.html:30 +msgid "Participation ended." +msgstr "" + +#: templates/contest/ranking.html:232 +msgid "View user participation" +msgstr "" + +#: templates/contest/ranking.html:236 +msgid "Show organizations" +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 +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 +msgid "activate" +msgstr "" + +#: 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 +msgid "Newsletter unsubscribe" +msgstr "" + +#: 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 +msgid "Do you want to unsubscribe from this newsletter?" +msgstr "" + +#: 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 +msgid "Newsletter update" +msgstr "" + +#: 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 +msgid "Update subscription" +msgstr "" + +#: templates/newsletter/subscription_update_activated.html:8 +msgid "Your subscription has successfully been updated." +msgstr "" + +#: 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:34 +#: templates/ticket/edit-notes.html:4 +msgid "Update" +msgstr "" + +#: 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:29 +msgid "Join organization" +msgstr "" + +#: templates/organization/home.html:33 +msgid "Request membership" +msgstr "" + +#: templates/organization/home.html:39 +msgid "Edit organization" +msgstr "" + +#: templates/organization/home.html:43 +msgid "View requests" +msgstr "" + +#: templates/organization/home.html:50 +msgid "Admin organization" +msgstr "" + +#: templates/organization/home.html:55 +msgid "View members" +msgstr "" + +#: templates/organization/list.html:23 templates/status/language-list.html:34 +msgid "Name" +msgstr "" + +#: templates/organization/list.html:24 +msgid "Members" +msgstr "" + +#: templates/organization/new.html:10 templates/ticket/new.html:38 +msgid "Create" +msgstr "" + +#: templates/organization/requests/detail.html:13 +msgid "User:" +msgstr "" + +#: templates/organization/requests/detail.html:17 +msgid "Organization:" +msgstr "" + +#: templates/organization/requests/detail.html:25 +msgid "Time:" +msgstr "" + +#: templates/organization/requests/detail.html:29 +msgid "Reason:" +msgstr "" + +#: 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:15 +msgid "Reason" +msgstr "" + +#: 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:17 +#: templates/problem/data.html:401 +msgid "Delete?" +msgstr "" + +#: templates/organization/requests/request.html:18 +msgid "Your reason for joining:" +msgstr "" + +#: templates/organization/requests/request.html:20 +msgid "Request" +msgstr "" + +#: templates/organization/requests/tabs.html:4 +msgid "Pending" +msgstr "" + +#: templates/organization/requests/tabs.html:7 +msgid "Log" +msgstr "" + +#: templates/organization/requests/tabs.html:10 +msgid "Approved" +msgstr "" + +#: templates/organization/requests/tabs.html:13 +msgid "Rejected" +msgstr "" + +#: templates/organization/users-table.html:15 +msgid "Kick" +msgstr "" + +#: templates/problem/clone.html:37 +msgid "Enter a new code for the cloned problem:" +msgstr "" + +#: templates/problem/data.html:353 +msgid "View YAML" +msgstr "" + +#: templates/problem/data.html:369 +msgid "Show columns:" +msgstr "" + +#: templates/problem/data.html:372 templates/problem/data.html:396 +msgid "Output prefix" +msgstr "" + +#: templates/problem/data.html:376 templates/problem/data.html:397 +msgid "Output limit" +msgstr "" + +#: templates/problem/data.html:380 templates/problem/data.html:398 +msgid "Checker" +msgstr "" + +#: templates/problem/data.html:384 templates/problem/data.html:399 +msgid "Generator args" +msgstr "" + +#: templates/problem/data.html:391 +msgid "Type" +msgstr "" + +#: templates/problem/data.html:392 +msgid "Input file" +msgstr "" + +#: templates/problem/data.html:393 +msgid "Output file" +msgstr "" + +#: templates/problem/data.html:395 +msgid "Pretest?" +msgstr "" + +#: templates/problem/data.html:447 templates/problem/submit.html:252 +msgid "Submit!" +msgstr "" + +#: templates/problem/data.html:448 +msgid "Add new case" +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 editorialist.

Submitting an official solution before solving the problem yourself is a bannable offence." +msgstr "" + +#: templates/problem/list.html:62 +msgid "Filter by type..." +msgstr "" + +#: templates/problem/list.html:185 +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:57 +msgid "Category" +msgstr "" + +#: templates/problem/list.html:209 templates/problem/list.html:228 +msgid "Types" +msgstr "" + +#: templates/problem/list.html:235 +#, python-format +msgid "AC %%" +msgstr "" + +#: 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:142 +msgid "Filter by result:" +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:101 templates/problem/problem.html:111 +#: templates/problem/problem.html:116 +msgid "Submit solution" +msgstr "" + +#: templates/problem/problem.html:104 +#, python-format +msgid "%(counter)s submission left" +msgid_plural "%(counter)s submissions left" +msgstr[0] "" + +#: templates/problem/problem.html:112 +msgid "0 submissions left" +msgstr "" + +#: templates/problem/problem.html:124 +msgid "My submissions" +msgstr "" + +#: templates/problem/problem.html:128 +msgid "Best submissions" +msgstr "" + +#: templates/problem/problem.html:132 +msgid "Read editorial" +msgstr "" + +#: templates/problem/problem.html:137 +msgid "Manage tickets" +msgstr "" + +#: templates/problem/problem.html:141 +msgid "Edit problem" +msgstr "" + +#: templates/problem/problem.html:143 +msgid "Edit test data" +msgstr "" + +#: templates/problem/problem.html:148 +msgid "My tickets" +msgstr "" + +#: templates/problem/problem.html:156 +msgid "Manage submissions" +msgstr "" + +#: templates/problem/problem.html:162 +msgid "Clone problem" +msgstr "" + +#: templates/problem/problem.html:169 +msgid "Points:" +msgstr "" + +#: templates/problem/problem.html:172 templates/problem/problem.html:174 +msgid "(partial)" +msgstr "" + +#: templates/problem/problem.html:179 +msgid "Time limit:" +msgstr "" + +#: templates/problem/problem.html:191 +msgid "Memory limit:" +msgstr "" + +#: templates/problem/problem.html:210 +msgid "Author:" +msgid_plural "Authors:" +msgstr[0] "" + +#: templates/problem/problem.html:225 +msgid "Problem type" +msgid_plural "Problem types" +msgstr[0] "" + +#: templates/problem/problem.html:238 +msgid "Allowed languages" +msgstr "" + +#: templates/problem/problem.html:246 +#, python-format +msgid "No %(lang)s judge online" +msgstr "" + +#: templates/problem/problem.html:257 +msgid "Judge:" +msgid_plural "Judges:" +msgstr[0] "" + +#: templates/problem/problem.html:274 +msgid "none available" +msgstr "" + +#: templates/problem/problem.html:299 +msgid "Request clarification" +msgstr "" + +#: templates/problem/problem.html:301 +msgid "Report an issue" +msgstr "" + +#: 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 +msgid "Search problems..." +msgstr "" + +#: templates/problem/search-form.html:14 +msgid "Full text search" +msgstr "" + +#: templates/problem/search-form.html:21 +msgid "Hide solved problems" +msgstr "" + +#: 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 +msgid "All" +msgstr "" + +#: templates/problem/search-form.html:46 +msgid "Problem types" +msgstr "" + +#: templates/problem/search-form.html:57 +msgid "Point range" +msgstr "" + +#: templates/problem/search-form.html:63 templates/submission/list.html:337 +#: templates/ticket/list.html:248 +msgid "Go" +msgstr "" + +#: templates/problem/search-form.html:64 +msgid "Random" +msgstr "" + +#: templates/problem/submit.html:192 +#, python-format +msgid "Warning! Your default language, %(default_language)s, is unavailable for this problem and has been deselected." +msgstr "" + +#: templates/problem/submit.html:203 +#, python-format +msgid "\n" +" You have %(left)s submission left\n" +" " +msgid_plural "\n" +" You have %(left)s submissions left\n" +" " +msgstr[0] "" + +#: templates/problem/submit.html:212 +msgid "You have 0 submissions left" +msgstr "" + +#: templates/problem/submit.html:250 +msgid "No judge is available for this problem." +msgstr "" + +#: templates/registration/activate.html:3 +#, python-format +msgid "%(key)s is an invalid activation key." +msgstr "" + +#: templates/registration/activation_complete.html:3 +msgid "Your account has been successfully activated." +msgstr "" + +#: templates/registration/login.html:43 +msgid "Invalid username or password." +msgstr "" + +#: templates/registration/login.html:61 +#: templates/registration/totp_auth.html:39 +msgid "Login!" +msgstr "" + +#: templates/registration/login.html:64 +msgid "Forgot your password?" +msgstr "" + +#: templates/registration/login.html:67 +msgid "Or log in with..." +msgstr "" + +#: templates/registration/logout.html:3 +msgid "See you later!" +msgstr "" + +#: templates/registration/password_change_done.html:3 +msgid "Your password was sucessfully changed." +msgstr "" + +#: templates/registration/password_change_form.html:8 +msgid "Change Password" +msgstr "" + +#: templates/registration/password_reset.html:7 +msgid "Send Reset Email" +msgstr "" + +#: 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_confirm.html:9 +msgid "Reset Password" +msgstr "" + +#: 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 +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 +#, 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 +msgid "Please go to the following page and choose a new password:" +msgstr "" + +#: templates/registration/password_reset_email.txt:7 +msgid "Your username, in case you've forgotten:" +msgstr "" + +#: templates/registration/password_reset_email.txt:9 +msgid "Thanks for using our site!" +msgstr "" + +#: templates/registration/password_reset_email.txt:11 +#, python-format +msgid "The %(site_name)s team" +msgstr "" + +#: 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 +msgid "Continue >" +msgstr "" + +#: 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:166 +msgid "(again, for confirmation)" +msgstr "" + +#: templates/registration/registration_form.html:173 +msgid "(select your closest major city)" +msgstr "" + +#: templates/registration/registration_form.html:178 +msgid "pick from map" +msgstr "" + +#: templates/registration/registration_form.html:183 +msgid "Default language" +msgstr "" + +#: templates/registration/registration_form.html:186 +#: templates/user/edit-profile.html:162 +msgid "Affiliated organizations" +msgstr "" + +#: templates/registration/registration_form.html:192 +#: templates/user/edit-profile.html:121 +msgid "Notify me about upcoming contests" +msgstr "" + +#: templates/registration/registration_form.html:206 +msgid "By registering, you agree to our" +msgstr "" + +#: templates/registration/registration_form.html:207 +msgid "Terms & Conditions" +msgstr "" + +#: templates/registration/registration_form.html:210 +msgid "Register!" +msgstr "" + +#: templates/registration/totp_auth.html:36 +#: templates/registration/totp_disable.html:45 +#: templates/registration/totp_enable.html:83 +msgid "Enter the 6-digit code generated by your app:" +msgstr "" + +#: templates/registration/totp_auth.html:41 +#, python-format +msgid "If you lost your authentication device, please contact us at %(email)s." +msgstr "" + +#: templates/registration/totp_disable.html:38 +msgid "To protect your account, you must first authenticate before you can disable Two Factor Authentication." +msgstr "" + +#: templates/registration/totp_enable.html:71 +msgid "Scan this code with your authenticator app:" +msgstr "" + +#: templates/registration/totp_enable.html:72 +msgid "QR code" +msgstr "" + +#: templates/registration/totp_enable.html:73 +msgid "Or enter this code manually:" +msgstr "" + +#: templates/stats/base.html:9 templates/submission/list.html:345 +msgid "Statistics" +msgstr "" + +#: templates/stats/language.html:11 +msgid "Submission Statistics" +msgstr "" + +#: templates/stats/language.html:16 +msgid "Submissions by Language" +msgstr "" + +#: templates/stats/language.html:21 +msgid "AC Submissions by Language" +msgstr "" + +#: templates/stats/language.html:26 +msgid "Language AC Rate" +msgstr "" + +#: templates/status/judge-status-table.html:2 +msgid "Judge" +msgstr "" + +#: templates/status/judge-status-table.html:4 +msgid "Online" +msgstr "" + +#: templates/status/judge-status-table.html:6 +msgid "Uptime" +msgstr "" + +#: templates/status/judge-status-table.html:7 +msgid "Ping" +msgstr "" + +#: 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 +msgid "N/A" +msgstr "" + +#: templates/status/judge-status-table.html:64 +msgid "There are no judges available at this time." +msgstr "" + +#: templates/status/language-list.html:33 templates/ticket/list.html:261 +msgid "ID" +msgstr "" + +#: templates/status/language-list.html:35 +msgid "Runtime Info" +msgstr "" + +#: templates/status/status-tabs.html:4 +msgid "Judges" +msgstr "" + +#: templates/status/status-tabs.html:6 +msgid "Version Matrix" +msgstr "" + +#: templates/submission/internal-error-message.html:8 +msgid "An internal error occurred while grading." +msgstr "" + +#: templates/submission/internal-error-message.html:15 +msgid "Error information" +msgstr "" + +#: templates/submission/list.html:76 +msgid "Filter by status..." +msgstr "" + +#: templates/submission/list.html:82 +msgid "Filter by language..." +msgstr "" + +#: templates/submission/list.html:315 +msgid "Filter submissions" +msgstr "" + +#: templates/submission/list.html:351 +msgid "Total:" +msgstr "" + +#: templates/submission/list.html:361 +msgid "You were disconnected. Refresh to show latest updates." +msgstr "" + +#: templates/submission/row.html:39 +#, python-format +msgid "Case #%(case)s" +msgstr "" + +#: templates/submission/row.html:49 +msgid "view" +msgstr "" + +#: templates/submission/row.html:53 +msgid "rejudge" +msgstr "" + +#: templates/submission/row.html:58 +msgid "admin" +msgstr "" + +#: templates/submission/source.html:25 +msgid "View status" +msgstr "" + +#: templates/submission/source.html:26 +msgid "View raw source" +msgstr "" + +#: templates/submission/source.html:28 templates/submission/status.html:61 +msgid "Resubmit" +msgstr "" + +#: 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 +msgid "Your submission is being processed..." +msgstr "" + +#: templates/submission/status-testcases.html:14 +msgid "Compilation Error" +msgstr "" + +#: templates/submission/status-testcases.html:18 +msgid "Compilation Warnings" +msgstr "" + +#: templates/submission/status-testcases.html:23 +msgid "Pretest Execution Results" +msgstr "" + +#: templates/submission/status-testcases.html:25 +msgid "Execution Results" +msgstr "" + +#: templates/submission/status-testcases.html:31 +msgid "Batch " +msgstr "" + +#: templates/submission/status-testcases.html:43 +msgid "Case" +msgstr "" + +#: templates/submission/status-testcases.html:45 +msgid "Pretest" +msgstr "" + +#: templates/submission/status-testcases.html:47 +msgid "Test case" +msgstr "" + +#: templates/submission/status-testcases.html:79 +msgid "Your output (clipped)" +msgstr "" + +#: templates/submission/status-testcases.html:90 +msgid "Judge feedback" +msgstr "" + +#: templates/submission/status-testcases.html:106 +msgid "Resources:" +msgstr "" + +#: templates/submission/status-testcases.html:115 +msgid "Final pretest score:" +msgstr "" + +#: templates/submission/status-testcases.html:117 +msgid "Final score:" +msgstr "" + +#: templates/submission/status-testcases.html:131 +msgid "Passing pretests does not guarantee a full score on system tests." +msgstr "" + +#: templates/submission/status-testcases.html:134 +msgid "Submission aborted!" +msgstr "" + +#: templates/submission/status.html:59 +msgid "View source" +msgstr "" + +#: templates/submission/status.html:88 +msgid "Abort" +msgstr "" + +#: templates/submission/submission-list-tabs.html:6 +msgid "Mine" +msgstr "" + +#: templates/submission/submission-list-tabs.html:9 +msgid "Best" +msgstr "" + +#: templates/submission/submission-list-tabs.html:12 +#, python-format +msgid "%(user)s's" +msgstr "" + +#: templates/ticket/list.html:135 templates/ticket/ticket.html:257 +msgid "Reopened: " +msgstr "" + +#: templates/ticket/list.html:138 templates/ticket/ticket.html:258 +msgid "Closed: " +msgstr "" + +#: templates/ticket/list.html:221 +msgid "Use desktop notification" +msgstr "" + +#: templates/ticket/list.html:227 +msgid "Show my tickets only" +msgstr "" + +#: templates/ticket/list.html:231 +msgid "Filing user" +msgstr "" + +#: templates/ticket/list.html:240 +msgid "Assignee" +msgstr "" + +#: templates/ticket/list.html:262 +msgid "Title" +msgstr "" + +#: templates/ticket/list.html:264 templates/ticket/ticket.html:304 +msgid "Assignees" +msgstr "" + +#: templates/ticket/new_problem.html:7 +msgid "Thanks for opening a ticket!" +msgstr "" + +#: 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 +msgid "Associated object" +msgstr "" + +#: templates/ticket/ticket.html:309 +msgid "No one is assigned." +msgstr "" + +#: templates/ticket/ticket.html:315 +msgid "Close ticket" +msgstr "" + +#: templates/ticket/ticket.html:317 +msgid "Reopen ticket" +msgstr "" + +#: templates/ticket/ticket.html:321 +msgid "Assignee notes" +msgstr "" + +#: templates/ticket/ticket.html:328 templates/widgets/select_all.html:4 +msgid "Nothing here." +msgstr "" + +#: templates/ticket/ticket.html:378 +msgid "Post" +msgstr "" + +#: templates/user/base-users-table.html:3 +msgid "Rank" +msgstr "" + +#: templates/user/base-users.html:14 templates/user/base-users.html:69 +msgid "Search by handle..." +msgstr "" + +#: templates/user/edit-profile.html:90 +msgid "Self-description" +msgstr "" + +#: templates/user/edit-profile.html:98 +msgid "Select your closest major city" +msgstr "" + +#: templates/user/edit-profile.html:107 +msgid "Editor theme" +msgstr "" + +#: templates/user/edit-profile.html:112 +msgid "Math engine" +msgstr "" + +#: templates/user/edit-profile.html:136 templates/user/edit-profile.html:137 +msgid "Change your avatar" +msgstr "" + +#: templates/user/edit-profile.html:143 +msgid "Change your password" +msgstr "" + +#: templates/user/edit-profile.html:150 +msgid "Two Factor Authentication is enabled." +msgstr "" + +#: templates/user/edit-profile.html:153 +msgid "Two Factor Authentication is disabled." +msgstr "" + +#: templates/user/edit-profile.html:170 +msgid "User-script" +msgstr "" + +#: templates/user/edit-profile.html:174 +msgid "Update profile" +msgstr "" + +#: templates/user/pp-row.html:22 +#, python-format +msgid "\n" +" weighted %(weight)s%%\n" +" " +msgstr "" + +#: templates/user/pp-row.html:27 +#, python-format +msgid "%(pp).1fpp" +msgstr "" + +#: templates/user/pp-row.html:29 +#, python-format +msgid "%(pp).0fpp" +msgstr "" + +#: templates/user/user-about.html:14 +msgid "From" +msgstr "" + +#: 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:40 +msgid "You have not shared any information." +msgstr "" + +#: templates/user/user-about.html:42 +msgid "This user has not shared any information." +msgstr "" + +#: templates/user/user-base.html:42 +#, python-format +msgid "%(counter)s problem solved" +msgid_plural "%(counter)s problems solved" +msgstr[0] "" + +#: templates/user/user-base.html:50 +msgid "Rank by points:" +msgstr "" + +#: templates/user/user-base.html:53 +msgid "Total points:" +msgstr "" + +#: templates/user/user-base.html:68 +msgid "Rank by rating:" +msgstr "" + +#: templates/user/user-base.html:70 +msgid "Rating:" +msgstr "" + +#: templates/user/user-base.html:71 +msgid "Volatility:" +msgstr "" + +#: templates/user/user-base.html:72 +msgid "Min. rating:" +msgstr "" + +#: templates/user/user-base.html:73 +msgid "Max rating:" +msgstr "" + +#: templates/user/user-problems.html:35 +msgid "Points Breakdown" +msgstr "" + +#: templates/user/user-problems.html:41 +msgid "Load more..." +msgstr "" + +#: templates/user/user-problems.html:45 +msgid "This user has not yet solved any problems." +msgstr "" + +#: templates/user/user-problems.html:51 +msgid "Authored Problems" +msgstr "" + +#: templates/user/user-problems.html:83 +msgid "Hide problems I've solved" +msgstr "" + +#: templates/user/user-problems.html:93 +#, python-format +msgid "%(points).1f points" +msgstr "" + +#: templates/user/user-problems.html:99 +msgid "Score" +msgstr "" + +#: templates/user/user-problems.html:110 +#, python-format +msgid "%(points)s / %(total)s" +msgstr "" + +#: templates/user/user-tabs.html:7 +msgid "Impersonate" +msgstr "" + +#: templates/user/user-tabs.html:13 +msgid "Admin User" +msgstr "" + +#: templates/user/user-tabs.html:16 +msgid "Admin Profile" +msgstr "" + +#: templates/widgets/select_all.html:8 +msgid "Check all" +msgstr "" + diff --git a/locale/ko/LC_MESSAGES/djangojs.po b/locale/ko/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..1a5cecb --- /dev/null +++ b/locale/ko/LC_MESSAGES/djangojs.po @@ -0,0 +1,29 @@ +msgid "" +msgstr "" +"Project-Id-Version: dmoj\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-10-01 23:12+0000\n" +"PO-Revision-Date: 2019-11-11 22:05\n" +"Last-Translator: Icyene\n" +"Language-Team: Korean\n" +"Language: ko_KR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: crowdin.com\n" +"X-Crowdin-Project: dmoj\n" +"X-Crowdin-Language: ko\n" +"X-Crowdin-File: djangojs.po\n" + +#: resources/common.js:207 +msgctxt "time format with day" +msgid "%d day %h:%m:%s" +msgid_plural "%d days %h:%m:%s" +msgstr[0] "%d일 %h:%m:%s" + +#: resources/common.js:210 +msgctxt "time format without day" +msgid "%h:%m:%s" +msgstr "%h:%m:%s" + diff --git a/locale/lt/LC_MESSAGES/django.po b/locale/lt/LC_MESSAGES/django.po new file mode 100644 index 0000000..3aeec79 --- /dev/null +++ b/locale/lt/LC_MESSAGES/django.po @@ -0,0 +1,4575 @@ +msgid "" +msgstr "" +"Project-Id-Version: dmoj\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-11-11 21:54+0000\n" +"PO-Revision-Date: 2019-11-11 22:05\n" +"Last-Translator: Icyene\n" +"Language-Team: Lithuanian\n" +"Language: lt_LT\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && (n%100>19 || n%100<11) ? 0 : (n%10>=2 && n%10<=9) && (n%100>19 || n%100<11) ? 1 : n%1!=0 ? 2: 3);\n" +"X-Generator: crowdin.com\n" +"X-Crowdin-Project: dmoj\n" +"X-Crowdin-Language: lt\n" +"X-Crowdin-File: django.po\n" + +#: dmoj/settings.py:337 +msgid "German" +msgstr "" + +#: dmoj/settings.py:338 +msgid "English" +msgstr "" + +#: dmoj/settings.py:339 +msgid "Spanish" +msgstr "" + +#: dmoj/settings.py:340 +msgid "French" +msgstr "" + +#: dmoj/settings.py:341 +msgid "Croatian" +msgstr "" + +#: dmoj/settings.py:342 +msgid "Hungarian" +msgstr "" + +#: dmoj/settings.py:343 +msgid "Japanese" +msgstr "" + +#: dmoj/settings.py:344 +msgid "Korean" +msgstr "" + +#: dmoj/settings.py:345 +msgid "Brazilian Portuguese" +msgstr "" + +#: dmoj/settings.py:346 +msgid "Romanian" +msgstr "" + +#: dmoj/settings.py:347 +msgid "Russian" +msgstr "" + +#: dmoj/settings.py:348 +msgid "Serbian (Latin)" +msgstr "" + +#: dmoj/settings.py:349 +msgid "Turkish" +msgstr "" + +#: dmoj/settings.py:350 +msgid "Vietnamese" +msgstr "" + +#: dmoj/settings.py:351 +msgid "Simplified Chinese" +msgstr "" + +#: dmoj/urls.py:54 +msgid "Login" +msgstr "" + +#: dmoj/urls.py:102 templates/base.html:190 +msgid "Home" +msgstr "" + +#: judge/admin/comments.py:40 +#, python-format +msgid "%d comment successfully hidden." +msgid_plural "%d comments successfully hidden." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: judge/admin/comments.py:43 +msgid "Hide comments" +msgstr "" + +#: 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[3] "" + +#: judge/admin/comments.py:50 +msgid "Unhide comments" +msgstr "" + +#: judge/admin/comments.py:58 +msgid "Associated page" +msgstr "" + +#: judge/admin/contest.py:29 +msgid "Included contests" +msgstr "" + +#: judge/admin/contest.py:65 templates/contest/contest.html:83 +#: templates/contest/moss.html:43 templates/problem/list.html:206 +#: templates/problem/list.html:221 templates/user/user-problems.html:56 +#: templates/user/user-problems.html:98 +msgid "Problem" +msgstr "" + +#: judge/admin/contest.py:113 +msgid "Settings" +msgstr "" + +#: judge/admin/contest.py:115 +msgid "Scheduling" +msgstr "" + +#: judge/admin/contest.py:116 +msgid "Details" +msgstr "" + +#: judge/admin/contest.py:117 +msgid "Format" +msgstr "" + +#: judge/admin/contest.py:118 templates/contest/ranking-table.html:5 +msgid "Rating" +msgstr "" + +#: judge/admin/contest.py:119 +msgid "Access" +msgstr "" + +#: judge/admin/contest.py:121 judge/admin/problem.py:131 +msgid "Justice" +msgstr "" + +#: judge/admin/contest.py:159 +#, python-format +msgid "%d contest successfully marked as visible." +msgid_plural "%d contests successfully marked as visible." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: judge/admin/contest.py:162 +msgid "Mark contests as visible" +msgstr "" + +#: judge/admin/contest.py:166 +#, 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] "" + +#: judge/admin/contest.py:169 +msgid "Mark contests as hidden" +msgstr "" + +#: judge/admin/contest.py:180 judge/admin/submission.py:149 +#: judge/admin/submission.py:171 +msgid "You do not have the permission to rejudge submissions." +msgstr "" + +#: judge/admin/contest.py:187 judge/admin/submission.py:155 +msgid "You do not have the permission to rejudge THAT many submissions." +msgstr "" + +#: judge/admin/contest.py:194 judge/admin/submission.py:164 +#, 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] "" + +#: judge/admin/contest.py:265 +#, python-format +msgid "%d participation recalculated." +msgid_plural "%d participations recalculated." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: judge/admin/contest.py:268 +msgid "Recalculate results" +msgstr "" + +#: judge/admin/contest.py:272 judge/admin/organization.py:65 +msgid "username" +msgstr "" + +#: judge/admin/contest.py:277 templates/base.html:258 +msgid "virtual" +msgstr "" + +#: judge/admin/interface.py:28 judge/models/interface.py:46 +msgid "link path" +msgstr "" + +#: judge/admin/interface.py:62 +msgid "Content" +msgstr "" + +#: judge/admin/interface.py:63 +msgid "Summary" +msgstr "" + +#: judge/admin/interface.py:107 judge/models/contest.py:251 +#: judge/models/contest.py:355 judge/models/profile.py:189 +msgid "user" +msgstr "" + +#: judge/admin/interface.py:148 +msgid "object" +msgstr "" + +#: judge/admin/organization.py:34 judge/admin/problem.py:171 +#: judge/admin/profile.py:78 +msgid "View on site" +msgstr "" + +#: judge/admin/problem.py:28 +msgid "Describe the changes you made (optional)" +msgstr "" + +#: judge/admin/problem.py:126 +msgid "Social Media" +msgstr "" + +#: judge/admin/problem.py:127 +msgid "Taxonomy" +msgstr "" + +#: judge/admin/problem.py:128 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:58 +msgid "Points" +msgstr "" + +#: judge/admin/problem.py:129 +msgid "Limits" +msgstr "" + +#: judge/admin/problem.py:130 judge/admin/submission.py:232 +#: templates/stats/base.html:14 templates/submission/list.html:328 +msgid "Language" +msgstr "" + +#: judge/admin/problem.py:132 +msgid "History" +msgstr "" + +#: judge/admin/problem.py:168 +msgid "Authors" +msgstr "" + +#: judge/admin/problem.py:183 +#, python-format +msgid "%d problem successfully marked as public." +msgid_plural "%d problems successfully marked as public." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: judge/admin/problem.py:187 +msgid "Mark problems as public" +msgstr "" + +#: judge/admin/problem.py:193 +#, python-format +msgid "%d problem successfully marked as private." +msgid_plural "%d problems successfully marked as private." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: judge/admin/problem.py:197 +msgid "Mark problems as private" +msgstr "" + +#: judge/admin/profile.py:32 +msgid "timezone" +msgstr "" + +#: judge/admin/profile.py:84 judge/admin/submission.py:211 +#: templates/organization/requests/log.html:9 +#: templates/organization/requests/pending.html:12 +#: templates/ticket/list.html:263 +msgid "User" +msgstr "" + +#: judge/admin/profile.py:89 templates/registration/registration_form.html:145 +msgid "Email" +msgstr "" + +#: judge/admin/profile.py:94 judge/views/register.py:29 +#: templates/registration/registration_form.html:173 +#: templates/user/edit-profile.html:99 +msgid "Timezone" +msgstr "" + +#: judge/admin/profile.py:99 +msgid "date joined" +msgstr "" + +#: judge/admin/profile.py:106 +#, python-format +msgid "%d user have scores recalculated." +msgid_plural "%d users have scores recalculated." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: judge/admin/profile.py:109 +msgid "Recalculate scores" +msgstr "" + +#: judge/admin/runtime.py:19 +msgid "Disallowed problems" +msgstr "" + +#: judge/admin/runtime.py:22 +msgid "These problems are NOT allowed to be submitted in this language" +msgstr "" + +#: judge/admin/runtime.py:83 +msgid "Description" +msgstr "" + +#: judge/admin/runtime.py:84 +msgid "Information" +msgstr "" + +#: judge/admin/runtime.py:85 +msgid "Capabilities" +msgstr "" + +#: judge/admin/submission.py:23 judge/admin/submission.py:42 +#: judge/admin/submission.py:221 +msgid "None" +msgstr "" + +#: judge/admin/submission.py:23 +msgid "Not done" +msgstr "" + +#: judge/admin/submission.py:23 +msgid "Exceptional" +msgstr "" + +#: judge/admin/submission.py:42 +msgid "Unaccepted" +msgstr "" + +#: judge/admin/submission.py:89 +#, python-format +msgctxt "contest problem" +msgid "%(problem)s in %(contest)s" +msgstr "" + +#: judge/admin/submission.py:167 +msgid "Rejudge the selected submissions" +msgstr "" + +#: judge/admin/submission.py:193 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] "" +msgstr[2] "" +msgstr[3] "" + +#: judge/admin/submission.py:196 +msgid "Rescore the selected submissions" +msgstr "" + +#: judge/admin/submission.py:200 +msgid "Problem code" +msgstr "" + +#: judge/admin/submission.py:205 +msgid "Problem name" +msgstr "" + +#: judge/admin/submission.py:215 templates/organization/requests/log.html:10 +#: templates/organization/requests/pending.html:13 +msgid "Time" +msgstr "" + +#: judge/admin/submission.py:223 +#, python-format +msgid "%d KB" +msgstr "" + +#: judge/admin/submission.py:225 +#, python-format +msgid "%.2f MB" +msgstr "" + +#: judge/admin/submission.py:227 +msgid "Memory" +msgstr "" + +#: judge/admin/taxon.py:11 judge/admin/taxon.py:34 +msgid "Included problems" +msgstr "" + +#: judge/admin/taxon.py:14 +msgid "These problems are included in this group of problems" +msgstr "" + +#: judge/admin/taxon.py:37 +msgid "These problems are included in this type of problems" +msgstr "" + +#: judge/apps.py:8 +msgid "Online Judge" +msgstr "" + +#: judge/comments.py:41 +msgid "Comment body" +msgstr "" + +#: judge/comments.py:47 judge/views/ticket.py:46 +msgid "Your part is silent, little toad." +msgstr "" + +#: judge/comments.py:50 templates/comments/list.html:131 +msgid "You need to have solved at least one problem before your voice can be heard." +msgstr "" + +#: judge/comments.py:92 +msgid "Posted comment" +msgstr "" + +#: judge/contest_format/atcoder.py:19 +msgid "AtCoder" +msgstr "" + +#: judge/contest_format/default.py:18 +msgid "Default" +msgstr "" + +#: judge/contest_format/ecoo.py:19 +msgid "ECOO" +msgstr "" + +#: judge/contest_format/ioi.py:19 +msgid "IOI" +msgstr "" + +#: judge/forms.py:27 +msgid "Subscribe to contest updates" +msgstr "" + +#: judge/forms.py:28 +msgid "Enable experimental features" +msgstr "" + +#: judge/forms.py:57 judge/views/organization.py:127 +#, python-brace-format +msgid "You may not be part of more than {count} public organizations." +msgstr "" + +#: judge/forms.py:107 judge/views/register.py:26 +#: templates/registration/registration_form.html:139 +#: templates/user/base-users-table.html:5 +msgid "Username" +msgstr "" + +#: judge/forms.py:108 templates/registration/registration_form.html:151 +#: templates/registration/registration_form.html:165 +msgid "Password" +msgstr "" + +#: judge/forms.py:130 +msgid "Two Factor Authentication tokens must be 6 decimal digits." +msgstr "" + +#: judge/forms.py:139 templates/registration/totp_auth.html:32 +msgid "Invalid Two Factor Authentication token." +msgstr "" + +#: judge/forms.py:143 judge/models/problem.py:97 +msgid "Problem code must be ^[a-z0-9]+$" +msgstr "" + +#: judge/forms.py:148 +msgid "Problem with code already exists." +msgstr "" + +#: judge/forms.py:153 judge/models/contest.py:51 +msgid "Contest id must be ^[a-z0-9]+$" +msgstr "" + +#: judge/forms.py:158 +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:59 +msgid "Leave as LaTeX" +msgstr "" + +#: judge/models/choices.py:60 +msgid "SVG with PNG fallback" +msgstr "" + +#: judge/models/choices.py:61 +msgid "MathML only" +msgstr "" + +#: judge/models/choices.py:62 +msgid "MathJax with SVG/PNG fallback" +msgstr "" + +#: judge/models/choices.py:63 +msgid "Detect best quality" +msgstr "" + +#: judge/models/comment.py:25 +msgid "Page code must be ^[pcs]:[a-z0-9]+$|^b:\\d+$" +msgstr "" + +#: judge/models/comment.py:41 +msgid "commenter" +msgstr "" + +#: judge/models/comment.py:42 +msgid "posted time" +msgstr "" + +#: judge/models/comment.py:43 judge/models/comment.py:176 +msgid "associated page" +msgstr "" + +#: judge/models/comment.py:45 +msgid "votes" +msgstr "" + +#: judge/models/comment.py:46 +msgid "body of comment" +msgstr "" + +#: judge/models/comment.py:47 +msgid "hide the comment" +msgstr "" + +#: judge/models/comment.py:48 +msgid "parent" +msgstr "" + +#: judge/models/comment.py:53 +msgid "comment" +msgstr "" + +#: judge/models/comment.py:54 +msgid "comments" +msgstr "" + +#: judge/models/comment.py:136 judge/models/problem.py:406 +#, python-format +msgid "Editorial for %s" +msgstr "" + +#: judge/models/comment.py:171 +msgid "comment vote" +msgstr "" + +#: judge/models/comment.py:172 +msgid "comment votes" +msgstr "" + +#: judge/models/comment.py:181 +msgid "Override comment lock" +msgstr "" + +#: judge/models/contest.py:21 +msgid "Invalid colour." +msgstr "" + +#: judge/models/contest.py:23 +msgid "tag name" +msgstr "" + +#: judge/models/contest.py:24 +msgid "Lowercase letters and hyphens only." +msgstr "" + +#: judge/models/contest.py:25 +msgid "tag colour" +msgstr "" + +#: judge/models/contest.py:26 +msgid "tag description" +msgstr "" + +#: judge/models/contest.py:45 +msgid "contest tag" +msgstr "" + +#: judge/models/contest.py:46 judge/models/contest.py:100 +msgid "contest tags" +msgstr "" + +#: judge/models/contest.py:50 +msgid "contest id" +msgstr "" + +#: judge/models/contest.py:52 +msgid "contest name" +msgstr "" + +#: judge/models/contest.py:53 +msgid "These people will be able to edit the contest." +msgstr "" + +#: judge/models/contest.py:55 judge/models/runtime.py:124 +#: src/dmoj-wpadmin/test_project/apps/books/admin.py:20 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:27 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:27 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:27 +msgid "description" +msgstr "" + +#: judge/models/contest.py:56 judge/models/problem.py:353 +#: judge/models/runtime.py:126 +msgid "problems" +msgstr "" + +#: judge/models/contest.py:57 judge/models/contest.py:252 +msgid "start time" +msgstr "" + +#: judge/models/contest.py:58 +msgid "end time" +msgstr "" + +#: judge/models/contest.py:59 judge/models/problem.py:118 +#: judge/models/problem.py:377 +msgid "time limit" +msgstr "" + +#: judge/models/contest.py:60 judge/models/problem.py:136 +msgid "publicly visible" +msgstr "" + +#: judge/models/contest.py:61 +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:64 +msgid "contest rated" +msgstr "" + +#: judge/models/contest.py:64 +msgid "Whether this contest can be rated." +msgstr "" + +#: judge/models/contest.py:66 +msgid "hide scoreboard" +msgstr "" + +#: judge/models/contest.py:67 +msgid "Whether the scoreboard should remain hidden for the duration of the contest." +msgstr "" + +#: judge/models/contest.py:70 +msgid "no comments" +msgstr "" + +#: judge/models/contest.py:71 +msgid "Use clarification system instead of comments." +msgstr "" + +#: judge/models/contest.py:73 +msgid "Rating floor for contest" +msgstr "" + +#: judge/models/contest.py:75 +msgid "Rating ceiling for contest" +msgstr "" + +#: judge/models/contest.py:77 +msgid "rate all" +msgstr "" + +#: judge/models/contest.py:77 +msgid "Rate all users who joined." +msgstr "" + +#: judge/models/contest.py:78 +msgid "exclude from ratings" +msgstr "" + +#: judge/models/contest.py:80 +msgid "private to specific users" +msgstr "" + +#: judge/models/contest.py:81 +msgid "private contestants" +msgstr "" + +#: judge/models/contest.py:82 +msgid "If private, only these users may see the contest" +msgstr "" + +#: judge/models/contest.py:84 +msgid "hide problem tags" +msgstr "" + +#: judge/models/contest.py:85 +msgid "Whether problem tags should be hidden by default." +msgstr "" + +#: judge/models/contest.py:87 +msgid "run pretests only" +msgstr "" + +#: judge/models/contest.py:88 +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:92 judge/models/problem.py:157 +msgid "private to organizations" +msgstr "" + +#: judge/models/contest.py:93 judge/models/problem.py:155 +#: judge/models/profile.py:76 +msgid "organizations" +msgstr "" + +#: judge/models/contest.py:94 +msgid "If private, only these organizations may see the contest" +msgstr "" + +#: judge/models/contest.py:95 judge/models/problem.py:145 +msgid "OpenGraph image" +msgstr "" + +#: judge/models/contest.py:96 judge/models/profile.py:47 +msgid "Logo override image" +msgstr "" + +#: judge/models/contest.py:98 +msgid "This image will replace the default site logo for users inside the contest." +msgstr "" + +#: judge/models/contest.py:101 +msgid "the amount of live participants" +msgstr "" + +#: judge/models/contest.py:102 +msgid "contest summary" +msgstr "" + +#: judge/models/contest.py:103 judge/models/problem.py:147 +msgid "Plain-text, shown in meta description tag, e.g. for social media." +msgstr "" + +#: judge/models/contest.py:104 judge/models/profile.py:46 +msgid "access code" +msgstr "" + +#: judge/models/contest.py:105 +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:107 judge/models/problem.py:141 +msgid "personae non gratae" +msgstr "" + +#: judge/models/contest.py:108 +msgid "Bans the selected users from joining this contest." +msgstr "" + +#: judge/models/contest.py:109 +msgid "contest format" +msgstr "" + +#: judge/models/contest.py:110 +msgid "The contest format module to use." +msgstr "" + +#: judge/models/contest.py:111 +msgid "contest format configuration" +msgstr "" + +#: judge/models/contest.py:112 +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:233 +msgid "See private contests" +msgstr "" + +#: judge/models/contest.py:234 +msgid "Edit own contests" +msgstr "" + +#: judge/models/contest.py:235 +msgid "Edit all contests" +msgstr "" + +#: judge/models/contest.py:236 +msgid "Clone contest" +msgstr "" + +#: judge/models/contest.py:237 templates/contest/moss.html:74 +msgid "MOSS contest" +msgstr "" + +#: judge/models/contest.py:238 +msgid "Rate contests" +msgstr "" + +#: judge/models/contest.py:239 +msgid "Contest access codes" +msgstr "" + +#: judge/models/contest.py:240 +msgid "Create private contests" +msgstr "" + +#: judge/models/contest.py:242 judge/models/contest.py:320 +#: judge/models/contest.py:356 judge/models/contest.py:378 +#: judge/models/submission.py:83 +msgid "contest" +msgstr "" + +#: judge/models/contest.py:243 +msgid "contests" +msgstr "" + +#: judge/models/contest.py:250 +msgid "associated contest" +msgstr "" + +#: judge/models/contest.py:253 +msgid "score" +msgstr "" + +#: judge/models/contest.py:254 +msgid "cumulative time" +msgstr "" + +#: judge/models/contest.py:255 +msgid "virtual participation id" +msgstr "" + +#: judge/models/contest.py:256 +msgid "0 means non-virtual, otherwise the n-th virtual participation" +msgstr "" + +#: judge/models/contest.py:257 +msgid "contest format specific data" +msgstr "" + +#: judge/models/contest.py:306 +#, python-format +msgid "%s spectating in %s" +msgstr "" + +#: judge/models/contest.py:308 +#, python-format +msgid "%s in %s, v%d" +msgstr "" + +#: judge/models/contest.py:309 +#, python-format +msgid "%s in %s" +msgstr "" + +#: judge/models/contest.py:312 +msgid "contest participation" +msgstr "" + +#: judge/models/contest.py:313 +msgid "contest participations" +msgstr "" + +#: judge/models/contest.py:319 judge/models/contest.py:340 +#: judge/models/contest.py:379 judge/models/problem.py:352 +#: judge/models/problem.py:357 judge/models/problem.py:375 +#: judge/models/problem_data.py:35 +msgid "problem" +msgstr "" + +#: judge/models/contest.py:321 judge/models/contest.py:344 +#: judge/models/problem.py:129 +msgid "points" +msgstr "" + +#: judge/models/contest.py:322 +msgid "partial" +msgstr "" + +#: judge/models/contest.py:323 judge/models/contest.py:345 +msgid "is pretested" +msgstr "" + +#: judge/models/contest.py:324 judge/models/interface.py:43 +msgid "order" +msgstr "" + +#: judge/models/contest.py:325 +msgid "output prefix length override" +msgstr "" + +#: judge/models/contest.py:326 +msgid "Maximum number of submissions for this problem, or 0 for no limit." +msgstr "" + +#: judge/models/contest.py:328 +msgid "Why include a problem you can't submit to?" +msgstr "" + +#: judge/models/contest.py:333 +msgid "contest problem" +msgstr "" + +#: judge/models/contest.py:334 +msgid "contest problems" +msgstr "" + +#: judge/models/contest.py:338 judge/models/submission.py:181 +msgid "submission" +msgstr "" + +#: judge/models/contest.py:342 judge/models/contest.py:357 +msgid "participation" +msgstr "" + +#: judge/models/contest.py:346 +msgid "Whether this submission was ran only on pretests." +msgstr "" + +#: judge/models/contest.py:350 +msgid "contest submission" +msgstr "" + +#: judge/models/contest.py:351 +msgid "contest submissions" +msgstr "" + +#: judge/models/contest.py:359 +msgid "rank" +msgstr "" + +#: judge/models/contest.py:360 +msgid "rating" +msgstr "" + +#: judge/models/contest.py:361 +msgid "volatility" +msgstr "" + +#: judge/models/contest.py:362 +msgid "last rated" +msgstr "" + +#: judge/models/contest.py:366 +msgid "contest rating" +msgstr "" + +#: judge/models/contest.py:367 +msgid "contest ratings" +msgstr "" + +#: judge/models/contest.py:386 +msgid "contest moss result" +msgstr "" + +#: judge/models/contest.py:387 +msgid "contest moss results" +msgstr "" + +#: judge/models/interface.py:24 +msgid "configuration item" +msgstr "" + +#: judge/models/interface.py:25 +msgid "miscellaneous configuration" +msgstr "" + +#: judge/models/interface.py:37 +msgid "navigation item" +msgstr "" + +#: judge/models/interface.py:38 +msgid "navigation bar" +msgstr "" + +#: judge/models/interface.py:44 +msgid "identifier" +msgstr "" + +#: judge/models/interface.py:45 +msgid "label" +msgstr "" + +#: judge/models/interface.py:47 +msgid "highlight regex" +msgstr "" + +#: judge/models/interface.py:48 +msgid "parent item" +msgstr "" + +#: judge/models/interface.py:66 +msgid "post title" +msgstr "" + +#: judge/models/interface.py:67 judge/models/problem.py:395 +msgid "authors" +msgstr "" + +#: judge/models/interface.py:68 +msgid "slug" +msgstr "" + +#: judge/models/interface.py:69 judge/models/problem.py:393 +msgid "public visibility" +msgstr "" + +#: judge/models/interface.py:70 +msgid "sticky" +msgstr "" + +#: judge/models/interface.py:71 +msgid "publish after" +msgstr "" + +#: judge/models/interface.py:72 +msgid "post content" +msgstr "" + +#: judge/models/interface.py:73 +msgid "post summary" +msgstr "" + +#: judge/models/interface.py:74 +msgid "openGraph image" +msgstr "" + +#: judge/models/interface.py:91 +msgid "Edit all posts" +msgstr "" + +#: judge/models/interface.py:93 +msgid "blog post" +msgstr "" + +#: judge/models/interface.py:94 +msgid "blog posts" +msgstr "" + +#: judge/models/message.py:11 +msgid "message title" +msgstr "" + +#: judge/models/message.py:12 judge/models/ticket.py:29 +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:26 +msgid "problem category ID" +msgstr "" + +#: judge/models/problem.py:27 +msgid "problem category name" +msgstr "" + +#: judge/models/problem.py:34 +msgid "problem type" +msgstr "" + +#: judge/models/problem.py:35 judge/models/problem.py:113 +msgid "problem types" +msgstr "" + +#: judge/models/problem.py:39 +msgid "problem group ID" +msgstr "" + +#: judge/models/problem.py:40 +msgid "problem group name" +msgstr "" + +#: judge/models/problem.py:47 judge/models/problem.py:116 +msgid "problem group" +msgstr "" + +#: judge/models/problem.py:48 +msgid "problem groups" +msgstr "" + +#: judge/models/problem.py:52 +msgid "key" +msgstr "" + +#: judge/models/problem.py:54 +msgid "link" +msgstr "" + +#: judge/models/problem.py:55 +msgid "full name" +msgstr "" + +#: judge/models/problem.py:56 judge/models/profile.py:32 +#: judge/models/runtime.py:23 +msgid "short name" +msgstr "" + +#: judge/models/problem.py:57 +msgid "Displayed on pages under this license" +msgstr "" + +#: judge/models/problem.py:58 +msgid "icon" +msgstr "" + +#: judge/models/problem.py:58 +msgid "URL to the icon" +msgstr "" + +#: judge/models/problem.py:59 +msgid "license text" +msgstr "" + +#: judge/models/problem.py:68 +msgid "license" +msgstr "" + +#: judge/models/problem.py:69 +msgid "licenses" +msgstr "" + +#: judge/models/problem.py:96 +msgid "problem code" +msgstr "" + +#: judge/models/problem.py:98 +msgid "A short, unique code for the problem, used in the url after /problem/" +msgstr "" + +#: judge/models/problem.py:100 +msgid "problem name" +msgstr "" + +#: judge/models/problem.py:101 +msgid "The full name of the problem, as shown in the problem list." +msgstr "" + +#: judge/models/problem.py:103 +msgid "problem body" +msgstr "" + +#: judge/models/problem.py:104 +msgid "creators" +msgstr "" + +#: judge/models/problem.py:105 +msgid "These users will be able to edit the problem, and be listed as authors." +msgstr "" + +#: judge/models/problem.py:107 +msgid "curators" +msgstr "" + +#: judge/models/problem.py:108 +msgid "These users will be able to edit the problem, but not be listed as authors." +msgstr "" + +#: judge/models/problem.py:110 +msgid "testers" +msgstr "" + +#: judge/models/problem.py:112 +msgid "These users will be able to view the private problem, but not edit it." +msgstr "" + +#: judge/models/problem.py:114 +msgid "The type of problem, as shown on the problem's page." +msgstr "" + +#: judge/models/problem.py:117 +msgid "The group of problem, shown under Category in the problem list." +msgstr "" + +#: judge/models/problem.py:119 +msgid "The time limit for this problem, in seconds. Fractional seconds (e.g. 1.5) are supported." +msgstr "" + +#: judge/models/problem.py:123 judge/models/problem.py:380 +msgid "memory limit" +msgstr "" + +#: judge/models/problem.py:124 +msgid "The memory limit for this problem, in kilobytes (e.g. 64mb = 65536 kilobytes)." +msgstr "" + +#: judge/models/problem.py:130 +msgid "Points awarded for problem completion. Points are displayed with a 'p' suffix if partial." +msgstr "" + +#: judge/models/problem.py:133 +msgid "allows partial points" +msgstr "" + +#: judge/models/problem.py:134 +msgid "allowed languages" +msgstr "" + +#: judge/models/problem.py:135 +msgid "List of allowed submission languages." +msgstr "" + +#: judge/models/problem.py:137 +msgid "manually managed" +msgstr "" + +#: judge/models/problem.py:138 +msgid "Whether judges should be allowed to manage data or not." +msgstr "" + +#: judge/models/problem.py:139 +msgid "date of publishing" +msgstr "" + +#: judge/models/problem.py:140 +msgid "Doesn't have magic ability to auto-publish due to backward compatibility" +msgstr "" + +#: judge/models/problem.py:142 +msgid "Bans the selected users from submitting to this problem." +msgstr "" + +#: judge/models/problem.py:144 +msgid "The license under which this problem is published." +msgstr "" + +#: judge/models/problem.py:146 +msgid "problem summary" +msgstr "" + +#: judge/models/problem.py:148 +msgid "number of users" +msgstr "" + +#: judge/models/problem.py:149 +msgid "The number of users who solved the problem." +msgstr "" + +#: judge/models/problem.py:150 +msgid "solve rate" +msgstr "" + +#: judge/models/problem.py:156 +msgid "If private, only these organizations may see the problem." +msgstr "" + +#: judge/models/problem.py:358 judge/models/problem.py:376 +#: judge/models/runtime.py:99 +msgid "language" +msgstr "" + +#: judge/models/problem.py:359 +msgid "translated name" +msgstr "" + +#: judge/models/problem.py:360 +msgid "translated description" +msgstr "" + +#: judge/models/problem.py:364 +msgid "problem translation" +msgstr "" + +#: judge/models/problem.py:365 +msgid "problem translations" +msgstr "" + +#: judge/models/problem.py:369 +msgid "clarified problem" +msgstr "" + +#: judge/models/problem.py:370 +msgid "clarification body" +msgstr "" + +#: judge/models/problem.py:371 +msgid "clarification timestamp" +msgstr "" + +#: judge/models/problem.py:386 +msgid "language-specific resource limit" +msgstr "" + +#: judge/models/problem.py:387 +msgid "language-specific resource limits" +msgstr "" + +#: judge/models/problem.py:391 +msgid "associated problem" +msgstr "" + +#: judge/models/problem.py:394 +msgid "publish date" +msgstr "" + +#: judge/models/problem.py:396 +msgid "editorial content" +msgstr "" + +#: judge/models/problem.py:412 +msgid "solution" +msgstr "" + +#: judge/models/problem.py:413 +msgid "solutions" +msgstr "" + +#: judge/models/problem_data.py:23 +msgid "Standard" +msgstr "" + +#: judge/models/problem_data.py:24 +msgid "Floats" +msgstr "" + +#: judge/models/problem_data.py:25 +msgid "Floats (absolute)" +msgstr "" + +#: judge/models/problem_data.py:26 +msgid "Floats (relative)" +msgstr "" + +#: judge/models/problem_data.py:27 +msgid "Non-trailing spaces" +msgstr "" + +#: judge/models/problem_data.py:28 +msgid "Unordered" +msgstr "" + +#: judge/models/problem_data.py:29 +msgid "Byte identical" +msgstr "" + +#: 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:39 +msgid "generator file" +msgstr "" + +#: judge/models/problem_data.py:41 judge/models/problem_data.py:90 +msgid "output prefix length" +msgstr "" + +#: judge/models/problem_data.py:42 judge/models/problem_data.py:91 +msgid "output limit length" +msgstr "" + +#: judge/models/problem_data.py:43 +msgid "init.yml generation feedback" +msgstr "" + +#: judge/models/problem_data.py:44 judge/models/problem_data.py:92 +msgid "checker" +msgstr "" + +#: judge/models/problem_data.py:45 judge/models/problem_data.py:93 +msgid "checker arguments" +msgstr "" + +#: 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:77 +msgid "problem data set" +msgstr "" + +#: judge/models/problem_data.py:79 +msgid "case position" +msgstr "" + +#: judge/models/problem_data.py:80 +msgid "case type" +msgstr "" + +#: judge/models/problem_data.py:81 +msgid "Normal case" +msgstr "" + +#: judge/models/problem_data.py:82 +msgid "Batch start" +msgstr "" + +#: judge/models/problem_data.py:83 +msgid "Batch end" +msgstr "" + +#: judge/models/problem_data.py:85 +msgid "input file name" +msgstr "" + +#: judge/models/problem_data.py:86 +msgid "output file name" +msgstr "" + +#: judge/models/problem_data.py:87 +msgid "generator arguments" +msgstr "" + +#: judge/models/problem_data.py:88 +msgid "point value" +msgstr "" + +#: judge/models/problem_data.py:89 +msgid "case is pretest?" +msgstr "" + +#: judge/models/profile.py:29 +msgid "organization title" +msgstr "" + +#: judge/models/profile.py:30 +msgid "organization slug" +msgstr "" + +#: judge/models/profile.py:31 +msgid "Organization name shown in URL" +msgstr "" + +#: judge/models/profile.py:33 +msgid "Displayed beside user name during contests" +msgstr "" + +#: judge/models/profile.py:34 +msgid "organization description" +msgstr "" + +#: judge/models/profile.py:35 +msgid "registrant" +msgstr "" + +#: judge/models/profile.py:36 +msgid "User who registered this organization" +msgstr "" + +#: judge/models/profile.py:37 +msgid "administrators" +msgstr "" + +#: judge/models/profile.py:38 +msgid "Those who can edit this organization" +msgstr "" + +#: judge/models/profile.py:39 +msgid "creation date" +msgstr "" + +#: judge/models/profile.py:40 +msgid "is open organization?" +msgstr "" + +#: judge/models/profile.py:41 +msgid "Allow joining organization" +msgstr "" + +#: judge/models/profile.py:42 +msgid "maximum size" +msgstr "" + +#: judge/models/profile.py:43 +msgid "Maximum amount of users in this organization, only applicable to private organizations" +msgstr "" + +#: judge/models/profile.py:45 +msgid "Student access code" +msgstr "" + +#: judge/models/profile.py:49 +msgid "This image will replace the default site logo for users viewing the organization." +msgstr "" + +#: judge/models/profile.py:75 judge/models/profile.py:91 +#: judge/models/profile.py:190 +msgid "organization" +msgstr "" + +#: judge/models/profile.py:80 +msgid "user associated" +msgstr "" + +#: judge/models/profile.py:81 +msgid "self-description" +msgstr "" + +#: judge/models/profile.py:82 +msgid "location" +msgstr "" + +#: judge/models/profile.py:84 +msgid "preferred language" +msgstr "" + +#: judge/models/profile.py:89 +msgid "last access time" +msgstr "" + +#: judge/models/profile.py:90 +msgid "last IP" +msgstr "" + +#: judge/models/profile.py:93 +msgid "display rank" +msgstr "" + +#: judge/models/profile.py:95 +msgid "comment mute" +msgstr "" + +#: judge/models/profile.py:95 +msgid "Some users are at their best when silent." +msgstr "" + +#: judge/models/profile.py:97 +msgid "unlisted user" +msgstr "" + +#: judge/models/profile.py:97 +msgid "User will not be ranked." +msgstr "" + +#: judge/models/profile.py:100 +msgid "user script" +msgstr "" + +#: judge/models/profile.py:101 +msgid "User-defined JavaScript for site customization." +msgstr "" + +#: judge/models/profile.py:102 +msgid "current contest" +msgstr "" + +#: judge/models/profile.py:104 +msgid "math engine" +msgstr "" + +#: judge/models/profile.py:106 +msgid "the rendering engine used to render math" +msgstr "" + +#: judge/models/profile.py:107 +msgid "2FA enabled" +msgstr "" + +#: judge/models/profile.py:108 +msgid "check to enable TOTP-based two factor authentication" +msgstr "" + +#: judge/models/profile.py:109 +msgid "TOTP key" +msgstr "" + +#: judge/models/profile.py:110 +msgid "32 character base32-encoded key for TOTP" +msgstr "" + +#: judge/models/profile.py:112 +msgid "TOTP key must be empty or base32" +msgstr "" + +#: judge/models/profile.py:113 +msgid "internal notes" +msgstr "" + +#: judge/models/profile.py:114 +msgid "Notes for administrators regarding this user." +msgstr "" + +#: judge/models/profile.py:184 +msgid "user profile" +msgstr "" + +#: judge/models/profile.py:185 +msgid "user profiles" +msgstr "" + +#: judge/models/profile.py:192 +msgid "request time" +msgstr "" + +#: judge/models/profile.py:193 +msgid "state" +msgstr "" + +#: judge/models/profile.py:198 +msgid "reason" +msgstr "" + +#: judge/models/profile.py:201 +msgid "organization join request" +msgstr "" + +#: judge/models/profile.py:202 +msgid "organization join requests" +msgstr "" + +#: judge/models/runtime.py:18 +msgid "short identifier" +msgstr "" + +#: judge/models/runtime.py:19 +msgid "The identifier for this language; the same as its executor id for judges." +msgstr "" + +#: judge/models/runtime.py:21 +msgid "long name" +msgstr "" + +#: judge/models/runtime.py:22 +msgid "Longer name for the language, e.g. \"Python 2\" or \"C++11\"." +msgstr "" + +#: judge/models/runtime.py:24 +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:28 +msgid "common name" +msgstr "" + +#: judge/models/runtime.py:29 +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:31 +msgid "ace mode name" +msgstr "" + +#: judge/models/runtime.py:32 +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:34 +msgid "pygments name" +msgstr "" + +#: judge/models/runtime.py:35 +msgid "Language ID for Pygments highlighting in source windows." +msgstr "" + +#: judge/models/runtime.py:36 +msgid "code template" +msgstr "" + +#: judge/models/runtime.py:37 +msgid "Code template to display in submission editor." +msgstr "" + +#: judge/models/runtime.py:38 +msgid "runtime info override" +msgstr "" + +#: judge/models/runtime.py:39 +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:41 +msgid "language description" +msgstr "" + +#: judge/models/runtime.py:42 +msgid "Use field this to inform users of quirks with your environment, additional restrictions, etc." +msgstr "" + +#: judge/models/runtime.py:44 +msgid "extension" +msgstr "" + +#: judge/models/runtime.py:45 +msgid "The extension of source files, e.g., \"py\" or \"cpp\"." +msgstr "" + +#: judge/models/runtime.py:100 +msgid "languages" +msgstr "" + +#: judge/models/runtime.py:104 +msgid "language to which this runtime belongs" +msgstr "" + +#: judge/models/runtime.py:105 +msgid "judge on which this runtime exists" +msgstr "" + +#: judge/models/runtime.py:106 +msgid "runtime name" +msgstr "" + +#: judge/models/runtime.py:107 +msgid "runtime version" +msgstr "" + +#: judge/models/runtime.py:108 +msgid "order in which to display this runtime" +msgstr "" + +#: judge/models/runtime.py:112 +msgid "Server name, hostname-style" +msgstr "" + +#: judge/models/runtime.py:113 +msgid "time of creation" +msgstr "" + +#: judge/models/runtime.py:114 +msgid "A key to authenticated this judge" +msgstr "" + +#: judge/models/runtime.py:115 +msgid "authentication key" +msgstr "" + +#: judge/models/runtime.py:116 +msgid "block judge" +msgstr "" + +#: judge/models/runtime.py:117 +msgid "Whether this judge should be blocked from connecting, even if its key is correct." +msgstr "" + +#: judge/models/runtime.py:119 +msgid "judge online status" +msgstr "" + +#: judge/models/runtime.py:120 +msgid "judge start time" +msgstr "" + +#: judge/models/runtime.py:121 +msgid "response time" +msgstr "" + +#: judge/models/runtime.py:122 +msgid "system load" +msgstr "" + +#: judge/models/runtime.py:123 +msgid "Load for the last minute, divided by processors to be fair." +msgstr "" + +#: judge/models/runtime.py:127 judge/models/runtime.py:167 +msgid "judges" +msgstr "" + +#: judge/models/runtime.py:166 +msgid "judge" +msgstr "" + +#: judge/models/submission.py:20 judge/models/submission.py:47 +#: judge/utils/problems.py:86 +msgid "Accepted" +msgstr "" + +#: judge/models/submission.py:21 judge/models/submission.py:48 +msgid "Wrong Answer" +msgstr "" + +#: judge/models/submission.py:22 judge/models/submission.py:50 +msgid "Time Limit Exceeded" +msgstr "" + +#: judge/models/submission.py:23 judge/models/submission.py:51 +msgid "Memory Limit Exceeded" +msgstr "" + +#: judge/models/submission.py:24 judge/models/submission.py:52 +msgid "Output Limit Exceeded" +msgstr "" + +#: judge/models/submission.py:25 judge/models/submission.py:53 +msgid "Invalid Return" +msgstr "" + +#: judge/models/submission.py:26 judge/models/submission.py:54 +msgid "Runtime Error" +msgstr "" + +#: judge/models/submission.py:27 judge/models/submission.py:41 +#: judge/models/submission.py:55 judge/utils/problems.py:88 +msgid "Compile Error" +msgstr "" + +#: judge/models/submission.py:28 judge/models/submission.py:40 +msgid "Internal Error" +msgstr "" + +#: judge/models/submission.py:29 +msgid "Short circuit" +msgstr "" + +#: judge/models/submission.py:30 judge/models/submission.py:42 +#: judge/models/submission.py:61 +msgid "Aborted" +msgstr "" + +#: judge/models/submission.py:36 judge/models/submission.py:57 +msgid "Queued" +msgstr "" + +#: judge/models/submission.py:37 judge/models/submission.py:58 +msgid "Processing" +msgstr "" + +#: judge/models/submission.py:38 judge/models/submission.py:59 +msgid "Grading" +msgstr "" + +#: judge/models/submission.py:39 judge/models/submission.py:60 +msgid "Completed" +msgstr "" + +#: judge/models/submission.py:56 +msgid "Internal Error (judging server error)" +msgstr "" + +#: judge/models/submission.py:66 +msgid "submission time" +msgstr "" + +#: judge/models/submission.py:67 judge/models/submission.py:201 +msgid "execution time" +msgstr "" + +#: judge/models/submission.py:68 judge/models/submission.py:202 +msgid "memory usage" +msgstr "" + +#: judge/models/submission.py:69 judge/models/submission.py:203 +msgid "points granted" +msgstr "" + +#: judge/models/submission.py:70 +msgid "submission language" +msgstr "" + +#: judge/models/submission.py:71 +msgid "status" +msgstr "" + +#: judge/models/submission.py:72 +msgid "result" +msgstr "" + +#: judge/models/submission.py:74 +msgid "compile errors" +msgstr "" + +#: judge/models/submission.py:76 +msgid "batched cases" +msgstr "" + +#: judge/models/submission.py:77 +msgid "test case points" +msgstr "" + +#: judge/models/submission.py:78 +msgid "test case total points" +msgstr "" + +#: judge/models/submission.py:79 +msgid "judged on" +msgstr "" + +#: judge/models/submission.py:81 +msgid "was rejudged by admin" +msgstr "" + +#: judge/models/submission.py:82 +msgid "was ran on pretests only" +msgstr "" + +#: judge/models/submission.py:182 templates/contest/moss.html:58 +msgid "submissions" +msgstr "" + +#: judge/models/submission.py:186 judge/models/submission.py:197 +msgid "associated submission" +msgstr "" + +#: judge/models/submission.py:188 +msgid "source code" +msgstr "" + +#: judge/models/submission.py:199 +msgid "test case ID" +msgstr "" + +#: judge/models/submission.py:200 +msgid "status flag" +msgstr "" + +#: judge/models/submission.py:204 +msgid "points possible" +msgstr "" + +#: judge/models/submission.py:205 +msgid "batch number" +msgstr "" + +#: judge/models/submission.py:206 +msgid "judging feedback" +msgstr "" + +#: judge/models/submission.py:207 +msgid "extended judging feedback" +msgstr "" + +#: judge/models/submission.py:208 +msgid "program output" +msgstr "" + +#: judge/models/submission.py:216 +msgid "submission test case" +msgstr "" + +#: judge/models/submission.py:217 +msgid "submission test cases" +msgstr "" + +#: judge/models/ticket.py:10 +msgid "ticket title" +msgstr "" + +#: judge/models/ticket.py:11 +msgid "ticket creator" +msgstr "" + +#: judge/models/ticket.py:13 +msgid "creation time" +msgstr "" + +#: judge/models/ticket.py:14 +msgid "assignees" +msgstr "" + +#: judge/models/ticket.py:15 +msgid "quick notes" +msgstr "" + +#: judge/models/ticket.py:16 +msgid "Staff notes for this issue to aid in processing." +msgstr "" + +#: judge/models/ticket.py:17 +msgid "linked item type" +msgstr "" + +#: judge/models/ticket.py:19 +msgid "linked item ID" +msgstr "" + +#: judge/models/ticket.py:21 +msgid "is ticket open?" +msgstr "" + +#: judge/models/ticket.py:25 +msgid "ticket" +msgstr "" + +#: judge/models/ticket.py:27 +msgid "poster" +msgstr "" + +#: judge/models/ticket.py:30 +msgid "message time" +msgstr "" + +#: judge/pdf_problems.py:134 judge/pdf_problems.py:186 +#: judge/pdf_problems.py:246 +msgid "Page [page] of [topage]" +msgstr "" + +#: judge/tasks/moss.py:25 +msgid "Running MOSS" +msgstr "" + +#: judge/tasks/submission.py:43 +msgid "Modifying submissions" +msgstr "" + +#: judge/tasks/submission.py:56 +msgid "Recalculating user points" +msgstr "" + +#: judge/utils/problem_data.py:63 +msgid "Empty batches not allowed." +msgstr "" + +#: 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 +#, python-format +msgid "Input file for case %d does not exist: %s" +msgstr "" + +#: 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 +#, python-format +msgid "Batch start case #%d requires points." +msgstr "" + +#: 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 +msgid "How did you corrupt the zip path?" +msgstr "" + +#: judge/utils/problem_data.py:160 +msgid "How did you corrupt the generator path?" +msgstr "" + +#: judge/utils/problems.py:76 +msgid "Can't pass both queryset and keyword filters" +msgstr "" + +#: judge/utils/problems.py:87 +msgid "Wrong" +msgstr "" + +#: judge/utils/problems.py:89 +msgid "Timeout" +msgstr "" + +#: judge/utils/problems.py:90 +msgid "Error" +msgstr "" + +#: 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/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] "" +msgstr[2] "" +msgstr[3] "" + +#: 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] "" +msgstr[2] "" +msgstr[3] "" + +#: judge/utils/timedelta.py:61 +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: judge/utils/timedelta.py:63 +msgctxt "hours and minutes" +msgid "%h:%m" +msgstr "" + +#: judge/views/blog.py:38 +#, python-format +msgid "Page %d of Posts" +msgstr "" + +#: judge/views/comment.py:27 +msgid "Messing around, are we?" +msgstr "" + +#: judge/views/comment.py:36 +msgid "You must solve at least one problem before you can vote." +msgstr "" + +#: judge/views/comment.py:63 +msgid "You already voted." +msgstr "" + +#: judge/views/comment.py:120 judge/views/organization.py:299 +msgid "Edited from site" +msgstr "" + +#: judge/views/comment.py:141 +msgid "Editing comment" +msgstr "" + +#: judge/views/contests.py:49 judge/views/contests.py:211 +#: judge/views/contests.py:214 judge/views/contests.py:385 +msgid "No such contest" +msgstr "" + +#: judge/views/contests.py:50 judge/views/contests.py:212 +#, python-format +msgid "Could not find a contest with the key \"%s\"." +msgstr "" + +#: judge/views/contests.py:75 +msgid "Contests" +msgstr "" + +#: judge/views/contests.py:215 +msgid "Could not find such contest." +msgstr "" + +#: judge/views/contests.py:218 +#, python-format +msgid "Access to contest \"%s\" denied" +msgstr "" + +#: judge/views/contests.py:242 +msgid "Clone Contest" +msgstr "" + +#: judge/views/contests.py:305 +msgid "Contest not ongoing" +msgstr "" + +#: judge/views/contests.py:306 +#, python-format +msgid "\"%s\" is not currently ongoing." +msgstr "" + +#: judge/views/contests.py:310 +msgid "Already in contest" +msgstr "" + +#: judge/views/contests.py:311 +#, python-format +msgid "You are already in a contest: \"%s\"." +msgstr "" + +#: judge/views/contests.py:314 +msgid "Banned from joining" +msgstr "" + +#: judge/views/contests.py:315 +msgid "You have been declared persona non grata for this contest. You are permanently barred from joining this contest." +msgstr "" + +#: judge/views/contests.py:375 +#, python-format +msgid "Enter access code for \"%s\"" +msgstr "" + +#: judge/views/contests.py:386 +#, python-format +msgid "You are not in contest \"%s\"." +msgstr "" + +#: judge/views/contests.py:405 +msgid "ContestCalendar requires integer year and month" +msgstr "" + +#: judge/views/contests.py:445 +#, python-format +msgid "Contests in %(month)s" +msgstr "" + +#: judge/views/contests.py:445 +msgid "F Y" +msgstr "" + +#: judge/views/contests.py:531 +msgid "???" +msgstr "" + +#: judge/views/contests.py:594 +#, python-format +msgid "%s Rankings" +msgstr "" + +#: judge/views/contests.py:610 +#, python-format +msgid "Your participation in %s" +msgstr "" + +#: judge/views/contests.py:611 +#, python-format +msgid "%s's participation in %s" +msgstr "" + +#: judge/views/contests.py:615 +msgid "Live" +msgstr "" + +#: judge/views/contests.py:627 templates/contest/contest-tabs.html:13 +msgid "Participation" +msgstr "" + +#: judge/views/contests.py:654 +#, python-format +msgid "%s MOSS Results" +msgstr "" + +#: judge/views/contests.py:681 +#, python-format +msgid "Running MOSS for %s..." +msgstr "" + +#: judge/views/contests.py:704 +#, python-format +msgid "Contest tag: %s" +msgstr "" + +#: judge/views/error.py:14 +msgid "404 error" +msgstr "" + +#: judge/views/error.py:15 +#, python-format +msgid "Could not find page \"%s\"" +msgstr "" + +#: judge/views/error.py:22 +#, python-format +msgid "no permission for %s" +msgstr "" + +#: 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 +msgid "Runtimes" +msgstr "" + +#: judge/views/organization.py:44 judge/views/organization.py:47 +msgid "No such organization" +msgstr "" + +#: judge/views/organization.py:45 +#, python-format +msgid "Could not find an organization with the key \"%s\"." +msgstr "" + +#: judge/views/organization.py:48 +msgid "Could not find such organization." +msgstr "" + +#: judge/views/organization.py:72 judge/views/register.py:34 +#: templates/organization/list.html:15 templates/user/user-list-tabs.html:5 +msgid "Organizations" +msgstr "" + +#: judge/views/organization.py:93 +#, python-format +msgid "%s Members" +msgstr "" + +#: judge/views/organization.py:118 judge/views/organization.py:121 +#: judge/views/organization.py:126 +msgid "Joining organization" +msgstr "" + +#: judge/views/organization.py:118 +msgid "You are already in the organization." +msgstr "" + +#: judge/views/organization.py:121 +msgid "This organization is not open." +msgstr "" + +#: judge/views/organization.py:138 +msgid "Leaving organization" +msgstr "" + +#: judge/views/organization.py:138 +#, python-format +msgid "You are not in \"%s\"." +msgstr "" + +#: judge/views/organization.py:162 +#, python-format +msgid "Request to join %s" +msgstr "" + +#: judge/views/organization.py:180 +msgid "Join request detail" +msgstr "" + +#: judge/views/organization.py:209 +#, python-format +msgid "Managing join requests for %s" +msgstr "" + +#: judge/views/organization.py:240 +#, python-format +msgid "Your organization can only receive %d more members. You cannot approve %d users." +msgstr "" + +#: judge/views/organization.py:252 +#, python-format +msgid "Approved %d user." +msgid_plural "Approved %d users." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: judge/views/organization.py:253 +#, python-format +msgid "Rejected %d user." +msgid_plural "Rejected %d users." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: judge/views/organization.py:283 +#, python-format +msgid "Editing %s" +msgstr "" + +#: judge/views/organization.py:307 judge/views/organization.py:315 +msgid "Can't edit organization" +msgstr "" + +#: judge/views/organization.py:308 +msgid "You are not allowed to edit this organization." +msgstr "" + +#: judge/views/organization.py:316 +msgid "You are not allowed to kick people from this organization." +msgstr "" + +#: judge/views/organization.py:321 judge/views/organization.py:325 +msgid "Can't kick user" +msgstr "" + +#: judge/views/organization.py:322 +msgid "The user you are trying to kick does not exist!" +msgstr "" + +#: judge/views/organization.py:326 +#, python-format +msgid "The user you are trying to kick is not in organization: %s." +msgstr "" + +#: judge/views/problem.py:68 +msgid "No such problem" +msgstr "" + +#: judge/views/problem.py:69 +#, python-format +msgid "Could not find a problem with the code \"%s\"." +msgstr "" + +#: judge/views/problem.py:111 +#, python-brace-format +msgid "Editorial for {0}" +msgstr "" + +#: judge/views/problem.py:114 +#, python-brace-format +msgid "Editorial for {0}" +msgstr "" + +#: judge/views/problem.py:285 templates/contest/contest.html:79 +#: templates/user/user-tabs.html:5 templates/user/users-table.html:23 +msgid "Problems" +msgstr "" + +#: judge/views/problem.py:546 +msgid "Banned from submitting" +msgstr "" + +#: judge/views/problem.py:547 +msgid "You have been declared persona non grata for this problem. You are permanently barred from submitting this problem." +msgstr "" + +#: judge/views/problem.py:560 +msgid "Too many submissions" +msgstr "" + +#: judge/views/problem.py:561 +msgid "You have exceeded the submission limit for this problem." +msgstr "" + +#: judge/views/problem.py:627 judge/views/problem.py:630 +#, python-format +msgid "Submit to %(problem)s" +msgstr "" + +#: judge/views/problem.py:646 +msgid "Clone Problem" +msgstr "" + +#: judge/views/problem_data.py:37 +msgid "Checker arguments must be a JSON object" +msgstr "" + +#: judge/views/problem_data.py:39 +msgid "Checker arguments is invalid JSON" +msgstr "" + +#: judge/views/problem_data.py:46 +msgid "Your zip file is invalid!" +msgstr "" + +#: judge/views/problem_data.py:104 +#, python-brace-format +msgid "Comparing submissions for {0}" +msgstr "" + +#: judge/views/problem_data.py:107 +#, python-brace-format +msgid "Comparing submissions for {0}" +msgstr "" + +#: judge/views/problem_data.py:142 +#, python-brace-format +msgid "Editing data for {0}" +msgstr "" + +#: judge/views/problem_data.py:145 +#, python-format +msgid "Editing data for %s" +msgstr "" + +#: judge/views/problem_data.py:237 judge/views/problem_data.py:238 +#, python-format +msgid "Generated init.yml for %s" +msgstr "" + +#: 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] "" +msgstr[2] "" +msgstr[3] "" + +#: judge/views/ranked_submission.py:58 +#, python-format +msgid "Best solutions for %s" +msgstr "" + +#: judge/views/ranked_submission.py:61 +#, python-brace-format +msgid "Best solutions for {0}" +msgstr "" + +#: judge/views/ranked_submission.py:71 +#, python-format +msgid "Best solutions for %(problem)s in %(contest)s" +msgstr "" + +#: judge/views/ranked_submission.py:74 +#, python-format +msgid "Best solutions for problem %(number)s in %(contest)s" +msgstr "" + +#: judge/views/ranked_submission.py:80 +#, python-brace-format +msgid "Best solutions for {0} in {2}" +msgstr "" + +#: judge/views/ranked_submission.py:83 +#, python-brace-format +msgid "Best solutions for problem {0} in {1}" +msgstr "" + +#: judge/views/register.py:27 +msgid "A username must contain letters, numbers, or underscores" +msgstr "" + +#: judge/views/register.py:31 templates/user/edit-profile.html:103 +msgid "Preferred language" +msgstr "" + +#: judge/views/register.py:38 +msgid "Subscribe to newsletter?" +msgstr "" + +#: judge/views/register.py:45 +#, python-format +msgid "The email address \"%s\" is already taken. Only one registration is allowed per address." +msgstr "" + +#: judge/views/register.py:51 +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 +msgid "Registration" +msgstr "" + +#: judge/views/register.py:106 +msgid "Authentication failure" +msgstr "" + +#: judge/views/stats.py:105 +msgid "Language statistics" +msgstr "" + +#: judge/views/status.py:24 templates/submission/list.html:319 +msgid "Status" +msgstr "" + +#: judge/views/status.py:108 +msgid "Version matrix" +msgstr "" + +#: judge/views/submission.py:59 judge/views/submission.py:66 +#, python-format +msgid "Submission of %(problem)s by %(user)s" +msgstr "" + +#: judge/views/submission.py:161 judge/views/submission.py:162 +#: templates/problem/problem.html:127 +msgid "All submissions" +msgstr "" + +#: judge/views/submission.py:303 +msgid "All my submissions" +msgstr "" + +#: judge/views/submission.py:304 +#, python-format +msgid "All submissions by %s" +msgstr "" + +#: judge/views/submission.py:335 +#, python-format +msgid "All submissions for %s" +msgstr "" + +#: judge/views/submission.py:354 +msgid "Must pass a problem" +msgstr "" + +#: judge/views/submission.py:397 +#, python-format +msgid "My submissions for %(problem)s" +msgstr "" + +#: judge/views/submission.py:398 +#, python-format +msgid "%(user)s's submissions for %(problem)s" +msgstr "" + +#: judge/views/submission.py:495 +msgid "Must pass a contest" +msgstr "" + +#: judge/views/submission.py:514 +#, python-brace-format +msgid "{0}'s submissions for {2} in {4}" +msgstr "" + +#: judge/views/submission.py:519 +#, 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 "" + +#: judge/views/ticket.py:40 +msgid "Issue description" +msgstr "" + +#: judge/views/ticket.py:85 judge/views/ticket.py:88 +#, python-format +msgid "New ticket for %s" +msgstr "" + +#: judge/views/ticket.py:139 +#, python-format +msgid "%(title)s - Ticket %(id)d" +msgstr "" + +#: judge/views/ticket.py:248 +#, python-format +msgid "Tickets - Page %(number)d of %(total)d" +msgstr "" + +#: judge/views/ticket.py:297 +#, python-format +msgid "New Ticket: %s" +msgstr "" + +#: judge/views/ticket.py:298 +#, python-format +msgid "#%(id)d, assigned to: %(users)s" +msgstr "" + +#: judge/views/ticket.py:300 +msgid ", " +msgstr "" + +#: judge/views/ticket.py:300 +msgid "no one" +msgstr "" + +#: judge/views/totp.py:42 templates/registration/totp_enable.html:86 +msgid "Enable Two Factor Authentication" +msgstr "" + +#: judge/views/totp.py:89 templates/registration/totp_disable.html:48 +msgid "Disable Two Factor Authentication" +msgstr "" + +#: judge/views/totp.py:103 +msgid "Perform Two Factor Authentication" +msgstr "" + +#: judge/views/user.py:68 +msgid "No such user" +msgstr "" + +#: judge/views/user.py:68 +#, python-format +msgid "No user handle \"%s\"." +msgstr "" + +#: judge/views/user.py:72 +msgid "My account" +msgstr "" + +#: judge/views/user.py:73 +#, python-format +msgid "User %s" +msgstr "" + +#: judge/views/user.py:136 +msgid "M j, Y, G:i" +msgstr "" + +#: judge/views/user.py:221 +msgid "Updated on site" +msgstr "" + +#: judge/views/user.py:253 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:10 +msgid "Edit profile" +msgstr "" + +#: judge/views/user.py:262 templates/user/user-list-tabs.html:4 +msgid "Leaderboard" +msgstr "" + +#: judge/views/widgets.py:48 judge/views/widgets.py:58 +#, python-format +msgid "Invalid upstream data: %s" +msgstr "" + +#: judge/views/widgets.py:68 +msgid "Bad latitude or longitude" +msgstr "" + +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:13 +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:27 +msgid "Photo" +msgstr "" + +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:14 +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:28 +msgid "Photos" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:9 +msgid "first name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:10 +msgid "last name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:11 +msgid "biography" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/admin.py:24 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:30 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:30 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:30 +msgid "owner" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:12 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:12 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:12 +msgid "name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:19 +msgid "Category of Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:20 +msgid "Categories of Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:26 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:26 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:26 +msgid "title" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:28 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:28 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:28 +msgid "category" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:29 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:29 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:29 +msgid "author" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:31 +msgid "publication date" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:37 +msgid "Book" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:38 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:136 +msgid "Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:19 +msgid "Category of CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:20 +msgid "Categories of CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:36 +msgid "CD" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:37 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:141 +msgid "CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:19 +msgid "Category of DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:20 +msgid "Categories of DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:36 +msgid "DVD" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:37 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:146 +msgid "DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/templates/admin/base_site.html:7 +msgid "Django administration" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/forms.py:12 +#, python-format +msgid "Please enter the correct %(username)s and password for an admin account. Note that both fields may be case-sensitive." +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/forms.py:32 +#, python-format +msgid "Please enter the correct %(username)s and password for an user account. Note that both fields may be case-sensitive." +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:27 +msgid "Site" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:38 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:41 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:130 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:133 +msgid "Dashboard" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:48 +msgid "Applications" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:53 +msgid "Administration" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:64 +msgid "Color theme" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:66 +msgid "Change color theme" +msgstr "" + +#: 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 +msgid "Rate all ratable contests" +msgstr "" + +#: 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 +msgid "Rejudge" +msgstr "" + +#: templates/base.html:214 +#, python-format +msgid "Hello, %(username)s." +msgstr "" + +#: templates/base.html:220 templates/comments/list.html:89 +#: templates/contest/contest-list-tabs.html:24 +#: templates/problem/problem-list-tabs.html:6 +#: templates/submission/info-base.html:12 +#: templates/submission/submission-list-tabs.html:15 +msgid "Admin" +msgstr "" + +#: templates/base.html:229 +msgid "Log out" +msgstr "" + +#: templates/base.html:238 +#: templates/registration/password_reset_complete.html:4 +msgid "Log in" +msgstr "" + +#: templates/base.html:239 templates/registration/registration_form.html:177 +msgid "or" +msgstr "" + +#: templates/base.html:240 +msgid "Sign up" +msgstr "" + +#: templates/base.html:252 +msgid "spectating" +msgstr "" + +#: 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:20 +#: 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 +msgid "Edit" +msgstr "" + +#: templates/blog/content.html:27 +#, python-format +msgid "\n" +" posted on %(time)s\n" +" " +msgstr "" + +#: templates/blog/dashboard.html:21 +#, python-format +msgid "\n" +" on %(time)s\n" +" " +msgstr "" + +#: templates/blog/list.html:85 +msgid "Blog" +msgstr "" + +#: templates/blog/list.html:87 +msgid "Events" +msgstr "" + +#: templates/blog/list.html:92 +msgid "News" +msgstr "" + +#: templates/blog/list.html:106 +#, python-brace-format +msgid "posted on {time}" +msgstr "" + +#: templates/blog/list.html:130 templates/problem/problem.html:310 +msgid "Clarifications" +msgstr "" + +#: templates/blog/list.html:146 templates/problem/problem.html:321 +msgid "No clarifications have been made at this time." +msgstr "" + +#: templates/blog/list.html:154 +msgid "Ongoing contests" +msgstr "" + +#: templates/blog/list.html:172 +msgid "Upcoming contests" +msgstr "" + +#: templates/blog/list.html:189 +msgid "Comment stream" +msgstr "" + +#: templates/blog/list.html:208 +msgid "New problems" +msgstr "" + +#: templates/blog/list.html:225 +msgid "My open tickets" +msgstr "" + +#: templates/blog/list.html:246 +msgid "New tickets" +msgstr "" + +#: templates/comments/list.html:2 +msgid "Comments" +msgstr "" + +#: templates/comments/list.html:18 templates/comments/list.html:27 +msgid "Please login to vote" +msgstr "" + +#: templates/comments/list.html:40 +#, python-brace-format +msgid "commented on {time}" +msgstr "" + +#: templates/comments/list.html:49 +#, python-format +msgid "edit %(edits)s" +msgstr "" + +#: templates/comments/list.html:51 templates/comments/media-js.html:77 +msgid "edited" +msgstr "" + +#: templates/comments/list.html:60 +msgid "Link" +msgstr "" + +#: templates/comments/list.html:73 templates/comments/list.html:80 +msgid "Reply" +msgstr "" + +#: templates/comments/list.html:86 +msgid "Hide" +msgstr "" + +#: templates/comments/list.html:101 +#, 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:120 +msgid "There are no comments at the moment." +msgstr "" + +#: templates/comments/list.html:126 +msgid "New comment" +msgstr "" + +#: templates/comments/list.html:140 +msgid "Invalid comment body." +msgstr "" + +#: templates/comments/list.html:148 +msgid "Post!" +msgstr "" + +#: templates/comments/list.html:156 +msgid "Comments are disabled on this page." +msgstr "" + +#: templates/comments/media-js.html:72 +#, python-brace-format +msgid "edit {edits}" +msgstr "" + +#: templates/comments/media-js.html:75 +msgid "original" +msgstr "" + +#: templates/contest/access_code.html:26 +msgid "Invalid access code." +msgstr "" + +#: templates/contest/access_code.html:29 +msgid "Please enter your access code:" +msgstr "" + +#: templates/contest/access_code.html:32 +msgid "Join Contest" +msgstr "" + +#: templates/contest/calendar.html:12 +msgid "Sunday" +msgstr "" + +#: templates/contest/calendar.html:13 +msgid "Monday" +msgstr "" + +#: templates/contest/calendar.html:14 +msgid "Tuesday" +msgstr "" + +#: templates/contest/calendar.html:15 +msgid "Wednesday" +msgstr "" + +#: templates/contest/calendar.html:16 +msgid "Thursday" +msgstr "" + +#: templates/contest/calendar.html:17 +msgid "Friday" +msgstr "" + +#: templates/contest/calendar.html:18 +msgid "Saturday" +msgstr "" + +#: 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 +msgid "Today" +msgstr "" + +#: templates/contest/contest-list-tabs.html:13 +msgid "Next" +msgstr "" + +#: templates/contest/contest-list-tabs.html:21 +#: templates/problem/problem-list-tabs.html:5 +msgid "List" +msgstr "" + +#: templates/contest/contest-list-tabs.html:22 +msgid "Calendar" +msgstr "" + +#: templates/contest/contest-tabs.html:4 +msgid "Info" +msgstr "" + +#: templates/contest/contest-tabs.html:8 +msgid "Rankings" +msgstr "" + +#: templates/contest/contest-tabs.html:10 +msgid "Hidden Rankings" +msgstr "" + +#: templates/contest/contest-tabs.html:18 +msgid "MOSS" +msgstr "" + +#: templates/contest/contest-tabs.html:23 +msgid "Clone" +msgstr "" + +#: templates/contest/contest-tabs.html:34 +#: templates/contest/contest-tabs.html:54 +msgid "Leave contest" +msgstr "" + +#: templates/contest/contest-tabs.html:41 templates/contest/list.html:293 +msgid "Virtual join" +msgstr "" + +#: templates/contest/contest-tabs.html:52 +msgid "Stop spectating" +msgstr "" + +#: templates/contest/contest-tabs.html:61 +msgid "Spectate contest" +msgstr "" + +#: templates/contest/contest-tabs.html:67 +#: templates/contest/contest-tabs.html:73 +msgid "Join contest" +msgstr "" + +#: templates/contest/contest-tabs.html:82 +msgid "Login to participate" +msgstr "" + +#: templates/contest/contest.html:37 +msgid "Participating virtually." +msgstr "" + +#: templates/contest/contest.html:43 +msgid "Contest is over." +msgstr "" + +#: templates/contest/contest.html:59 templates/contest/contest.html:63 +msgid "F j, Y, G:i T" +msgstr "" + +#: 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 +#, python-format +msgid "%(length)s long starting on %(start_time)s" +msgstr "" + +#: templates/contest/contest.html:85 +msgid "AC Rate" +msgstr "" + +#: templates/contest/contest.html:86 templates/contest/list.html:153 +#: templates/contest/list.html:195 templates/contest/list.html:271 +#: templates/problem/list.html:212 templates/problem/list.html:238 +msgid "Users" +msgstr "" + +#: templates/contest/contest.html:111 +msgid "Editorial" +msgstr "" + +#: templates/contest/list.html:31 templates/contest/media-js.html:9 +msgid "Are you sure you want to join?" +msgstr "" + +#: 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:65 +msgid "hidden" +msgstr "" + +#: templates/contest/list.html:70 +msgid "private" +msgstr "" + +#: templates/contest/list.html:84 +msgid "rated" +msgstr "" + +#: templates/contest/list.html:132 +msgid "Spectate" +msgstr "" + +#: templates/contest/list.html:138 +msgid "Join" +msgstr "" + +#: templates/contest/list.html:148 +msgid "Active Contests" +msgstr "" + +#: templates/contest/list.html:152 templates/contest/list.html:194 +#: templates/contest/list.html:232 templates/contest/list.html:270 +msgid "Contest" +msgstr "" + +#: templates/contest/list.html:190 +msgid "Ongoing Contests" +msgstr "" + +#: templates/contest/list.html:227 +msgid "Upcoming Contests" +msgstr "" + +#: templates/contest/list.html:255 +msgid "There are no scheduled contests at this time." +msgstr "" + +#: templates/contest/list.html:261 +msgid "Past Contests" +msgstr "" + +#: templates/contest/media-js.html:4 +msgid "Are you sure you want to leave?" +msgstr "" + +#: 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 +msgid "Joining a contest starts your timer, after which it becomes unstoppable." +msgstr "" + +#: 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:7 +msgid "Organization" +msgstr "" + +#: templates/contest/ranking-table.html:27 +#, python-brace-format +msgid "Started on {time}" +msgstr "" + +#: templates/contest/ranking-table.html:30 +msgid "Participation ended." +msgstr "" + +#: templates/contest/ranking.html:232 +msgid "View user participation" +msgstr "" + +#: templates/contest/ranking.html:236 +msgid "Show organizations" +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 +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 +msgid "activate" +msgstr "" + +#: 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 +msgid "Newsletter unsubscribe" +msgstr "" + +#: 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 +msgid "Do you want to unsubscribe from this newsletter?" +msgstr "" + +#: 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 +msgid "Newsletter update" +msgstr "" + +#: 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 +msgid "Update subscription" +msgstr "" + +#: templates/newsletter/subscription_update_activated.html:8 +msgid "Your subscription has successfully been updated." +msgstr "" + +#: 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:34 +#: templates/ticket/edit-notes.html:4 +msgid "Update" +msgstr "" + +#: 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:29 +msgid "Join organization" +msgstr "" + +#: templates/organization/home.html:33 +msgid "Request membership" +msgstr "" + +#: templates/organization/home.html:39 +msgid "Edit organization" +msgstr "" + +#: templates/organization/home.html:43 +msgid "View requests" +msgstr "" + +#: templates/organization/home.html:50 +msgid "Admin organization" +msgstr "" + +#: templates/organization/home.html:55 +msgid "View members" +msgstr "" + +#: templates/organization/list.html:23 templates/status/language-list.html:34 +msgid "Name" +msgstr "" + +#: templates/organization/list.html:24 +msgid "Members" +msgstr "" + +#: templates/organization/new.html:10 templates/ticket/new.html:38 +msgid "Create" +msgstr "" + +#: templates/organization/requests/detail.html:13 +msgid "User:" +msgstr "" + +#: templates/organization/requests/detail.html:17 +msgid "Organization:" +msgstr "" + +#: templates/organization/requests/detail.html:25 +msgid "Time:" +msgstr "" + +#: templates/organization/requests/detail.html:29 +msgid "Reason:" +msgstr "" + +#: 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:15 +msgid "Reason" +msgstr "" + +#: 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:17 +#: templates/problem/data.html:401 +msgid "Delete?" +msgstr "" + +#: templates/organization/requests/request.html:18 +msgid "Your reason for joining:" +msgstr "" + +#: templates/organization/requests/request.html:20 +msgid "Request" +msgstr "" + +#: templates/organization/requests/tabs.html:4 +msgid "Pending" +msgstr "" + +#: templates/organization/requests/tabs.html:7 +msgid "Log" +msgstr "" + +#: templates/organization/requests/tabs.html:10 +msgid "Approved" +msgstr "" + +#: templates/organization/requests/tabs.html:13 +msgid "Rejected" +msgstr "" + +#: templates/organization/users-table.html:15 +msgid "Kick" +msgstr "" + +#: templates/problem/clone.html:37 +msgid "Enter a new code for the cloned problem:" +msgstr "" + +#: templates/problem/data.html:353 +msgid "View YAML" +msgstr "" + +#: templates/problem/data.html:369 +msgid "Show columns:" +msgstr "" + +#: templates/problem/data.html:372 templates/problem/data.html:396 +msgid "Output prefix" +msgstr "" + +#: templates/problem/data.html:376 templates/problem/data.html:397 +msgid "Output limit" +msgstr "" + +#: templates/problem/data.html:380 templates/problem/data.html:398 +msgid "Checker" +msgstr "" + +#: templates/problem/data.html:384 templates/problem/data.html:399 +msgid "Generator args" +msgstr "" + +#: templates/problem/data.html:391 +msgid "Type" +msgstr "" + +#: templates/problem/data.html:392 +msgid "Input file" +msgstr "" + +#: templates/problem/data.html:393 +msgid "Output file" +msgstr "" + +#: templates/problem/data.html:395 +msgid "Pretest?" +msgstr "" + +#: templates/problem/data.html:447 templates/problem/submit.html:252 +msgid "Submit!" +msgstr "" + +#: templates/problem/data.html:448 +msgid "Add new case" +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 editorialist.

Submitting an official solution before solving the problem yourself is a bannable offence." +msgstr "" + +#: templates/problem/list.html:62 +msgid "Filter by type..." +msgstr "" + +#: templates/problem/list.html:185 +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:57 +msgid "Category" +msgstr "" + +#: templates/problem/list.html:209 templates/problem/list.html:228 +msgid "Types" +msgstr "" + +#: templates/problem/list.html:235 +#, python-format +msgid "AC %%" +msgstr "" + +#: 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:142 +msgid "Filter by result:" +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:101 templates/problem/problem.html:111 +#: templates/problem/problem.html:116 +msgid "Submit solution" +msgstr "" + +#: templates/problem/problem.html:104 +#, python-format +msgid "%(counter)s submission left" +msgid_plural "%(counter)s submissions left" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: templates/problem/problem.html:112 +msgid "0 submissions left" +msgstr "" + +#: templates/problem/problem.html:124 +msgid "My submissions" +msgstr "" + +#: templates/problem/problem.html:128 +msgid "Best submissions" +msgstr "" + +#: templates/problem/problem.html:132 +msgid "Read editorial" +msgstr "" + +#: templates/problem/problem.html:137 +msgid "Manage tickets" +msgstr "" + +#: templates/problem/problem.html:141 +msgid "Edit problem" +msgstr "" + +#: templates/problem/problem.html:143 +msgid "Edit test data" +msgstr "" + +#: templates/problem/problem.html:148 +msgid "My tickets" +msgstr "" + +#: templates/problem/problem.html:156 +msgid "Manage submissions" +msgstr "" + +#: templates/problem/problem.html:162 +msgid "Clone problem" +msgstr "" + +#: templates/problem/problem.html:169 +msgid "Points:" +msgstr "" + +#: templates/problem/problem.html:172 templates/problem/problem.html:174 +msgid "(partial)" +msgstr "" + +#: templates/problem/problem.html:179 +msgid "Time limit:" +msgstr "" + +#: templates/problem/problem.html:191 +msgid "Memory limit:" +msgstr "" + +#: templates/problem/problem.html:210 +msgid "Author:" +msgid_plural "Authors:" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: templates/problem/problem.html:225 +msgid "Problem type" +msgid_plural "Problem types" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: templates/problem/problem.html:238 +msgid "Allowed languages" +msgstr "" + +#: templates/problem/problem.html:246 +#, python-format +msgid "No %(lang)s judge online" +msgstr "" + +#: templates/problem/problem.html:257 +msgid "Judge:" +msgid_plural "Judges:" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: templates/problem/problem.html:274 +msgid "none available" +msgstr "" + +#: templates/problem/problem.html:299 +msgid "Request clarification" +msgstr "" + +#: templates/problem/problem.html:301 +msgid "Report an issue" +msgstr "" + +#: 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 +msgid "Search problems..." +msgstr "" + +#: templates/problem/search-form.html:14 +msgid "Full text search" +msgstr "" + +#: templates/problem/search-form.html:21 +msgid "Hide solved problems" +msgstr "" + +#: 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 +msgid "All" +msgstr "" + +#: templates/problem/search-form.html:46 +msgid "Problem types" +msgstr "" + +#: templates/problem/search-form.html:57 +msgid "Point range" +msgstr "" + +#: templates/problem/search-form.html:63 templates/submission/list.html:337 +#: templates/ticket/list.html:248 +msgid "Go" +msgstr "" + +#: templates/problem/search-form.html:64 +msgid "Random" +msgstr "" + +#: templates/problem/submit.html:192 +#, python-format +msgid "Warning! Your default language, %(default_language)s, is unavailable for this problem and has been deselected." +msgstr "" + +#: templates/problem/submit.html:203 +#, python-format +msgid "\n" +" You have %(left)s submission left\n" +" " +msgid_plural "\n" +" You have %(left)s submissions left\n" +" " +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: templates/problem/submit.html:212 +msgid "You have 0 submissions left" +msgstr "" + +#: templates/problem/submit.html:250 +msgid "No judge is available for this problem." +msgstr "" + +#: templates/registration/activate.html:3 +#, python-format +msgid "%(key)s is an invalid activation key." +msgstr "" + +#: templates/registration/activation_complete.html:3 +msgid "Your account has been successfully activated." +msgstr "" + +#: templates/registration/login.html:43 +msgid "Invalid username or password." +msgstr "" + +#: templates/registration/login.html:61 +#: templates/registration/totp_auth.html:39 +msgid "Login!" +msgstr "" + +#: templates/registration/login.html:64 +msgid "Forgot your password?" +msgstr "" + +#: templates/registration/login.html:67 +msgid "Or log in with..." +msgstr "" + +#: templates/registration/logout.html:3 +msgid "See you later!" +msgstr "" + +#: templates/registration/password_change_done.html:3 +msgid "Your password was sucessfully changed." +msgstr "" + +#: templates/registration/password_change_form.html:8 +msgid "Change Password" +msgstr "" + +#: templates/registration/password_reset.html:7 +msgid "Send Reset Email" +msgstr "" + +#: 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_confirm.html:9 +msgid "Reset Password" +msgstr "" + +#: 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 +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 +#, 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 +msgid "Please go to the following page and choose a new password:" +msgstr "" + +#: templates/registration/password_reset_email.txt:7 +msgid "Your username, in case you've forgotten:" +msgstr "" + +#: templates/registration/password_reset_email.txt:9 +msgid "Thanks for using our site!" +msgstr "" + +#: templates/registration/password_reset_email.txt:11 +#, python-format +msgid "The %(site_name)s team" +msgstr "" + +#: 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 +msgid "Continue >" +msgstr "" + +#: 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:166 +msgid "(again, for confirmation)" +msgstr "" + +#: templates/registration/registration_form.html:173 +msgid "(select your closest major city)" +msgstr "" + +#: templates/registration/registration_form.html:178 +msgid "pick from map" +msgstr "" + +#: templates/registration/registration_form.html:183 +msgid "Default language" +msgstr "" + +#: templates/registration/registration_form.html:186 +#: templates/user/edit-profile.html:162 +msgid "Affiliated organizations" +msgstr "" + +#: templates/registration/registration_form.html:192 +#: templates/user/edit-profile.html:121 +msgid "Notify me about upcoming contests" +msgstr "" + +#: templates/registration/registration_form.html:206 +msgid "By registering, you agree to our" +msgstr "" + +#: templates/registration/registration_form.html:207 +msgid "Terms & Conditions" +msgstr "" + +#: templates/registration/registration_form.html:210 +msgid "Register!" +msgstr "" + +#: templates/registration/totp_auth.html:36 +#: templates/registration/totp_disable.html:45 +#: templates/registration/totp_enable.html:83 +msgid "Enter the 6-digit code generated by your app:" +msgstr "" + +#: templates/registration/totp_auth.html:41 +#, python-format +msgid "If you lost your authentication device, please contact us at %(email)s." +msgstr "" + +#: templates/registration/totp_disable.html:38 +msgid "To protect your account, you must first authenticate before you can disable Two Factor Authentication." +msgstr "" + +#: templates/registration/totp_enable.html:71 +msgid "Scan this code with your authenticator app:" +msgstr "" + +#: templates/registration/totp_enable.html:72 +msgid "QR code" +msgstr "" + +#: templates/registration/totp_enable.html:73 +msgid "Or enter this code manually:" +msgstr "" + +#: templates/stats/base.html:9 templates/submission/list.html:345 +msgid "Statistics" +msgstr "" + +#: templates/stats/language.html:11 +msgid "Submission Statistics" +msgstr "" + +#: templates/stats/language.html:16 +msgid "Submissions by Language" +msgstr "" + +#: templates/stats/language.html:21 +msgid "AC Submissions by Language" +msgstr "" + +#: templates/stats/language.html:26 +msgid "Language AC Rate" +msgstr "" + +#: templates/status/judge-status-table.html:2 +msgid "Judge" +msgstr "" + +#: templates/status/judge-status-table.html:4 +msgid "Online" +msgstr "" + +#: templates/status/judge-status-table.html:6 +msgid "Uptime" +msgstr "" + +#: templates/status/judge-status-table.html:7 +msgid "Ping" +msgstr "" + +#: 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 +msgid "N/A" +msgstr "" + +#: templates/status/judge-status-table.html:64 +msgid "There are no judges available at this time." +msgstr "" + +#: templates/status/language-list.html:33 templates/ticket/list.html:261 +msgid "ID" +msgstr "" + +#: templates/status/language-list.html:35 +msgid "Runtime Info" +msgstr "" + +#: templates/status/status-tabs.html:4 +msgid "Judges" +msgstr "" + +#: templates/status/status-tabs.html:6 +msgid "Version Matrix" +msgstr "" + +#: templates/submission/internal-error-message.html:8 +msgid "An internal error occurred while grading." +msgstr "" + +#: templates/submission/internal-error-message.html:15 +msgid "Error information" +msgstr "" + +#: templates/submission/list.html:76 +msgid "Filter by status..." +msgstr "" + +#: templates/submission/list.html:82 +msgid "Filter by language..." +msgstr "" + +#: templates/submission/list.html:315 +msgid "Filter submissions" +msgstr "" + +#: templates/submission/list.html:351 +msgid "Total:" +msgstr "" + +#: templates/submission/list.html:361 +msgid "You were disconnected. Refresh to show latest updates." +msgstr "" + +#: templates/submission/row.html:39 +#, python-format +msgid "Case #%(case)s" +msgstr "" + +#: templates/submission/row.html:49 +msgid "view" +msgstr "" + +#: templates/submission/row.html:53 +msgid "rejudge" +msgstr "" + +#: templates/submission/row.html:58 +msgid "admin" +msgstr "" + +#: templates/submission/source.html:25 +msgid "View status" +msgstr "" + +#: templates/submission/source.html:26 +msgid "View raw source" +msgstr "" + +#: templates/submission/source.html:28 templates/submission/status.html:61 +msgid "Resubmit" +msgstr "" + +#: 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 +msgid "Your submission is being processed..." +msgstr "" + +#: templates/submission/status-testcases.html:14 +msgid "Compilation Error" +msgstr "" + +#: templates/submission/status-testcases.html:18 +msgid "Compilation Warnings" +msgstr "" + +#: templates/submission/status-testcases.html:23 +msgid "Pretest Execution Results" +msgstr "" + +#: templates/submission/status-testcases.html:25 +msgid "Execution Results" +msgstr "" + +#: templates/submission/status-testcases.html:31 +msgid "Batch " +msgstr "" + +#: templates/submission/status-testcases.html:43 +msgid "Case" +msgstr "" + +#: templates/submission/status-testcases.html:45 +msgid "Pretest" +msgstr "" + +#: templates/submission/status-testcases.html:47 +msgid "Test case" +msgstr "" + +#: templates/submission/status-testcases.html:79 +msgid "Your output (clipped)" +msgstr "" + +#: templates/submission/status-testcases.html:90 +msgid "Judge feedback" +msgstr "" + +#: templates/submission/status-testcases.html:106 +msgid "Resources:" +msgstr "" + +#: templates/submission/status-testcases.html:115 +msgid "Final pretest score:" +msgstr "" + +#: templates/submission/status-testcases.html:117 +msgid "Final score:" +msgstr "" + +#: templates/submission/status-testcases.html:131 +msgid "Passing pretests does not guarantee a full score on system tests." +msgstr "" + +#: templates/submission/status-testcases.html:134 +msgid "Submission aborted!" +msgstr "" + +#: templates/submission/status.html:59 +msgid "View source" +msgstr "" + +#: templates/submission/status.html:88 +msgid "Abort" +msgstr "" + +#: templates/submission/submission-list-tabs.html:6 +msgid "Mine" +msgstr "" + +#: templates/submission/submission-list-tabs.html:9 +msgid "Best" +msgstr "" + +#: templates/submission/submission-list-tabs.html:12 +#, python-format +msgid "%(user)s's" +msgstr "" + +#: templates/ticket/list.html:135 templates/ticket/ticket.html:257 +msgid "Reopened: " +msgstr "" + +#: templates/ticket/list.html:138 templates/ticket/ticket.html:258 +msgid "Closed: " +msgstr "" + +#: templates/ticket/list.html:221 +msgid "Use desktop notification" +msgstr "" + +#: templates/ticket/list.html:227 +msgid "Show my tickets only" +msgstr "" + +#: templates/ticket/list.html:231 +msgid "Filing user" +msgstr "" + +#: templates/ticket/list.html:240 +msgid "Assignee" +msgstr "" + +#: templates/ticket/list.html:262 +msgid "Title" +msgstr "" + +#: templates/ticket/list.html:264 templates/ticket/ticket.html:304 +msgid "Assignees" +msgstr "" + +#: templates/ticket/new_problem.html:7 +msgid "Thanks for opening a ticket!" +msgstr "" + +#: 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 +msgid "Associated object" +msgstr "" + +#: templates/ticket/ticket.html:309 +msgid "No one is assigned." +msgstr "" + +#: templates/ticket/ticket.html:315 +msgid "Close ticket" +msgstr "" + +#: templates/ticket/ticket.html:317 +msgid "Reopen ticket" +msgstr "" + +#: templates/ticket/ticket.html:321 +msgid "Assignee notes" +msgstr "" + +#: templates/ticket/ticket.html:328 templates/widgets/select_all.html:4 +msgid "Nothing here." +msgstr "" + +#: templates/ticket/ticket.html:378 +msgid "Post" +msgstr "" + +#: templates/user/base-users-table.html:3 +msgid "Rank" +msgstr "" + +#: templates/user/base-users.html:14 templates/user/base-users.html:69 +msgid "Search by handle..." +msgstr "" + +#: templates/user/edit-profile.html:90 +msgid "Self-description" +msgstr "" + +#: templates/user/edit-profile.html:98 +msgid "Select your closest major city" +msgstr "" + +#: templates/user/edit-profile.html:107 +msgid "Editor theme" +msgstr "" + +#: templates/user/edit-profile.html:112 +msgid "Math engine" +msgstr "" + +#: templates/user/edit-profile.html:136 templates/user/edit-profile.html:137 +msgid "Change your avatar" +msgstr "" + +#: templates/user/edit-profile.html:143 +msgid "Change your password" +msgstr "" + +#: templates/user/edit-profile.html:150 +msgid "Two Factor Authentication is enabled." +msgstr "" + +#: templates/user/edit-profile.html:153 +msgid "Two Factor Authentication is disabled." +msgstr "" + +#: templates/user/edit-profile.html:170 +msgid "User-script" +msgstr "" + +#: templates/user/edit-profile.html:174 +msgid "Update profile" +msgstr "" + +#: templates/user/pp-row.html:22 +#, python-format +msgid "\n" +" weighted %(weight)s%%\n" +" " +msgstr "" + +#: templates/user/pp-row.html:27 +#, python-format +msgid "%(pp).1fpp" +msgstr "" + +#: templates/user/pp-row.html:29 +#, python-format +msgid "%(pp).0fpp" +msgstr "" + +#: templates/user/user-about.html:14 +msgid "From" +msgstr "" + +#: 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:40 +msgid "You have not shared any information." +msgstr "" + +#: templates/user/user-about.html:42 +msgid "This user has not shared any information." +msgstr "" + +#: templates/user/user-base.html:42 +#, python-format +msgid "%(counter)s problem solved" +msgid_plural "%(counter)s problems solved" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: templates/user/user-base.html:50 +msgid "Rank by points:" +msgstr "" + +#: templates/user/user-base.html:53 +msgid "Total points:" +msgstr "" + +#: templates/user/user-base.html:68 +msgid "Rank by rating:" +msgstr "" + +#: templates/user/user-base.html:70 +msgid "Rating:" +msgstr "" + +#: templates/user/user-base.html:71 +msgid "Volatility:" +msgstr "" + +#: templates/user/user-base.html:72 +msgid "Min. rating:" +msgstr "" + +#: templates/user/user-base.html:73 +msgid "Max rating:" +msgstr "" + +#: templates/user/user-problems.html:35 +msgid "Points Breakdown" +msgstr "" + +#: templates/user/user-problems.html:41 +msgid "Load more..." +msgstr "" + +#: templates/user/user-problems.html:45 +msgid "This user has not yet solved any problems." +msgstr "" + +#: templates/user/user-problems.html:51 +msgid "Authored Problems" +msgstr "" + +#: templates/user/user-problems.html:83 +msgid "Hide problems I've solved" +msgstr "" + +#: templates/user/user-problems.html:93 +#, python-format +msgid "%(points).1f points" +msgstr "" + +#: templates/user/user-problems.html:99 +msgid "Score" +msgstr "" + +#: templates/user/user-problems.html:110 +#, python-format +msgid "%(points)s / %(total)s" +msgstr "" + +#: templates/user/user-tabs.html:7 +msgid "Impersonate" +msgstr "" + +#: templates/user/user-tabs.html:13 +msgid "Admin User" +msgstr "" + +#: templates/user/user-tabs.html:16 +msgid "Admin Profile" +msgstr "" + +#: templates/widgets/select_all.html:8 +msgid "Check all" +msgstr "" + diff --git a/locale/lt/LC_MESSAGES/djangojs.po b/locale/lt/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..de87146 --- /dev/null +++ b/locale/lt/LC_MESSAGES/djangojs.po @@ -0,0 +1,32 @@ +msgid "" +msgstr "" +"Project-Id-Version: dmoj\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-10-01 23:12+0000\n" +"PO-Revision-Date: 2019-11-11 22:05\n" +"Last-Translator: Icyene\n" +"Language-Team: Lithuanian\n" +"Language: lt_LT\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && (n%100>19 || n%100<11) ? 0 : (n%10>=2 && n%10<=9) && (n%100>19 || n%100<11) ? 1 : n%1!=0 ? 2: 3);\n" +"X-Generator: crowdin.com\n" +"X-Crowdin-Project: dmoj\n" +"X-Crowdin-Language: lt\n" +"X-Crowdin-File: djangojs.po\n" + +#: 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] "" +msgstr[2] "" +msgstr[3] "" + +#: resources/common.js:210 +msgctxt "time format without day" +msgid "%h:%m:%s" +msgstr "" + diff --git a/locale/nl/LC_MESSAGES/django.po b/locale/nl/LC_MESSAGES/django.po new file mode 100644 index 0000000..6ee5536 --- /dev/null +++ b/locale/nl/LC_MESSAGES/django.po @@ -0,0 +1,4531 @@ +msgid "" +msgstr "" +"Project-Id-Version: dmoj\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-11-11 21:54+0000\n" +"PO-Revision-Date: 2019-11-11 22:05\n" +"Last-Translator: Icyene\n" +"Language-Team: Dutch\n" +"Language: nl_NL\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: crowdin.com\n" +"X-Crowdin-Project: dmoj\n" +"X-Crowdin-Language: nl\n" +"X-Crowdin-File: django.po\n" + +#: dmoj/settings.py:337 +msgid "German" +msgstr "" + +#: dmoj/settings.py:338 +msgid "English" +msgstr "" + +#: dmoj/settings.py:339 +msgid "Spanish" +msgstr "" + +#: dmoj/settings.py:340 +msgid "French" +msgstr "" + +#: dmoj/settings.py:341 +msgid "Croatian" +msgstr "" + +#: dmoj/settings.py:342 +msgid "Hungarian" +msgstr "" + +#: dmoj/settings.py:343 +msgid "Japanese" +msgstr "" + +#: dmoj/settings.py:344 +msgid "Korean" +msgstr "" + +#: dmoj/settings.py:345 +msgid "Brazilian Portuguese" +msgstr "" + +#: dmoj/settings.py:346 +msgid "Romanian" +msgstr "" + +#: dmoj/settings.py:347 +msgid "Russian" +msgstr "" + +#: dmoj/settings.py:348 +msgid "Serbian (Latin)" +msgstr "" + +#: dmoj/settings.py:349 +msgid "Turkish" +msgstr "" + +#: dmoj/settings.py:350 +msgid "Vietnamese" +msgstr "" + +#: dmoj/settings.py:351 +msgid "Simplified Chinese" +msgstr "" + +#: dmoj/urls.py:54 +msgid "Login" +msgstr "" + +#: dmoj/urls.py:102 templates/base.html:190 +msgid "Home" +msgstr "" + +#: 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 +msgid "Hide comments" +msgstr "" + +#: 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 +msgid "Unhide comments" +msgstr "" + +#: judge/admin/comments.py:58 +msgid "Associated page" +msgstr "" + +#: judge/admin/contest.py:29 +msgid "Included contests" +msgstr "" + +#: judge/admin/contest.py:65 templates/contest/contest.html:83 +#: templates/contest/moss.html:43 templates/problem/list.html:206 +#: templates/problem/list.html:221 templates/user/user-problems.html:56 +#: templates/user/user-problems.html:98 +msgid "Problem" +msgstr "" + +#: judge/admin/contest.py:113 +msgid "Settings" +msgstr "" + +#: judge/admin/contest.py:115 +msgid "Scheduling" +msgstr "" + +#: judge/admin/contest.py:116 +msgid "Details" +msgstr "" + +#: judge/admin/contest.py:117 +msgid "Format" +msgstr "" + +#: judge/admin/contest.py:118 templates/contest/ranking-table.html:5 +msgid "Rating" +msgstr "" + +#: judge/admin/contest.py:119 +msgid "Access" +msgstr "" + +#: judge/admin/contest.py:121 judge/admin/problem.py:131 +msgid "Justice" +msgstr "" + +#: judge/admin/contest.py:159 +#, 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:162 +msgid "Mark contests as visible" +msgstr "" + +#: judge/admin/contest.py:166 +#, 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:169 +msgid "Mark contests as hidden" +msgstr "" + +#: judge/admin/contest.py:180 judge/admin/submission.py:149 +#: judge/admin/submission.py:171 +msgid "You do not have the permission to rejudge submissions." +msgstr "" + +#: judge/admin/contest.py:187 judge/admin/submission.py:155 +msgid "You do not have the permission to rejudge THAT many submissions." +msgstr "" + +#: judge/admin/contest.py:194 judge/admin/submission.py:164 +#, 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:265 +#, python-format +msgid "%d participation recalculated." +msgid_plural "%d participations recalculated." +msgstr[0] "" +msgstr[1] "" + +#: judge/admin/contest.py:268 +msgid "Recalculate results" +msgstr "" + +#: judge/admin/contest.py:272 judge/admin/organization.py:65 +msgid "username" +msgstr "" + +#: judge/admin/contest.py:277 templates/base.html:258 +msgid "virtual" +msgstr "" + +#: judge/admin/interface.py:28 judge/models/interface.py:46 +msgid "link path" +msgstr "" + +#: judge/admin/interface.py:62 +msgid "Content" +msgstr "" + +#: judge/admin/interface.py:63 +msgid "Summary" +msgstr "" + +#: judge/admin/interface.py:107 judge/models/contest.py:251 +#: judge/models/contest.py:355 judge/models/profile.py:189 +msgid "user" +msgstr "" + +#: judge/admin/interface.py:148 +msgid "object" +msgstr "" + +#: judge/admin/organization.py:34 judge/admin/problem.py:171 +#: judge/admin/profile.py:78 +msgid "View on site" +msgstr "" + +#: judge/admin/problem.py:28 +msgid "Describe the changes you made (optional)" +msgstr "" + +#: judge/admin/problem.py:126 +msgid "Social Media" +msgstr "" + +#: judge/admin/problem.py:127 +msgid "Taxonomy" +msgstr "" + +#: judge/admin/problem.py:128 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:58 +msgid "Points" +msgstr "" + +#: judge/admin/problem.py:129 +msgid "Limits" +msgstr "" + +#: judge/admin/problem.py:130 judge/admin/submission.py:232 +#: templates/stats/base.html:14 templates/submission/list.html:328 +msgid "Language" +msgstr "" + +#: judge/admin/problem.py:132 +msgid "History" +msgstr "" + +#: judge/admin/problem.py:168 +msgid "Authors" +msgstr "" + +#: judge/admin/problem.py:183 +#, 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:187 +msgid "Mark problems as public" +msgstr "" + +#: judge/admin/problem.py:193 +#, 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:197 +msgid "Mark problems as private" +msgstr "" + +#: judge/admin/profile.py:32 +msgid "timezone" +msgstr "" + +#: judge/admin/profile.py:84 judge/admin/submission.py:211 +#: templates/organization/requests/log.html:9 +#: templates/organization/requests/pending.html:12 +#: templates/ticket/list.html:263 +msgid "User" +msgstr "" + +#: judge/admin/profile.py:89 templates/registration/registration_form.html:145 +msgid "Email" +msgstr "" + +#: judge/admin/profile.py:94 judge/views/register.py:29 +#: templates/registration/registration_form.html:173 +#: templates/user/edit-profile.html:99 +msgid "Timezone" +msgstr "" + +#: judge/admin/profile.py:99 +msgid "date joined" +msgstr "" + +#: judge/admin/profile.py:106 +#, python-format +msgid "%d user have scores recalculated." +msgid_plural "%d users have scores recalculated." +msgstr[0] "" +msgstr[1] "" + +#: judge/admin/profile.py:109 +msgid "Recalculate scores" +msgstr "" + +#: judge/admin/runtime.py:19 +msgid "Disallowed problems" +msgstr "" + +#: judge/admin/runtime.py:22 +msgid "These problems are NOT allowed to be submitted in this language" +msgstr "" + +#: judge/admin/runtime.py:83 +msgid "Description" +msgstr "" + +#: judge/admin/runtime.py:84 +msgid "Information" +msgstr "" + +#: judge/admin/runtime.py:85 +msgid "Capabilities" +msgstr "" + +#: judge/admin/submission.py:23 judge/admin/submission.py:42 +#: judge/admin/submission.py:221 +msgid "None" +msgstr "" + +#: judge/admin/submission.py:23 +msgid "Not done" +msgstr "" + +#: judge/admin/submission.py:23 +msgid "Exceptional" +msgstr "" + +#: judge/admin/submission.py:42 +msgid "Unaccepted" +msgstr "" + +#: judge/admin/submission.py:89 +#, python-format +msgctxt "contest problem" +msgid "%(problem)s in %(contest)s" +msgstr "" + +#: judge/admin/submission.py:167 +msgid "Rejudge the selected submissions" +msgstr "" + +#: judge/admin/submission.py:193 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:196 +msgid "Rescore the selected submissions" +msgstr "" + +#: judge/admin/submission.py:200 +msgid "Problem code" +msgstr "" + +#: judge/admin/submission.py:205 +msgid "Problem name" +msgstr "" + +#: judge/admin/submission.py:215 templates/organization/requests/log.html:10 +#: templates/organization/requests/pending.html:13 +msgid "Time" +msgstr "" + +#: judge/admin/submission.py:223 +#, python-format +msgid "%d KB" +msgstr "" + +#: judge/admin/submission.py:225 +#, python-format +msgid "%.2f MB" +msgstr "" + +#: judge/admin/submission.py:227 +msgid "Memory" +msgstr "" + +#: judge/admin/taxon.py:11 judge/admin/taxon.py:34 +msgid "Included problems" +msgstr "" + +#: judge/admin/taxon.py:14 +msgid "These problems are included in this group of problems" +msgstr "" + +#: judge/admin/taxon.py:37 +msgid "These problems are included in this type of problems" +msgstr "" + +#: judge/apps.py:8 +msgid "Online Judge" +msgstr "" + +#: judge/comments.py:41 +msgid "Comment body" +msgstr "" + +#: judge/comments.py:47 judge/views/ticket.py:46 +msgid "Your part is silent, little toad." +msgstr "" + +#: judge/comments.py:50 templates/comments/list.html:131 +msgid "You need to have solved at least one problem before your voice can be heard." +msgstr "" + +#: judge/comments.py:92 +msgid "Posted comment" +msgstr "" + +#: judge/contest_format/atcoder.py:19 +msgid "AtCoder" +msgstr "" + +#: judge/contest_format/default.py:18 +msgid "Default" +msgstr "" + +#: judge/contest_format/ecoo.py:19 +msgid "ECOO" +msgstr "" + +#: judge/contest_format/ioi.py:19 +msgid "IOI" +msgstr "" + +#: judge/forms.py:27 +msgid "Subscribe to contest updates" +msgstr "" + +#: judge/forms.py:28 +msgid "Enable experimental features" +msgstr "" + +#: judge/forms.py:57 judge/views/organization.py:127 +#, python-brace-format +msgid "You may not be part of more than {count} public organizations." +msgstr "" + +#: judge/forms.py:107 judge/views/register.py:26 +#: templates/registration/registration_form.html:139 +#: templates/user/base-users-table.html:5 +msgid "Username" +msgstr "" + +#: judge/forms.py:108 templates/registration/registration_form.html:151 +#: templates/registration/registration_form.html:165 +msgid "Password" +msgstr "" + +#: judge/forms.py:130 +msgid "Two Factor Authentication tokens must be 6 decimal digits." +msgstr "" + +#: judge/forms.py:139 templates/registration/totp_auth.html:32 +msgid "Invalid Two Factor Authentication token." +msgstr "" + +#: judge/forms.py:143 judge/models/problem.py:97 +msgid "Problem code must be ^[a-z0-9]+$" +msgstr "" + +#: judge/forms.py:148 +msgid "Problem with code already exists." +msgstr "" + +#: judge/forms.py:153 judge/models/contest.py:51 +msgid "Contest id must be ^[a-z0-9]+$" +msgstr "" + +#: judge/forms.py:158 +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:59 +msgid "Leave as LaTeX" +msgstr "" + +#: judge/models/choices.py:60 +msgid "SVG with PNG fallback" +msgstr "" + +#: judge/models/choices.py:61 +msgid "MathML only" +msgstr "" + +#: judge/models/choices.py:62 +msgid "MathJax with SVG/PNG fallback" +msgstr "" + +#: judge/models/choices.py:63 +msgid "Detect best quality" +msgstr "" + +#: judge/models/comment.py:25 +msgid "Page code must be ^[pcs]:[a-z0-9]+$|^b:\\d+$" +msgstr "" + +#: judge/models/comment.py:41 +msgid "commenter" +msgstr "" + +#: judge/models/comment.py:42 +msgid "posted time" +msgstr "" + +#: judge/models/comment.py:43 judge/models/comment.py:176 +msgid "associated page" +msgstr "" + +#: judge/models/comment.py:45 +msgid "votes" +msgstr "" + +#: judge/models/comment.py:46 +msgid "body of comment" +msgstr "" + +#: judge/models/comment.py:47 +msgid "hide the comment" +msgstr "" + +#: judge/models/comment.py:48 +msgid "parent" +msgstr "" + +#: judge/models/comment.py:53 +msgid "comment" +msgstr "" + +#: judge/models/comment.py:54 +msgid "comments" +msgstr "" + +#: judge/models/comment.py:136 judge/models/problem.py:406 +#, python-format +msgid "Editorial for %s" +msgstr "" + +#: judge/models/comment.py:171 +msgid "comment vote" +msgstr "" + +#: judge/models/comment.py:172 +msgid "comment votes" +msgstr "" + +#: judge/models/comment.py:181 +msgid "Override comment lock" +msgstr "" + +#: judge/models/contest.py:21 +msgid "Invalid colour." +msgstr "" + +#: judge/models/contest.py:23 +msgid "tag name" +msgstr "" + +#: judge/models/contest.py:24 +msgid "Lowercase letters and hyphens only." +msgstr "" + +#: judge/models/contest.py:25 +msgid "tag colour" +msgstr "" + +#: judge/models/contest.py:26 +msgid "tag description" +msgstr "" + +#: judge/models/contest.py:45 +msgid "contest tag" +msgstr "" + +#: judge/models/contest.py:46 judge/models/contest.py:100 +msgid "contest tags" +msgstr "" + +#: judge/models/contest.py:50 +msgid "contest id" +msgstr "" + +#: judge/models/contest.py:52 +msgid "contest name" +msgstr "" + +#: judge/models/contest.py:53 +msgid "These people will be able to edit the contest." +msgstr "" + +#: judge/models/contest.py:55 judge/models/runtime.py:124 +#: src/dmoj-wpadmin/test_project/apps/books/admin.py:20 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:27 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:27 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:27 +msgid "description" +msgstr "" + +#: judge/models/contest.py:56 judge/models/problem.py:353 +#: judge/models/runtime.py:126 +msgid "problems" +msgstr "" + +#: judge/models/contest.py:57 judge/models/contest.py:252 +msgid "start time" +msgstr "" + +#: judge/models/contest.py:58 +msgid "end time" +msgstr "" + +#: judge/models/contest.py:59 judge/models/problem.py:118 +#: judge/models/problem.py:377 +msgid "time limit" +msgstr "" + +#: judge/models/contest.py:60 judge/models/problem.py:136 +msgid "publicly visible" +msgstr "" + +#: judge/models/contest.py:61 +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:64 +msgid "contest rated" +msgstr "" + +#: judge/models/contest.py:64 +msgid "Whether this contest can be rated." +msgstr "" + +#: judge/models/contest.py:66 +msgid "hide scoreboard" +msgstr "" + +#: judge/models/contest.py:67 +msgid "Whether the scoreboard should remain hidden for the duration of the contest." +msgstr "" + +#: judge/models/contest.py:70 +msgid "no comments" +msgstr "" + +#: judge/models/contest.py:71 +msgid "Use clarification system instead of comments." +msgstr "" + +#: judge/models/contest.py:73 +msgid "Rating floor for contest" +msgstr "" + +#: judge/models/contest.py:75 +msgid "Rating ceiling for contest" +msgstr "" + +#: judge/models/contest.py:77 +msgid "rate all" +msgstr "" + +#: judge/models/contest.py:77 +msgid "Rate all users who joined." +msgstr "" + +#: judge/models/contest.py:78 +msgid "exclude from ratings" +msgstr "" + +#: judge/models/contest.py:80 +msgid "private to specific users" +msgstr "" + +#: judge/models/contest.py:81 +msgid "private contestants" +msgstr "" + +#: judge/models/contest.py:82 +msgid "If private, only these users may see the contest" +msgstr "" + +#: judge/models/contest.py:84 +msgid "hide problem tags" +msgstr "" + +#: judge/models/contest.py:85 +msgid "Whether problem tags should be hidden by default." +msgstr "" + +#: judge/models/contest.py:87 +msgid "run pretests only" +msgstr "" + +#: judge/models/contest.py:88 +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:92 judge/models/problem.py:157 +msgid "private to organizations" +msgstr "" + +#: judge/models/contest.py:93 judge/models/problem.py:155 +#: judge/models/profile.py:76 +msgid "organizations" +msgstr "" + +#: judge/models/contest.py:94 +msgid "If private, only these organizations may see the contest" +msgstr "" + +#: judge/models/contest.py:95 judge/models/problem.py:145 +msgid "OpenGraph image" +msgstr "" + +#: judge/models/contest.py:96 judge/models/profile.py:47 +msgid "Logo override image" +msgstr "" + +#: judge/models/contest.py:98 +msgid "This image will replace the default site logo for users inside the contest." +msgstr "" + +#: judge/models/contest.py:101 +msgid "the amount of live participants" +msgstr "" + +#: judge/models/contest.py:102 +msgid "contest summary" +msgstr "" + +#: judge/models/contest.py:103 judge/models/problem.py:147 +msgid "Plain-text, shown in meta description tag, e.g. for social media." +msgstr "" + +#: judge/models/contest.py:104 judge/models/profile.py:46 +msgid "access code" +msgstr "" + +#: judge/models/contest.py:105 +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:107 judge/models/problem.py:141 +msgid "personae non gratae" +msgstr "" + +#: judge/models/contest.py:108 +msgid "Bans the selected users from joining this contest." +msgstr "" + +#: judge/models/contest.py:109 +msgid "contest format" +msgstr "" + +#: judge/models/contest.py:110 +msgid "The contest format module to use." +msgstr "" + +#: judge/models/contest.py:111 +msgid "contest format configuration" +msgstr "" + +#: judge/models/contest.py:112 +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:233 +msgid "See private contests" +msgstr "" + +#: judge/models/contest.py:234 +msgid "Edit own contests" +msgstr "" + +#: judge/models/contest.py:235 +msgid "Edit all contests" +msgstr "" + +#: judge/models/contest.py:236 +msgid "Clone contest" +msgstr "" + +#: judge/models/contest.py:237 templates/contest/moss.html:74 +msgid "MOSS contest" +msgstr "" + +#: judge/models/contest.py:238 +msgid "Rate contests" +msgstr "" + +#: judge/models/contest.py:239 +msgid "Contest access codes" +msgstr "" + +#: judge/models/contest.py:240 +msgid "Create private contests" +msgstr "" + +#: judge/models/contest.py:242 judge/models/contest.py:320 +#: judge/models/contest.py:356 judge/models/contest.py:378 +#: judge/models/submission.py:83 +msgid "contest" +msgstr "" + +#: judge/models/contest.py:243 +msgid "contests" +msgstr "" + +#: judge/models/contest.py:250 +msgid "associated contest" +msgstr "" + +#: judge/models/contest.py:253 +msgid "score" +msgstr "" + +#: judge/models/contest.py:254 +msgid "cumulative time" +msgstr "" + +#: judge/models/contest.py:255 +msgid "virtual participation id" +msgstr "" + +#: judge/models/contest.py:256 +msgid "0 means non-virtual, otherwise the n-th virtual participation" +msgstr "" + +#: judge/models/contest.py:257 +msgid "contest format specific data" +msgstr "" + +#: judge/models/contest.py:306 +#, python-format +msgid "%s spectating in %s" +msgstr "" + +#: judge/models/contest.py:308 +#, python-format +msgid "%s in %s, v%d" +msgstr "" + +#: judge/models/contest.py:309 +#, python-format +msgid "%s in %s" +msgstr "" + +#: judge/models/contest.py:312 +msgid "contest participation" +msgstr "" + +#: judge/models/contest.py:313 +msgid "contest participations" +msgstr "" + +#: judge/models/contest.py:319 judge/models/contest.py:340 +#: judge/models/contest.py:379 judge/models/problem.py:352 +#: judge/models/problem.py:357 judge/models/problem.py:375 +#: judge/models/problem_data.py:35 +msgid "problem" +msgstr "" + +#: judge/models/contest.py:321 judge/models/contest.py:344 +#: judge/models/problem.py:129 +msgid "points" +msgstr "" + +#: judge/models/contest.py:322 +msgid "partial" +msgstr "" + +#: judge/models/contest.py:323 judge/models/contest.py:345 +msgid "is pretested" +msgstr "" + +#: judge/models/contest.py:324 judge/models/interface.py:43 +msgid "order" +msgstr "" + +#: judge/models/contest.py:325 +msgid "output prefix length override" +msgstr "" + +#: judge/models/contest.py:326 +msgid "Maximum number of submissions for this problem, or 0 for no limit." +msgstr "" + +#: judge/models/contest.py:328 +msgid "Why include a problem you can't submit to?" +msgstr "" + +#: judge/models/contest.py:333 +msgid "contest problem" +msgstr "" + +#: judge/models/contest.py:334 +msgid "contest problems" +msgstr "" + +#: judge/models/contest.py:338 judge/models/submission.py:181 +msgid "submission" +msgstr "" + +#: judge/models/contest.py:342 judge/models/contest.py:357 +msgid "participation" +msgstr "" + +#: judge/models/contest.py:346 +msgid "Whether this submission was ran only on pretests." +msgstr "" + +#: judge/models/contest.py:350 +msgid "contest submission" +msgstr "" + +#: judge/models/contest.py:351 +msgid "contest submissions" +msgstr "" + +#: judge/models/contest.py:359 +msgid "rank" +msgstr "" + +#: judge/models/contest.py:360 +msgid "rating" +msgstr "" + +#: judge/models/contest.py:361 +msgid "volatility" +msgstr "" + +#: judge/models/contest.py:362 +msgid "last rated" +msgstr "" + +#: judge/models/contest.py:366 +msgid "contest rating" +msgstr "" + +#: judge/models/contest.py:367 +msgid "contest ratings" +msgstr "" + +#: judge/models/contest.py:386 +msgid "contest moss result" +msgstr "" + +#: judge/models/contest.py:387 +msgid "contest moss results" +msgstr "" + +#: judge/models/interface.py:24 +msgid "configuration item" +msgstr "" + +#: judge/models/interface.py:25 +msgid "miscellaneous configuration" +msgstr "" + +#: judge/models/interface.py:37 +msgid "navigation item" +msgstr "" + +#: judge/models/interface.py:38 +msgid "navigation bar" +msgstr "" + +#: judge/models/interface.py:44 +msgid "identifier" +msgstr "" + +#: judge/models/interface.py:45 +msgid "label" +msgstr "" + +#: judge/models/interface.py:47 +msgid "highlight regex" +msgstr "" + +#: judge/models/interface.py:48 +msgid "parent item" +msgstr "" + +#: judge/models/interface.py:66 +msgid "post title" +msgstr "" + +#: judge/models/interface.py:67 judge/models/problem.py:395 +msgid "authors" +msgstr "" + +#: judge/models/interface.py:68 +msgid "slug" +msgstr "" + +#: judge/models/interface.py:69 judge/models/problem.py:393 +msgid "public visibility" +msgstr "" + +#: judge/models/interface.py:70 +msgid "sticky" +msgstr "" + +#: judge/models/interface.py:71 +msgid "publish after" +msgstr "" + +#: judge/models/interface.py:72 +msgid "post content" +msgstr "" + +#: judge/models/interface.py:73 +msgid "post summary" +msgstr "" + +#: judge/models/interface.py:74 +msgid "openGraph image" +msgstr "" + +#: judge/models/interface.py:91 +msgid "Edit all posts" +msgstr "" + +#: judge/models/interface.py:93 +msgid "blog post" +msgstr "" + +#: judge/models/interface.py:94 +msgid "blog posts" +msgstr "" + +#: judge/models/message.py:11 +msgid "message title" +msgstr "" + +#: judge/models/message.py:12 judge/models/ticket.py:29 +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:26 +msgid "problem category ID" +msgstr "" + +#: judge/models/problem.py:27 +msgid "problem category name" +msgstr "" + +#: judge/models/problem.py:34 +msgid "problem type" +msgstr "" + +#: judge/models/problem.py:35 judge/models/problem.py:113 +msgid "problem types" +msgstr "" + +#: judge/models/problem.py:39 +msgid "problem group ID" +msgstr "" + +#: judge/models/problem.py:40 +msgid "problem group name" +msgstr "" + +#: judge/models/problem.py:47 judge/models/problem.py:116 +msgid "problem group" +msgstr "" + +#: judge/models/problem.py:48 +msgid "problem groups" +msgstr "" + +#: judge/models/problem.py:52 +msgid "key" +msgstr "" + +#: judge/models/problem.py:54 +msgid "link" +msgstr "" + +#: judge/models/problem.py:55 +msgid "full name" +msgstr "" + +#: judge/models/problem.py:56 judge/models/profile.py:32 +#: judge/models/runtime.py:23 +msgid "short name" +msgstr "" + +#: judge/models/problem.py:57 +msgid "Displayed on pages under this license" +msgstr "" + +#: judge/models/problem.py:58 +msgid "icon" +msgstr "" + +#: judge/models/problem.py:58 +msgid "URL to the icon" +msgstr "" + +#: judge/models/problem.py:59 +msgid "license text" +msgstr "" + +#: judge/models/problem.py:68 +msgid "license" +msgstr "" + +#: judge/models/problem.py:69 +msgid "licenses" +msgstr "" + +#: judge/models/problem.py:96 +msgid "problem code" +msgstr "" + +#: judge/models/problem.py:98 +msgid "A short, unique code for the problem, used in the url after /problem/" +msgstr "" + +#: judge/models/problem.py:100 +msgid "problem name" +msgstr "" + +#: judge/models/problem.py:101 +msgid "The full name of the problem, as shown in the problem list." +msgstr "" + +#: judge/models/problem.py:103 +msgid "problem body" +msgstr "" + +#: judge/models/problem.py:104 +msgid "creators" +msgstr "" + +#: judge/models/problem.py:105 +msgid "These users will be able to edit the problem, and be listed as authors." +msgstr "" + +#: judge/models/problem.py:107 +msgid "curators" +msgstr "" + +#: judge/models/problem.py:108 +msgid "These users will be able to edit the problem, but not be listed as authors." +msgstr "" + +#: judge/models/problem.py:110 +msgid "testers" +msgstr "" + +#: judge/models/problem.py:112 +msgid "These users will be able to view the private problem, but not edit it." +msgstr "" + +#: judge/models/problem.py:114 +msgid "The type of problem, as shown on the problem's page." +msgstr "" + +#: judge/models/problem.py:117 +msgid "The group of problem, shown under Category in the problem list." +msgstr "" + +#: judge/models/problem.py:119 +msgid "The time limit for this problem, in seconds. Fractional seconds (e.g. 1.5) are supported." +msgstr "" + +#: judge/models/problem.py:123 judge/models/problem.py:380 +msgid "memory limit" +msgstr "" + +#: judge/models/problem.py:124 +msgid "The memory limit for this problem, in kilobytes (e.g. 64mb = 65536 kilobytes)." +msgstr "" + +#: judge/models/problem.py:130 +msgid "Points awarded for problem completion. Points are displayed with a 'p' suffix if partial." +msgstr "" + +#: judge/models/problem.py:133 +msgid "allows partial points" +msgstr "" + +#: judge/models/problem.py:134 +msgid "allowed languages" +msgstr "" + +#: judge/models/problem.py:135 +msgid "List of allowed submission languages." +msgstr "" + +#: judge/models/problem.py:137 +msgid "manually managed" +msgstr "" + +#: judge/models/problem.py:138 +msgid "Whether judges should be allowed to manage data or not." +msgstr "" + +#: judge/models/problem.py:139 +msgid "date of publishing" +msgstr "" + +#: judge/models/problem.py:140 +msgid "Doesn't have magic ability to auto-publish due to backward compatibility" +msgstr "" + +#: judge/models/problem.py:142 +msgid "Bans the selected users from submitting to this problem." +msgstr "" + +#: judge/models/problem.py:144 +msgid "The license under which this problem is published." +msgstr "" + +#: judge/models/problem.py:146 +msgid "problem summary" +msgstr "" + +#: judge/models/problem.py:148 +msgid "number of users" +msgstr "" + +#: judge/models/problem.py:149 +msgid "The number of users who solved the problem." +msgstr "" + +#: judge/models/problem.py:150 +msgid "solve rate" +msgstr "" + +#: judge/models/problem.py:156 +msgid "If private, only these organizations may see the problem." +msgstr "" + +#: judge/models/problem.py:358 judge/models/problem.py:376 +#: judge/models/runtime.py:99 +msgid "language" +msgstr "" + +#: judge/models/problem.py:359 +msgid "translated name" +msgstr "" + +#: judge/models/problem.py:360 +msgid "translated description" +msgstr "" + +#: judge/models/problem.py:364 +msgid "problem translation" +msgstr "" + +#: judge/models/problem.py:365 +msgid "problem translations" +msgstr "" + +#: judge/models/problem.py:369 +msgid "clarified problem" +msgstr "" + +#: judge/models/problem.py:370 +msgid "clarification body" +msgstr "" + +#: judge/models/problem.py:371 +msgid "clarification timestamp" +msgstr "" + +#: judge/models/problem.py:386 +msgid "language-specific resource limit" +msgstr "" + +#: judge/models/problem.py:387 +msgid "language-specific resource limits" +msgstr "" + +#: judge/models/problem.py:391 +msgid "associated problem" +msgstr "" + +#: judge/models/problem.py:394 +msgid "publish date" +msgstr "" + +#: judge/models/problem.py:396 +msgid "editorial content" +msgstr "" + +#: judge/models/problem.py:412 +msgid "solution" +msgstr "" + +#: judge/models/problem.py:413 +msgid "solutions" +msgstr "" + +#: judge/models/problem_data.py:23 +msgid "Standard" +msgstr "" + +#: judge/models/problem_data.py:24 +msgid "Floats" +msgstr "" + +#: judge/models/problem_data.py:25 +msgid "Floats (absolute)" +msgstr "" + +#: judge/models/problem_data.py:26 +msgid "Floats (relative)" +msgstr "" + +#: judge/models/problem_data.py:27 +msgid "Non-trailing spaces" +msgstr "" + +#: judge/models/problem_data.py:28 +msgid "Unordered" +msgstr "" + +#: judge/models/problem_data.py:29 +msgid "Byte identical" +msgstr "" + +#: 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:39 +msgid "generator file" +msgstr "" + +#: judge/models/problem_data.py:41 judge/models/problem_data.py:90 +msgid "output prefix length" +msgstr "" + +#: judge/models/problem_data.py:42 judge/models/problem_data.py:91 +msgid "output limit length" +msgstr "" + +#: judge/models/problem_data.py:43 +msgid "init.yml generation feedback" +msgstr "" + +#: judge/models/problem_data.py:44 judge/models/problem_data.py:92 +msgid "checker" +msgstr "" + +#: judge/models/problem_data.py:45 judge/models/problem_data.py:93 +msgid "checker arguments" +msgstr "" + +#: 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:77 +msgid "problem data set" +msgstr "" + +#: judge/models/problem_data.py:79 +msgid "case position" +msgstr "" + +#: judge/models/problem_data.py:80 +msgid "case type" +msgstr "" + +#: judge/models/problem_data.py:81 +msgid "Normal case" +msgstr "" + +#: judge/models/problem_data.py:82 +msgid "Batch start" +msgstr "" + +#: judge/models/problem_data.py:83 +msgid "Batch end" +msgstr "" + +#: judge/models/problem_data.py:85 +msgid "input file name" +msgstr "" + +#: judge/models/problem_data.py:86 +msgid "output file name" +msgstr "" + +#: judge/models/problem_data.py:87 +msgid "generator arguments" +msgstr "" + +#: judge/models/problem_data.py:88 +msgid "point value" +msgstr "" + +#: judge/models/problem_data.py:89 +msgid "case is pretest?" +msgstr "" + +#: judge/models/profile.py:29 +msgid "organization title" +msgstr "" + +#: judge/models/profile.py:30 +msgid "organization slug" +msgstr "" + +#: judge/models/profile.py:31 +msgid "Organization name shown in URL" +msgstr "" + +#: judge/models/profile.py:33 +msgid "Displayed beside user name during contests" +msgstr "" + +#: judge/models/profile.py:34 +msgid "organization description" +msgstr "" + +#: judge/models/profile.py:35 +msgid "registrant" +msgstr "" + +#: judge/models/profile.py:36 +msgid "User who registered this organization" +msgstr "" + +#: judge/models/profile.py:37 +msgid "administrators" +msgstr "" + +#: judge/models/profile.py:38 +msgid "Those who can edit this organization" +msgstr "" + +#: judge/models/profile.py:39 +msgid "creation date" +msgstr "" + +#: judge/models/profile.py:40 +msgid "is open organization?" +msgstr "" + +#: judge/models/profile.py:41 +msgid "Allow joining organization" +msgstr "" + +#: judge/models/profile.py:42 +msgid "maximum size" +msgstr "" + +#: judge/models/profile.py:43 +msgid "Maximum amount of users in this organization, only applicable to private organizations" +msgstr "" + +#: judge/models/profile.py:45 +msgid "Student access code" +msgstr "" + +#: judge/models/profile.py:49 +msgid "This image will replace the default site logo for users viewing the organization." +msgstr "" + +#: judge/models/profile.py:75 judge/models/profile.py:91 +#: judge/models/profile.py:190 +msgid "organization" +msgstr "" + +#: judge/models/profile.py:80 +msgid "user associated" +msgstr "" + +#: judge/models/profile.py:81 +msgid "self-description" +msgstr "" + +#: judge/models/profile.py:82 +msgid "location" +msgstr "" + +#: judge/models/profile.py:84 +msgid "preferred language" +msgstr "" + +#: judge/models/profile.py:89 +msgid "last access time" +msgstr "" + +#: judge/models/profile.py:90 +msgid "last IP" +msgstr "" + +#: judge/models/profile.py:93 +msgid "display rank" +msgstr "" + +#: judge/models/profile.py:95 +msgid "comment mute" +msgstr "" + +#: judge/models/profile.py:95 +msgid "Some users are at their best when silent." +msgstr "" + +#: judge/models/profile.py:97 +msgid "unlisted user" +msgstr "" + +#: judge/models/profile.py:97 +msgid "User will not be ranked." +msgstr "" + +#: judge/models/profile.py:100 +msgid "user script" +msgstr "" + +#: judge/models/profile.py:101 +msgid "User-defined JavaScript for site customization." +msgstr "" + +#: judge/models/profile.py:102 +msgid "current contest" +msgstr "" + +#: judge/models/profile.py:104 +msgid "math engine" +msgstr "" + +#: judge/models/profile.py:106 +msgid "the rendering engine used to render math" +msgstr "" + +#: judge/models/profile.py:107 +msgid "2FA enabled" +msgstr "" + +#: judge/models/profile.py:108 +msgid "check to enable TOTP-based two factor authentication" +msgstr "" + +#: judge/models/profile.py:109 +msgid "TOTP key" +msgstr "" + +#: judge/models/profile.py:110 +msgid "32 character base32-encoded key for TOTP" +msgstr "" + +#: judge/models/profile.py:112 +msgid "TOTP key must be empty or base32" +msgstr "" + +#: judge/models/profile.py:113 +msgid "internal notes" +msgstr "" + +#: judge/models/profile.py:114 +msgid "Notes for administrators regarding this user." +msgstr "" + +#: judge/models/profile.py:184 +msgid "user profile" +msgstr "" + +#: judge/models/profile.py:185 +msgid "user profiles" +msgstr "" + +#: judge/models/profile.py:192 +msgid "request time" +msgstr "" + +#: judge/models/profile.py:193 +msgid "state" +msgstr "" + +#: judge/models/profile.py:198 +msgid "reason" +msgstr "" + +#: judge/models/profile.py:201 +msgid "organization join request" +msgstr "" + +#: judge/models/profile.py:202 +msgid "organization join requests" +msgstr "" + +#: judge/models/runtime.py:18 +msgid "short identifier" +msgstr "" + +#: judge/models/runtime.py:19 +msgid "The identifier for this language; the same as its executor id for judges." +msgstr "" + +#: judge/models/runtime.py:21 +msgid "long name" +msgstr "" + +#: judge/models/runtime.py:22 +msgid "Longer name for the language, e.g. \"Python 2\" or \"C++11\"." +msgstr "" + +#: judge/models/runtime.py:24 +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:28 +msgid "common name" +msgstr "" + +#: judge/models/runtime.py:29 +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:31 +msgid "ace mode name" +msgstr "" + +#: judge/models/runtime.py:32 +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:34 +msgid "pygments name" +msgstr "" + +#: judge/models/runtime.py:35 +msgid "Language ID for Pygments highlighting in source windows." +msgstr "" + +#: judge/models/runtime.py:36 +msgid "code template" +msgstr "" + +#: judge/models/runtime.py:37 +msgid "Code template to display in submission editor." +msgstr "" + +#: judge/models/runtime.py:38 +msgid "runtime info override" +msgstr "" + +#: judge/models/runtime.py:39 +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:41 +msgid "language description" +msgstr "" + +#: judge/models/runtime.py:42 +msgid "Use field this to inform users of quirks with your environment, additional restrictions, etc." +msgstr "" + +#: judge/models/runtime.py:44 +msgid "extension" +msgstr "" + +#: judge/models/runtime.py:45 +msgid "The extension of source files, e.g., \"py\" or \"cpp\"." +msgstr "" + +#: judge/models/runtime.py:100 +msgid "languages" +msgstr "" + +#: judge/models/runtime.py:104 +msgid "language to which this runtime belongs" +msgstr "" + +#: judge/models/runtime.py:105 +msgid "judge on which this runtime exists" +msgstr "" + +#: judge/models/runtime.py:106 +msgid "runtime name" +msgstr "" + +#: judge/models/runtime.py:107 +msgid "runtime version" +msgstr "" + +#: judge/models/runtime.py:108 +msgid "order in which to display this runtime" +msgstr "" + +#: judge/models/runtime.py:112 +msgid "Server name, hostname-style" +msgstr "" + +#: judge/models/runtime.py:113 +msgid "time of creation" +msgstr "" + +#: judge/models/runtime.py:114 +msgid "A key to authenticated this judge" +msgstr "" + +#: judge/models/runtime.py:115 +msgid "authentication key" +msgstr "" + +#: judge/models/runtime.py:116 +msgid "block judge" +msgstr "" + +#: judge/models/runtime.py:117 +msgid "Whether this judge should be blocked from connecting, even if its key is correct." +msgstr "" + +#: judge/models/runtime.py:119 +msgid "judge online status" +msgstr "" + +#: judge/models/runtime.py:120 +msgid "judge start time" +msgstr "" + +#: judge/models/runtime.py:121 +msgid "response time" +msgstr "" + +#: judge/models/runtime.py:122 +msgid "system load" +msgstr "" + +#: judge/models/runtime.py:123 +msgid "Load for the last minute, divided by processors to be fair." +msgstr "" + +#: judge/models/runtime.py:127 judge/models/runtime.py:167 +msgid "judges" +msgstr "" + +#: judge/models/runtime.py:166 +msgid "judge" +msgstr "" + +#: judge/models/submission.py:20 judge/models/submission.py:47 +#: judge/utils/problems.py:86 +msgid "Accepted" +msgstr "" + +#: judge/models/submission.py:21 judge/models/submission.py:48 +msgid "Wrong Answer" +msgstr "" + +#: judge/models/submission.py:22 judge/models/submission.py:50 +msgid "Time Limit Exceeded" +msgstr "" + +#: judge/models/submission.py:23 judge/models/submission.py:51 +msgid "Memory Limit Exceeded" +msgstr "" + +#: judge/models/submission.py:24 judge/models/submission.py:52 +msgid "Output Limit Exceeded" +msgstr "" + +#: judge/models/submission.py:25 judge/models/submission.py:53 +msgid "Invalid Return" +msgstr "" + +#: judge/models/submission.py:26 judge/models/submission.py:54 +msgid "Runtime Error" +msgstr "" + +#: judge/models/submission.py:27 judge/models/submission.py:41 +#: judge/models/submission.py:55 judge/utils/problems.py:88 +msgid "Compile Error" +msgstr "" + +#: judge/models/submission.py:28 judge/models/submission.py:40 +msgid "Internal Error" +msgstr "" + +#: judge/models/submission.py:29 +msgid "Short circuit" +msgstr "" + +#: judge/models/submission.py:30 judge/models/submission.py:42 +#: judge/models/submission.py:61 +msgid "Aborted" +msgstr "" + +#: judge/models/submission.py:36 judge/models/submission.py:57 +msgid "Queued" +msgstr "" + +#: judge/models/submission.py:37 judge/models/submission.py:58 +msgid "Processing" +msgstr "" + +#: judge/models/submission.py:38 judge/models/submission.py:59 +msgid "Grading" +msgstr "" + +#: judge/models/submission.py:39 judge/models/submission.py:60 +msgid "Completed" +msgstr "" + +#: judge/models/submission.py:56 +msgid "Internal Error (judging server error)" +msgstr "" + +#: judge/models/submission.py:66 +msgid "submission time" +msgstr "" + +#: judge/models/submission.py:67 judge/models/submission.py:201 +msgid "execution time" +msgstr "" + +#: judge/models/submission.py:68 judge/models/submission.py:202 +msgid "memory usage" +msgstr "" + +#: judge/models/submission.py:69 judge/models/submission.py:203 +msgid "points granted" +msgstr "" + +#: judge/models/submission.py:70 +msgid "submission language" +msgstr "" + +#: judge/models/submission.py:71 +msgid "status" +msgstr "" + +#: judge/models/submission.py:72 +msgid "result" +msgstr "" + +#: judge/models/submission.py:74 +msgid "compile errors" +msgstr "" + +#: judge/models/submission.py:76 +msgid "batched cases" +msgstr "" + +#: judge/models/submission.py:77 +msgid "test case points" +msgstr "" + +#: judge/models/submission.py:78 +msgid "test case total points" +msgstr "" + +#: judge/models/submission.py:79 +msgid "judged on" +msgstr "" + +#: judge/models/submission.py:81 +msgid "was rejudged by admin" +msgstr "" + +#: judge/models/submission.py:82 +msgid "was ran on pretests only" +msgstr "" + +#: judge/models/submission.py:182 templates/contest/moss.html:58 +msgid "submissions" +msgstr "" + +#: judge/models/submission.py:186 judge/models/submission.py:197 +msgid "associated submission" +msgstr "" + +#: judge/models/submission.py:188 +msgid "source code" +msgstr "" + +#: judge/models/submission.py:199 +msgid "test case ID" +msgstr "" + +#: judge/models/submission.py:200 +msgid "status flag" +msgstr "" + +#: judge/models/submission.py:204 +msgid "points possible" +msgstr "" + +#: judge/models/submission.py:205 +msgid "batch number" +msgstr "" + +#: judge/models/submission.py:206 +msgid "judging feedback" +msgstr "" + +#: judge/models/submission.py:207 +msgid "extended judging feedback" +msgstr "" + +#: judge/models/submission.py:208 +msgid "program output" +msgstr "" + +#: judge/models/submission.py:216 +msgid "submission test case" +msgstr "" + +#: judge/models/submission.py:217 +msgid "submission test cases" +msgstr "" + +#: judge/models/ticket.py:10 +msgid "ticket title" +msgstr "" + +#: judge/models/ticket.py:11 +msgid "ticket creator" +msgstr "" + +#: judge/models/ticket.py:13 +msgid "creation time" +msgstr "" + +#: judge/models/ticket.py:14 +msgid "assignees" +msgstr "" + +#: judge/models/ticket.py:15 +msgid "quick notes" +msgstr "" + +#: judge/models/ticket.py:16 +msgid "Staff notes for this issue to aid in processing." +msgstr "" + +#: judge/models/ticket.py:17 +msgid "linked item type" +msgstr "" + +#: judge/models/ticket.py:19 +msgid "linked item ID" +msgstr "" + +#: judge/models/ticket.py:21 +msgid "is ticket open?" +msgstr "" + +#: judge/models/ticket.py:25 +msgid "ticket" +msgstr "" + +#: judge/models/ticket.py:27 +msgid "poster" +msgstr "" + +#: judge/models/ticket.py:30 +msgid "message time" +msgstr "" + +#: judge/pdf_problems.py:134 judge/pdf_problems.py:186 +#: judge/pdf_problems.py:246 +msgid "Page [page] of [topage]" +msgstr "" + +#: judge/tasks/moss.py:25 +msgid "Running MOSS" +msgstr "" + +#: judge/tasks/submission.py:43 +msgid "Modifying submissions" +msgstr "" + +#: judge/tasks/submission.py:56 +msgid "Recalculating user points" +msgstr "" + +#: judge/utils/problem_data.py:63 +msgid "Empty batches not allowed." +msgstr "" + +#: 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 +#, python-format +msgid "Input file for case %d does not exist: %s" +msgstr "" + +#: 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 +#, python-format +msgid "Batch start case #%d requires points." +msgstr "" + +#: 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 +msgid "How did you corrupt the zip path?" +msgstr "" + +#: judge/utils/problem_data.py:160 +msgid "How did you corrupt the generator path?" +msgstr "" + +#: judge/utils/problems.py:76 +msgid "Can't pass both queryset and keyword filters" +msgstr "" + +#: judge/utils/problems.py:87 +msgid "Wrong" +msgstr "" + +#: judge/utils/problems.py:89 +msgid "Timeout" +msgstr "" + +#: judge/utils/problems.py:90 +msgid "Error" +msgstr "" + +#: 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/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:38 +#, python-format +msgid "Page %d of Posts" +msgstr "" + +#: judge/views/comment.py:27 +msgid "Messing around, are we?" +msgstr "" + +#: judge/views/comment.py:36 +msgid "You must solve at least one problem before you can vote." +msgstr "" + +#: judge/views/comment.py:63 +msgid "You already voted." +msgstr "" + +#: judge/views/comment.py:120 judge/views/organization.py:299 +msgid "Edited from site" +msgstr "" + +#: judge/views/comment.py:141 +msgid "Editing comment" +msgstr "" + +#: judge/views/contests.py:49 judge/views/contests.py:211 +#: judge/views/contests.py:214 judge/views/contests.py:385 +msgid "No such contest" +msgstr "" + +#: judge/views/contests.py:50 judge/views/contests.py:212 +#, python-format +msgid "Could not find a contest with the key \"%s\"." +msgstr "" + +#: judge/views/contests.py:75 +msgid "Contests" +msgstr "" + +#: judge/views/contests.py:215 +msgid "Could not find such contest." +msgstr "" + +#: judge/views/contests.py:218 +#, python-format +msgid "Access to contest \"%s\" denied" +msgstr "" + +#: judge/views/contests.py:242 +msgid "Clone Contest" +msgstr "" + +#: judge/views/contests.py:305 +msgid "Contest not ongoing" +msgstr "" + +#: judge/views/contests.py:306 +#, python-format +msgid "\"%s\" is not currently ongoing." +msgstr "" + +#: judge/views/contests.py:310 +msgid "Already in contest" +msgstr "" + +#: judge/views/contests.py:311 +#, python-format +msgid "You are already in a contest: \"%s\"." +msgstr "" + +#: judge/views/contests.py:314 +msgid "Banned from joining" +msgstr "" + +#: judge/views/contests.py:315 +msgid "You have been declared persona non grata for this contest. You are permanently barred from joining this contest." +msgstr "" + +#: judge/views/contests.py:375 +#, python-format +msgid "Enter access code for \"%s\"" +msgstr "" + +#: judge/views/contests.py:386 +#, python-format +msgid "You are not in contest \"%s\"." +msgstr "" + +#: judge/views/contests.py:405 +msgid "ContestCalendar requires integer year and month" +msgstr "" + +#: judge/views/contests.py:445 +#, python-format +msgid "Contests in %(month)s" +msgstr "" + +#: judge/views/contests.py:445 +msgid "F Y" +msgstr "" + +#: judge/views/contests.py:531 +msgid "???" +msgstr "" + +#: judge/views/contests.py:594 +#, python-format +msgid "%s Rankings" +msgstr "" + +#: judge/views/contests.py:610 +#, python-format +msgid "Your participation in %s" +msgstr "" + +#: judge/views/contests.py:611 +#, python-format +msgid "%s's participation in %s" +msgstr "" + +#: judge/views/contests.py:615 +msgid "Live" +msgstr "" + +#: judge/views/contests.py:627 templates/contest/contest-tabs.html:13 +msgid "Participation" +msgstr "" + +#: judge/views/contests.py:654 +#, python-format +msgid "%s MOSS Results" +msgstr "" + +#: judge/views/contests.py:681 +#, python-format +msgid "Running MOSS for %s..." +msgstr "" + +#: judge/views/contests.py:704 +#, python-format +msgid "Contest tag: %s" +msgstr "" + +#: judge/views/error.py:14 +msgid "404 error" +msgstr "" + +#: judge/views/error.py:15 +#, python-format +msgid "Could not find page \"%s\"" +msgstr "" + +#: judge/views/error.py:22 +#, python-format +msgid "no permission for %s" +msgstr "" + +#: 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 +msgid "Runtimes" +msgstr "" + +#: judge/views/organization.py:44 judge/views/organization.py:47 +msgid "No such organization" +msgstr "" + +#: judge/views/organization.py:45 +#, python-format +msgid "Could not find an organization with the key \"%s\"." +msgstr "" + +#: judge/views/organization.py:48 +msgid "Could not find such organization." +msgstr "" + +#: judge/views/organization.py:72 judge/views/register.py:34 +#: templates/organization/list.html:15 templates/user/user-list-tabs.html:5 +msgid "Organizations" +msgstr "" + +#: judge/views/organization.py:93 +#, python-format +msgid "%s Members" +msgstr "" + +#: judge/views/organization.py:118 judge/views/organization.py:121 +#: judge/views/organization.py:126 +msgid "Joining organization" +msgstr "" + +#: judge/views/organization.py:118 +msgid "You are already in the organization." +msgstr "" + +#: judge/views/organization.py:121 +msgid "This organization is not open." +msgstr "" + +#: judge/views/organization.py:138 +msgid "Leaving organization" +msgstr "" + +#: judge/views/organization.py:138 +#, python-format +msgid "You are not in \"%s\"." +msgstr "" + +#: judge/views/organization.py:162 +#, python-format +msgid "Request to join %s" +msgstr "" + +#: judge/views/organization.py:180 +msgid "Join request detail" +msgstr "" + +#: judge/views/organization.py:209 +#, python-format +msgid "Managing join requests for %s" +msgstr "" + +#: judge/views/organization.py:240 +#, python-format +msgid "Your organization can only receive %d more members. You cannot approve %d users." +msgstr "" + +#: judge/views/organization.py:252 +#, python-format +msgid "Approved %d user." +msgid_plural "Approved %d users." +msgstr[0] "" +msgstr[1] "" + +#: judge/views/organization.py:253 +#, python-format +msgid "Rejected %d user." +msgid_plural "Rejected %d users." +msgstr[0] "" +msgstr[1] "" + +#: judge/views/organization.py:283 +#, python-format +msgid "Editing %s" +msgstr "" + +#: judge/views/organization.py:307 judge/views/organization.py:315 +msgid "Can't edit organization" +msgstr "" + +#: judge/views/organization.py:308 +msgid "You are not allowed to edit this organization." +msgstr "" + +#: judge/views/organization.py:316 +msgid "You are not allowed to kick people from this organization." +msgstr "" + +#: judge/views/organization.py:321 judge/views/organization.py:325 +msgid "Can't kick user" +msgstr "" + +#: judge/views/organization.py:322 +msgid "The user you are trying to kick does not exist!" +msgstr "" + +#: judge/views/organization.py:326 +#, python-format +msgid "The user you are trying to kick is not in organization: %s." +msgstr "" + +#: judge/views/problem.py:68 +msgid "No such problem" +msgstr "" + +#: judge/views/problem.py:69 +#, python-format +msgid "Could not find a problem with the code \"%s\"." +msgstr "" + +#: judge/views/problem.py:111 +#, python-brace-format +msgid "Editorial for {0}" +msgstr "" + +#: judge/views/problem.py:114 +#, python-brace-format +msgid "Editorial for {0}" +msgstr "" + +#: judge/views/problem.py:285 templates/contest/contest.html:79 +#: templates/user/user-tabs.html:5 templates/user/users-table.html:23 +msgid "Problems" +msgstr "" + +#: judge/views/problem.py:546 +msgid "Banned from submitting" +msgstr "" + +#: judge/views/problem.py:547 +msgid "You have been declared persona non grata for this problem. You are permanently barred from submitting this problem." +msgstr "" + +#: judge/views/problem.py:560 +msgid "Too many submissions" +msgstr "" + +#: judge/views/problem.py:561 +msgid "You have exceeded the submission limit for this problem." +msgstr "" + +#: judge/views/problem.py:627 judge/views/problem.py:630 +#, python-format +msgid "Submit to %(problem)s" +msgstr "" + +#: judge/views/problem.py:646 +msgid "Clone Problem" +msgstr "" + +#: judge/views/problem_data.py:37 +msgid "Checker arguments must be a JSON object" +msgstr "" + +#: judge/views/problem_data.py:39 +msgid "Checker arguments is invalid JSON" +msgstr "" + +#: judge/views/problem_data.py:46 +msgid "Your zip file is invalid!" +msgstr "" + +#: judge/views/problem_data.py:104 +#, python-brace-format +msgid "Comparing submissions for {0}" +msgstr "" + +#: judge/views/problem_data.py:107 +#, python-brace-format +msgid "Comparing submissions for {0}" +msgstr "" + +#: judge/views/problem_data.py:142 +#, python-brace-format +msgid "Editing data for {0}" +msgstr "" + +#: judge/views/problem_data.py:145 +#, python-format +msgid "Editing data for %s" +msgstr "" + +#: judge/views/problem_data.py:237 judge/views/problem_data.py:238 +#, python-format +msgid "Generated init.yml for %s" +msgstr "" + +#: 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:58 +#, python-format +msgid "Best solutions for %s" +msgstr "" + +#: judge/views/ranked_submission.py:61 +#, python-brace-format +msgid "Best solutions for {0}" +msgstr "" + +#: judge/views/ranked_submission.py:71 +#, python-format +msgid "Best solutions for %(problem)s in %(contest)s" +msgstr "" + +#: judge/views/ranked_submission.py:74 +#, python-format +msgid "Best solutions for problem %(number)s in %(contest)s" +msgstr "" + +#: judge/views/ranked_submission.py:80 +#, python-brace-format +msgid "Best solutions for {0} in {2}" +msgstr "" + +#: judge/views/ranked_submission.py:83 +#, python-brace-format +msgid "Best solutions for problem {0} in {1}" +msgstr "" + +#: judge/views/register.py:27 +msgid "A username must contain letters, numbers, or underscores" +msgstr "" + +#: judge/views/register.py:31 templates/user/edit-profile.html:103 +msgid "Preferred language" +msgstr "" + +#: judge/views/register.py:38 +msgid "Subscribe to newsletter?" +msgstr "" + +#: judge/views/register.py:45 +#, python-format +msgid "The email address \"%s\" is already taken. Only one registration is allowed per address." +msgstr "" + +#: judge/views/register.py:51 +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 +msgid "Registration" +msgstr "" + +#: judge/views/register.py:106 +msgid "Authentication failure" +msgstr "" + +#: judge/views/stats.py:105 +msgid "Language statistics" +msgstr "" + +#: judge/views/status.py:24 templates/submission/list.html:319 +msgid "Status" +msgstr "" + +#: judge/views/status.py:108 +msgid "Version matrix" +msgstr "" + +#: judge/views/submission.py:59 judge/views/submission.py:66 +#, python-format +msgid "Submission of %(problem)s by %(user)s" +msgstr "" + +#: judge/views/submission.py:161 judge/views/submission.py:162 +#: templates/problem/problem.html:127 +msgid "All submissions" +msgstr "" + +#: judge/views/submission.py:303 +msgid "All my submissions" +msgstr "" + +#: judge/views/submission.py:304 +#, python-format +msgid "All submissions by %s" +msgstr "" + +#: judge/views/submission.py:335 +#, python-format +msgid "All submissions for %s" +msgstr "" + +#: judge/views/submission.py:354 +msgid "Must pass a problem" +msgstr "" + +#: judge/views/submission.py:397 +#, python-format +msgid "My submissions for %(problem)s" +msgstr "" + +#: judge/views/submission.py:398 +#, python-format +msgid "%(user)s's submissions for %(problem)s" +msgstr "" + +#: judge/views/submission.py:495 +msgid "Must pass a contest" +msgstr "" + +#: judge/views/submission.py:514 +#, python-brace-format +msgid "{0}'s submissions for {2} in {4}" +msgstr "" + +#: judge/views/submission.py:519 +#, 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 "" + +#: judge/views/ticket.py:40 +msgid "Issue description" +msgstr "" + +#: judge/views/ticket.py:85 judge/views/ticket.py:88 +#, python-format +msgid "New ticket for %s" +msgstr "" + +#: judge/views/ticket.py:139 +#, python-format +msgid "%(title)s - Ticket %(id)d" +msgstr "" + +#: judge/views/ticket.py:248 +#, python-format +msgid "Tickets - Page %(number)d of %(total)d" +msgstr "" + +#: judge/views/ticket.py:297 +#, python-format +msgid "New Ticket: %s" +msgstr "" + +#: judge/views/ticket.py:298 +#, python-format +msgid "#%(id)d, assigned to: %(users)s" +msgstr "" + +#: judge/views/ticket.py:300 +msgid ", " +msgstr "" + +#: judge/views/ticket.py:300 +msgid "no one" +msgstr "" + +#: judge/views/totp.py:42 templates/registration/totp_enable.html:86 +msgid "Enable Two Factor Authentication" +msgstr "" + +#: judge/views/totp.py:89 templates/registration/totp_disable.html:48 +msgid "Disable Two Factor Authentication" +msgstr "" + +#: judge/views/totp.py:103 +msgid "Perform Two Factor Authentication" +msgstr "" + +#: judge/views/user.py:68 +msgid "No such user" +msgstr "" + +#: judge/views/user.py:68 +#, python-format +msgid "No user handle \"%s\"." +msgstr "" + +#: judge/views/user.py:72 +msgid "My account" +msgstr "" + +#: judge/views/user.py:73 +#, python-format +msgid "User %s" +msgstr "" + +#: judge/views/user.py:136 +msgid "M j, Y, G:i" +msgstr "" + +#: judge/views/user.py:221 +msgid "Updated on site" +msgstr "" + +#: judge/views/user.py:253 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:10 +msgid "Edit profile" +msgstr "" + +#: judge/views/user.py:262 templates/user/user-list-tabs.html:4 +msgid "Leaderboard" +msgstr "" + +#: judge/views/widgets.py:48 judge/views/widgets.py:58 +#, python-format +msgid "Invalid upstream data: %s" +msgstr "" + +#: judge/views/widgets.py:68 +msgid "Bad latitude or longitude" +msgstr "" + +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:13 +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:27 +msgid "Photo" +msgstr "" + +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:14 +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:28 +msgid "Photos" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:9 +msgid "first name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:10 +msgid "last name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:11 +msgid "biography" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/admin.py:24 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:30 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:30 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:30 +msgid "owner" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:12 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:12 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:12 +msgid "name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:19 +msgid "Category of Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:20 +msgid "Categories of Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:26 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:26 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:26 +msgid "title" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:28 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:28 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:28 +msgid "category" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:29 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:29 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:29 +msgid "author" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:31 +msgid "publication date" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:37 +msgid "Book" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:38 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:136 +msgid "Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:19 +msgid "Category of CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:20 +msgid "Categories of CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:36 +msgid "CD" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:37 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:141 +msgid "CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:19 +msgid "Category of DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:20 +msgid "Categories of DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:36 +msgid "DVD" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:37 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:146 +msgid "DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/templates/admin/base_site.html:7 +msgid "Django administration" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/forms.py:12 +#, python-format +msgid "Please enter the correct %(username)s and password for an admin account. Note that both fields may be case-sensitive." +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/forms.py:32 +#, python-format +msgid "Please enter the correct %(username)s and password for an user account. Note that both fields may be case-sensitive." +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:27 +msgid "Site" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:38 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:41 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:130 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:133 +msgid "Dashboard" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:48 +msgid "Applications" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:53 +msgid "Administration" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:64 +msgid "Color theme" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:66 +msgid "Change color theme" +msgstr "" + +#: 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 +msgid "Rate all ratable contests" +msgstr "" + +#: 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 +msgid "Rejudge" +msgstr "" + +#: templates/base.html:214 +#, python-format +msgid "Hello, %(username)s." +msgstr "" + +#: templates/base.html:220 templates/comments/list.html:89 +#: templates/contest/contest-list-tabs.html:24 +#: templates/problem/problem-list-tabs.html:6 +#: templates/submission/info-base.html:12 +#: templates/submission/submission-list-tabs.html:15 +msgid "Admin" +msgstr "" + +#: templates/base.html:229 +msgid "Log out" +msgstr "" + +#: templates/base.html:238 +#: templates/registration/password_reset_complete.html:4 +msgid "Log in" +msgstr "" + +#: templates/base.html:239 templates/registration/registration_form.html:177 +msgid "or" +msgstr "" + +#: templates/base.html:240 +msgid "Sign up" +msgstr "" + +#: templates/base.html:252 +msgid "spectating" +msgstr "" + +#: 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:20 +#: 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 +msgid "Edit" +msgstr "" + +#: templates/blog/content.html:27 +#, python-format +msgid "\n" +" posted on %(time)s\n" +" " +msgstr "" + +#: templates/blog/dashboard.html:21 +#, python-format +msgid "\n" +" on %(time)s\n" +" " +msgstr "" + +#: templates/blog/list.html:85 +msgid "Blog" +msgstr "" + +#: templates/blog/list.html:87 +msgid "Events" +msgstr "" + +#: templates/blog/list.html:92 +msgid "News" +msgstr "" + +#: templates/blog/list.html:106 +#, python-brace-format +msgid "posted on {time}" +msgstr "" + +#: templates/blog/list.html:130 templates/problem/problem.html:310 +msgid "Clarifications" +msgstr "" + +#: templates/blog/list.html:146 templates/problem/problem.html:321 +msgid "No clarifications have been made at this time." +msgstr "" + +#: templates/blog/list.html:154 +msgid "Ongoing contests" +msgstr "" + +#: templates/blog/list.html:172 +msgid "Upcoming contests" +msgstr "" + +#: templates/blog/list.html:189 +msgid "Comment stream" +msgstr "" + +#: templates/blog/list.html:208 +msgid "New problems" +msgstr "" + +#: templates/blog/list.html:225 +msgid "My open tickets" +msgstr "" + +#: templates/blog/list.html:246 +msgid "New tickets" +msgstr "" + +#: templates/comments/list.html:2 +msgid "Comments" +msgstr "" + +#: templates/comments/list.html:18 templates/comments/list.html:27 +msgid "Please login to vote" +msgstr "" + +#: templates/comments/list.html:40 +#, python-brace-format +msgid "commented on {time}" +msgstr "" + +#: templates/comments/list.html:49 +#, python-format +msgid "edit %(edits)s" +msgstr "" + +#: templates/comments/list.html:51 templates/comments/media-js.html:77 +msgid "edited" +msgstr "" + +#: templates/comments/list.html:60 +msgid "Link" +msgstr "" + +#: templates/comments/list.html:73 templates/comments/list.html:80 +msgid "Reply" +msgstr "" + +#: templates/comments/list.html:86 +msgid "Hide" +msgstr "" + +#: templates/comments/list.html:101 +#, 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:120 +msgid "There are no comments at the moment." +msgstr "" + +#: templates/comments/list.html:126 +msgid "New comment" +msgstr "" + +#: templates/comments/list.html:140 +msgid "Invalid comment body." +msgstr "" + +#: templates/comments/list.html:148 +msgid "Post!" +msgstr "" + +#: templates/comments/list.html:156 +msgid "Comments are disabled on this page." +msgstr "" + +#: templates/comments/media-js.html:72 +#, python-brace-format +msgid "edit {edits}" +msgstr "" + +#: templates/comments/media-js.html:75 +msgid "original" +msgstr "" + +#: templates/contest/access_code.html:26 +msgid "Invalid access code." +msgstr "" + +#: templates/contest/access_code.html:29 +msgid "Please enter your access code:" +msgstr "" + +#: templates/contest/access_code.html:32 +msgid "Join Contest" +msgstr "" + +#: templates/contest/calendar.html:12 +msgid "Sunday" +msgstr "" + +#: templates/contest/calendar.html:13 +msgid "Monday" +msgstr "" + +#: templates/contest/calendar.html:14 +msgid "Tuesday" +msgstr "" + +#: templates/contest/calendar.html:15 +msgid "Wednesday" +msgstr "" + +#: templates/contest/calendar.html:16 +msgid "Thursday" +msgstr "" + +#: templates/contest/calendar.html:17 +msgid "Friday" +msgstr "" + +#: templates/contest/calendar.html:18 +msgid "Saturday" +msgstr "" + +#: 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 +msgid "Today" +msgstr "" + +#: templates/contest/contest-list-tabs.html:13 +msgid "Next" +msgstr "" + +#: templates/contest/contest-list-tabs.html:21 +#: templates/problem/problem-list-tabs.html:5 +msgid "List" +msgstr "" + +#: templates/contest/contest-list-tabs.html:22 +msgid "Calendar" +msgstr "" + +#: templates/contest/contest-tabs.html:4 +msgid "Info" +msgstr "" + +#: templates/contest/contest-tabs.html:8 +msgid "Rankings" +msgstr "" + +#: templates/contest/contest-tabs.html:10 +msgid "Hidden Rankings" +msgstr "" + +#: templates/contest/contest-tabs.html:18 +msgid "MOSS" +msgstr "" + +#: templates/contest/contest-tabs.html:23 +msgid "Clone" +msgstr "" + +#: templates/contest/contest-tabs.html:34 +#: templates/contest/contest-tabs.html:54 +msgid "Leave contest" +msgstr "" + +#: templates/contest/contest-tabs.html:41 templates/contest/list.html:293 +msgid "Virtual join" +msgstr "" + +#: templates/contest/contest-tabs.html:52 +msgid "Stop spectating" +msgstr "" + +#: templates/contest/contest-tabs.html:61 +msgid "Spectate contest" +msgstr "" + +#: templates/contest/contest-tabs.html:67 +#: templates/contest/contest-tabs.html:73 +msgid "Join contest" +msgstr "" + +#: templates/contest/contest-tabs.html:82 +msgid "Login to participate" +msgstr "" + +#: templates/contest/contest.html:37 +msgid "Participating virtually." +msgstr "" + +#: templates/contest/contest.html:43 +msgid "Contest is over." +msgstr "" + +#: templates/contest/contest.html:59 templates/contest/contest.html:63 +msgid "F j, Y, G:i T" +msgstr "" + +#: 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 +#, python-format +msgid "%(length)s long starting on %(start_time)s" +msgstr "" + +#: templates/contest/contest.html:85 +msgid "AC Rate" +msgstr "" + +#: templates/contest/contest.html:86 templates/contest/list.html:153 +#: templates/contest/list.html:195 templates/contest/list.html:271 +#: templates/problem/list.html:212 templates/problem/list.html:238 +msgid "Users" +msgstr "" + +#: templates/contest/contest.html:111 +msgid "Editorial" +msgstr "" + +#: templates/contest/list.html:31 templates/contest/media-js.html:9 +msgid "Are you sure you want to join?" +msgstr "" + +#: 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:65 +msgid "hidden" +msgstr "" + +#: templates/contest/list.html:70 +msgid "private" +msgstr "" + +#: templates/contest/list.html:84 +msgid "rated" +msgstr "" + +#: templates/contest/list.html:132 +msgid "Spectate" +msgstr "" + +#: templates/contest/list.html:138 +msgid "Join" +msgstr "" + +#: templates/contest/list.html:148 +msgid "Active Contests" +msgstr "" + +#: templates/contest/list.html:152 templates/contest/list.html:194 +#: templates/contest/list.html:232 templates/contest/list.html:270 +msgid "Contest" +msgstr "" + +#: templates/contest/list.html:190 +msgid "Ongoing Contests" +msgstr "" + +#: templates/contest/list.html:227 +msgid "Upcoming Contests" +msgstr "" + +#: templates/contest/list.html:255 +msgid "There are no scheduled contests at this time." +msgstr "" + +#: templates/contest/list.html:261 +msgid "Past Contests" +msgstr "" + +#: templates/contest/media-js.html:4 +msgid "Are you sure you want to leave?" +msgstr "" + +#: 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 +msgid "Joining a contest starts your timer, after which it becomes unstoppable." +msgstr "" + +#: 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:7 +msgid "Organization" +msgstr "" + +#: templates/contest/ranking-table.html:27 +#, python-brace-format +msgid "Started on {time}" +msgstr "" + +#: templates/contest/ranking-table.html:30 +msgid "Participation ended." +msgstr "" + +#: templates/contest/ranking.html:232 +msgid "View user participation" +msgstr "" + +#: templates/contest/ranking.html:236 +msgid "Show organizations" +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 +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 +msgid "activate" +msgstr "" + +#: 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 +msgid "Newsletter unsubscribe" +msgstr "" + +#: 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 +msgid "Do you want to unsubscribe from this newsletter?" +msgstr "" + +#: 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 +msgid "Newsletter update" +msgstr "" + +#: 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 +msgid "Update subscription" +msgstr "" + +#: templates/newsletter/subscription_update_activated.html:8 +msgid "Your subscription has successfully been updated." +msgstr "" + +#: 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:34 +#: templates/ticket/edit-notes.html:4 +msgid "Update" +msgstr "" + +#: 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:29 +msgid "Join organization" +msgstr "" + +#: templates/organization/home.html:33 +msgid "Request membership" +msgstr "" + +#: templates/organization/home.html:39 +msgid "Edit organization" +msgstr "" + +#: templates/organization/home.html:43 +msgid "View requests" +msgstr "" + +#: templates/organization/home.html:50 +msgid "Admin organization" +msgstr "" + +#: templates/organization/home.html:55 +msgid "View members" +msgstr "" + +#: templates/organization/list.html:23 templates/status/language-list.html:34 +msgid "Name" +msgstr "" + +#: templates/organization/list.html:24 +msgid "Members" +msgstr "" + +#: templates/organization/new.html:10 templates/ticket/new.html:38 +msgid "Create" +msgstr "" + +#: templates/organization/requests/detail.html:13 +msgid "User:" +msgstr "" + +#: templates/organization/requests/detail.html:17 +msgid "Organization:" +msgstr "" + +#: templates/organization/requests/detail.html:25 +msgid "Time:" +msgstr "" + +#: templates/organization/requests/detail.html:29 +msgid "Reason:" +msgstr "" + +#: 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:15 +msgid "Reason" +msgstr "" + +#: 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:17 +#: templates/problem/data.html:401 +msgid "Delete?" +msgstr "" + +#: templates/organization/requests/request.html:18 +msgid "Your reason for joining:" +msgstr "" + +#: templates/organization/requests/request.html:20 +msgid "Request" +msgstr "" + +#: templates/organization/requests/tabs.html:4 +msgid "Pending" +msgstr "" + +#: templates/organization/requests/tabs.html:7 +msgid "Log" +msgstr "" + +#: templates/organization/requests/tabs.html:10 +msgid "Approved" +msgstr "" + +#: templates/organization/requests/tabs.html:13 +msgid "Rejected" +msgstr "" + +#: templates/organization/users-table.html:15 +msgid "Kick" +msgstr "" + +#: templates/problem/clone.html:37 +msgid "Enter a new code for the cloned problem:" +msgstr "" + +#: templates/problem/data.html:353 +msgid "View YAML" +msgstr "" + +#: templates/problem/data.html:369 +msgid "Show columns:" +msgstr "" + +#: templates/problem/data.html:372 templates/problem/data.html:396 +msgid "Output prefix" +msgstr "" + +#: templates/problem/data.html:376 templates/problem/data.html:397 +msgid "Output limit" +msgstr "" + +#: templates/problem/data.html:380 templates/problem/data.html:398 +msgid "Checker" +msgstr "" + +#: templates/problem/data.html:384 templates/problem/data.html:399 +msgid "Generator args" +msgstr "" + +#: templates/problem/data.html:391 +msgid "Type" +msgstr "" + +#: templates/problem/data.html:392 +msgid "Input file" +msgstr "" + +#: templates/problem/data.html:393 +msgid "Output file" +msgstr "" + +#: templates/problem/data.html:395 +msgid "Pretest?" +msgstr "" + +#: templates/problem/data.html:447 templates/problem/submit.html:252 +msgid "Submit!" +msgstr "" + +#: templates/problem/data.html:448 +msgid "Add new case" +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 editorialist.

Submitting an official solution before solving the problem yourself is a bannable offence." +msgstr "" + +#: templates/problem/list.html:62 +msgid "Filter by type..." +msgstr "" + +#: templates/problem/list.html:185 +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:57 +msgid "Category" +msgstr "" + +#: templates/problem/list.html:209 templates/problem/list.html:228 +msgid "Types" +msgstr "" + +#: templates/problem/list.html:235 +#, python-format +msgid "AC %%" +msgstr "" + +#: 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:142 +msgid "Filter by result:" +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:101 templates/problem/problem.html:111 +#: templates/problem/problem.html:116 +msgid "Submit solution" +msgstr "" + +#: 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:112 +msgid "0 submissions left" +msgstr "" + +#: templates/problem/problem.html:124 +msgid "My submissions" +msgstr "" + +#: templates/problem/problem.html:128 +msgid "Best submissions" +msgstr "" + +#: templates/problem/problem.html:132 +msgid "Read editorial" +msgstr "" + +#: templates/problem/problem.html:137 +msgid "Manage tickets" +msgstr "" + +#: templates/problem/problem.html:141 +msgid "Edit problem" +msgstr "" + +#: templates/problem/problem.html:143 +msgid "Edit test data" +msgstr "" + +#: templates/problem/problem.html:148 +msgid "My tickets" +msgstr "" + +#: templates/problem/problem.html:156 +msgid "Manage submissions" +msgstr "" + +#: templates/problem/problem.html:162 +msgid "Clone problem" +msgstr "" + +#: templates/problem/problem.html:169 +msgid "Points:" +msgstr "" + +#: templates/problem/problem.html:172 templates/problem/problem.html:174 +msgid "(partial)" +msgstr "" + +#: templates/problem/problem.html:179 +msgid "Time limit:" +msgstr "" + +#: templates/problem/problem.html:191 +msgid "Memory limit:" +msgstr "" + +#: templates/problem/problem.html:210 +msgid "Author:" +msgid_plural "Authors:" +msgstr[0] "" +msgstr[1] "" + +#: templates/problem/problem.html:225 +msgid "Problem type" +msgid_plural "Problem types" +msgstr[0] "" +msgstr[1] "" + +#: templates/problem/problem.html:238 +msgid "Allowed languages" +msgstr "" + +#: templates/problem/problem.html:246 +#, python-format +msgid "No %(lang)s judge online" +msgstr "" + +#: templates/problem/problem.html:257 +msgid "Judge:" +msgid_plural "Judges:" +msgstr[0] "" +msgstr[1] "" + +#: templates/problem/problem.html:274 +msgid "none available" +msgstr "" + +#: templates/problem/problem.html:299 +msgid "Request clarification" +msgstr "" + +#: templates/problem/problem.html:301 +msgid "Report an issue" +msgstr "" + +#: 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 +msgid "Search problems..." +msgstr "" + +#: templates/problem/search-form.html:14 +msgid "Full text search" +msgstr "" + +#: templates/problem/search-form.html:21 +msgid "Hide solved problems" +msgstr "" + +#: 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 +msgid "All" +msgstr "" + +#: templates/problem/search-form.html:46 +msgid "Problem types" +msgstr "" + +#: templates/problem/search-form.html:57 +msgid "Point range" +msgstr "" + +#: templates/problem/search-form.html:63 templates/submission/list.html:337 +#: templates/ticket/list.html:248 +msgid "Go" +msgstr "" + +#: templates/problem/search-form.html:64 +msgid "Random" +msgstr "" + +#: templates/problem/submit.html:192 +#, python-format +msgid "Warning! Your default language, %(default_language)s, is unavailable for this problem and has been deselected." +msgstr "" + +#: templates/problem/submit.html:203 +#, python-format +msgid "\n" +" You have %(left)s submission left\n" +" " +msgid_plural "\n" +" You have %(left)s submissions left\n" +" " +msgstr[0] "" +msgstr[1] "" + +#: templates/problem/submit.html:212 +msgid "You have 0 submissions left" +msgstr "" + +#: templates/problem/submit.html:250 +msgid "No judge is available for this problem." +msgstr "" + +#: templates/registration/activate.html:3 +#, python-format +msgid "%(key)s is an invalid activation key." +msgstr "" + +#: templates/registration/activation_complete.html:3 +msgid "Your account has been successfully activated." +msgstr "" + +#: templates/registration/login.html:43 +msgid "Invalid username or password." +msgstr "" + +#: templates/registration/login.html:61 +#: templates/registration/totp_auth.html:39 +msgid "Login!" +msgstr "" + +#: templates/registration/login.html:64 +msgid "Forgot your password?" +msgstr "" + +#: templates/registration/login.html:67 +msgid "Or log in with..." +msgstr "" + +#: templates/registration/logout.html:3 +msgid "See you later!" +msgstr "" + +#: templates/registration/password_change_done.html:3 +msgid "Your password was sucessfully changed." +msgstr "" + +#: templates/registration/password_change_form.html:8 +msgid "Change Password" +msgstr "" + +#: templates/registration/password_reset.html:7 +msgid "Send Reset Email" +msgstr "" + +#: 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_confirm.html:9 +msgid "Reset Password" +msgstr "" + +#: 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 +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 +#, 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 +msgid "Please go to the following page and choose a new password:" +msgstr "" + +#: templates/registration/password_reset_email.txt:7 +msgid "Your username, in case you've forgotten:" +msgstr "" + +#: templates/registration/password_reset_email.txt:9 +msgid "Thanks for using our site!" +msgstr "" + +#: templates/registration/password_reset_email.txt:11 +#, python-format +msgid "The %(site_name)s team" +msgstr "" + +#: 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 +msgid "Continue >" +msgstr "" + +#: 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:166 +msgid "(again, for confirmation)" +msgstr "" + +#: templates/registration/registration_form.html:173 +msgid "(select your closest major city)" +msgstr "" + +#: templates/registration/registration_form.html:178 +msgid "pick from map" +msgstr "" + +#: templates/registration/registration_form.html:183 +msgid "Default language" +msgstr "" + +#: templates/registration/registration_form.html:186 +#: templates/user/edit-profile.html:162 +msgid "Affiliated organizations" +msgstr "" + +#: templates/registration/registration_form.html:192 +#: templates/user/edit-profile.html:121 +msgid "Notify me about upcoming contests" +msgstr "" + +#: templates/registration/registration_form.html:206 +msgid "By registering, you agree to our" +msgstr "" + +#: templates/registration/registration_form.html:207 +msgid "Terms & Conditions" +msgstr "" + +#: templates/registration/registration_form.html:210 +msgid "Register!" +msgstr "" + +#: templates/registration/totp_auth.html:36 +#: templates/registration/totp_disable.html:45 +#: templates/registration/totp_enable.html:83 +msgid "Enter the 6-digit code generated by your app:" +msgstr "" + +#: templates/registration/totp_auth.html:41 +#, python-format +msgid "If you lost your authentication device, please contact us at %(email)s." +msgstr "" + +#: templates/registration/totp_disable.html:38 +msgid "To protect your account, you must first authenticate before you can disable Two Factor Authentication." +msgstr "" + +#: templates/registration/totp_enable.html:71 +msgid "Scan this code with your authenticator app:" +msgstr "" + +#: templates/registration/totp_enable.html:72 +msgid "QR code" +msgstr "" + +#: templates/registration/totp_enable.html:73 +msgid "Or enter this code manually:" +msgstr "" + +#: templates/stats/base.html:9 templates/submission/list.html:345 +msgid "Statistics" +msgstr "" + +#: templates/stats/language.html:11 +msgid "Submission Statistics" +msgstr "" + +#: templates/stats/language.html:16 +msgid "Submissions by Language" +msgstr "" + +#: templates/stats/language.html:21 +msgid "AC Submissions by Language" +msgstr "" + +#: templates/stats/language.html:26 +msgid "Language AC Rate" +msgstr "" + +#: templates/status/judge-status-table.html:2 +msgid "Judge" +msgstr "" + +#: templates/status/judge-status-table.html:4 +msgid "Online" +msgstr "" + +#: templates/status/judge-status-table.html:6 +msgid "Uptime" +msgstr "" + +#: templates/status/judge-status-table.html:7 +msgid "Ping" +msgstr "" + +#: 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 +msgid "N/A" +msgstr "" + +#: templates/status/judge-status-table.html:64 +msgid "There are no judges available at this time." +msgstr "" + +#: templates/status/language-list.html:33 templates/ticket/list.html:261 +msgid "ID" +msgstr "" + +#: templates/status/language-list.html:35 +msgid "Runtime Info" +msgstr "" + +#: templates/status/status-tabs.html:4 +msgid "Judges" +msgstr "" + +#: templates/status/status-tabs.html:6 +msgid "Version Matrix" +msgstr "" + +#: templates/submission/internal-error-message.html:8 +msgid "An internal error occurred while grading." +msgstr "" + +#: templates/submission/internal-error-message.html:15 +msgid "Error information" +msgstr "" + +#: templates/submission/list.html:76 +msgid "Filter by status..." +msgstr "" + +#: templates/submission/list.html:82 +msgid "Filter by language..." +msgstr "" + +#: templates/submission/list.html:315 +msgid "Filter submissions" +msgstr "" + +#: templates/submission/list.html:351 +msgid "Total:" +msgstr "" + +#: templates/submission/list.html:361 +msgid "You were disconnected. Refresh to show latest updates." +msgstr "" + +#: templates/submission/row.html:39 +#, python-format +msgid "Case #%(case)s" +msgstr "" + +#: templates/submission/row.html:49 +msgid "view" +msgstr "" + +#: templates/submission/row.html:53 +msgid "rejudge" +msgstr "" + +#: templates/submission/row.html:58 +msgid "admin" +msgstr "" + +#: templates/submission/source.html:25 +msgid "View status" +msgstr "" + +#: templates/submission/source.html:26 +msgid "View raw source" +msgstr "" + +#: templates/submission/source.html:28 templates/submission/status.html:61 +msgid "Resubmit" +msgstr "" + +#: 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 +msgid "Your submission is being processed..." +msgstr "" + +#: templates/submission/status-testcases.html:14 +msgid "Compilation Error" +msgstr "" + +#: templates/submission/status-testcases.html:18 +msgid "Compilation Warnings" +msgstr "" + +#: templates/submission/status-testcases.html:23 +msgid "Pretest Execution Results" +msgstr "" + +#: templates/submission/status-testcases.html:25 +msgid "Execution Results" +msgstr "" + +#: templates/submission/status-testcases.html:31 +msgid "Batch " +msgstr "" + +#: templates/submission/status-testcases.html:43 +msgid "Case" +msgstr "" + +#: templates/submission/status-testcases.html:45 +msgid "Pretest" +msgstr "" + +#: templates/submission/status-testcases.html:47 +msgid "Test case" +msgstr "" + +#: templates/submission/status-testcases.html:79 +msgid "Your output (clipped)" +msgstr "" + +#: templates/submission/status-testcases.html:90 +msgid "Judge feedback" +msgstr "" + +#: templates/submission/status-testcases.html:106 +msgid "Resources:" +msgstr "" + +#: templates/submission/status-testcases.html:115 +msgid "Final pretest score:" +msgstr "" + +#: templates/submission/status-testcases.html:117 +msgid "Final score:" +msgstr "" + +#: templates/submission/status-testcases.html:131 +msgid "Passing pretests does not guarantee a full score on system tests." +msgstr "" + +#: templates/submission/status-testcases.html:134 +msgid "Submission aborted!" +msgstr "" + +#: templates/submission/status.html:59 +msgid "View source" +msgstr "" + +#: templates/submission/status.html:88 +msgid "Abort" +msgstr "" + +#: templates/submission/submission-list-tabs.html:6 +msgid "Mine" +msgstr "" + +#: templates/submission/submission-list-tabs.html:9 +msgid "Best" +msgstr "" + +#: templates/submission/submission-list-tabs.html:12 +#, python-format +msgid "%(user)s's" +msgstr "" + +#: templates/ticket/list.html:135 templates/ticket/ticket.html:257 +msgid "Reopened: " +msgstr "" + +#: templates/ticket/list.html:138 templates/ticket/ticket.html:258 +msgid "Closed: " +msgstr "" + +#: templates/ticket/list.html:221 +msgid "Use desktop notification" +msgstr "" + +#: templates/ticket/list.html:227 +msgid "Show my tickets only" +msgstr "" + +#: templates/ticket/list.html:231 +msgid "Filing user" +msgstr "" + +#: templates/ticket/list.html:240 +msgid "Assignee" +msgstr "" + +#: templates/ticket/list.html:262 +msgid "Title" +msgstr "" + +#: templates/ticket/list.html:264 templates/ticket/ticket.html:304 +msgid "Assignees" +msgstr "" + +#: templates/ticket/new_problem.html:7 +msgid "Thanks for opening a ticket!" +msgstr "" + +#: 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 +msgid "Associated object" +msgstr "" + +#: templates/ticket/ticket.html:309 +msgid "No one is assigned." +msgstr "" + +#: templates/ticket/ticket.html:315 +msgid "Close ticket" +msgstr "" + +#: templates/ticket/ticket.html:317 +msgid "Reopen ticket" +msgstr "" + +#: templates/ticket/ticket.html:321 +msgid "Assignee notes" +msgstr "" + +#: templates/ticket/ticket.html:328 templates/widgets/select_all.html:4 +msgid "Nothing here." +msgstr "" + +#: templates/ticket/ticket.html:378 +msgid "Post" +msgstr "" + +#: templates/user/base-users-table.html:3 +msgid "Rank" +msgstr "" + +#: templates/user/base-users.html:14 templates/user/base-users.html:69 +msgid "Search by handle..." +msgstr "" + +#: templates/user/edit-profile.html:90 +msgid "Self-description" +msgstr "" + +#: templates/user/edit-profile.html:98 +msgid "Select your closest major city" +msgstr "" + +#: templates/user/edit-profile.html:107 +msgid "Editor theme" +msgstr "" + +#: templates/user/edit-profile.html:112 +msgid "Math engine" +msgstr "" + +#: templates/user/edit-profile.html:136 templates/user/edit-profile.html:137 +msgid "Change your avatar" +msgstr "" + +#: templates/user/edit-profile.html:143 +msgid "Change your password" +msgstr "" + +#: templates/user/edit-profile.html:150 +msgid "Two Factor Authentication is enabled." +msgstr "" + +#: templates/user/edit-profile.html:153 +msgid "Two Factor Authentication is disabled." +msgstr "" + +#: templates/user/edit-profile.html:170 +msgid "User-script" +msgstr "" + +#: templates/user/edit-profile.html:174 +msgid "Update profile" +msgstr "" + +#: templates/user/pp-row.html:22 +#, python-format +msgid "\n" +" weighted %(weight)s%%\n" +" " +msgstr "" + +#: templates/user/pp-row.html:27 +#, python-format +msgid "%(pp).1fpp" +msgstr "" + +#: templates/user/pp-row.html:29 +#, python-format +msgid "%(pp).0fpp" +msgstr "" + +#: templates/user/user-about.html:14 +msgid "From" +msgstr "" + +#: 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:40 +msgid "You have not shared any information." +msgstr "" + +#: templates/user/user-about.html:42 +msgid "This user has not shared any information." +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:53 +msgid "Total points:" +msgstr "" + +#: templates/user/user-base.html:68 +msgid "Rank by rating:" +msgstr "" + +#: templates/user/user-base.html:70 +msgid "Rating:" +msgstr "" + +#: templates/user/user-base.html:71 +msgid "Volatility:" +msgstr "" + +#: templates/user/user-base.html:72 +msgid "Min. rating:" +msgstr "" + +#: templates/user/user-base.html:73 +msgid "Max rating:" +msgstr "" + +#: templates/user/user-problems.html:35 +msgid "Points Breakdown" +msgstr "" + +#: templates/user/user-problems.html:41 +msgid "Load more..." +msgstr "" + +#: templates/user/user-problems.html:45 +msgid "This user has not yet solved any problems." +msgstr "" + +#: templates/user/user-problems.html:51 +msgid "Authored Problems" +msgstr "" + +#: templates/user/user-problems.html:83 +msgid "Hide problems I've solved" +msgstr "" + +#: templates/user/user-problems.html:93 +#, python-format +msgid "%(points).1f points" +msgstr "" + +#: templates/user/user-problems.html:99 +msgid "Score" +msgstr "" + +#: templates/user/user-problems.html:110 +#, python-format +msgid "%(points)s / %(total)s" +msgstr "" + +#: templates/user/user-tabs.html:7 +msgid "Impersonate" +msgstr "" + +#: templates/user/user-tabs.html:13 +msgid "Admin User" +msgstr "" + +#: templates/user/user-tabs.html:16 +msgid "Admin Profile" +msgstr "" + +#: templates/widgets/select_all.html:8 +msgid "Check all" +msgstr "" + diff --git a/locale/nl/LC_MESSAGES/djangojs.po b/locale/nl/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..0f23d9b --- /dev/null +++ b/locale/nl/LC_MESSAGES/djangojs.po @@ -0,0 +1,30 @@ +msgid "" +msgstr "" +"Project-Id-Version: dmoj\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-10-01 23:12+0000\n" +"PO-Revision-Date: 2019-11-11 22:05\n" +"Last-Translator: Icyene\n" +"Language-Team: Dutch\n" +"Language: nl_NL\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: crowdin.com\n" +"X-Crowdin-Project: dmoj\n" +"X-Crowdin-Language: nl\n" +"X-Crowdin-File: djangojs.po\n" + +#: 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:210 +msgctxt "time format without day" +msgid "%h:%m:%s" +msgstr "" + diff --git a/locale/pl/LC_MESSAGES/django.po b/locale/pl/LC_MESSAGES/django.po new file mode 100644 index 0000000..a5b91d6 --- /dev/null +++ b/locale/pl/LC_MESSAGES/django.po @@ -0,0 +1,4575 @@ +msgid "" +msgstr "" +"Project-Id-Version: dmoj\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-11-11 21:54+0000\n" +"PO-Revision-Date: 2019-11-11 22:05\n" +"Last-Translator: Icyene\n" +"Language-Team: Polish\n" +"Language: pl_PL\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" +"X-Generator: crowdin.com\n" +"X-Crowdin-Project: dmoj\n" +"X-Crowdin-Language: pl\n" +"X-Crowdin-File: django.po\n" + +#: dmoj/settings.py:337 +msgid "German" +msgstr "Niemiecki" + +#: dmoj/settings.py:338 +msgid "English" +msgstr "Angielski" + +#: dmoj/settings.py:339 +msgid "Spanish" +msgstr "Hiszpański" + +#: dmoj/settings.py:340 +msgid "French" +msgstr "Francuski" + +#: dmoj/settings.py:341 +msgid "Croatian" +msgstr "Chorwacki" + +#: dmoj/settings.py:342 +msgid "Hungarian" +msgstr "Węgierski" + +#: dmoj/settings.py:343 +msgid "Japanese" +msgstr "" + +#: dmoj/settings.py:344 +msgid "Korean" +msgstr "Koreański" + +#: dmoj/settings.py:345 +msgid "Brazilian Portuguese" +msgstr "" + +#: dmoj/settings.py:346 +msgid "Romanian" +msgstr "Rumuński" + +#: dmoj/settings.py:347 +msgid "Russian" +msgstr "Rosyjski" + +#: dmoj/settings.py:348 +msgid "Serbian (Latin)" +msgstr "Serbski (alfabet łaciński)" + +#: dmoj/settings.py:349 +msgid "Turkish" +msgstr "Turecki" + +#: dmoj/settings.py:350 +msgid "Vietnamese" +msgstr "Wietnamski" + +#: dmoj/settings.py:351 +msgid "Simplified Chinese" +msgstr "Chiński Uproszczony" + +#: dmoj/urls.py:54 +msgid "Login" +msgstr "Logowanie" + +#: dmoj/urls.py:102 templates/base.html:190 +msgid "Home" +msgstr "Strona główna" + +#: judge/admin/comments.py:40 +#, python-format +msgid "%d comment successfully hidden." +msgid_plural "%d comments successfully hidden." +msgstr[0] "%d komentarz został pomyślnie dodany." +msgstr[1] "%d komentarze zostały pomyślnie dodane." +msgstr[2] "%d komentarzy zostało pomyślnie dodanych." +msgstr[3] "%d komentarzy zostało pomyślnie dodanych." + +#: judge/admin/comments.py:43 +msgid "Hide comments" +msgstr "Ukryj komentarze" + +#: judge/admin/comments.py:47 +#, python-format +msgid "%d comment successfully unhidden." +msgid_plural "%d comments successfully unhidden." +msgstr[0] "%d komentarz został pomyślnie ukryty." +msgstr[1] "%d komentarz został pomyślnie ukryty." +msgstr[2] "%d komentarzy zostało pomyślnie ukrytych." +msgstr[3] "%d komentarzy zostało pomyślnie ukrytych." + +#: judge/admin/comments.py:50 +msgid "Unhide comments" +msgstr "Pokaż komentarze" + +#: judge/admin/comments.py:58 +msgid "Associated page" +msgstr "Dołączona strona" + +#: judge/admin/contest.py:29 +msgid "Included contests" +msgstr "Załączniki" + +#: judge/admin/contest.py:65 templates/contest/contest.html:83 +#: templates/contest/moss.html:43 templates/problem/list.html:206 +#: templates/problem/list.html:221 templates/user/user-problems.html:56 +#: templates/user/user-problems.html:98 +msgid "Problem" +msgstr "Problem" + +#: judge/admin/contest.py:113 +msgid "Settings" +msgstr "" + +#: judge/admin/contest.py:115 +msgid "Scheduling" +msgstr "Planowanie" + +#: judge/admin/contest.py:116 +msgid "Details" +msgstr "Szczegóły" + +#: judge/admin/contest.py:117 +msgid "Format" +msgstr "" + +#: judge/admin/contest.py:118 templates/contest/ranking-table.html:5 +msgid "Rating" +msgstr "Ocena" + +#: judge/admin/contest.py:119 +msgid "Access" +msgstr "" + +#: judge/admin/contest.py:121 judge/admin/problem.py:131 +msgid "Justice" +msgstr "" + +#: judge/admin/contest.py:159 +#, python-format +msgid "%d contest successfully marked as visible." +msgid_plural "%d contests successfully marked as visible." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: judge/admin/contest.py:162 +msgid "Mark contests as visible" +msgstr "" + +#: judge/admin/contest.py:166 +#, 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] "" + +#: judge/admin/contest.py:169 +msgid "Mark contests as hidden" +msgstr "" + +#: judge/admin/contest.py:180 judge/admin/submission.py:149 +#: judge/admin/submission.py:171 +msgid "You do not have the permission to rejudge submissions." +msgstr "" + +#: judge/admin/contest.py:187 judge/admin/submission.py:155 +msgid "You do not have the permission to rejudge THAT many submissions." +msgstr "" + +#: judge/admin/contest.py:194 judge/admin/submission.py:164 +#, 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] "" + +#: judge/admin/contest.py:265 +#, python-format +msgid "%d participation recalculated." +msgid_plural "%d participations recalculated." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: judge/admin/contest.py:268 +msgid "Recalculate results" +msgstr "" + +#: judge/admin/contest.py:272 judge/admin/organization.py:65 +msgid "username" +msgstr "" + +#: judge/admin/contest.py:277 templates/base.html:258 +msgid "virtual" +msgstr "" + +#: judge/admin/interface.py:28 judge/models/interface.py:46 +msgid "link path" +msgstr "" + +#: judge/admin/interface.py:62 +msgid "Content" +msgstr "" + +#: judge/admin/interface.py:63 +msgid "Summary" +msgstr "" + +#: judge/admin/interface.py:107 judge/models/contest.py:251 +#: judge/models/contest.py:355 judge/models/profile.py:189 +msgid "user" +msgstr "" + +#: judge/admin/interface.py:148 +msgid "object" +msgstr "" + +#: judge/admin/organization.py:34 judge/admin/problem.py:171 +#: judge/admin/profile.py:78 +msgid "View on site" +msgstr "" + +#: judge/admin/problem.py:28 +msgid "Describe the changes you made (optional)" +msgstr "" + +#: judge/admin/problem.py:126 +msgid "Social Media" +msgstr "" + +#: judge/admin/problem.py:127 +msgid "Taxonomy" +msgstr "" + +#: judge/admin/problem.py:128 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:58 +msgid "Points" +msgstr "" + +#: judge/admin/problem.py:129 +msgid "Limits" +msgstr "" + +#: judge/admin/problem.py:130 judge/admin/submission.py:232 +#: templates/stats/base.html:14 templates/submission/list.html:328 +msgid "Language" +msgstr "" + +#: judge/admin/problem.py:132 +msgid "History" +msgstr "" + +#: judge/admin/problem.py:168 +msgid "Authors" +msgstr "" + +#: judge/admin/problem.py:183 +#, python-format +msgid "%d problem successfully marked as public." +msgid_plural "%d problems successfully marked as public." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: judge/admin/problem.py:187 +msgid "Mark problems as public" +msgstr "" + +#: judge/admin/problem.py:193 +#, python-format +msgid "%d problem successfully marked as private." +msgid_plural "%d problems successfully marked as private." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: judge/admin/problem.py:197 +msgid "Mark problems as private" +msgstr "" + +#: judge/admin/profile.py:32 +msgid "timezone" +msgstr "" + +#: judge/admin/profile.py:84 judge/admin/submission.py:211 +#: templates/organization/requests/log.html:9 +#: templates/organization/requests/pending.html:12 +#: templates/ticket/list.html:263 +msgid "User" +msgstr "" + +#: judge/admin/profile.py:89 templates/registration/registration_form.html:145 +msgid "Email" +msgstr "" + +#: judge/admin/profile.py:94 judge/views/register.py:29 +#: templates/registration/registration_form.html:173 +#: templates/user/edit-profile.html:99 +msgid "Timezone" +msgstr "" + +#: judge/admin/profile.py:99 +msgid "date joined" +msgstr "" + +#: judge/admin/profile.py:106 +#, python-format +msgid "%d user have scores recalculated." +msgid_plural "%d users have scores recalculated." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: judge/admin/profile.py:109 +msgid "Recalculate scores" +msgstr "" + +#: judge/admin/runtime.py:19 +msgid "Disallowed problems" +msgstr "" + +#: judge/admin/runtime.py:22 +msgid "These problems are NOT allowed to be submitted in this language" +msgstr "" + +#: judge/admin/runtime.py:83 +msgid "Description" +msgstr "" + +#: judge/admin/runtime.py:84 +msgid "Information" +msgstr "" + +#: judge/admin/runtime.py:85 +msgid "Capabilities" +msgstr "" + +#: judge/admin/submission.py:23 judge/admin/submission.py:42 +#: judge/admin/submission.py:221 +msgid "None" +msgstr "" + +#: judge/admin/submission.py:23 +msgid "Not done" +msgstr "" + +#: judge/admin/submission.py:23 +msgid "Exceptional" +msgstr "" + +#: judge/admin/submission.py:42 +msgid "Unaccepted" +msgstr "" + +#: judge/admin/submission.py:89 +#, python-format +msgctxt "contest problem" +msgid "%(problem)s in %(contest)s" +msgstr "" + +#: judge/admin/submission.py:167 +msgid "Rejudge the selected submissions" +msgstr "" + +#: judge/admin/submission.py:193 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] "" +msgstr[2] "" +msgstr[3] "" + +#: judge/admin/submission.py:196 +msgid "Rescore the selected submissions" +msgstr "" + +#: judge/admin/submission.py:200 +msgid "Problem code" +msgstr "" + +#: judge/admin/submission.py:205 +msgid "Problem name" +msgstr "" + +#: judge/admin/submission.py:215 templates/organization/requests/log.html:10 +#: templates/organization/requests/pending.html:13 +msgid "Time" +msgstr "" + +#: judge/admin/submission.py:223 +#, python-format +msgid "%d KB" +msgstr "" + +#: judge/admin/submission.py:225 +#, python-format +msgid "%.2f MB" +msgstr "" + +#: judge/admin/submission.py:227 +msgid "Memory" +msgstr "" + +#: judge/admin/taxon.py:11 judge/admin/taxon.py:34 +msgid "Included problems" +msgstr "" + +#: judge/admin/taxon.py:14 +msgid "These problems are included in this group of problems" +msgstr "" + +#: judge/admin/taxon.py:37 +msgid "These problems are included in this type of problems" +msgstr "" + +#: judge/apps.py:8 +msgid "Online Judge" +msgstr "" + +#: judge/comments.py:41 +msgid "Comment body" +msgstr "" + +#: judge/comments.py:47 judge/views/ticket.py:46 +msgid "Your part is silent, little toad." +msgstr "" + +#: judge/comments.py:50 templates/comments/list.html:131 +msgid "You need to have solved at least one problem before your voice can be heard." +msgstr "" + +#: judge/comments.py:92 +msgid "Posted comment" +msgstr "" + +#: judge/contest_format/atcoder.py:19 +msgid "AtCoder" +msgstr "" + +#: judge/contest_format/default.py:18 +msgid "Default" +msgstr "" + +#: judge/contest_format/ecoo.py:19 +msgid "ECOO" +msgstr "" + +#: judge/contest_format/ioi.py:19 +msgid "IOI" +msgstr "" + +#: judge/forms.py:27 +msgid "Subscribe to contest updates" +msgstr "" + +#: judge/forms.py:28 +msgid "Enable experimental features" +msgstr "" + +#: judge/forms.py:57 judge/views/organization.py:127 +#, python-brace-format +msgid "You may not be part of more than {count} public organizations." +msgstr "" + +#: judge/forms.py:107 judge/views/register.py:26 +#: templates/registration/registration_form.html:139 +#: templates/user/base-users-table.html:5 +msgid "Username" +msgstr "" + +#: judge/forms.py:108 templates/registration/registration_form.html:151 +#: templates/registration/registration_form.html:165 +msgid "Password" +msgstr "" + +#: judge/forms.py:130 +msgid "Two Factor Authentication tokens must be 6 decimal digits." +msgstr "" + +#: judge/forms.py:139 templates/registration/totp_auth.html:32 +msgid "Invalid Two Factor Authentication token." +msgstr "" + +#: judge/forms.py:143 judge/models/problem.py:97 +msgid "Problem code must be ^[a-z0-9]+$" +msgstr "" + +#: judge/forms.py:148 +msgid "Problem with code already exists." +msgstr "" + +#: judge/forms.py:153 judge/models/contest.py:51 +msgid "Contest id must be ^[a-z0-9]+$" +msgstr "" + +#: judge/forms.py:158 +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:59 +msgid "Leave as LaTeX" +msgstr "" + +#: judge/models/choices.py:60 +msgid "SVG with PNG fallback" +msgstr "" + +#: judge/models/choices.py:61 +msgid "MathML only" +msgstr "" + +#: judge/models/choices.py:62 +msgid "MathJax with SVG/PNG fallback" +msgstr "" + +#: judge/models/choices.py:63 +msgid "Detect best quality" +msgstr "" + +#: judge/models/comment.py:25 +msgid "Page code must be ^[pcs]:[a-z0-9]+$|^b:\\d+$" +msgstr "" + +#: judge/models/comment.py:41 +msgid "commenter" +msgstr "" + +#: judge/models/comment.py:42 +msgid "posted time" +msgstr "" + +#: judge/models/comment.py:43 judge/models/comment.py:176 +msgid "associated page" +msgstr "" + +#: judge/models/comment.py:45 +msgid "votes" +msgstr "" + +#: judge/models/comment.py:46 +msgid "body of comment" +msgstr "" + +#: judge/models/comment.py:47 +msgid "hide the comment" +msgstr "" + +#: judge/models/comment.py:48 +msgid "parent" +msgstr "" + +#: judge/models/comment.py:53 +msgid "comment" +msgstr "" + +#: judge/models/comment.py:54 +msgid "comments" +msgstr "" + +#: judge/models/comment.py:136 judge/models/problem.py:406 +#, python-format +msgid "Editorial for %s" +msgstr "" + +#: judge/models/comment.py:171 +msgid "comment vote" +msgstr "" + +#: judge/models/comment.py:172 +msgid "comment votes" +msgstr "" + +#: judge/models/comment.py:181 +msgid "Override comment lock" +msgstr "" + +#: judge/models/contest.py:21 +msgid "Invalid colour." +msgstr "" + +#: judge/models/contest.py:23 +msgid "tag name" +msgstr "" + +#: judge/models/contest.py:24 +msgid "Lowercase letters and hyphens only." +msgstr "" + +#: judge/models/contest.py:25 +msgid "tag colour" +msgstr "" + +#: judge/models/contest.py:26 +msgid "tag description" +msgstr "" + +#: judge/models/contest.py:45 +msgid "contest tag" +msgstr "" + +#: judge/models/contest.py:46 judge/models/contest.py:100 +msgid "contest tags" +msgstr "" + +#: judge/models/contest.py:50 +msgid "contest id" +msgstr "" + +#: judge/models/contest.py:52 +msgid "contest name" +msgstr "" + +#: judge/models/contest.py:53 +msgid "These people will be able to edit the contest." +msgstr "" + +#: judge/models/contest.py:55 judge/models/runtime.py:124 +#: src/dmoj-wpadmin/test_project/apps/books/admin.py:20 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:27 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:27 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:27 +msgid "description" +msgstr "" + +#: judge/models/contest.py:56 judge/models/problem.py:353 +#: judge/models/runtime.py:126 +msgid "problems" +msgstr "" + +#: judge/models/contest.py:57 judge/models/contest.py:252 +msgid "start time" +msgstr "" + +#: judge/models/contest.py:58 +msgid "end time" +msgstr "" + +#: judge/models/contest.py:59 judge/models/problem.py:118 +#: judge/models/problem.py:377 +msgid "time limit" +msgstr "" + +#: judge/models/contest.py:60 judge/models/problem.py:136 +msgid "publicly visible" +msgstr "" + +#: judge/models/contest.py:61 +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:64 +msgid "contest rated" +msgstr "" + +#: judge/models/contest.py:64 +msgid "Whether this contest can be rated." +msgstr "" + +#: judge/models/contest.py:66 +msgid "hide scoreboard" +msgstr "" + +#: judge/models/contest.py:67 +msgid "Whether the scoreboard should remain hidden for the duration of the contest." +msgstr "" + +#: judge/models/contest.py:70 +msgid "no comments" +msgstr "" + +#: judge/models/contest.py:71 +msgid "Use clarification system instead of comments." +msgstr "" + +#: judge/models/contest.py:73 +msgid "Rating floor for contest" +msgstr "" + +#: judge/models/contest.py:75 +msgid "Rating ceiling for contest" +msgstr "" + +#: judge/models/contest.py:77 +msgid "rate all" +msgstr "" + +#: judge/models/contest.py:77 +msgid "Rate all users who joined." +msgstr "" + +#: judge/models/contest.py:78 +msgid "exclude from ratings" +msgstr "" + +#: judge/models/contest.py:80 +msgid "private to specific users" +msgstr "" + +#: judge/models/contest.py:81 +msgid "private contestants" +msgstr "" + +#: judge/models/contest.py:82 +msgid "If private, only these users may see the contest" +msgstr "" + +#: judge/models/contest.py:84 +msgid "hide problem tags" +msgstr "" + +#: judge/models/contest.py:85 +msgid "Whether problem tags should be hidden by default." +msgstr "" + +#: judge/models/contest.py:87 +msgid "run pretests only" +msgstr "" + +#: judge/models/contest.py:88 +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:92 judge/models/problem.py:157 +msgid "private to organizations" +msgstr "" + +#: judge/models/contest.py:93 judge/models/problem.py:155 +#: judge/models/profile.py:76 +msgid "organizations" +msgstr "" + +#: judge/models/contest.py:94 +msgid "If private, only these organizations may see the contest" +msgstr "" + +#: judge/models/contest.py:95 judge/models/problem.py:145 +msgid "OpenGraph image" +msgstr "" + +#: judge/models/contest.py:96 judge/models/profile.py:47 +msgid "Logo override image" +msgstr "" + +#: judge/models/contest.py:98 +msgid "This image will replace the default site logo for users inside the contest." +msgstr "" + +#: judge/models/contest.py:101 +msgid "the amount of live participants" +msgstr "" + +#: judge/models/contest.py:102 +msgid "contest summary" +msgstr "" + +#: judge/models/contest.py:103 judge/models/problem.py:147 +msgid "Plain-text, shown in meta description tag, e.g. for social media." +msgstr "" + +#: judge/models/contest.py:104 judge/models/profile.py:46 +msgid "access code" +msgstr "" + +#: judge/models/contest.py:105 +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:107 judge/models/problem.py:141 +msgid "personae non gratae" +msgstr "" + +#: judge/models/contest.py:108 +msgid "Bans the selected users from joining this contest." +msgstr "" + +#: judge/models/contest.py:109 +msgid "contest format" +msgstr "" + +#: judge/models/contest.py:110 +msgid "The contest format module to use." +msgstr "" + +#: judge/models/contest.py:111 +msgid "contest format configuration" +msgstr "" + +#: judge/models/contest.py:112 +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:233 +msgid "See private contests" +msgstr "" + +#: judge/models/contest.py:234 +msgid "Edit own contests" +msgstr "" + +#: judge/models/contest.py:235 +msgid "Edit all contests" +msgstr "" + +#: judge/models/contest.py:236 +msgid "Clone contest" +msgstr "" + +#: judge/models/contest.py:237 templates/contest/moss.html:74 +msgid "MOSS contest" +msgstr "" + +#: judge/models/contest.py:238 +msgid "Rate contests" +msgstr "" + +#: judge/models/contest.py:239 +msgid "Contest access codes" +msgstr "" + +#: judge/models/contest.py:240 +msgid "Create private contests" +msgstr "" + +#: judge/models/contest.py:242 judge/models/contest.py:320 +#: judge/models/contest.py:356 judge/models/contest.py:378 +#: judge/models/submission.py:83 +msgid "contest" +msgstr "" + +#: judge/models/contest.py:243 +msgid "contests" +msgstr "" + +#: judge/models/contest.py:250 +msgid "associated contest" +msgstr "" + +#: judge/models/contest.py:253 +msgid "score" +msgstr "" + +#: judge/models/contest.py:254 +msgid "cumulative time" +msgstr "" + +#: judge/models/contest.py:255 +msgid "virtual participation id" +msgstr "" + +#: judge/models/contest.py:256 +msgid "0 means non-virtual, otherwise the n-th virtual participation" +msgstr "" + +#: judge/models/contest.py:257 +msgid "contest format specific data" +msgstr "" + +#: judge/models/contest.py:306 +#, python-format +msgid "%s spectating in %s" +msgstr "" + +#: judge/models/contest.py:308 +#, python-format +msgid "%s in %s, v%d" +msgstr "" + +#: judge/models/contest.py:309 +#, python-format +msgid "%s in %s" +msgstr "" + +#: judge/models/contest.py:312 +msgid "contest participation" +msgstr "" + +#: judge/models/contest.py:313 +msgid "contest participations" +msgstr "" + +#: judge/models/contest.py:319 judge/models/contest.py:340 +#: judge/models/contest.py:379 judge/models/problem.py:352 +#: judge/models/problem.py:357 judge/models/problem.py:375 +#: judge/models/problem_data.py:35 +msgid "problem" +msgstr "" + +#: judge/models/contest.py:321 judge/models/contest.py:344 +#: judge/models/problem.py:129 +msgid "points" +msgstr "" + +#: judge/models/contest.py:322 +msgid "partial" +msgstr "" + +#: judge/models/contest.py:323 judge/models/contest.py:345 +msgid "is pretested" +msgstr "" + +#: judge/models/contest.py:324 judge/models/interface.py:43 +msgid "order" +msgstr "" + +#: judge/models/contest.py:325 +msgid "output prefix length override" +msgstr "" + +#: judge/models/contest.py:326 +msgid "Maximum number of submissions for this problem, or 0 for no limit." +msgstr "" + +#: judge/models/contest.py:328 +msgid "Why include a problem you can't submit to?" +msgstr "" + +#: judge/models/contest.py:333 +msgid "contest problem" +msgstr "" + +#: judge/models/contest.py:334 +msgid "contest problems" +msgstr "" + +#: judge/models/contest.py:338 judge/models/submission.py:181 +msgid "submission" +msgstr "" + +#: judge/models/contest.py:342 judge/models/contest.py:357 +msgid "participation" +msgstr "" + +#: judge/models/contest.py:346 +msgid "Whether this submission was ran only on pretests." +msgstr "" + +#: judge/models/contest.py:350 +msgid "contest submission" +msgstr "" + +#: judge/models/contest.py:351 +msgid "contest submissions" +msgstr "" + +#: judge/models/contest.py:359 +msgid "rank" +msgstr "" + +#: judge/models/contest.py:360 +msgid "rating" +msgstr "" + +#: judge/models/contest.py:361 +msgid "volatility" +msgstr "" + +#: judge/models/contest.py:362 +msgid "last rated" +msgstr "" + +#: judge/models/contest.py:366 +msgid "contest rating" +msgstr "" + +#: judge/models/contest.py:367 +msgid "contest ratings" +msgstr "" + +#: judge/models/contest.py:386 +msgid "contest moss result" +msgstr "" + +#: judge/models/contest.py:387 +msgid "contest moss results" +msgstr "" + +#: judge/models/interface.py:24 +msgid "configuration item" +msgstr "" + +#: judge/models/interface.py:25 +msgid "miscellaneous configuration" +msgstr "" + +#: judge/models/interface.py:37 +msgid "navigation item" +msgstr "" + +#: judge/models/interface.py:38 +msgid "navigation bar" +msgstr "" + +#: judge/models/interface.py:44 +msgid "identifier" +msgstr "" + +#: judge/models/interface.py:45 +msgid "label" +msgstr "" + +#: judge/models/interface.py:47 +msgid "highlight regex" +msgstr "" + +#: judge/models/interface.py:48 +msgid "parent item" +msgstr "" + +#: judge/models/interface.py:66 +msgid "post title" +msgstr "" + +#: judge/models/interface.py:67 judge/models/problem.py:395 +msgid "authors" +msgstr "" + +#: judge/models/interface.py:68 +msgid "slug" +msgstr "" + +#: judge/models/interface.py:69 judge/models/problem.py:393 +msgid "public visibility" +msgstr "" + +#: judge/models/interface.py:70 +msgid "sticky" +msgstr "" + +#: judge/models/interface.py:71 +msgid "publish after" +msgstr "" + +#: judge/models/interface.py:72 +msgid "post content" +msgstr "" + +#: judge/models/interface.py:73 +msgid "post summary" +msgstr "" + +#: judge/models/interface.py:74 +msgid "openGraph image" +msgstr "" + +#: judge/models/interface.py:91 +msgid "Edit all posts" +msgstr "" + +#: judge/models/interface.py:93 +msgid "blog post" +msgstr "" + +#: judge/models/interface.py:94 +msgid "blog posts" +msgstr "" + +#: judge/models/message.py:11 +msgid "message title" +msgstr "" + +#: judge/models/message.py:12 judge/models/ticket.py:29 +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:26 +msgid "problem category ID" +msgstr "" + +#: judge/models/problem.py:27 +msgid "problem category name" +msgstr "" + +#: judge/models/problem.py:34 +msgid "problem type" +msgstr "" + +#: judge/models/problem.py:35 judge/models/problem.py:113 +msgid "problem types" +msgstr "" + +#: judge/models/problem.py:39 +msgid "problem group ID" +msgstr "" + +#: judge/models/problem.py:40 +msgid "problem group name" +msgstr "" + +#: judge/models/problem.py:47 judge/models/problem.py:116 +msgid "problem group" +msgstr "" + +#: judge/models/problem.py:48 +msgid "problem groups" +msgstr "" + +#: judge/models/problem.py:52 +msgid "key" +msgstr "" + +#: judge/models/problem.py:54 +msgid "link" +msgstr "" + +#: judge/models/problem.py:55 +msgid "full name" +msgstr "" + +#: judge/models/problem.py:56 judge/models/profile.py:32 +#: judge/models/runtime.py:23 +msgid "short name" +msgstr "" + +#: judge/models/problem.py:57 +msgid "Displayed on pages under this license" +msgstr "" + +#: judge/models/problem.py:58 +msgid "icon" +msgstr "" + +#: judge/models/problem.py:58 +msgid "URL to the icon" +msgstr "" + +#: judge/models/problem.py:59 +msgid "license text" +msgstr "" + +#: judge/models/problem.py:68 +msgid "license" +msgstr "" + +#: judge/models/problem.py:69 +msgid "licenses" +msgstr "" + +#: judge/models/problem.py:96 +msgid "problem code" +msgstr "" + +#: judge/models/problem.py:98 +msgid "A short, unique code for the problem, used in the url after /problem/" +msgstr "" + +#: judge/models/problem.py:100 +msgid "problem name" +msgstr "" + +#: judge/models/problem.py:101 +msgid "The full name of the problem, as shown in the problem list." +msgstr "" + +#: judge/models/problem.py:103 +msgid "problem body" +msgstr "" + +#: judge/models/problem.py:104 +msgid "creators" +msgstr "" + +#: judge/models/problem.py:105 +msgid "These users will be able to edit the problem, and be listed as authors." +msgstr "" + +#: judge/models/problem.py:107 +msgid "curators" +msgstr "" + +#: judge/models/problem.py:108 +msgid "These users will be able to edit the problem, but not be listed as authors." +msgstr "" + +#: judge/models/problem.py:110 +msgid "testers" +msgstr "" + +#: judge/models/problem.py:112 +msgid "These users will be able to view the private problem, but not edit it." +msgstr "" + +#: judge/models/problem.py:114 +msgid "The type of problem, as shown on the problem's page." +msgstr "" + +#: judge/models/problem.py:117 +msgid "The group of problem, shown under Category in the problem list." +msgstr "" + +#: judge/models/problem.py:119 +msgid "The time limit for this problem, in seconds. Fractional seconds (e.g. 1.5) are supported." +msgstr "" + +#: judge/models/problem.py:123 judge/models/problem.py:380 +msgid "memory limit" +msgstr "" + +#: judge/models/problem.py:124 +msgid "The memory limit for this problem, in kilobytes (e.g. 64mb = 65536 kilobytes)." +msgstr "" + +#: judge/models/problem.py:130 +msgid "Points awarded for problem completion. Points are displayed with a 'p' suffix if partial." +msgstr "" + +#: judge/models/problem.py:133 +msgid "allows partial points" +msgstr "" + +#: judge/models/problem.py:134 +msgid "allowed languages" +msgstr "" + +#: judge/models/problem.py:135 +msgid "List of allowed submission languages." +msgstr "" + +#: judge/models/problem.py:137 +msgid "manually managed" +msgstr "" + +#: judge/models/problem.py:138 +msgid "Whether judges should be allowed to manage data or not." +msgstr "" + +#: judge/models/problem.py:139 +msgid "date of publishing" +msgstr "" + +#: judge/models/problem.py:140 +msgid "Doesn't have magic ability to auto-publish due to backward compatibility" +msgstr "" + +#: judge/models/problem.py:142 +msgid "Bans the selected users from submitting to this problem." +msgstr "" + +#: judge/models/problem.py:144 +msgid "The license under which this problem is published." +msgstr "" + +#: judge/models/problem.py:146 +msgid "problem summary" +msgstr "" + +#: judge/models/problem.py:148 +msgid "number of users" +msgstr "" + +#: judge/models/problem.py:149 +msgid "The number of users who solved the problem." +msgstr "" + +#: judge/models/problem.py:150 +msgid "solve rate" +msgstr "" + +#: judge/models/problem.py:156 +msgid "If private, only these organizations may see the problem." +msgstr "" + +#: judge/models/problem.py:358 judge/models/problem.py:376 +#: judge/models/runtime.py:99 +msgid "language" +msgstr "" + +#: judge/models/problem.py:359 +msgid "translated name" +msgstr "" + +#: judge/models/problem.py:360 +msgid "translated description" +msgstr "" + +#: judge/models/problem.py:364 +msgid "problem translation" +msgstr "" + +#: judge/models/problem.py:365 +msgid "problem translations" +msgstr "" + +#: judge/models/problem.py:369 +msgid "clarified problem" +msgstr "" + +#: judge/models/problem.py:370 +msgid "clarification body" +msgstr "" + +#: judge/models/problem.py:371 +msgid "clarification timestamp" +msgstr "" + +#: judge/models/problem.py:386 +msgid "language-specific resource limit" +msgstr "" + +#: judge/models/problem.py:387 +msgid "language-specific resource limits" +msgstr "" + +#: judge/models/problem.py:391 +msgid "associated problem" +msgstr "" + +#: judge/models/problem.py:394 +msgid "publish date" +msgstr "" + +#: judge/models/problem.py:396 +msgid "editorial content" +msgstr "" + +#: judge/models/problem.py:412 +msgid "solution" +msgstr "" + +#: judge/models/problem.py:413 +msgid "solutions" +msgstr "" + +#: judge/models/problem_data.py:23 +msgid "Standard" +msgstr "" + +#: judge/models/problem_data.py:24 +msgid "Floats" +msgstr "" + +#: judge/models/problem_data.py:25 +msgid "Floats (absolute)" +msgstr "" + +#: judge/models/problem_data.py:26 +msgid "Floats (relative)" +msgstr "" + +#: judge/models/problem_data.py:27 +msgid "Non-trailing spaces" +msgstr "" + +#: judge/models/problem_data.py:28 +msgid "Unordered" +msgstr "" + +#: judge/models/problem_data.py:29 +msgid "Byte identical" +msgstr "" + +#: 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:39 +msgid "generator file" +msgstr "" + +#: judge/models/problem_data.py:41 judge/models/problem_data.py:90 +msgid "output prefix length" +msgstr "" + +#: judge/models/problem_data.py:42 judge/models/problem_data.py:91 +msgid "output limit length" +msgstr "" + +#: judge/models/problem_data.py:43 +msgid "init.yml generation feedback" +msgstr "" + +#: judge/models/problem_data.py:44 judge/models/problem_data.py:92 +msgid "checker" +msgstr "" + +#: judge/models/problem_data.py:45 judge/models/problem_data.py:93 +msgid "checker arguments" +msgstr "" + +#: 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:77 +msgid "problem data set" +msgstr "" + +#: judge/models/problem_data.py:79 +msgid "case position" +msgstr "" + +#: judge/models/problem_data.py:80 +msgid "case type" +msgstr "" + +#: judge/models/problem_data.py:81 +msgid "Normal case" +msgstr "" + +#: judge/models/problem_data.py:82 +msgid "Batch start" +msgstr "" + +#: judge/models/problem_data.py:83 +msgid "Batch end" +msgstr "" + +#: judge/models/problem_data.py:85 +msgid "input file name" +msgstr "" + +#: judge/models/problem_data.py:86 +msgid "output file name" +msgstr "" + +#: judge/models/problem_data.py:87 +msgid "generator arguments" +msgstr "" + +#: judge/models/problem_data.py:88 +msgid "point value" +msgstr "" + +#: judge/models/problem_data.py:89 +msgid "case is pretest?" +msgstr "" + +#: judge/models/profile.py:29 +msgid "organization title" +msgstr "" + +#: judge/models/profile.py:30 +msgid "organization slug" +msgstr "" + +#: judge/models/profile.py:31 +msgid "Organization name shown in URL" +msgstr "" + +#: judge/models/profile.py:33 +msgid "Displayed beside user name during contests" +msgstr "" + +#: judge/models/profile.py:34 +msgid "organization description" +msgstr "" + +#: judge/models/profile.py:35 +msgid "registrant" +msgstr "" + +#: judge/models/profile.py:36 +msgid "User who registered this organization" +msgstr "" + +#: judge/models/profile.py:37 +msgid "administrators" +msgstr "" + +#: judge/models/profile.py:38 +msgid "Those who can edit this organization" +msgstr "" + +#: judge/models/profile.py:39 +msgid "creation date" +msgstr "" + +#: judge/models/profile.py:40 +msgid "is open organization?" +msgstr "" + +#: judge/models/profile.py:41 +msgid "Allow joining organization" +msgstr "" + +#: judge/models/profile.py:42 +msgid "maximum size" +msgstr "" + +#: judge/models/profile.py:43 +msgid "Maximum amount of users in this organization, only applicable to private organizations" +msgstr "" + +#: judge/models/profile.py:45 +msgid "Student access code" +msgstr "" + +#: judge/models/profile.py:49 +msgid "This image will replace the default site logo for users viewing the organization." +msgstr "" + +#: judge/models/profile.py:75 judge/models/profile.py:91 +#: judge/models/profile.py:190 +msgid "organization" +msgstr "" + +#: judge/models/profile.py:80 +msgid "user associated" +msgstr "" + +#: judge/models/profile.py:81 +msgid "self-description" +msgstr "" + +#: judge/models/profile.py:82 +msgid "location" +msgstr "" + +#: judge/models/profile.py:84 +msgid "preferred language" +msgstr "" + +#: judge/models/profile.py:89 +msgid "last access time" +msgstr "" + +#: judge/models/profile.py:90 +msgid "last IP" +msgstr "" + +#: judge/models/profile.py:93 +msgid "display rank" +msgstr "" + +#: judge/models/profile.py:95 +msgid "comment mute" +msgstr "" + +#: judge/models/profile.py:95 +msgid "Some users are at their best when silent." +msgstr "" + +#: judge/models/profile.py:97 +msgid "unlisted user" +msgstr "" + +#: judge/models/profile.py:97 +msgid "User will not be ranked." +msgstr "" + +#: judge/models/profile.py:100 +msgid "user script" +msgstr "" + +#: judge/models/profile.py:101 +msgid "User-defined JavaScript for site customization." +msgstr "" + +#: judge/models/profile.py:102 +msgid "current contest" +msgstr "" + +#: judge/models/profile.py:104 +msgid "math engine" +msgstr "" + +#: judge/models/profile.py:106 +msgid "the rendering engine used to render math" +msgstr "" + +#: judge/models/profile.py:107 +msgid "2FA enabled" +msgstr "" + +#: judge/models/profile.py:108 +msgid "check to enable TOTP-based two factor authentication" +msgstr "" + +#: judge/models/profile.py:109 +msgid "TOTP key" +msgstr "" + +#: judge/models/profile.py:110 +msgid "32 character base32-encoded key for TOTP" +msgstr "" + +#: judge/models/profile.py:112 +msgid "TOTP key must be empty or base32" +msgstr "" + +#: judge/models/profile.py:113 +msgid "internal notes" +msgstr "" + +#: judge/models/profile.py:114 +msgid "Notes for administrators regarding this user." +msgstr "" + +#: judge/models/profile.py:184 +msgid "user profile" +msgstr "" + +#: judge/models/profile.py:185 +msgid "user profiles" +msgstr "" + +#: judge/models/profile.py:192 +msgid "request time" +msgstr "" + +#: judge/models/profile.py:193 +msgid "state" +msgstr "" + +#: judge/models/profile.py:198 +msgid "reason" +msgstr "" + +#: judge/models/profile.py:201 +msgid "organization join request" +msgstr "" + +#: judge/models/profile.py:202 +msgid "organization join requests" +msgstr "" + +#: judge/models/runtime.py:18 +msgid "short identifier" +msgstr "" + +#: judge/models/runtime.py:19 +msgid "The identifier for this language; the same as its executor id for judges." +msgstr "" + +#: judge/models/runtime.py:21 +msgid "long name" +msgstr "" + +#: judge/models/runtime.py:22 +msgid "Longer name for the language, e.g. \"Python 2\" or \"C++11\"." +msgstr "" + +#: judge/models/runtime.py:24 +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:28 +msgid "common name" +msgstr "" + +#: judge/models/runtime.py:29 +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:31 +msgid "ace mode name" +msgstr "" + +#: judge/models/runtime.py:32 +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:34 +msgid "pygments name" +msgstr "" + +#: judge/models/runtime.py:35 +msgid "Language ID for Pygments highlighting in source windows." +msgstr "" + +#: judge/models/runtime.py:36 +msgid "code template" +msgstr "" + +#: judge/models/runtime.py:37 +msgid "Code template to display in submission editor." +msgstr "" + +#: judge/models/runtime.py:38 +msgid "runtime info override" +msgstr "" + +#: judge/models/runtime.py:39 +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:41 +msgid "language description" +msgstr "" + +#: judge/models/runtime.py:42 +msgid "Use field this to inform users of quirks with your environment, additional restrictions, etc." +msgstr "" + +#: judge/models/runtime.py:44 +msgid "extension" +msgstr "" + +#: judge/models/runtime.py:45 +msgid "The extension of source files, e.g., \"py\" or \"cpp\"." +msgstr "" + +#: judge/models/runtime.py:100 +msgid "languages" +msgstr "" + +#: judge/models/runtime.py:104 +msgid "language to which this runtime belongs" +msgstr "" + +#: judge/models/runtime.py:105 +msgid "judge on which this runtime exists" +msgstr "" + +#: judge/models/runtime.py:106 +msgid "runtime name" +msgstr "" + +#: judge/models/runtime.py:107 +msgid "runtime version" +msgstr "" + +#: judge/models/runtime.py:108 +msgid "order in which to display this runtime" +msgstr "" + +#: judge/models/runtime.py:112 +msgid "Server name, hostname-style" +msgstr "" + +#: judge/models/runtime.py:113 +msgid "time of creation" +msgstr "" + +#: judge/models/runtime.py:114 +msgid "A key to authenticated this judge" +msgstr "" + +#: judge/models/runtime.py:115 +msgid "authentication key" +msgstr "" + +#: judge/models/runtime.py:116 +msgid "block judge" +msgstr "" + +#: judge/models/runtime.py:117 +msgid "Whether this judge should be blocked from connecting, even if its key is correct." +msgstr "" + +#: judge/models/runtime.py:119 +msgid "judge online status" +msgstr "" + +#: judge/models/runtime.py:120 +msgid "judge start time" +msgstr "" + +#: judge/models/runtime.py:121 +msgid "response time" +msgstr "" + +#: judge/models/runtime.py:122 +msgid "system load" +msgstr "" + +#: judge/models/runtime.py:123 +msgid "Load for the last minute, divided by processors to be fair." +msgstr "" + +#: judge/models/runtime.py:127 judge/models/runtime.py:167 +msgid "judges" +msgstr "" + +#: judge/models/runtime.py:166 +msgid "judge" +msgstr "" + +#: judge/models/submission.py:20 judge/models/submission.py:47 +#: judge/utils/problems.py:86 +msgid "Accepted" +msgstr "" + +#: judge/models/submission.py:21 judge/models/submission.py:48 +msgid "Wrong Answer" +msgstr "" + +#: judge/models/submission.py:22 judge/models/submission.py:50 +msgid "Time Limit Exceeded" +msgstr "" + +#: judge/models/submission.py:23 judge/models/submission.py:51 +msgid "Memory Limit Exceeded" +msgstr "" + +#: judge/models/submission.py:24 judge/models/submission.py:52 +msgid "Output Limit Exceeded" +msgstr "" + +#: judge/models/submission.py:25 judge/models/submission.py:53 +msgid "Invalid Return" +msgstr "" + +#: judge/models/submission.py:26 judge/models/submission.py:54 +msgid "Runtime Error" +msgstr "" + +#: judge/models/submission.py:27 judge/models/submission.py:41 +#: judge/models/submission.py:55 judge/utils/problems.py:88 +msgid "Compile Error" +msgstr "" + +#: judge/models/submission.py:28 judge/models/submission.py:40 +msgid "Internal Error" +msgstr "" + +#: judge/models/submission.py:29 +msgid "Short circuit" +msgstr "" + +#: judge/models/submission.py:30 judge/models/submission.py:42 +#: judge/models/submission.py:61 +msgid "Aborted" +msgstr "" + +#: judge/models/submission.py:36 judge/models/submission.py:57 +msgid "Queued" +msgstr "" + +#: judge/models/submission.py:37 judge/models/submission.py:58 +msgid "Processing" +msgstr "" + +#: judge/models/submission.py:38 judge/models/submission.py:59 +msgid "Grading" +msgstr "" + +#: judge/models/submission.py:39 judge/models/submission.py:60 +msgid "Completed" +msgstr "" + +#: judge/models/submission.py:56 +msgid "Internal Error (judging server error)" +msgstr "" + +#: judge/models/submission.py:66 +msgid "submission time" +msgstr "" + +#: judge/models/submission.py:67 judge/models/submission.py:201 +msgid "execution time" +msgstr "" + +#: judge/models/submission.py:68 judge/models/submission.py:202 +msgid "memory usage" +msgstr "" + +#: judge/models/submission.py:69 judge/models/submission.py:203 +msgid "points granted" +msgstr "" + +#: judge/models/submission.py:70 +msgid "submission language" +msgstr "" + +#: judge/models/submission.py:71 +msgid "status" +msgstr "" + +#: judge/models/submission.py:72 +msgid "result" +msgstr "" + +#: judge/models/submission.py:74 +msgid "compile errors" +msgstr "" + +#: judge/models/submission.py:76 +msgid "batched cases" +msgstr "" + +#: judge/models/submission.py:77 +msgid "test case points" +msgstr "" + +#: judge/models/submission.py:78 +msgid "test case total points" +msgstr "" + +#: judge/models/submission.py:79 +msgid "judged on" +msgstr "" + +#: judge/models/submission.py:81 +msgid "was rejudged by admin" +msgstr "" + +#: judge/models/submission.py:82 +msgid "was ran on pretests only" +msgstr "" + +#: judge/models/submission.py:182 templates/contest/moss.html:58 +msgid "submissions" +msgstr "" + +#: judge/models/submission.py:186 judge/models/submission.py:197 +msgid "associated submission" +msgstr "" + +#: judge/models/submission.py:188 +msgid "source code" +msgstr "" + +#: judge/models/submission.py:199 +msgid "test case ID" +msgstr "" + +#: judge/models/submission.py:200 +msgid "status flag" +msgstr "" + +#: judge/models/submission.py:204 +msgid "points possible" +msgstr "" + +#: judge/models/submission.py:205 +msgid "batch number" +msgstr "" + +#: judge/models/submission.py:206 +msgid "judging feedback" +msgstr "" + +#: judge/models/submission.py:207 +msgid "extended judging feedback" +msgstr "" + +#: judge/models/submission.py:208 +msgid "program output" +msgstr "" + +#: judge/models/submission.py:216 +msgid "submission test case" +msgstr "" + +#: judge/models/submission.py:217 +msgid "submission test cases" +msgstr "" + +#: judge/models/ticket.py:10 +msgid "ticket title" +msgstr "" + +#: judge/models/ticket.py:11 +msgid "ticket creator" +msgstr "" + +#: judge/models/ticket.py:13 +msgid "creation time" +msgstr "" + +#: judge/models/ticket.py:14 +msgid "assignees" +msgstr "" + +#: judge/models/ticket.py:15 +msgid "quick notes" +msgstr "" + +#: judge/models/ticket.py:16 +msgid "Staff notes for this issue to aid in processing." +msgstr "" + +#: judge/models/ticket.py:17 +msgid "linked item type" +msgstr "" + +#: judge/models/ticket.py:19 +msgid "linked item ID" +msgstr "" + +#: judge/models/ticket.py:21 +msgid "is ticket open?" +msgstr "" + +#: judge/models/ticket.py:25 +msgid "ticket" +msgstr "" + +#: judge/models/ticket.py:27 +msgid "poster" +msgstr "" + +#: judge/models/ticket.py:30 +msgid "message time" +msgstr "" + +#: judge/pdf_problems.py:134 judge/pdf_problems.py:186 +#: judge/pdf_problems.py:246 +msgid "Page [page] of [topage]" +msgstr "" + +#: judge/tasks/moss.py:25 +msgid "Running MOSS" +msgstr "" + +#: judge/tasks/submission.py:43 +msgid "Modifying submissions" +msgstr "" + +#: judge/tasks/submission.py:56 +msgid "Recalculating user points" +msgstr "" + +#: judge/utils/problem_data.py:63 +msgid "Empty batches not allowed." +msgstr "" + +#: 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 +#, python-format +msgid "Input file for case %d does not exist: %s" +msgstr "" + +#: 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 +#, python-format +msgid "Batch start case #%d requires points." +msgstr "" + +#: 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 +msgid "How did you corrupt the zip path?" +msgstr "" + +#: judge/utils/problem_data.py:160 +msgid "How did you corrupt the generator path?" +msgstr "" + +#: judge/utils/problems.py:76 +msgid "Can't pass both queryset and keyword filters" +msgstr "" + +#: judge/utils/problems.py:87 +msgid "Wrong" +msgstr "" + +#: judge/utils/problems.py:89 +msgid "Timeout" +msgstr "" + +#: judge/utils/problems.py:90 +msgid "Error" +msgstr "" + +#: 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/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] "" +msgstr[2] "" +msgstr[3] "" + +#: 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] "" +msgstr[2] "" +msgstr[3] "" + +#: judge/utils/timedelta.py:61 +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: judge/utils/timedelta.py:63 +msgctxt "hours and minutes" +msgid "%h:%m" +msgstr "" + +#: judge/views/blog.py:38 +#, python-format +msgid "Page %d of Posts" +msgstr "" + +#: judge/views/comment.py:27 +msgid "Messing around, are we?" +msgstr "" + +#: judge/views/comment.py:36 +msgid "You must solve at least one problem before you can vote." +msgstr "" + +#: judge/views/comment.py:63 +msgid "You already voted." +msgstr "" + +#: judge/views/comment.py:120 judge/views/organization.py:299 +msgid "Edited from site" +msgstr "" + +#: judge/views/comment.py:141 +msgid "Editing comment" +msgstr "" + +#: judge/views/contests.py:49 judge/views/contests.py:211 +#: judge/views/contests.py:214 judge/views/contests.py:385 +msgid "No such contest" +msgstr "" + +#: judge/views/contests.py:50 judge/views/contests.py:212 +#, python-format +msgid "Could not find a contest with the key \"%s\"." +msgstr "" + +#: judge/views/contests.py:75 +msgid "Contests" +msgstr "" + +#: judge/views/contests.py:215 +msgid "Could not find such contest." +msgstr "" + +#: judge/views/contests.py:218 +#, python-format +msgid "Access to contest \"%s\" denied" +msgstr "" + +#: judge/views/contests.py:242 +msgid "Clone Contest" +msgstr "" + +#: judge/views/contests.py:305 +msgid "Contest not ongoing" +msgstr "" + +#: judge/views/contests.py:306 +#, python-format +msgid "\"%s\" is not currently ongoing." +msgstr "" + +#: judge/views/contests.py:310 +msgid "Already in contest" +msgstr "" + +#: judge/views/contests.py:311 +#, python-format +msgid "You are already in a contest: \"%s\"." +msgstr "" + +#: judge/views/contests.py:314 +msgid "Banned from joining" +msgstr "" + +#: judge/views/contests.py:315 +msgid "You have been declared persona non grata for this contest. You are permanently barred from joining this contest." +msgstr "" + +#: judge/views/contests.py:375 +#, python-format +msgid "Enter access code for \"%s\"" +msgstr "" + +#: judge/views/contests.py:386 +#, python-format +msgid "You are not in contest \"%s\"." +msgstr "" + +#: judge/views/contests.py:405 +msgid "ContestCalendar requires integer year and month" +msgstr "" + +#: judge/views/contests.py:445 +#, python-format +msgid "Contests in %(month)s" +msgstr "" + +#: judge/views/contests.py:445 +msgid "F Y" +msgstr "" + +#: judge/views/contests.py:531 +msgid "???" +msgstr "" + +#: judge/views/contests.py:594 +#, python-format +msgid "%s Rankings" +msgstr "" + +#: judge/views/contests.py:610 +#, python-format +msgid "Your participation in %s" +msgstr "" + +#: judge/views/contests.py:611 +#, python-format +msgid "%s's participation in %s" +msgstr "" + +#: judge/views/contests.py:615 +msgid "Live" +msgstr "" + +#: judge/views/contests.py:627 templates/contest/contest-tabs.html:13 +msgid "Participation" +msgstr "" + +#: judge/views/contests.py:654 +#, python-format +msgid "%s MOSS Results" +msgstr "" + +#: judge/views/contests.py:681 +#, python-format +msgid "Running MOSS for %s..." +msgstr "" + +#: judge/views/contests.py:704 +#, python-format +msgid "Contest tag: %s" +msgstr "" + +#: judge/views/error.py:14 +msgid "404 error" +msgstr "" + +#: judge/views/error.py:15 +#, python-format +msgid "Could not find page \"%s\"" +msgstr "" + +#: judge/views/error.py:22 +#, python-format +msgid "no permission for %s" +msgstr "" + +#: 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 +msgid "Runtimes" +msgstr "" + +#: judge/views/organization.py:44 judge/views/organization.py:47 +msgid "No such organization" +msgstr "" + +#: judge/views/organization.py:45 +#, python-format +msgid "Could not find an organization with the key \"%s\"." +msgstr "" + +#: judge/views/organization.py:48 +msgid "Could not find such organization." +msgstr "" + +#: judge/views/organization.py:72 judge/views/register.py:34 +#: templates/organization/list.html:15 templates/user/user-list-tabs.html:5 +msgid "Organizations" +msgstr "" + +#: judge/views/organization.py:93 +#, python-format +msgid "%s Members" +msgstr "" + +#: judge/views/organization.py:118 judge/views/organization.py:121 +#: judge/views/organization.py:126 +msgid "Joining organization" +msgstr "" + +#: judge/views/organization.py:118 +msgid "You are already in the organization." +msgstr "" + +#: judge/views/organization.py:121 +msgid "This organization is not open." +msgstr "" + +#: judge/views/organization.py:138 +msgid "Leaving organization" +msgstr "" + +#: judge/views/organization.py:138 +#, python-format +msgid "You are not in \"%s\"." +msgstr "" + +#: judge/views/organization.py:162 +#, python-format +msgid "Request to join %s" +msgstr "" + +#: judge/views/organization.py:180 +msgid "Join request detail" +msgstr "" + +#: judge/views/organization.py:209 +#, python-format +msgid "Managing join requests for %s" +msgstr "" + +#: judge/views/organization.py:240 +#, python-format +msgid "Your organization can only receive %d more members. You cannot approve %d users." +msgstr "" + +#: judge/views/organization.py:252 +#, python-format +msgid "Approved %d user." +msgid_plural "Approved %d users." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: judge/views/organization.py:253 +#, python-format +msgid "Rejected %d user." +msgid_plural "Rejected %d users." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: judge/views/organization.py:283 +#, python-format +msgid "Editing %s" +msgstr "" + +#: judge/views/organization.py:307 judge/views/organization.py:315 +msgid "Can't edit organization" +msgstr "" + +#: judge/views/organization.py:308 +msgid "You are not allowed to edit this organization." +msgstr "" + +#: judge/views/organization.py:316 +msgid "You are not allowed to kick people from this organization." +msgstr "" + +#: judge/views/organization.py:321 judge/views/organization.py:325 +msgid "Can't kick user" +msgstr "" + +#: judge/views/organization.py:322 +msgid "The user you are trying to kick does not exist!" +msgstr "" + +#: judge/views/organization.py:326 +#, python-format +msgid "The user you are trying to kick is not in organization: %s." +msgstr "" + +#: judge/views/problem.py:68 +msgid "No such problem" +msgstr "" + +#: judge/views/problem.py:69 +#, python-format +msgid "Could not find a problem with the code \"%s\"." +msgstr "" + +#: judge/views/problem.py:111 +#, python-brace-format +msgid "Editorial for {0}" +msgstr "" + +#: judge/views/problem.py:114 +#, python-brace-format +msgid "Editorial for {0}" +msgstr "" + +#: judge/views/problem.py:285 templates/contest/contest.html:79 +#: templates/user/user-tabs.html:5 templates/user/users-table.html:23 +msgid "Problems" +msgstr "" + +#: judge/views/problem.py:546 +msgid "Banned from submitting" +msgstr "" + +#: judge/views/problem.py:547 +msgid "You have been declared persona non grata for this problem. You are permanently barred from submitting this problem." +msgstr "" + +#: judge/views/problem.py:560 +msgid "Too many submissions" +msgstr "" + +#: judge/views/problem.py:561 +msgid "You have exceeded the submission limit for this problem." +msgstr "" + +#: judge/views/problem.py:627 judge/views/problem.py:630 +#, python-format +msgid "Submit to %(problem)s" +msgstr "" + +#: judge/views/problem.py:646 +msgid "Clone Problem" +msgstr "" + +#: judge/views/problem_data.py:37 +msgid "Checker arguments must be a JSON object" +msgstr "" + +#: judge/views/problem_data.py:39 +msgid "Checker arguments is invalid JSON" +msgstr "" + +#: judge/views/problem_data.py:46 +msgid "Your zip file is invalid!" +msgstr "" + +#: judge/views/problem_data.py:104 +#, python-brace-format +msgid "Comparing submissions for {0}" +msgstr "" + +#: judge/views/problem_data.py:107 +#, python-brace-format +msgid "Comparing submissions for {0}" +msgstr "" + +#: judge/views/problem_data.py:142 +#, python-brace-format +msgid "Editing data for {0}" +msgstr "" + +#: judge/views/problem_data.py:145 +#, python-format +msgid "Editing data for %s" +msgstr "" + +#: judge/views/problem_data.py:237 judge/views/problem_data.py:238 +#, python-format +msgid "Generated init.yml for %s" +msgstr "" + +#: 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] "" +msgstr[2] "" +msgstr[3] "" + +#: judge/views/ranked_submission.py:58 +#, python-format +msgid "Best solutions for %s" +msgstr "" + +#: judge/views/ranked_submission.py:61 +#, python-brace-format +msgid "Best solutions for {0}" +msgstr "" + +#: judge/views/ranked_submission.py:71 +#, python-format +msgid "Best solutions for %(problem)s in %(contest)s" +msgstr "" + +#: judge/views/ranked_submission.py:74 +#, python-format +msgid "Best solutions for problem %(number)s in %(contest)s" +msgstr "" + +#: judge/views/ranked_submission.py:80 +#, python-brace-format +msgid "Best solutions for {0} in {2}" +msgstr "" + +#: judge/views/ranked_submission.py:83 +#, python-brace-format +msgid "Best solutions for problem {0} in {1}" +msgstr "" + +#: judge/views/register.py:27 +msgid "A username must contain letters, numbers, or underscores" +msgstr "" + +#: judge/views/register.py:31 templates/user/edit-profile.html:103 +msgid "Preferred language" +msgstr "" + +#: judge/views/register.py:38 +msgid "Subscribe to newsletter?" +msgstr "" + +#: judge/views/register.py:45 +#, python-format +msgid "The email address \"%s\" is already taken. Only one registration is allowed per address." +msgstr "" + +#: judge/views/register.py:51 +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 +msgid "Registration" +msgstr "" + +#: judge/views/register.py:106 +msgid "Authentication failure" +msgstr "" + +#: judge/views/stats.py:105 +msgid "Language statistics" +msgstr "" + +#: judge/views/status.py:24 templates/submission/list.html:319 +msgid "Status" +msgstr "" + +#: judge/views/status.py:108 +msgid "Version matrix" +msgstr "" + +#: judge/views/submission.py:59 judge/views/submission.py:66 +#, python-format +msgid "Submission of %(problem)s by %(user)s" +msgstr "" + +#: judge/views/submission.py:161 judge/views/submission.py:162 +#: templates/problem/problem.html:127 +msgid "All submissions" +msgstr "" + +#: judge/views/submission.py:303 +msgid "All my submissions" +msgstr "" + +#: judge/views/submission.py:304 +#, python-format +msgid "All submissions by %s" +msgstr "" + +#: judge/views/submission.py:335 +#, python-format +msgid "All submissions for %s" +msgstr "" + +#: judge/views/submission.py:354 +msgid "Must pass a problem" +msgstr "" + +#: judge/views/submission.py:397 +#, python-format +msgid "My submissions for %(problem)s" +msgstr "" + +#: judge/views/submission.py:398 +#, python-format +msgid "%(user)s's submissions for %(problem)s" +msgstr "" + +#: judge/views/submission.py:495 +msgid "Must pass a contest" +msgstr "" + +#: judge/views/submission.py:514 +#, python-brace-format +msgid "{0}'s submissions for {2} in {4}" +msgstr "" + +#: judge/views/submission.py:519 +#, 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 "" + +#: judge/views/ticket.py:40 +msgid "Issue description" +msgstr "" + +#: judge/views/ticket.py:85 judge/views/ticket.py:88 +#, python-format +msgid "New ticket for %s" +msgstr "" + +#: judge/views/ticket.py:139 +#, python-format +msgid "%(title)s - Ticket %(id)d" +msgstr "" + +#: judge/views/ticket.py:248 +#, python-format +msgid "Tickets - Page %(number)d of %(total)d" +msgstr "" + +#: judge/views/ticket.py:297 +#, python-format +msgid "New Ticket: %s" +msgstr "" + +#: judge/views/ticket.py:298 +#, python-format +msgid "#%(id)d, assigned to: %(users)s" +msgstr "" + +#: judge/views/ticket.py:300 +msgid ", " +msgstr "" + +#: judge/views/ticket.py:300 +msgid "no one" +msgstr "" + +#: judge/views/totp.py:42 templates/registration/totp_enable.html:86 +msgid "Enable Two Factor Authentication" +msgstr "" + +#: judge/views/totp.py:89 templates/registration/totp_disable.html:48 +msgid "Disable Two Factor Authentication" +msgstr "" + +#: judge/views/totp.py:103 +msgid "Perform Two Factor Authentication" +msgstr "" + +#: judge/views/user.py:68 +msgid "No such user" +msgstr "" + +#: judge/views/user.py:68 +#, python-format +msgid "No user handle \"%s\"." +msgstr "" + +#: judge/views/user.py:72 +msgid "My account" +msgstr "" + +#: judge/views/user.py:73 +#, python-format +msgid "User %s" +msgstr "" + +#: judge/views/user.py:136 +msgid "M j, Y, G:i" +msgstr "" + +#: judge/views/user.py:221 +msgid "Updated on site" +msgstr "" + +#: judge/views/user.py:253 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:10 +msgid "Edit profile" +msgstr "" + +#: judge/views/user.py:262 templates/user/user-list-tabs.html:4 +msgid "Leaderboard" +msgstr "" + +#: judge/views/widgets.py:48 judge/views/widgets.py:58 +#, python-format +msgid "Invalid upstream data: %s" +msgstr "" + +#: judge/views/widgets.py:68 +msgid "Bad latitude or longitude" +msgstr "" + +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:13 +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:27 +msgid "Photo" +msgstr "" + +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:14 +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:28 +msgid "Photos" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:9 +msgid "first name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:10 +msgid "last name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:11 +msgid "biography" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/admin.py:24 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:30 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:30 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:30 +msgid "owner" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:12 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:12 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:12 +msgid "name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:19 +msgid "Category of Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:20 +msgid "Categories of Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:26 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:26 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:26 +msgid "title" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:28 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:28 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:28 +msgid "category" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:29 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:29 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:29 +msgid "author" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:31 +msgid "publication date" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:37 +msgid "Book" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:38 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:136 +msgid "Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:19 +msgid "Category of CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:20 +msgid "Categories of CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:36 +msgid "CD" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:37 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:141 +msgid "CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:19 +msgid "Category of DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:20 +msgid "Categories of DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:36 +msgid "DVD" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:37 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:146 +msgid "DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/templates/admin/base_site.html:7 +msgid "Django administration" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/forms.py:12 +#, python-format +msgid "Please enter the correct %(username)s and password for an admin account. Note that both fields may be case-sensitive." +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/forms.py:32 +#, python-format +msgid "Please enter the correct %(username)s and password for an user account. Note that both fields may be case-sensitive." +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:27 +msgid "Site" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:38 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:41 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:130 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:133 +msgid "Dashboard" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:48 +msgid "Applications" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:53 +msgid "Administration" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:64 +msgid "Color theme" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:66 +msgid "Change color theme" +msgstr "" + +#: 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 +msgid "Rate all ratable contests" +msgstr "" + +#: 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 +msgid "Rejudge" +msgstr "" + +#: templates/base.html:214 +#, python-format +msgid "Hello, %(username)s." +msgstr "" + +#: templates/base.html:220 templates/comments/list.html:89 +#: templates/contest/contest-list-tabs.html:24 +#: templates/problem/problem-list-tabs.html:6 +#: templates/submission/info-base.html:12 +#: templates/submission/submission-list-tabs.html:15 +msgid "Admin" +msgstr "" + +#: templates/base.html:229 +msgid "Log out" +msgstr "" + +#: templates/base.html:238 +#: templates/registration/password_reset_complete.html:4 +msgid "Log in" +msgstr "" + +#: templates/base.html:239 templates/registration/registration_form.html:177 +msgid "or" +msgstr "" + +#: templates/base.html:240 +msgid "Sign up" +msgstr "" + +#: templates/base.html:252 +msgid "spectating" +msgstr "" + +#: 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:20 +#: 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 +msgid "Edit" +msgstr "" + +#: templates/blog/content.html:27 +#, python-format +msgid "\n" +" posted on %(time)s\n" +" " +msgstr "" + +#: templates/blog/dashboard.html:21 +#, python-format +msgid "\n" +" on %(time)s\n" +" " +msgstr "" + +#: templates/blog/list.html:85 +msgid "Blog" +msgstr "" + +#: templates/blog/list.html:87 +msgid "Events" +msgstr "" + +#: templates/blog/list.html:92 +msgid "News" +msgstr "" + +#: templates/blog/list.html:106 +#, python-brace-format +msgid "posted on {time}" +msgstr "" + +#: templates/blog/list.html:130 templates/problem/problem.html:310 +msgid "Clarifications" +msgstr "" + +#: templates/blog/list.html:146 templates/problem/problem.html:321 +msgid "No clarifications have been made at this time." +msgstr "" + +#: templates/blog/list.html:154 +msgid "Ongoing contests" +msgstr "" + +#: templates/blog/list.html:172 +msgid "Upcoming contests" +msgstr "" + +#: templates/blog/list.html:189 +msgid "Comment stream" +msgstr "" + +#: templates/blog/list.html:208 +msgid "New problems" +msgstr "" + +#: templates/blog/list.html:225 +msgid "My open tickets" +msgstr "" + +#: templates/blog/list.html:246 +msgid "New tickets" +msgstr "" + +#: templates/comments/list.html:2 +msgid "Comments" +msgstr "" + +#: templates/comments/list.html:18 templates/comments/list.html:27 +msgid "Please login to vote" +msgstr "" + +#: templates/comments/list.html:40 +#, python-brace-format +msgid "commented on {time}" +msgstr "" + +#: templates/comments/list.html:49 +#, python-format +msgid "edit %(edits)s" +msgstr "" + +#: templates/comments/list.html:51 templates/comments/media-js.html:77 +msgid "edited" +msgstr "" + +#: templates/comments/list.html:60 +msgid "Link" +msgstr "" + +#: templates/comments/list.html:73 templates/comments/list.html:80 +msgid "Reply" +msgstr "" + +#: templates/comments/list.html:86 +msgid "Hide" +msgstr "" + +#: templates/comments/list.html:101 +#, 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:120 +msgid "There are no comments at the moment." +msgstr "" + +#: templates/comments/list.html:126 +msgid "New comment" +msgstr "" + +#: templates/comments/list.html:140 +msgid "Invalid comment body." +msgstr "" + +#: templates/comments/list.html:148 +msgid "Post!" +msgstr "" + +#: templates/comments/list.html:156 +msgid "Comments are disabled on this page." +msgstr "" + +#: templates/comments/media-js.html:72 +#, python-brace-format +msgid "edit {edits}" +msgstr "" + +#: templates/comments/media-js.html:75 +msgid "original" +msgstr "" + +#: templates/contest/access_code.html:26 +msgid "Invalid access code." +msgstr "" + +#: templates/contest/access_code.html:29 +msgid "Please enter your access code:" +msgstr "" + +#: templates/contest/access_code.html:32 +msgid "Join Contest" +msgstr "" + +#: templates/contest/calendar.html:12 +msgid "Sunday" +msgstr "" + +#: templates/contest/calendar.html:13 +msgid "Monday" +msgstr "" + +#: templates/contest/calendar.html:14 +msgid "Tuesday" +msgstr "" + +#: templates/contest/calendar.html:15 +msgid "Wednesday" +msgstr "" + +#: templates/contest/calendar.html:16 +msgid "Thursday" +msgstr "" + +#: templates/contest/calendar.html:17 +msgid "Friday" +msgstr "" + +#: templates/contest/calendar.html:18 +msgid "Saturday" +msgstr "" + +#: 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 +msgid "Today" +msgstr "" + +#: templates/contest/contest-list-tabs.html:13 +msgid "Next" +msgstr "" + +#: templates/contest/contest-list-tabs.html:21 +#: templates/problem/problem-list-tabs.html:5 +msgid "List" +msgstr "" + +#: templates/contest/contest-list-tabs.html:22 +msgid "Calendar" +msgstr "" + +#: templates/contest/contest-tabs.html:4 +msgid "Info" +msgstr "" + +#: templates/contest/contest-tabs.html:8 +msgid "Rankings" +msgstr "" + +#: templates/contest/contest-tabs.html:10 +msgid "Hidden Rankings" +msgstr "" + +#: templates/contest/contest-tabs.html:18 +msgid "MOSS" +msgstr "" + +#: templates/contest/contest-tabs.html:23 +msgid "Clone" +msgstr "" + +#: templates/contest/contest-tabs.html:34 +#: templates/contest/contest-tabs.html:54 +msgid "Leave contest" +msgstr "" + +#: templates/contest/contest-tabs.html:41 templates/contest/list.html:293 +msgid "Virtual join" +msgstr "" + +#: templates/contest/contest-tabs.html:52 +msgid "Stop spectating" +msgstr "" + +#: templates/contest/contest-tabs.html:61 +msgid "Spectate contest" +msgstr "" + +#: templates/contest/contest-tabs.html:67 +#: templates/contest/contest-tabs.html:73 +msgid "Join contest" +msgstr "" + +#: templates/contest/contest-tabs.html:82 +msgid "Login to participate" +msgstr "" + +#: templates/contest/contest.html:37 +msgid "Participating virtually." +msgstr "" + +#: templates/contest/contest.html:43 +msgid "Contest is over." +msgstr "" + +#: templates/contest/contest.html:59 templates/contest/contest.html:63 +msgid "F j, Y, G:i T" +msgstr "" + +#: 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 +#, python-format +msgid "%(length)s long starting on %(start_time)s" +msgstr "" + +#: templates/contest/contest.html:85 +msgid "AC Rate" +msgstr "" + +#: templates/contest/contest.html:86 templates/contest/list.html:153 +#: templates/contest/list.html:195 templates/contest/list.html:271 +#: templates/problem/list.html:212 templates/problem/list.html:238 +msgid "Users" +msgstr "" + +#: templates/contest/contest.html:111 +msgid "Editorial" +msgstr "" + +#: templates/contest/list.html:31 templates/contest/media-js.html:9 +msgid "Are you sure you want to join?" +msgstr "" + +#: 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:65 +msgid "hidden" +msgstr "" + +#: templates/contest/list.html:70 +msgid "private" +msgstr "" + +#: templates/contest/list.html:84 +msgid "rated" +msgstr "" + +#: templates/contest/list.html:132 +msgid "Spectate" +msgstr "" + +#: templates/contest/list.html:138 +msgid "Join" +msgstr "" + +#: templates/contest/list.html:148 +msgid "Active Contests" +msgstr "" + +#: templates/contest/list.html:152 templates/contest/list.html:194 +#: templates/contest/list.html:232 templates/contest/list.html:270 +msgid "Contest" +msgstr "" + +#: templates/contest/list.html:190 +msgid "Ongoing Contests" +msgstr "" + +#: templates/contest/list.html:227 +msgid "Upcoming Contests" +msgstr "" + +#: templates/contest/list.html:255 +msgid "There are no scheduled contests at this time." +msgstr "" + +#: templates/contest/list.html:261 +msgid "Past Contests" +msgstr "" + +#: templates/contest/media-js.html:4 +msgid "Are you sure you want to leave?" +msgstr "" + +#: 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 +msgid "Joining a contest starts your timer, after which it becomes unstoppable." +msgstr "" + +#: 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:7 +msgid "Organization" +msgstr "Organizacja" + +#: templates/contest/ranking-table.html:27 +#, python-brace-format +msgid "Started on {time}" +msgstr "" + +#: templates/contest/ranking-table.html:30 +msgid "Participation ended." +msgstr "" + +#: templates/contest/ranking.html:232 +msgid "View user participation" +msgstr "" + +#: templates/contest/ranking.html:236 +msgid "Show organizations" +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 +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 +msgid "activate" +msgstr "" + +#: 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 +msgid "Newsletter unsubscribe" +msgstr "" + +#: 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 +msgid "Do you want to unsubscribe from this newsletter?" +msgstr "" + +#: 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 +msgid "Newsletter update" +msgstr "" + +#: 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 +msgid "Update subscription" +msgstr "" + +#: templates/newsletter/subscription_update_activated.html:8 +msgid "Your subscription has successfully been updated." +msgstr "" + +#: 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:34 +#: templates/ticket/edit-notes.html:4 +msgid "Update" +msgstr "" + +#: 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:29 +msgid "Join organization" +msgstr "" + +#: templates/organization/home.html:33 +msgid "Request membership" +msgstr "" + +#: templates/organization/home.html:39 +msgid "Edit organization" +msgstr "" + +#: templates/organization/home.html:43 +msgid "View requests" +msgstr "" + +#: templates/organization/home.html:50 +msgid "Admin organization" +msgstr "" + +#: templates/organization/home.html:55 +msgid "View members" +msgstr "" + +#: templates/organization/list.html:23 templates/status/language-list.html:34 +msgid "Name" +msgstr "" + +#: templates/organization/list.html:24 +msgid "Members" +msgstr "" + +#: templates/organization/new.html:10 templates/ticket/new.html:38 +msgid "Create" +msgstr "" + +#: templates/organization/requests/detail.html:13 +msgid "User:" +msgstr "" + +#: templates/organization/requests/detail.html:17 +msgid "Organization:" +msgstr "" + +#: templates/organization/requests/detail.html:25 +msgid "Time:" +msgstr "" + +#: templates/organization/requests/detail.html:29 +msgid "Reason:" +msgstr "" + +#: 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:15 +msgid "Reason" +msgstr "" + +#: 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:17 +#: templates/problem/data.html:401 +msgid "Delete?" +msgstr "" + +#: templates/organization/requests/request.html:18 +msgid "Your reason for joining:" +msgstr "" + +#: templates/organization/requests/request.html:20 +msgid "Request" +msgstr "" + +#: templates/organization/requests/tabs.html:4 +msgid "Pending" +msgstr "" + +#: templates/organization/requests/tabs.html:7 +msgid "Log" +msgstr "" + +#: templates/organization/requests/tabs.html:10 +msgid "Approved" +msgstr "" + +#: templates/organization/requests/tabs.html:13 +msgid "Rejected" +msgstr "" + +#: templates/organization/users-table.html:15 +msgid "Kick" +msgstr "" + +#: templates/problem/clone.html:37 +msgid "Enter a new code for the cloned problem:" +msgstr "" + +#: templates/problem/data.html:353 +msgid "View YAML" +msgstr "" + +#: templates/problem/data.html:369 +msgid "Show columns:" +msgstr "" + +#: templates/problem/data.html:372 templates/problem/data.html:396 +msgid "Output prefix" +msgstr "" + +#: templates/problem/data.html:376 templates/problem/data.html:397 +msgid "Output limit" +msgstr "" + +#: templates/problem/data.html:380 templates/problem/data.html:398 +msgid "Checker" +msgstr "" + +#: templates/problem/data.html:384 templates/problem/data.html:399 +msgid "Generator args" +msgstr "" + +#: templates/problem/data.html:391 +msgid "Type" +msgstr "" + +#: templates/problem/data.html:392 +msgid "Input file" +msgstr "" + +#: templates/problem/data.html:393 +msgid "Output file" +msgstr "" + +#: templates/problem/data.html:395 +msgid "Pretest?" +msgstr "" + +#: templates/problem/data.html:447 templates/problem/submit.html:252 +msgid "Submit!" +msgstr "" + +#: templates/problem/data.html:448 +msgid "Add new case" +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 editorialist.

Submitting an official solution before solving the problem yourself is a bannable offence." +msgstr "" + +#: templates/problem/list.html:62 +msgid "Filter by type..." +msgstr "" + +#: templates/problem/list.html:185 +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:57 +msgid "Category" +msgstr "" + +#: templates/problem/list.html:209 templates/problem/list.html:228 +msgid "Types" +msgstr "" + +#: templates/problem/list.html:235 +#, python-format +msgid "AC %%" +msgstr "" + +#: 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:142 +msgid "Filter by result:" +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:101 templates/problem/problem.html:111 +#: templates/problem/problem.html:116 +msgid "Submit solution" +msgstr "" + +#: templates/problem/problem.html:104 +#, python-format +msgid "%(counter)s submission left" +msgid_plural "%(counter)s submissions left" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: templates/problem/problem.html:112 +msgid "0 submissions left" +msgstr "" + +#: templates/problem/problem.html:124 +msgid "My submissions" +msgstr "" + +#: templates/problem/problem.html:128 +msgid "Best submissions" +msgstr "" + +#: templates/problem/problem.html:132 +msgid "Read editorial" +msgstr "" + +#: templates/problem/problem.html:137 +msgid "Manage tickets" +msgstr "" + +#: templates/problem/problem.html:141 +msgid "Edit problem" +msgstr "" + +#: templates/problem/problem.html:143 +msgid "Edit test data" +msgstr "" + +#: templates/problem/problem.html:148 +msgid "My tickets" +msgstr "" + +#: templates/problem/problem.html:156 +msgid "Manage submissions" +msgstr "" + +#: templates/problem/problem.html:162 +msgid "Clone problem" +msgstr "" + +#: templates/problem/problem.html:169 +msgid "Points:" +msgstr "" + +#: templates/problem/problem.html:172 templates/problem/problem.html:174 +msgid "(partial)" +msgstr "" + +#: templates/problem/problem.html:179 +msgid "Time limit:" +msgstr "" + +#: templates/problem/problem.html:191 +msgid "Memory limit:" +msgstr "" + +#: templates/problem/problem.html:210 +msgid "Author:" +msgid_plural "Authors:" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: templates/problem/problem.html:225 +msgid "Problem type" +msgid_plural "Problem types" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: templates/problem/problem.html:238 +msgid "Allowed languages" +msgstr "" + +#: templates/problem/problem.html:246 +#, python-format +msgid "No %(lang)s judge online" +msgstr "" + +#: templates/problem/problem.html:257 +msgid "Judge:" +msgid_plural "Judges:" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: templates/problem/problem.html:274 +msgid "none available" +msgstr "" + +#: templates/problem/problem.html:299 +msgid "Request clarification" +msgstr "" + +#: templates/problem/problem.html:301 +msgid "Report an issue" +msgstr "" + +#: 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 +msgid "Search problems..." +msgstr "" + +#: templates/problem/search-form.html:14 +msgid "Full text search" +msgstr "" + +#: templates/problem/search-form.html:21 +msgid "Hide solved problems" +msgstr "" + +#: 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 +msgid "All" +msgstr "" + +#: templates/problem/search-form.html:46 +msgid "Problem types" +msgstr "" + +#: templates/problem/search-form.html:57 +msgid "Point range" +msgstr "" + +#: templates/problem/search-form.html:63 templates/submission/list.html:337 +#: templates/ticket/list.html:248 +msgid "Go" +msgstr "" + +#: templates/problem/search-form.html:64 +msgid "Random" +msgstr "" + +#: templates/problem/submit.html:192 +#, python-format +msgid "Warning! Your default language, %(default_language)s, is unavailable for this problem and has been deselected." +msgstr "" + +#: templates/problem/submit.html:203 +#, python-format +msgid "\n" +" You have %(left)s submission left\n" +" " +msgid_plural "\n" +" You have %(left)s submissions left\n" +" " +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: templates/problem/submit.html:212 +msgid "You have 0 submissions left" +msgstr "" + +#: templates/problem/submit.html:250 +msgid "No judge is available for this problem." +msgstr "" + +#: templates/registration/activate.html:3 +#, python-format +msgid "%(key)s is an invalid activation key." +msgstr "" + +#: templates/registration/activation_complete.html:3 +msgid "Your account has been successfully activated." +msgstr "" + +#: templates/registration/login.html:43 +msgid "Invalid username or password." +msgstr "" + +#: templates/registration/login.html:61 +#: templates/registration/totp_auth.html:39 +msgid "Login!" +msgstr "" + +#: templates/registration/login.html:64 +msgid "Forgot your password?" +msgstr "" + +#: templates/registration/login.html:67 +msgid "Or log in with..." +msgstr "" + +#: templates/registration/logout.html:3 +msgid "See you later!" +msgstr "" + +#: templates/registration/password_change_done.html:3 +msgid "Your password was sucessfully changed." +msgstr "" + +#: templates/registration/password_change_form.html:8 +msgid "Change Password" +msgstr "" + +#: templates/registration/password_reset.html:7 +msgid "Send Reset Email" +msgstr "" + +#: 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_confirm.html:9 +msgid "Reset Password" +msgstr "" + +#: 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 +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 +#, 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 +msgid "Please go to the following page and choose a new password:" +msgstr "" + +#: templates/registration/password_reset_email.txt:7 +msgid "Your username, in case you've forgotten:" +msgstr "" + +#: templates/registration/password_reset_email.txt:9 +msgid "Thanks for using our site!" +msgstr "" + +#: templates/registration/password_reset_email.txt:11 +#, python-format +msgid "The %(site_name)s team" +msgstr "" + +#: 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 +msgid "Continue >" +msgstr "" + +#: 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:166 +msgid "(again, for confirmation)" +msgstr "" + +#: templates/registration/registration_form.html:173 +msgid "(select your closest major city)" +msgstr "" + +#: templates/registration/registration_form.html:178 +msgid "pick from map" +msgstr "" + +#: templates/registration/registration_form.html:183 +msgid "Default language" +msgstr "" + +#: templates/registration/registration_form.html:186 +#: templates/user/edit-profile.html:162 +msgid "Affiliated organizations" +msgstr "" + +#: templates/registration/registration_form.html:192 +#: templates/user/edit-profile.html:121 +msgid "Notify me about upcoming contests" +msgstr "" + +#: templates/registration/registration_form.html:206 +msgid "By registering, you agree to our" +msgstr "" + +#: templates/registration/registration_form.html:207 +msgid "Terms & Conditions" +msgstr "" + +#: templates/registration/registration_form.html:210 +msgid "Register!" +msgstr "" + +#: templates/registration/totp_auth.html:36 +#: templates/registration/totp_disable.html:45 +#: templates/registration/totp_enable.html:83 +msgid "Enter the 6-digit code generated by your app:" +msgstr "" + +#: templates/registration/totp_auth.html:41 +#, python-format +msgid "If you lost your authentication device, please contact us at %(email)s." +msgstr "" + +#: templates/registration/totp_disable.html:38 +msgid "To protect your account, you must first authenticate before you can disable Two Factor Authentication." +msgstr "" + +#: templates/registration/totp_enable.html:71 +msgid "Scan this code with your authenticator app:" +msgstr "" + +#: templates/registration/totp_enable.html:72 +msgid "QR code" +msgstr "" + +#: templates/registration/totp_enable.html:73 +msgid "Or enter this code manually:" +msgstr "" + +#: templates/stats/base.html:9 templates/submission/list.html:345 +msgid "Statistics" +msgstr "" + +#: templates/stats/language.html:11 +msgid "Submission Statistics" +msgstr "" + +#: templates/stats/language.html:16 +msgid "Submissions by Language" +msgstr "" + +#: templates/stats/language.html:21 +msgid "AC Submissions by Language" +msgstr "" + +#: templates/stats/language.html:26 +msgid "Language AC Rate" +msgstr "" + +#: templates/status/judge-status-table.html:2 +msgid "Judge" +msgstr "" + +#: templates/status/judge-status-table.html:4 +msgid "Online" +msgstr "" + +#: templates/status/judge-status-table.html:6 +msgid "Uptime" +msgstr "" + +#: templates/status/judge-status-table.html:7 +msgid "Ping" +msgstr "" + +#: 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 +msgid "N/A" +msgstr "" + +#: templates/status/judge-status-table.html:64 +msgid "There are no judges available at this time." +msgstr "" + +#: templates/status/language-list.html:33 templates/ticket/list.html:261 +msgid "ID" +msgstr "" + +#: templates/status/language-list.html:35 +msgid "Runtime Info" +msgstr "" + +#: templates/status/status-tabs.html:4 +msgid "Judges" +msgstr "" + +#: templates/status/status-tabs.html:6 +msgid "Version Matrix" +msgstr "" + +#: templates/submission/internal-error-message.html:8 +msgid "An internal error occurred while grading." +msgstr "" + +#: templates/submission/internal-error-message.html:15 +msgid "Error information" +msgstr "" + +#: templates/submission/list.html:76 +msgid "Filter by status..." +msgstr "" + +#: templates/submission/list.html:82 +msgid "Filter by language..." +msgstr "" + +#: templates/submission/list.html:315 +msgid "Filter submissions" +msgstr "" + +#: templates/submission/list.html:351 +msgid "Total:" +msgstr "" + +#: templates/submission/list.html:361 +msgid "You were disconnected. Refresh to show latest updates." +msgstr "" + +#: templates/submission/row.html:39 +#, python-format +msgid "Case #%(case)s" +msgstr "" + +#: templates/submission/row.html:49 +msgid "view" +msgstr "" + +#: templates/submission/row.html:53 +msgid "rejudge" +msgstr "" + +#: templates/submission/row.html:58 +msgid "admin" +msgstr "" + +#: templates/submission/source.html:25 +msgid "View status" +msgstr "" + +#: templates/submission/source.html:26 +msgid "View raw source" +msgstr "" + +#: templates/submission/source.html:28 templates/submission/status.html:61 +msgid "Resubmit" +msgstr "" + +#: 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 +msgid "Your submission is being processed..." +msgstr "" + +#: templates/submission/status-testcases.html:14 +msgid "Compilation Error" +msgstr "" + +#: templates/submission/status-testcases.html:18 +msgid "Compilation Warnings" +msgstr "" + +#: templates/submission/status-testcases.html:23 +msgid "Pretest Execution Results" +msgstr "" + +#: templates/submission/status-testcases.html:25 +msgid "Execution Results" +msgstr "" + +#: templates/submission/status-testcases.html:31 +msgid "Batch " +msgstr "" + +#: templates/submission/status-testcases.html:43 +msgid "Case" +msgstr "" + +#: templates/submission/status-testcases.html:45 +msgid "Pretest" +msgstr "" + +#: templates/submission/status-testcases.html:47 +msgid "Test case" +msgstr "" + +#: templates/submission/status-testcases.html:79 +msgid "Your output (clipped)" +msgstr "" + +#: templates/submission/status-testcases.html:90 +msgid "Judge feedback" +msgstr "" + +#: templates/submission/status-testcases.html:106 +msgid "Resources:" +msgstr "" + +#: templates/submission/status-testcases.html:115 +msgid "Final pretest score:" +msgstr "" + +#: templates/submission/status-testcases.html:117 +msgid "Final score:" +msgstr "" + +#: templates/submission/status-testcases.html:131 +msgid "Passing pretests does not guarantee a full score on system tests." +msgstr "" + +#: templates/submission/status-testcases.html:134 +msgid "Submission aborted!" +msgstr "" + +#: templates/submission/status.html:59 +msgid "View source" +msgstr "" + +#: templates/submission/status.html:88 +msgid "Abort" +msgstr "" + +#: templates/submission/submission-list-tabs.html:6 +msgid "Mine" +msgstr "" + +#: templates/submission/submission-list-tabs.html:9 +msgid "Best" +msgstr "" + +#: templates/submission/submission-list-tabs.html:12 +#, python-format +msgid "%(user)s's" +msgstr "" + +#: templates/ticket/list.html:135 templates/ticket/ticket.html:257 +msgid "Reopened: " +msgstr "" + +#: templates/ticket/list.html:138 templates/ticket/ticket.html:258 +msgid "Closed: " +msgstr "" + +#: templates/ticket/list.html:221 +msgid "Use desktop notification" +msgstr "" + +#: templates/ticket/list.html:227 +msgid "Show my tickets only" +msgstr "" + +#: templates/ticket/list.html:231 +msgid "Filing user" +msgstr "" + +#: templates/ticket/list.html:240 +msgid "Assignee" +msgstr "" + +#: templates/ticket/list.html:262 +msgid "Title" +msgstr "" + +#: templates/ticket/list.html:264 templates/ticket/ticket.html:304 +msgid "Assignees" +msgstr "" + +#: templates/ticket/new_problem.html:7 +msgid "Thanks for opening a ticket!" +msgstr "" + +#: 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 +msgid "Associated object" +msgstr "" + +#: templates/ticket/ticket.html:309 +msgid "No one is assigned." +msgstr "" + +#: templates/ticket/ticket.html:315 +msgid "Close ticket" +msgstr "" + +#: templates/ticket/ticket.html:317 +msgid "Reopen ticket" +msgstr "" + +#: templates/ticket/ticket.html:321 +msgid "Assignee notes" +msgstr "" + +#: templates/ticket/ticket.html:328 templates/widgets/select_all.html:4 +msgid "Nothing here." +msgstr "" + +#: templates/ticket/ticket.html:378 +msgid "Post" +msgstr "" + +#: templates/user/base-users-table.html:3 +msgid "Rank" +msgstr "" + +#: templates/user/base-users.html:14 templates/user/base-users.html:69 +msgid "Search by handle..." +msgstr "" + +#: templates/user/edit-profile.html:90 +msgid "Self-description" +msgstr "" + +#: templates/user/edit-profile.html:98 +msgid "Select your closest major city" +msgstr "" + +#: templates/user/edit-profile.html:107 +msgid "Editor theme" +msgstr "" + +#: templates/user/edit-profile.html:112 +msgid "Math engine" +msgstr "" + +#: templates/user/edit-profile.html:136 templates/user/edit-profile.html:137 +msgid "Change your avatar" +msgstr "" + +#: templates/user/edit-profile.html:143 +msgid "Change your password" +msgstr "" + +#: templates/user/edit-profile.html:150 +msgid "Two Factor Authentication is enabled." +msgstr "" + +#: templates/user/edit-profile.html:153 +msgid "Two Factor Authentication is disabled." +msgstr "" + +#: templates/user/edit-profile.html:170 +msgid "User-script" +msgstr "" + +#: templates/user/edit-profile.html:174 +msgid "Update profile" +msgstr "" + +#: templates/user/pp-row.html:22 +#, python-format +msgid "\n" +" weighted %(weight)s%%\n" +" " +msgstr "" + +#: templates/user/pp-row.html:27 +#, python-format +msgid "%(pp).1fpp" +msgstr "" + +#: templates/user/pp-row.html:29 +#, python-format +msgid "%(pp).0fpp" +msgstr "" + +#: templates/user/user-about.html:14 +msgid "From" +msgstr "" + +#: 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:40 +msgid "You have not shared any information." +msgstr "" + +#: templates/user/user-about.html:42 +msgid "This user has not shared any information." +msgstr "" + +#: templates/user/user-base.html:42 +#, python-format +msgid "%(counter)s problem solved" +msgid_plural "%(counter)s problems solved" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: templates/user/user-base.html:50 +msgid "Rank by points:" +msgstr "" + +#: templates/user/user-base.html:53 +msgid "Total points:" +msgstr "" + +#: templates/user/user-base.html:68 +msgid "Rank by rating:" +msgstr "" + +#: templates/user/user-base.html:70 +msgid "Rating:" +msgstr "" + +#: templates/user/user-base.html:71 +msgid "Volatility:" +msgstr "" + +#: templates/user/user-base.html:72 +msgid "Min. rating:" +msgstr "" + +#: templates/user/user-base.html:73 +msgid "Max rating:" +msgstr "" + +#: templates/user/user-problems.html:35 +msgid "Points Breakdown" +msgstr "" + +#: templates/user/user-problems.html:41 +msgid "Load more..." +msgstr "" + +#: templates/user/user-problems.html:45 +msgid "This user has not yet solved any problems." +msgstr "" + +#: templates/user/user-problems.html:51 +msgid "Authored Problems" +msgstr "" + +#: templates/user/user-problems.html:83 +msgid "Hide problems I've solved" +msgstr "" + +#: templates/user/user-problems.html:93 +#, python-format +msgid "%(points).1f points" +msgstr "" + +#: templates/user/user-problems.html:99 +msgid "Score" +msgstr "" + +#: templates/user/user-problems.html:110 +#, python-format +msgid "%(points)s / %(total)s" +msgstr "" + +#: templates/user/user-tabs.html:7 +msgid "Impersonate" +msgstr "" + +#: templates/user/user-tabs.html:13 +msgid "Admin User" +msgstr "" + +#: templates/user/user-tabs.html:16 +msgid "Admin Profile" +msgstr "" + +#: templates/widgets/select_all.html:8 +msgid "Check all" +msgstr "" + diff --git a/locale/pl/LC_MESSAGES/djangojs.po b/locale/pl/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..f30632e --- /dev/null +++ b/locale/pl/LC_MESSAGES/djangojs.po @@ -0,0 +1,32 @@ +msgid "" +msgstr "" +"Project-Id-Version: dmoj\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-10-01 23:12+0000\n" +"PO-Revision-Date: 2019-11-11 22:05\n" +"Last-Translator: Icyene\n" +"Language-Team: Polish\n" +"Language: pl_PL\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" +"X-Generator: crowdin.com\n" +"X-Crowdin-Project: dmoj\n" +"X-Crowdin-Language: pl\n" +"X-Crowdin-File: djangojs.po\n" + +#: 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] "" +msgstr[2] "" +msgstr[3] "" + +#: resources/common.js:210 +msgctxt "time format without day" +msgid "%h:%m:%s" +msgstr "" + diff --git a/locale/pt/LC_MESSAGES/django.po b/locale/pt/LC_MESSAGES/django.po new file mode 100644 index 0000000..5bcf22a --- /dev/null +++ b/locale/pt/LC_MESSAGES/django.po @@ -0,0 +1,4531 @@ +msgid "" +msgstr "" +"Project-Id-Version: dmoj\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-11-11 21:54+0000\n" +"PO-Revision-Date: 2019-11-11 22:05\n" +"Last-Translator: Icyene\n" +"Language-Team: Portuguese, Brazilian\n" +"Language: pt_BR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: crowdin.com\n" +"X-Crowdin-Project: dmoj\n" +"X-Crowdin-Language: pt-BR\n" +"X-Crowdin-File: django.po\n" + +#: dmoj/settings.py:337 +msgid "German" +msgstr "" + +#: dmoj/settings.py:338 +msgid "English" +msgstr "" + +#: dmoj/settings.py:339 +msgid "Spanish" +msgstr "" + +#: dmoj/settings.py:340 +msgid "French" +msgstr "" + +#: dmoj/settings.py:341 +msgid "Croatian" +msgstr "" + +#: dmoj/settings.py:342 +msgid "Hungarian" +msgstr "" + +#: dmoj/settings.py:343 +msgid "Japanese" +msgstr "" + +#: dmoj/settings.py:344 +msgid "Korean" +msgstr "" + +#: dmoj/settings.py:345 +msgid "Brazilian Portuguese" +msgstr "" + +#: dmoj/settings.py:346 +msgid "Romanian" +msgstr "" + +#: dmoj/settings.py:347 +msgid "Russian" +msgstr "" + +#: dmoj/settings.py:348 +msgid "Serbian (Latin)" +msgstr "" + +#: dmoj/settings.py:349 +msgid "Turkish" +msgstr "" + +#: dmoj/settings.py:350 +msgid "Vietnamese" +msgstr "" + +#: dmoj/settings.py:351 +msgid "Simplified Chinese" +msgstr "" + +#: dmoj/urls.py:54 +msgid "Login" +msgstr "" + +#: dmoj/urls.py:102 templates/base.html:190 +msgid "Home" +msgstr "" + +#: 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 +msgid "Hide comments" +msgstr "" + +#: 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 +msgid "Unhide comments" +msgstr "" + +#: judge/admin/comments.py:58 +msgid "Associated page" +msgstr "" + +#: judge/admin/contest.py:29 +msgid "Included contests" +msgstr "" + +#: judge/admin/contest.py:65 templates/contest/contest.html:83 +#: templates/contest/moss.html:43 templates/problem/list.html:206 +#: templates/problem/list.html:221 templates/user/user-problems.html:56 +#: templates/user/user-problems.html:98 +msgid "Problem" +msgstr "" + +#: judge/admin/contest.py:113 +msgid "Settings" +msgstr "" + +#: judge/admin/contest.py:115 +msgid "Scheduling" +msgstr "" + +#: judge/admin/contest.py:116 +msgid "Details" +msgstr "" + +#: judge/admin/contest.py:117 +msgid "Format" +msgstr "" + +#: judge/admin/contest.py:118 templates/contest/ranking-table.html:5 +msgid "Rating" +msgstr "" + +#: judge/admin/contest.py:119 +msgid "Access" +msgstr "" + +#: judge/admin/contest.py:121 judge/admin/problem.py:131 +msgid "Justice" +msgstr "" + +#: judge/admin/contest.py:159 +#, 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:162 +msgid "Mark contests as visible" +msgstr "" + +#: judge/admin/contest.py:166 +#, 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:169 +msgid "Mark contests as hidden" +msgstr "" + +#: judge/admin/contest.py:180 judge/admin/submission.py:149 +#: judge/admin/submission.py:171 +msgid "You do not have the permission to rejudge submissions." +msgstr "" + +#: judge/admin/contest.py:187 judge/admin/submission.py:155 +msgid "You do not have the permission to rejudge THAT many submissions." +msgstr "" + +#: judge/admin/contest.py:194 judge/admin/submission.py:164 +#, 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:265 +#, python-format +msgid "%d participation recalculated." +msgid_plural "%d participations recalculated." +msgstr[0] "" +msgstr[1] "" + +#: judge/admin/contest.py:268 +msgid "Recalculate results" +msgstr "" + +#: judge/admin/contest.py:272 judge/admin/organization.py:65 +msgid "username" +msgstr "" + +#: judge/admin/contest.py:277 templates/base.html:258 +msgid "virtual" +msgstr "" + +#: judge/admin/interface.py:28 judge/models/interface.py:46 +msgid "link path" +msgstr "" + +#: judge/admin/interface.py:62 +msgid "Content" +msgstr "" + +#: judge/admin/interface.py:63 +msgid "Summary" +msgstr "" + +#: judge/admin/interface.py:107 judge/models/contest.py:251 +#: judge/models/contest.py:355 judge/models/profile.py:189 +msgid "user" +msgstr "" + +#: judge/admin/interface.py:148 +msgid "object" +msgstr "" + +#: judge/admin/organization.py:34 judge/admin/problem.py:171 +#: judge/admin/profile.py:78 +msgid "View on site" +msgstr "" + +#: judge/admin/problem.py:28 +msgid "Describe the changes you made (optional)" +msgstr "" + +#: judge/admin/problem.py:126 +msgid "Social Media" +msgstr "" + +#: judge/admin/problem.py:127 +msgid "Taxonomy" +msgstr "" + +#: judge/admin/problem.py:128 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:58 +msgid "Points" +msgstr "" + +#: judge/admin/problem.py:129 +msgid "Limits" +msgstr "" + +#: judge/admin/problem.py:130 judge/admin/submission.py:232 +#: templates/stats/base.html:14 templates/submission/list.html:328 +msgid "Language" +msgstr "" + +#: judge/admin/problem.py:132 +msgid "History" +msgstr "" + +#: judge/admin/problem.py:168 +msgid "Authors" +msgstr "" + +#: judge/admin/problem.py:183 +#, 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:187 +msgid "Mark problems as public" +msgstr "" + +#: judge/admin/problem.py:193 +#, 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:197 +msgid "Mark problems as private" +msgstr "" + +#: judge/admin/profile.py:32 +msgid "timezone" +msgstr "" + +#: judge/admin/profile.py:84 judge/admin/submission.py:211 +#: templates/organization/requests/log.html:9 +#: templates/organization/requests/pending.html:12 +#: templates/ticket/list.html:263 +msgid "User" +msgstr "" + +#: judge/admin/profile.py:89 templates/registration/registration_form.html:145 +msgid "Email" +msgstr "" + +#: judge/admin/profile.py:94 judge/views/register.py:29 +#: templates/registration/registration_form.html:173 +#: templates/user/edit-profile.html:99 +msgid "Timezone" +msgstr "" + +#: judge/admin/profile.py:99 +msgid "date joined" +msgstr "" + +#: judge/admin/profile.py:106 +#, python-format +msgid "%d user have scores recalculated." +msgid_plural "%d users have scores recalculated." +msgstr[0] "" +msgstr[1] "" + +#: judge/admin/profile.py:109 +msgid "Recalculate scores" +msgstr "" + +#: judge/admin/runtime.py:19 +msgid "Disallowed problems" +msgstr "" + +#: judge/admin/runtime.py:22 +msgid "These problems are NOT allowed to be submitted in this language" +msgstr "" + +#: judge/admin/runtime.py:83 +msgid "Description" +msgstr "" + +#: judge/admin/runtime.py:84 +msgid "Information" +msgstr "" + +#: judge/admin/runtime.py:85 +msgid "Capabilities" +msgstr "" + +#: judge/admin/submission.py:23 judge/admin/submission.py:42 +#: judge/admin/submission.py:221 +msgid "None" +msgstr "" + +#: judge/admin/submission.py:23 +msgid "Not done" +msgstr "" + +#: judge/admin/submission.py:23 +msgid "Exceptional" +msgstr "" + +#: judge/admin/submission.py:42 +msgid "Unaccepted" +msgstr "" + +#: judge/admin/submission.py:89 +#, python-format +msgctxt "contest problem" +msgid "%(problem)s in %(contest)s" +msgstr "" + +#: judge/admin/submission.py:167 +msgid "Rejudge the selected submissions" +msgstr "" + +#: judge/admin/submission.py:193 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:196 +msgid "Rescore the selected submissions" +msgstr "" + +#: judge/admin/submission.py:200 +msgid "Problem code" +msgstr "" + +#: judge/admin/submission.py:205 +msgid "Problem name" +msgstr "" + +#: judge/admin/submission.py:215 templates/organization/requests/log.html:10 +#: templates/organization/requests/pending.html:13 +msgid "Time" +msgstr "" + +#: judge/admin/submission.py:223 +#, python-format +msgid "%d KB" +msgstr "" + +#: judge/admin/submission.py:225 +#, python-format +msgid "%.2f MB" +msgstr "" + +#: judge/admin/submission.py:227 +msgid "Memory" +msgstr "" + +#: judge/admin/taxon.py:11 judge/admin/taxon.py:34 +msgid "Included problems" +msgstr "" + +#: judge/admin/taxon.py:14 +msgid "These problems are included in this group of problems" +msgstr "" + +#: judge/admin/taxon.py:37 +msgid "These problems are included in this type of problems" +msgstr "" + +#: judge/apps.py:8 +msgid "Online Judge" +msgstr "" + +#: judge/comments.py:41 +msgid "Comment body" +msgstr "" + +#: judge/comments.py:47 judge/views/ticket.py:46 +msgid "Your part is silent, little toad." +msgstr "" + +#: judge/comments.py:50 templates/comments/list.html:131 +msgid "You need to have solved at least one problem before your voice can be heard." +msgstr "" + +#: judge/comments.py:92 +msgid "Posted comment" +msgstr "" + +#: judge/contest_format/atcoder.py:19 +msgid "AtCoder" +msgstr "" + +#: judge/contest_format/default.py:18 +msgid "Default" +msgstr "" + +#: judge/contest_format/ecoo.py:19 +msgid "ECOO" +msgstr "" + +#: judge/contest_format/ioi.py:19 +msgid "IOI" +msgstr "" + +#: judge/forms.py:27 +msgid "Subscribe to contest updates" +msgstr "" + +#: judge/forms.py:28 +msgid "Enable experimental features" +msgstr "" + +#: judge/forms.py:57 judge/views/organization.py:127 +#, python-brace-format +msgid "You may not be part of more than {count} public organizations." +msgstr "" + +#: judge/forms.py:107 judge/views/register.py:26 +#: templates/registration/registration_form.html:139 +#: templates/user/base-users-table.html:5 +msgid "Username" +msgstr "" + +#: judge/forms.py:108 templates/registration/registration_form.html:151 +#: templates/registration/registration_form.html:165 +msgid "Password" +msgstr "" + +#: judge/forms.py:130 +msgid "Two Factor Authentication tokens must be 6 decimal digits." +msgstr "" + +#: judge/forms.py:139 templates/registration/totp_auth.html:32 +msgid "Invalid Two Factor Authentication token." +msgstr "" + +#: judge/forms.py:143 judge/models/problem.py:97 +msgid "Problem code must be ^[a-z0-9]+$" +msgstr "" + +#: judge/forms.py:148 +msgid "Problem with code already exists." +msgstr "" + +#: judge/forms.py:153 judge/models/contest.py:51 +msgid "Contest id must be ^[a-z0-9]+$" +msgstr "" + +#: judge/forms.py:158 +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:59 +msgid "Leave as LaTeX" +msgstr "" + +#: judge/models/choices.py:60 +msgid "SVG with PNG fallback" +msgstr "" + +#: judge/models/choices.py:61 +msgid "MathML only" +msgstr "" + +#: judge/models/choices.py:62 +msgid "MathJax with SVG/PNG fallback" +msgstr "" + +#: judge/models/choices.py:63 +msgid "Detect best quality" +msgstr "" + +#: judge/models/comment.py:25 +msgid "Page code must be ^[pcs]:[a-z0-9]+$|^b:\\d+$" +msgstr "" + +#: judge/models/comment.py:41 +msgid "commenter" +msgstr "" + +#: judge/models/comment.py:42 +msgid "posted time" +msgstr "" + +#: judge/models/comment.py:43 judge/models/comment.py:176 +msgid "associated page" +msgstr "" + +#: judge/models/comment.py:45 +msgid "votes" +msgstr "" + +#: judge/models/comment.py:46 +msgid "body of comment" +msgstr "" + +#: judge/models/comment.py:47 +msgid "hide the comment" +msgstr "" + +#: judge/models/comment.py:48 +msgid "parent" +msgstr "" + +#: judge/models/comment.py:53 +msgid "comment" +msgstr "" + +#: judge/models/comment.py:54 +msgid "comments" +msgstr "" + +#: judge/models/comment.py:136 judge/models/problem.py:406 +#, python-format +msgid "Editorial for %s" +msgstr "" + +#: judge/models/comment.py:171 +msgid "comment vote" +msgstr "" + +#: judge/models/comment.py:172 +msgid "comment votes" +msgstr "" + +#: judge/models/comment.py:181 +msgid "Override comment lock" +msgstr "" + +#: judge/models/contest.py:21 +msgid "Invalid colour." +msgstr "" + +#: judge/models/contest.py:23 +msgid "tag name" +msgstr "" + +#: judge/models/contest.py:24 +msgid "Lowercase letters and hyphens only." +msgstr "" + +#: judge/models/contest.py:25 +msgid "tag colour" +msgstr "" + +#: judge/models/contest.py:26 +msgid "tag description" +msgstr "" + +#: judge/models/contest.py:45 +msgid "contest tag" +msgstr "" + +#: judge/models/contest.py:46 judge/models/contest.py:100 +msgid "contest tags" +msgstr "" + +#: judge/models/contest.py:50 +msgid "contest id" +msgstr "" + +#: judge/models/contest.py:52 +msgid "contest name" +msgstr "" + +#: judge/models/contest.py:53 +msgid "These people will be able to edit the contest." +msgstr "" + +#: judge/models/contest.py:55 judge/models/runtime.py:124 +#: src/dmoj-wpadmin/test_project/apps/books/admin.py:20 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:27 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:27 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:27 +msgid "description" +msgstr "" + +#: judge/models/contest.py:56 judge/models/problem.py:353 +#: judge/models/runtime.py:126 +msgid "problems" +msgstr "" + +#: judge/models/contest.py:57 judge/models/contest.py:252 +msgid "start time" +msgstr "" + +#: judge/models/contest.py:58 +msgid "end time" +msgstr "" + +#: judge/models/contest.py:59 judge/models/problem.py:118 +#: judge/models/problem.py:377 +msgid "time limit" +msgstr "" + +#: judge/models/contest.py:60 judge/models/problem.py:136 +msgid "publicly visible" +msgstr "" + +#: judge/models/contest.py:61 +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:64 +msgid "contest rated" +msgstr "" + +#: judge/models/contest.py:64 +msgid "Whether this contest can be rated." +msgstr "" + +#: judge/models/contest.py:66 +msgid "hide scoreboard" +msgstr "" + +#: judge/models/contest.py:67 +msgid "Whether the scoreboard should remain hidden for the duration of the contest." +msgstr "" + +#: judge/models/contest.py:70 +msgid "no comments" +msgstr "" + +#: judge/models/contest.py:71 +msgid "Use clarification system instead of comments." +msgstr "" + +#: judge/models/contest.py:73 +msgid "Rating floor for contest" +msgstr "" + +#: judge/models/contest.py:75 +msgid "Rating ceiling for contest" +msgstr "" + +#: judge/models/contest.py:77 +msgid "rate all" +msgstr "" + +#: judge/models/contest.py:77 +msgid "Rate all users who joined." +msgstr "" + +#: judge/models/contest.py:78 +msgid "exclude from ratings" +msgstr "" + +#: judge/models/contest.py:80 +msgid "private to specific users" +msgstr "" + +#: judge/models/contest.py:81 +msgid "private contestants" +msgstr "" + +#: judge/models/contest.py:82 +msgid "If private, only these users may see the contest" +msgstr "" + +#: judge/models/contest.py:84 +msgid "hide problem tags" +msgstr "" + +#: judge/models/contest.py:85 +msgid "Whether problem tags should be hidden by default." +msgstr "" + +#: judge/models/contest.py:87 +msgid "run pretests only" +msgstr "" + +#: judge/models/contest.py:88 +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:92 judge/models/problem.py:157 +msgid "private to organizations" +msgstr "" + +#: judge/models/contest.py:93 judge/models/problem.py:155 +#: judge/models/profile.py:76 +msgid "organizations" +msgstr "" + +#: judge/models/contest.py:94 +msgid "If private, only these organizations may see the contest" +msgstr "" + +#: judge/models/contest.py:95 judge/models/problem.py:145 +msgid "OpenGraph image" +msgstr "" + +#: judge/models/contest.py:96 judge/models/profile.py:47 +msgid "Logo override image" +msgstr "" + +#: judge/models/contest.py:98 +msgid "This image will replace the default site logo for users inside the contest." +msgstr "" + +#: judge/models/contest.py:101 +msgid "the amount of live participants" +msgstr "" + +#: judge/models/contest.py:102 +msgid "contest summary" +msgstr "" + +#: judge/models/contest.py:103 judge/models/problem.py:147 +msgid "Plain-text, shown in meta description tag, e.g. for social media." +msgstr "" + +#: judge/models/contest.py:104 judge/models/profile.py:46 +msgid "access code" +msgstr "" + +#: judge/models/contest.py:105 +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:107 judge/models/problem.py:141 +msgid "personae non gratae" +msgstr "" + +#: judge/models/contest.py:108 +msgid "Bans the selected users from joining this contest." +msgstr "" + +#: judge/models/contest.py:109 +msgid "contest format" +msgstr "" + +#: judge/models/contest.py:110 +msgid "The contest format module to use." +msgstr "" + +#: judge/models/contest.py:111 +msgid "contest format configuration" +msgstr "" + +#: judge/models/contest.py:112 +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:233 +msgid "See private contests" +msgstr "" + +#: judge/models/contest.py:234 +msgid "Edit own contests" +msgstr "" + +#: judge/models/contest.py:235 +msgid "Edit all contests" +msgstr "" + +#: judge/models/contest.py:236 +msgid "Clone contest" +msgstr "" + +#: judge/models/contest.py:237 templates/contest/moss.html:74 +msgid "MOSS contest" +msgstr "" + +#: judge/models/contest.py:238 +msgid "Rate contests" +msgstr "" + +#: judge/models/contest.py:239 +msgid "Contest access codes" +msgstr "" + +#: judge/models/contest.py:240 +msgid "Create private contests" +msgstr "" + +#: judge/models/contest.py:242 judge/models/contest.py:320 +#: judge/models/contest.py:356 judge/models/contest.py:378 +#: judge/models/submission.py:83 +msgid "contest" +msgstr "" + +#: judge/models/contest.py:243 +msgid "contests" +msgstr "" + +#: judge/models/contest.py:250 +msgid "associated contest" +msgstr "" + +#: judge/models/contest.py:253 +msgid "score" +msgstr "" + +#: judge/models/contest.py:254 +msgid "cumulative time" +msgstr "" + +#: judge/models/contest.py:255 +msgid "virtual participation id" +msgstr "" + +#: judge/models/contest.py:256 +msgid "0 means non-virtual, otherwise the n-th virtual participation" +msgstr "" + +#: judge/models/contest.py:257 +msgid "contest format specific data" +msgstr "" + +#: judge/models/contest.py:306 +#, python-format +msgid "%s spectating in %s" +msgstr "" + +#: judge/models/contest.py:308 +#, python-format +msgid "%s in %s, v%d" +msgstr "" + +#: judge/models/contest.py:309 +#, python-format +msgid "%s in %s" +msgstr "" + +#: judge/models/contest.py:312 +msgid "contest participation" +msgstr "" + +#: judge/models/contest.py:313 +msgid "contest participations" +msgstr "" + +#: judge/models/contest.py:319 judge/models/contest.py:340 +#: judge/models/contest.py:379 judge/models/problem.py:352 +#: judge/models/problem.py:357 judge/models/problem.py:375 +#: judge/models/problem_data.py:35 +msgid "problem" +msgstr "" + +#: judge/models/contest.py:321 judge/models/contest.py:344 +#: judge/models/problem.py:129 +msgid "points" +msgstr "" + +#: judge/models/contest.py:322 +msgid "partial" +msgstr "" + +#: judge/models/contest.py:323 judge/models/contest.py:345 +msgid "is pretested" +msgstr "" + +#: judge/models/contest.py:324 judge/models/interface.py:43 +msgid "order" +msgstr "" + +#: judge/models/contest.py:325 +msgid "output prefix length override" +msgstr "" + +#: judge/models/contest.py:326 +msgid "Maximum number of submissions for this problem, or 0 for no limit." +msgstr "" + +#: judge/models/contest.py:328 +msgid "Why include a problem you can't submit to?" +msgstr "" + +#: judge/models/contest.py:333 +msgid "contest problem" +msgstr "" + +#: judge/models/contest.py:334 +msgid "contest problems" +msgstr "" + +#: judge/models/contest.py:338 judge/models/submission.py:181 +msgid "submission" +msgstr "" + +#: judge/models/contest.py:342 judge/models/contest.py:357 +msgid "participation" +msgstr "" + +#: judge/models/contest.py:346 +msgid "Whether this submission was ran only on pretests." +msgstr "" + +#: judge/models/contest.py:350 +msgid "contest submission" +msgstr "" + +#: judge/models/contest.py:351 +msgid "contest submissions" +msgstr "" + +#: judge/models/contest.py:359 +msgid "rank" +msgstr "" + +#: judge/models/contest.py:360 +msgid "rating" +msgstr "" + +#: judge/models/contest.py:361 +msgid "volatility" +msgstr "" + +#: judge/models/contest.py:362 +msgid "last rated" +msgstr "" + +#: judge/models/contest.py:366 +msgid "contest rating" +msgstr "" + +#: judge/models/contest.py:367 +msgid "contest ratings" +msgstr "" + +#: judge/models/contest.py:386 +msgid "contest moss result" +msgstr "" + +#: judge/models/contest.py:387 +msgid "contest moss results" +msgstr "" + +#: judge/models/interface.py:24 +msgid "configuration item" +msgstr "" + +#: judge/models/interface.py:25 +msgid "miscellaneous configuration" +msgstr "" + +#: judge/models/interface.py:37 +msgid "navigation item" +msgstr "" + +#: judge/models/interface.py:38 +msgid "navigation bar" +msgstr "" + +#: judge/models/interface.py:44 +msgid "identifier" +msgstr "" + +#: judge/models/interface.py:45 +msgid "label" +msgstr "" + +#: judge/models/interface.py:47 +msgid "highlight regex" +msgstr "" + +#: judge/models/interface.py:48 +msgid "parent item" +msgstr "" + +#: judge/models/interface.py:66 +msgid "post title" +msgstr "" + +#: judge/models/interface.py:67 judge/models/problem.py:395 +msgid "authors" +msgstr "" + +#: judge/models/interface.py:68 +msgid "slug" +msgstr "" + +#: judge/models/interface.py:69 judge/models/problem.py:393 +msgid "public visibility" +msgstr "" + +#: judge/models/interface.py:70 +msgid "sticky" +msgstr "" + +#: judge/models/interface.py:71 +msgid "publish after" +msgstr "" + +#: judge/models/interface.py:72 +msgid "post content" +msgstr "" + +#: judge/models/interface.py:73 +msgid "post summary" +msgstr "" + +#: judge/models/interface.py:74 +msgid "openGraph image" +msgstr "" + +#: judge/models/interface.py:91 +msgid "Edit all posts" +msgstr "" + +#: judge/models/interface.py:93 +msgid "blog post" +msgstr "" + +#: judge/models/interface.py:94 +msgid "blog posts" +msgstr "" + +#: judge/models/message.py:11 +msgid "message title" +msgstr "" + +#: judge/models/message.py:12 judge/models/ticket.py:29 +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:26 +msgid "problem category ID" +msgstr "" + +#: judge/models/problem.py:27 +msgid "problem category name" +msgstr "" + +#: judge/models/problem.py:34 +msgid "problem type" +msgstr "" + +#: judge/models/problem.py:35 judge/models/problem.py:113 +msgid "problem types" +msgstr "" + +#: judge/models/problem.py:39 +msgid "problem group ID" +msgstr "" + +#: judge/models/problem.py:40 +msgid "problem group name" +msgstr "" + +#: judge/models/problem.py:47 judge/models/problem.py:116 +msgid "problem group" +msgstr "" + +#: judge/models/problem.py:48 +msgid "problem groups" +msgstr "" + +#: judge/models/problem.py:52 +msgid "key" +msgstr "" + +#: judge/models/problem.py:54 +msgid "link" +msgstr "" + +#: judge/models/problem.py:55 +msgid "full name" +msgstr "" + +#: judge/models/problem.py:56 judge/models/profile.py:32 +#: judge/models/runtime.py:23 +msgid "short name" +msgstr "" + +#: judge/models/problem.py:57 +msgid "Displayed on pages under this license" +msgstr "" + +#: judge/models/problem.py:58 +msgid "icon" +msgstr "" + +#: judge/models/problem.py:58 +msgid "URL to the icon" +msgstr "" + +#: judge/models/problem.py:59 +msgid "license text" +msgstr "" + +#: judge/models/problem.py:68 +msgid "license" +msgstr "" + +#: judge/models/problem.py:69 +msgid "licenses" +msgstr "" + +#: judge/models/problem.py:96 +msgid "problem code" +msgstr "" + +#: judge/models/problem.py:98 +msgid "A short, unique code for the problem, used in the url after /problem/" +msgstr "" + +#: judge/models/problem.py:100 +msgid "problem name" +msgstr "" + +#: judge/models/problem.py:101 +msgid "The full name of the problem, as shown in the problem list." +msgstr "" + +#: judge/models/problem.py:103 +msgid "problem body" +msgstr "" + +#: judge/models/problem.py:104 +msgid "creators" +msgstr "" + +#: judge/models/problem.py:105 +msgid "These users will be able to edit the problem, and be listed as authors." +msgstr "" + +#: judge/models/problem.py:107 +msgid "curators" +msgstr "" + +#: judge/models/problem.py:108 +msgid "These users will be able to edit the problem, but not be listed as authors." +msgstr "" + +#: judge/models/problem.py:110 +msgid "testers" +msgstr "" + +#: judge/models/problem.py:112 +msgid "These users will be able to view the private problem, but not edit it." +msgstr "" + +#: judge/models/problem.py:114 +msgid "The type of problem, as shown on the problem's page." +msgstr "" + +#: judge/models/problem.py:117 +msgid "The group of problem, shown under Category in the problem list." +msgstr "" + +#: judge/models/problem.py:119 +msgid "The time limit for this problem, in seconds. Fractional seconds (e.g. 1.5) are supported." +msgstr "" + +#: judge/models/problem.py:123 judge/models/problem.py:380 +msgid "memory limit" +msgstr "" + +#: judge/models/problem.py:124 +msgid "The memory limit for this problem, in kilobytes (e.g. 64mb = 65536 kilobytes)." +msgstr "" + +#: judge/models/problem.py:130 +msgid "Points awarded for problem completion. Points are displayed with a 'p' suffix if partial." +msgstr "" + +#: judge/models/problem.py:133 +msgid "allows partial points" +msgstr "" + +#: judge/models/problem.py:134 +msgid "allowed languages" +msgstr "" + +#: judge/models/problem.py:135 +msgid "List of allowed submission languages." +msgstr "" + +#: judge/models/problem.py:137 +msgid "manually managed" +msgstr "" + +#: judge/models/problem.py:138 +msgid "Whether judges should be allowed to manage data or not." +msgstr "" + +#: judge/models/problem.py:139 +msgid "date of publishing" +msgstr "" + +#: judge/models/problem.py:140 +msgid "Doesn't have magic ability to auto-publish due to backward compatibility" +msgstr "" + +#: judge/models/problem.py:142 +msgid "Bans the selected users from submitting to this problem." +msgstr "" + +#: judge/models/problem.py:144 +msgid "The license under which this problem is published." +msgstr "" + +#: judge/models/problem.py:146 +msgid "problem summary" +msgstr "" + +#: judge/models/problem.py:148 +msgid "number of users" +msgstr "" + +#: judge/models/problem.py:149 +msgid "The number of users who solved the problem." +msgstr "" + +#: judge/models/problem.py:150 +msgid "solve rate" +msgstr "" + +#: judge/models/problem.py:156 +msgid "If private, only these organizations may see the problem." +msgstr "" + +#: judge/models/problem.py:358 judge/models/problem.py:376 +#: judge/models/runtime.py:99 +msgid "language" +msgstr "" + +#: judge/models/problem.py:359 +msgid "translated name" +msgstr "" + +#: judge/models/problem.py:360 +msgid "translated description" +msgstr "" + +#: judge/models/problem.py:364 +msgid "problem translation" +msgstr "" + +#: judge/models/problem.py:365 +msgid "problem translations" +msgstr "" + +#: judge/models/problem.py:369 +msgid "clarified problem" +msgstr "" + +#: judge/models/problem.py:370 +msgid "clarification body" +msgstr "" + +#: judge/models/problem.py:371 +msgid "clarification timestamp" +msgstr "" + +#: judge/models/problem.py:386 +msgid "language-specific resource limit" +msgstr "" + +#: judge/models/problem.py:387 +msgid "language-specific resource limits" +msgstr "" + +#: judge/models/problem.py:391 +msgid "associated problem" +msgstr "" + +#: judge/models/problem.py:394 +msgid "publish date" +msgstr "" + +#: judge/models/problem.py:396 +msgid "editorial content" +msgstr "" + +#: judge/models/problem.py:412 +msgid "solution" +msgstr "" + +#: judge/models/problem.py:413 +msgid "solutions" +msgstr "" + +#: judge/models/problem_data.py:23 +msgid "Standard" +msgstr "" + +#: judge/models/problem_data.py:24 +msgid "Floats" +msgstr "" + +#: judge/models/problem_data.py:25 +msgid "Floats (absolute)" +msgstr "" + +#: judge/models/problem_data.py:26 +msgid "Floats (relative)" +msgstr "" + +#: judge/models/problem_data.py:27 +msgid "Non-trailing spaces" +msgstr "" + +#: judge/models/problem_data.py:28 +msgid "Unordered" +msgstr "" + +#: judge/models/problem_data.py:29 +msgid "Byte identical" +msgstr "" + +#: 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:39 +msgid "generator file" +msgstr "" + +#: judge/models/problem_data.py:41 judge/models/problem_data.py:90 +msgid "output prefix length" +msgstr "" + +#: judge/models/problem_data.py:42 judge/models/problem_data.py:91 +msgid "output limit length" +msgstr "" + +#: judge/models/problem_data.py:43 +msgid "init.yml generation feedback" +msgstr "" + +#: judge/models/problem_data.py:44 judge/models/problem_data.py:92 +msgid "checker" +msgstr "" + +#: judge/models/problem_data.py:45 judge/models/problem_data.py:93 +msgid "checker arguments" +msgstr "" + +#: 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:77 +msgid "problem data set" +msgstr "" + +#: judge/models/problem_data.py:79 +msgid "case position" +msgstr "" + +#: judge/models/problem_data.py:80 +msgid "case type" +msgstr "" + +#: judge/models/problem_data.py:81 +msgid "Normal case" +msgstr "" + +#: judge/models/problem_data.py:82 +msgid "Batch start" +msgstr "" + +#: judge/models/problem_data.py:83 +msgid "Batch end" +msgstr "" + +#: judge/models/problem_data.py:85 +msgid "input file name" +msgstr "" + +#: judge/models/problem_data.py:86 +msgid "output file name" +msgstr "" + +#: judge/models/problem_data.py:87 +msgid "generator arguments" +msgstr "" + +#: judge/models/problem_data.py:88 +msgid "point value" +msgstr "" + +#: judge/models/problem_data.py:89 +msgid "case is pretest?" +msgstr "" + +#: judge/models/profile.py:29 +msgid "organization title" +msgstr "" + +#: judge/models/profile.py:30 +msgid "organization slug" +msgstr "" + +#: judge/models/profile.py:31 +msgid "Organization name shown in URL" +msgstr "" + +#: judge/models/profile.py:33 +msgid "Displayed beside user name during contests" +msgstr "" + +#: judge/models/profile.py:34 +msgid "organization description" +msgstr "" + +#: judge/models/profile.py:35 +msgid "registrant" +msgstr "" + +#: judge/models/profile.py:36 +msgid "User who registered this organization" +msgstr "" + +#: judge/models/profile.py:37 +msgid "administrators" +msgstr "" + +#: judge/models/profile.py:38 +msgid "Those who can edit this organization" +msgstr "" + +#: judge/models/profile.py:39 +msgid "creation date" +msgstr "" + +#: judge/models/profile.py:40 +msgid "is open organization?" +msgstr "" + +#: judge/models/profile.py:41 +msgid "Allow joining organization" +msgstr "" + +#: judge/models/profile.py:42 +msgid "maximum size" +msgstr "" + +#: judge/models/profile.py:43 +msgid "Maximum amount of users in this organization, only applicable to private organizations" +msgstr "" + +#: judge/models/profile.py:45 +msgid "Student access code" +msgstr "" + +#: judge/models/profile.py:49 +msgid "This image will replace the default site logo for users viewing the organization." +msgstr "" + +#: judge/models/profile.py:75 judge/models/profile.py:91 +#: judge/models/profile.py:190 +msgid "organization" +msgstr "" + +#: judge/models/profile.py:80 +msgid "user associated" +msgstr "" + +#: judge/models/profile.py:81 +msgid "self-description" +msgstr "" + +#: judge/models/profile.py:82 +msgid "location" +msgstr "" + +#: judge/models/profile.py:84 +msgid "preferred language" +msgstr "" + +#: judge/models/profile.py:89 +msgid "last access time" +msgstr "" + +#: judge/models/profile.py:90 +msgid "last IP" +msgstr "" + +#: judge/models/profile.py:93 +msgid "display rank" +msgstr "" + +#: judge/models/profile.py:95 +msgid "comment mute" +msgstr "" + +#: judge/models/profile.py:95 +msgid "Some users are at their best when silent." +msgstr "" + +#: judge/models/profile.py:97 +msgid "unlisted user" +msgstr "" + +#: judge/models/profile.py:97 +msgid "User will not be ranked." +msgstr "" + +#: judge/models/profile.py:100 +msgid "user script" +msgstr "" + +#: judge/models/profile.py:101 +msgid "User-defined JavaScript for site customization." +msgstr "" + +#: judge/models/profile.py:102 +msgid "current contest" +msgstr "" + +#: judge/models/profile.py:104 +msgid "math engine" +msgstr "" + +#: judge/models/profile.py:106 +msgid "the rendering engine used to render math" +msgstr "" + +#: judge/models/profile.py:107 +msgid "2FA enabled" +msgstr "" + +#: judge/models/profile.py:108 +msgid "check to enable TOTP-based two factor authentication" +msgstr "" + +#: judge/models/profile.py:109 +msgid "TOTP key" +msgstr "" + +#: judge/models/profile.py:110 +msgid "32 character base32-encoded key for TOTP" +msgstr "" + +#: judge/models/profile.py:112 +msgid "TOTP key must be empty or base32" +msgstr "" + +#: judge/models/profile.py:113 +msgid "internal notes" +msgstr "" + +#: judge/models/profile.py:114 +msgid "Notes for administrators regarding this user." +msgstr "" + +#: judge/models/profile.py:184 +msgid "user profile" +msgstr "" + +#: judge/models/profile.py:185 +msgid "user profiles" +msgstr "" + +#: judge/models/profile.py:192 +msgid "request time" +msgstr "" + +#: judge/models/profile.py:193 +msgid "state" +msgstr "" + +#: judge/models/profile.py:198 +msgid "reason" +msgstr "" + +#: judge/models/profile.py:201 +msgid "organization join request" +msgstr "" + +#: judge/models/profile.py:202 +msgid "organization join requests" +msgstr "" + +#: judge/models/runtime.py:18 +msgid "short identifier" +msgstr "" + +#: judge/models/runtime.py:19 +msgid "The identifier for this language; the same as its executor id for judges." +msgstr "" + +#: judge/models/runtime.py:21 +msgid "long name" +msgstr "" + +#: judge/models/runtime.py:22 +msgid "Longer name for the language, e.g. \"Python 2\" or \"C++11\"." +msgstr "" + +#: judge/models/runtime.py:24 +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:28 +msgid "common name" +msgstr "" + +#: judge/models/runtime.py:29 +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:31 +msgid "ace mode name" +msgstr "" + +#: judge/models/runtime.py:32 +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:34 +msgid "pygments name" +msgstr "" + +#: judge/models/runtime.py:35 +msgid "Language ID for Pygments highlighting in source windows." +msgstr "" + +#: judge/models/runtime.py:36 +msgid "code template" +msgstr "" + +#: judge/models/runtime.py:37 +msgid "Code template to display in submission editor." +msgstr "" + +#: judge/models/runtime.py:38 +msgid "runtime info override" +msgstr "" + +#: judge/models/runtime.py:39 +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:41 +msgid "language description" +msgstr "" + +#: judge/models/runtime.py:42 +msgid "Use field this to inform users of quirks with your environment, additional restrictions, etc." +msgstr "" + +#: judge/models/runtime.py:44 +msgid "extension" +msgstr "" + +#: judge/models/runtime.py:45 +msgid "The extension of source files, e.g., \"py\" or \"cpp\"." +msgstr "" + +#: judge/models/runtime.py:100 +msgid "languages" +msgstr "" + +#: judge/models/runtime.py:104 +msgid "language to which this runtime belongs" +msgstr "" + +#: judge/models/runtime.py:105 +msgid "judge on which this runtime exists" +msgstr "" + +#: judge/models/runtime.py:106 +msgid "runtime name" +msgstr "" + +#: judge/models/runtime.py:107 +msgid "runtime version" +msgstr "" + +#: judge/models/runtime.py:108 +msgid "order in which to display this runtime" +msgstr "" + +#: judge/models/runtime.py:112 +msgid "Server name, hostname-style" +msgstr "" + +#: judge/models/runtime.py:113 +msgid "time of creation" +msgstr "" + +#: judge/models/runtime.py:114 +msgid "A key to authenticated this judge" +msgstr "" + +#: judge/models/runtime.py:115 +msgid "authentication key" +msgstr "" + +#: judge/models/runtime.py:116 +msgid "block judge" +msgstr "" + +#: judge/models/runtime.py:117 +msgid "Whether this judge should be blocked from connecting, even if its key is correct." +msgstr "" + +#: judge/models/runtime.py:119 +msgid "judge online status" +msgstr "" + +#: judge/models/runtime.py:120 +msgid "judge start time" +msgstr "" + +#: judge/models/runtime.py:121 +msgid "response time" +msgstr "" + +#: judge/models/runtime.py:122 +msgid "system load" +msgstr "" + +#: judge/models/runtime.py:123 +msgid "Load for the last minute, divided by processors to be fair." +msgstr "" + +#: judge/models/runtime.py:127 judge/models/runtime.py:167 +msgid "judges" +msgstr "" + +#: judge/models/runtime.py:166 +msgid "judge" +msgstr "" + +#: judge/models/submission.py:20 judge/models/submission.py:47 +#: judge/utils/problems.py:86 +msgid "Accepted" +msgstr "" + +#: judge/models/submission.py:21 judge/models/submission.py:48 +msgid "Wrong Answer" +msgstr "" + +#: judge/models/submission.py:22 judge/models/submission.py:50 +msgid "Time Limit Exceeded" +msgstr "" + +#: judge/models/submission.py:23 judge/models/submission.py:51 +msgid "Memory Limit Exceeded" +msgstr "" + +#: judge/models/submission.py:24 judge/models/submission.py:52 +msgid "Output Limit Exceeded" +msgstr "" + +#: judge/models/submission.py:25 judge/models/submission.py:53 +msgid "Invalid Return" +msgstr "" + +#: judge/models/submission.py:26 judge/models/submission.py:54 +msgid "Runtime Error" +msgstr "" + +#: judge/models/submission.py:27 judge/models/submission.py:41 +#: judge/models/submission.py:55 judge/utils/problems.py:88 +msgid "Compile Error" +msgstr "" + +#: judge/models/submission.py:28 judge/models/submission.py:40 +msgid "Internal Error" +msgstr "" + +#: judge/models/submission.py:29 +msgid "Short circuit" +msgstr "" + +#: judge/models/submission.py:30 judge/models/submission.py:42 +#: judge/models/submission.py:61 +msgid "Aborted" +msgstr "" + +#: judge/models/submission.py:36 judge/models/submission.py:57 +msgid "Queued" +msgstr "" + +#: judge/models/submission.py:37 judge/models/submission.py:58 +msgid "Processing" +msgstr "" + +#: judge/models/submission.py:38 judge/models/submission.py:59 +msgid "Grading" +msgstr "" + +#: judge/models/submission.py:39 judge/models/submission.py:60 +msgid "Completed" +msgstr "" + +#: judge/models/submission.py:56 +msgid "Internal Error (judging server error)" +msgstr "" + +#: judge/models/submission.py:66 +msgid "submission time" +msgstr "" + +#: judge/models/submission.py:67 judge/models/submission.py:201 +msgid "execution time" +msgstr "" + +#: judge/models/submission.py:68 judge/models/submission.py:202 +msgid "memory usage" +msgstr "" + +#: judge/models/submission.py:69 judge/models/submission.py:203 +msgid "points granted" +msgstr "" + +#: judge/models/submission.py:70 +msgid "submission language" +msgstr "" + +#: judge/models/submission.py:71 +msgid "status" +msgstr "" + +#: judge/models/submission.py:72 +msgid "result" +msgstr "" + +#: judge/models/submission.py:74 +msgid "compile errors" +msgstr "" + +#: judge/models/submission.py:76 +msgid "batched cases" +msgstr "" + +#: judge/models/submission.py:77 +msgid "test case points" +msgstr "" + +#: judge/models/submission.py:78 +msgid "test case total points" +msgstr "" + +#: judge/models/submission.py:79 +msgid "judged on" +msgstr "" + +#: judge/models/submission.py:81 +msgid "was rejudged by admin" +msgstr "" + +#: judge/models/submission.py:82 +msgid "was ran on pretests only" +msgstr "" + +#: judge/models/submission.py:182 templates/contest/moss.html:58 +msgid "submissions" +msgstr "" + +#: judge/models/submission.py:186 judge/models/submission.py:197 +msgid "associated submission" +msgstr "" + +#: judge/models/submission.py:188 +msgid "source code" +msgstr "" + +#: judge/models/submission.py:199 +msgid "test case ID" +msgstr "" + +#: judge/models/submission.py:200 +msgid "status flag" +msgstr "" + +#: judge/models/submission.py:204 +msgid "points possible" +msgstr "" + +#: judge/models/submission.py:205 +msgid "batch number" +msgstr "" + +#: judge/models/submission.py:206 +msgid "judging feedback" +msgstr "" + +#: judge/models/submission.py:207 +msgid "extended judging feedback" +msgstr "" + +#: judge/models/submission.py:208 +msgid "program output" +msgstr "" + +#: judge/models/submission.py:216 +msgid "submission test case" +msgstr "" + +#: judge/models/submission.py:217 +msgid "submission test cases" +msgstr "" + +#: judge/models/ticket.py:10 +msgid "ticket title" +msgstr "" + +#: judge/models/ticket.py:11 +msgid "ticket creator" +msgstr "" + +#: judge/models/ticket.py:13 +msgid "creation time" +msgstr "" + +#: judge/models/ticket.py:14 +msgid "assignees" +msgstr "" + +#: judge/models/ticket.py:15 +msgid "quick notes" +msgstr "" + +#: judge/models/ticket.py:16 +msgid "Staff notes for this issue to aid in processing." +msgstr "" + +#: judge/models/ticket.py:17 +msgid "linked item type" +msgstr "" + +#: judge/models/ticket.py:19 +msgid "linked item ID" +msgstr "" + +#: judge/models/ticket.py:21 +msgid "is ticket open?" +msgstr "" + +#: judge/models/ticket.py:25 +msgid "ticket" +msgstr "" + +#: judge/models/ticket.py:27 +msgid "poster" +msgstr "" + +#: judge/models/ticket.py:30 +msgid "message time" +msgstr "" + +#: judge/pdf_problems.py:134 judge/pdf_problems.py:186 +#: judge/pdf_problems.py:246 +msgid "Page [page] of [topage]" +msgstr "" + +#: judge/tasks/moss.py:25 +msgid "Running MOSS" +msgstr "" + +#: judge/tasks/submission.py:43 +msgid "Modifying submissions" +msgstr "" + +#: judge/tasks/submission.py:56 +msgid "Recalculating user points" +msgstr "" + +#: judge/utils/problem_data.py:63 +msgid "Empty batches not allowed." +msgstr "" + +#: 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 +#, python-format +msgid "Input file for case %d does not exist: %s" +msgstr "" + +#: 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 +#, python-format +msgid "Batch start case #%d requires points." +msgstr "" + +#: 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 +msgid "How did you corrupt the zip path?" +msgstr "" + +#: judge/utils/problem_data.py:160 +msgid "How did you corrupt the generator path?" +msgstr "" + +#: judge/utils/problems.py:76 +msgid "Can't pass both queryset and keyword filters" +msgstr "" + +#: judge/utils/problems.py:87 +msgid "Wrong" +msgstr "" + +#: judge/utils/problems.py:89 +msgid "Timeout" +msgstr "" + +#: judge/utils/problems.py:90 +msgid "Error" +msgstr "" + +#: 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/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:38 +#, python-format +msgid "Page %d of Posts" +msgstr "" + +#: judge/views/comment.py:27 +msgid "Messing around, are we?" +msgstr "" + +#: judge/views/comment.py:36 +msgid "You must solve at least one problem before you can vote." +msgstr "" + +#: judge/views/comment.py:63 +msgid "You already voted." +msgstr "" + +#: judge/views/comment.py:120 judge/views/organization.py:299 +msgid "Edited from site" +msgstr "" + +#: judge/views/comment.py:141 +msgid "Editing comment" +msgstr "" + +#: judge/views/contests.py:49 judge/views/contests.py:211 +#: judge/views/contests.py:214 judge/views/contests.py:385 +msgid "No such contest" +msgstr "" + +#: judge/views/contests.py:50 judge/views/contests.py:212 +#, python-format +msgid "Could not find a contest with the key \"%s\"." +msgstr "" + +#: judge/views/contests.py:75 +msgid "Contests" +msgstr "" + +#: judge/views/contests.py:215 +msgid "Could not find such contest." +msgstr "" + +#: judge/views/contests.py:218 +#, python-format +msgid "Access to contest \"%s\" denied" +msgstr "" + +#: judge/views/contests.py:242 +msgid "Clone Contest" +msgstr "" + +#: judge/views/contests.py:305 +msgid "Contest not ongoing" +msgstr "" + +#: judge/views/contests.py:306 +#, python-format +msgid "\"%s\" is not currently ongoing." +msgstr "" + +#: judge/views/contests.py:310 +msgid "Already in contest" +msgstr "" + +#: judge/views/contests.py:311 +#, python-format +msgid "You are already in a contest: \"%s\"." +msgstr "" + +#: judge/views/contests.py:314 +msgid "Banned from joining" +msgstr "" + +#: judge/views/contests.py:315 +msgid "You have been declared persona non grata for this contest. You are permanently barred from joining this contest." +msgstr "" + +#: judge/views/contests.py:375 +#, python-format +msgid "Enter access code for \"%s\"" +msgstr "" + +#: judge/views/contests.py:386 +#, python-format +msgid "You are not in contest \"%s\"." +msgstr "" + +#: judge/views/contests.py:405 +msgid "ContestCalendar requires integer year and month" +msgstr "" + +#: judge/views/contests.py:445 +#, python-format +msgid "Contests in %(month)s" +msgstr "" + +#: judge/views/contests.py:445 +msgid "F Y" +msgstr "" + +#: judge/views/contests.py:531 +msgid "???" +msgstr "" + +#: judge/views/contests.py:594 +#, python-format +msgid "%s Rankings" +msgstr "" + +#: judge/views/contests.py:610 +#, python-format +msgid "Your participation in %s" +msgstr "" + +#: judge/views/contests.py:611 +#, python-format +msgid "%s's participation in %s" +msgstr "" + +#: judge/views/contests.py:615 +msgid "Live" +msgstr "" + +#: judge/views/contests.py:627 templates/contest/contest-tabs.html:13 +msgid "Participation" +msgstr "" + +#: judge/views/contests.py:654 +#, python-format +msgid "%s MOSS Results" +msgstr "" + +#: judge/views/contests.py:681 +#, python-format +msgid "Running MOSS for %s..." +msgstr "" + +#: judge/views/contests.py:704 +#, python-format +msgid "Contest tag: %s" +msgstr "" + +#: judge/views/error.py:14 +msgid "404 error" +msgstr "" + +#: judge/views/error.py:15 +#, python-format +msgid "Could not find page \"%s\"" +msgstr "" + +#: judge/views/error.py:22 +#, python-format +msgid "no permission for %s" +msgstr "" + +#: 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 +msgid "Runtimes" +msgstr "" + +#: judge/views/organization.py:44 judge/views/organization.py:47 +msgid "No such organization" +msgstr "" + +#: judge/views/organization.py:45 +#, python-format +msgid "Could not find an organization with the key \"%s\"." +msgstr "" + +#: judge/views/organization.py:48 +msgid "Could not find such organization." +msgstr "" + +#: judge/views/organization.py:72 judge/views/register.py:34 +#: templates/organization/list.html:15 templates/user/user-list-tabs.html:5 +msgid "Organizations" +msgstr "" + +#: judge/views/organization.py:93 +#, python-format +msgid "%s Members" +msgstr "" + +#: judge/views/organization.py:118 judge/views/organization.py:121 +#: judge/views/organization.py:126 +msgid "Joining organization" +msgstr "" + +#: judge/views/organization.py:118 +msgid "You are already in the organization." +msgstr "" + +#: judge/views/organization.py:121 +msgid "This organization is not open." +msgstr "" + +#: judge/views/organization.py:138 +msgid "Leaving organization" +msgstr "" + +#: judge/views/organization.py:138 +#, python-format +msgid "You are not in \"%s\"." +msgstr "" + +#: judge/views/organization.py:162 +#, python-format +msgid "Request to join %s" +msgstr "" + +#: judge/views/organization.py:180 +msgid "Join request detail" +msgstr "" + +#: judge/views/organization.py:209 +#, python-format +msgid "Managing join requests for %s" +msgstr "" + +#: judge/views/organization.py:240 +#, python-format +msgid "Your organization can only receive %d more members. You cannot approve %d users." +msgstr "" + +#: judge/views/organization.py:252 +#, python-format +msgid "Approved %d user." +msgid_plural "Approved %d users." +msgstr[0] "" +msgstr[1] "" + +#: judge/views/organization.py:253 +#, python-format +msgid "Rejected %d user." +msgid_plural "Rejected %d users." +msgstr[0] "" +msgstr[1] "" + +#: judge/views/organization.py:283 +#, python-format +msgid "Editing %s" +msgstr "" + +#: judge/views/organization.py:307 judge/views/organization.py:315 +msgid "Can't edit organization" +msgstr "" + +#: judge/views/organization.py:308 +msgid "You are not allowed to edit this organization." +msgstr "" + +#: judge/views/organization.py:316 +msgid "You are not allowed to kick people from this organization." +msgstr "" + +#: judge/views/organization.py:321 judge/views/organization.py:325 +msgid "Can't kick user" +msgstr "" + +#: judge/views/organization.py:322 +msgid "The user you are trying to kick does not exist!" +msgstr "" + +#: judge/views/organization.py:326 +#, python-format +msgid "The user you are trying to kick is not in organization: %s." +msgstr "" + +#: judge/views/problem.py:68 +msgid "No such problem" +msgstr "" + +#: judge/views/problem.py:69 +#, python-format +msgid "Could not find a problem with the code \"%s\"." +msgstr "" + +#: judge/views/problem.py:111 +#, python-brace-format +msgid "Editorial for {0}" +msgstr "" + +#: judge/views/problem.py:114 +#, python-brace-format +msgid "Editorial for {0}" +msgstr "" + +#: judge/views/problem.py:285 templates/contest/contest.html:79 +#: templates/user/user-tabs.html:5 templates/user/users-table.html:23 +msgid "Problems" +msgstr "" + +#: judge/views/problem.py:546 +msgid "Banned from submitting" +msgstr "" + +#: judge/views/problem.py:547 +msgid "You have been declared persona non grata for this problem. You are permanently barred from submitting this problem." +msgstr "" + +#: judge/views/problem.py:560 +msgid "Too many submissions" +msgstr "" + +#: judge/views/problem.py:561 +msgid "You have exceeded the submission limit for this problem." +msgstr "" + +#: judge/views/problem.py:627 judge/views/problem.py:630 +#, python-format +msgid "Submit to %(problem)s" +msgstr "" + +#: judge/views/problem.py:646 +msgid "Clone Problem" +msgstr "" + +#: judge/views/problem_data.py:37 +msgid "Checker arguments must be a JSON object" +msgstr "" + +#: judge/views/problem_data.py:39 +msgid "Checker arguments is invalid JSON" +msgstr "" + +#: judge/views/problem_data.py:46 +msgid "Your zip file is invalid!" +msgstr "" + +#: judge/views/problem_data.py:104 +#, python-brace-format +msgid "Comparing submissions for {0}" +msgstr "" + +#: judge/views/problem_data.py:107 +#, python-brace-format +msgid "Comparing submissions for {0}" +msgstr "" + +#: judge/views/problem_data.py:142 +#, python-brace-format +msgid "Editing data for {0}" +msgstr "" + +#: judge/views/problem_data.py:145 +#, python-format +msgid "Editing data for %s" +msgstr "" + +#: judge/views/problem_data.py:237 judge/views/problem_data.py:238 +#, python-format +msgid "Generated init.yml for %s" +msgstr "" + +#: 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:58 +#, python-format +msgid "Best solutions for %s" +msgstr "" + +#: judge/views/ranked_submission.py:61 +#, python-brace-format +msgid "Best solutions for {0}" +msgstr "" + +#: judge/views/ranked_submission.py:71 +#, python-format +msgid "Best solutions for %(problem)s in %(contest)s" +msgstr "" + +#: judge/views/ranked_submission.py:74 +#, python-format +msgid "Best solutions for problem %(number)s in %(contest)s" +msgstr "" + +#: judge/views/ranked_submission.py:80 +#, python-brace-format +msgid "Best solutions for {0} in {2}" +msgstr "" + +#: judge/views/ranked_submission.py:83 +#, python-brace-format +msgid "Best solutions for problem {0} in {1}" +msgstr "" + +#: judge/views/register.py:27 +msgid "A username must contain letters, numbers, or underscores" +msgstr "" + +#: judge/views/register.py:31 templates/user/edit-profile.html:103 +msgid "Preferred language" +msgstr "" + +#: judge/views/register.py:38 +msgid "Subscribe to newsletter?" +msgstr "" + +#: judge/views/register.py:45 +#, python-format +msgid "The email address \"%s\" is already taken. Only one registration is allowed per address." +msgstr "" + +#: judge/views/register.py:51 +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 +msgid "Registration" +msgstr "" + +#: judge/views/register.py:106 +msgid "Authentication failure" +msgstr "" + +#: judge/views/stats.py:105 +msgid "Language statistics" +msgstr "" + +#: judge/views/status.py:24 templates/submission/list.html:319 +msgid "Status" +msgstr "" + +#: judge/views/status.py:108 +msgid "Version matrix" +msgstr "" + +#: judge/views/submission.py:59 judge/views/submission.py:66 +#, python-format +msgid "Submission of %(problem)s by %(user)s" +msgstr "" + +#: judge/views/submission.py:161 judge/views/submission.py:162 +#: templates/problem/problem.html:127 +msgid "All submissions" +msgstr "" + +#: judge/views/submission.py:303 +msgid "All my submissions" +msgstr "" + +#: judge/views/submission.py:304 +#, python-format +msgid "All submissions by %s" +msgstr "" + +#: judge/views/submission.py:335 +#, python-format +msgid "All submissions for %s" +msgstr "" + +#: judge/views/submission.py:354 +msgid "Must pass a problem" +msgstr "" + +#: judge/views/submission.py:397 +#, python-format +msgid "My submissions for %(problem)s" +msgstr "" + +#: judge/views/submission.py:398 +#, python-format +msgid "%(user)s's submissions for %(problem)s" +msgstr "" + +#: judge/views/submission.py:495 +msgid "Must pass a contest" +msgstr "" + +#: judge/views/submission.py:514 +#, python-brace-format +msgid "{0}'s submissions for {2} in {4}" +msgstr "" + +#: judge/views/submission.py:519 +#, 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 "" + +#: judge/views/ticket.py:40 +msgid "Issue description" +msgstr "" + +#: judge/views/ticket.py:85 judge/views/ticket.py:88 +#, python-format +msgid "New ticket for %s" +msgstr "" + +#: judge/views/ticket.py:139 +#, python-format +msgid "%(title)s - Ticket %(id)d" +msgstr "" + +#: judge/views/ticket.py:248 +#, python-format +msgid "Tickets - Page %(number)d of %(total)d" +msgstr "" + +#: judge/views/ticket.py:297 +#, python-format +msgid "New Ticket: %s" +msgstr "" + +#: judge/views/ticket.py:298 +#, python-format +msgid "#%(id)d, assigned to: %(users)s" +msgstr "" + +#: judge/views/ticket.py:300 +msgid ", " +msgstr "" + +#: judge/views/ticket.py:300 +msgid "no one" +msgstr "" + +#: judge/views/totp.py:42 templates/registration/totp_enable.html:86 +msgid "Enable Two Factor Authentication" +msgstr "" + +#: judge/views/totp.py:89 templates/registration/totp_disable.html:48 +msgid "Disable Two Factor Authentication" +msgstr "" + +#: judge/views/totp.py:103 +msgid "Perform Two Factor Authentication" +msgstr "" + +#: judge/views/user.py:68 +msgid "No such user" +msgstr "" + +#: judge/views/user.py:68 +#, python-format +msgid "No user handle \"%s\"." +msgstr "" + +#: judge/views/user.py:72 +msgid "My account" +msgstr "" + +#: judge/views/user.py:73 +#, python-format +msgid "User %s" +msgstr "" + +#: judge/views/user.py:136 +msgid "M j, Y, G:i" +msgstr "" + +#: judge/views/user.py:221 +msgid "Updated on site" +msgstr "" + +#: judge/views/user.py:253 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:10 +msgid "Edit profile" +msgstr "" + +#: judge/views/user.py:262 templates/user/user-list-tabs.html:4 +msgid "Leaderboard" +msgstr "" + +#: judge/views/widgets.py:48 judge/views/widgets.py:58 +#, python-format +msgid "Invalid upstream data: %s" +msgstr "" + +#: judge/views/widgets.py:68 +msgid "Bad latitude or longitude" +msgstr "" + +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:13 +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:27 +msgid "Photo" +msgstr "" + +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:14 +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:28 +msgid "Photos" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:9 +msgid "first name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:10 +msgid "last name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:11 +msgid "biography" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/admin.py:24 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:30 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:30 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:30 +msgid "owner" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:12 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:12 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:12 +msgid "name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:19 +msgid "Category of Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:20 +msgid "Categories of Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:26 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:26 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:26 +msgid "title" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:28 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:28 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:28 +msgid "category" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:29 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:29 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:29 +msgid "author" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:31 +msgid "publication date" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:37 +msgid "Book" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:38 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:136 +msgid "Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:19 +msgid "Category of CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:20 +msgid "Categories of CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:36 +msgid "CD" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:37 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:141 +msgid "CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:19 +msgid "Category of DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:20 +msgid "Categories of DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:36 +msgid "DVD" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:37 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:146 +msgid "DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/templates/admin/base_site.html:7 +msgid "Django administration" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/forms.py:12 +#, python-format +msgid "Please enter the correct %(username)s and password for an admin account. Note that both fields may be case-sensitive." +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/forms.py:32 +#, python-format +msgid "Please enter the correct %(username)s and password for an user account. Note that both fields may be case-sensitive." +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:27 +msgid "Site" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:38 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:41 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:130 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:133 +msgid "Dashboard" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:48 +msgid "Applications" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:53 +msgid "Administration" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:64 +msgid "Color theme" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:66 +msgid "Change color theme" +msgstr "" + +#: 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 +msgid "Rate all ratable contests" +msgstr "" + +#: 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 +msgid "Rejudge" +msgstr "" + +#: templates/base.html:214 +#, python-format +msgid "Hello, %(username)s." +msgstr "" + +#: templates/base.html:220 templates/comments/list.html:89 +#: templates/contest/contest-list-tabs.html:24 +#: templates/problem/problem-list-tabs.html:6 +#: templates/submission/info-base.html:12 +#: templates/submission/submission-list-tabs.html:15 +msgid "Admin" +msgstr "" + +#: templates/base.html:229 +msgid "Log out" +msgstr "" + +#: templates/base.html:238 +#: templates/registration/password_reset_complete.html:4 +msgid "Log in" +msgstr "" + +#: templates/base.html:239 templates/registration/registration_form.html:177 +msgid "or" +msgstr "" + +#: templates/base.html:240 +msgid "Sign up" +msgstr "" + +#: templates/base.html:252 +msgid "spectating" +msgstr "" + +#: 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:20 +#: 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 +msgid "Edit" +msgstr "" + +#: templates/blog/content.html:27 +#, python-format +msgid "\n" +" posted on %(time)s\n" +" " +msgstr "" + +#: templates/blog/dashboard.html:21 +#, python-format +msgid "\n" +" on %(time)s\n" +" " +msgstr "" + +#: templates/blog/list.html:85 +msgid "Blog" +msgstr "" + +#: templates/blog/list.html:87 +msgid "Events" +msgstr "" + +#: templates/blog/list.html:92 +msgid "News" +msgstr "" + +#: templates/blog/list.html:106 +#, python-brace-format +msgid "posted on {time}" +msgstr "" + +#: templates/blog/list.html:130 templates/problem/problem.html:310 +msgid "Clarifications" +msgstr "" + +#: templates/blog/list.html:146 templates/problem/problem.html:321 +msgid "No clarifications have been made at this time." +msgstr "" + +#: templates/blog/list.html:154 +msgid "Ongoing contests" +msgstr "" + +#: templates/blog/list.html:172 +msgid "Upcoming contests" +msgstr "" + +#: templates/blog/list.html:189 +msgid "Comment stream" +msgstr "" + +#: templates/blog/list.html:208 +msgid "New problems" +msgstr "" + +#: templates/blog/list.html:225 +msgid "My open tickets" +msgstr "" + +#: templates/blog/list.html:246 +msgid "New tickets" +msgstr "" + +#: templates/comments/list.html:2 +msgid "Comments" +msgstr "" + +#: templates/comments/list.html:18 templates/comments/list.html:27 +msgid "Please login to vote" +msgstr "" + +#: templates/comments/list.html:40 +#, python-brace-format +msgid "commented on {time}" +msgstr "" + +#: templates/comments/list.html:49 +#, python-format +msgid "edit %(edits)s" +msgstr "" + +#: templates/comments/list.html:51 templates/comments/media-js.html:77 +msgid "edited" +msgstr "" + +#: templates/comments/list.html:60 +msgid "Link" +msgstr "" + +#: templates/comments/list.html:73 templates/comments/list.html:80 +msgid "Reply" +msgstr "" + +#: templates/comments/list.html:86 +msgid "Hide" +msgstr "" + +#: templates/comments/list.html:101 +#, 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:120 +msgid "There are no comments at the moment." +msgstr "" + +#: templates/comments/list.html:126 +msgid "New comment" +msgstr "" + +#: templates/comments/list.html:140 +msgid "Invalid comment body." +msgstr "" + +#: templates/comments/list.html:148 +msgid "Post!" +msgstr "" + +#: templates/comments/list.html:156 +msgid "Comments are disabled on this page." +msgstr "" + +#: templates/comments/media-js.html:72 +#, python-brace-format +msgid "edit {edits}" +msgstr "" + +#: templates/comments/media-js.html:75 +msgid "original" +msgstr "" + +#: templates/contest/access_code.html:26 +msgid "Invalid access code." +msgstr "" + +#: templates/contest/access_code.html:29 +msgid "Please enter your access code:" +msgstr "" + +#: templates/contest/access_code.html:32 +msgid "Join Contest" +msgstr "" + +#: templates/contest/calendar.html:12 +msgid "Sunday" +msgstr "" + +#: templates/contest/calendar.html:13 +msgid "Monday" +msgstr "" + +#: templates/contest/calendar.html:14 +msgid "Tuesday" +msgstr "" + +#: templates/contest/calendar.html:15 +msgid "Wednesday" +msgstr "" + +#: templates/contest/calendar.html:16 +msgid "Thursday" +msgstr "" + +#: templates/contest/calendar.html:17 +msgid "Friday" +msgstr "" + +#: templates/contest/calendar.html:18 +msgid "Saturday" +msgstr "" + +#: 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 +msgid "Today" +msgstr "" + +#: templates/contest/contest-list-tabs.html:13 +msgid "Next" +msgstr "" + +#: templates/contest/contest-list-tabs.html:21 +#: templates/problem/problem-list-tabs.html:5 +msgid "List" +msgstr "" + +#: templates/contest/contest-list-tabs.html:22 +msgid "Calendar" +msgstr "" + +#: templates/contest/contest-tabs.html:4 +msgid "Info" +msgstr "" + +#: templates/contest/contest-tabs.html:8 +msgid "Rankings" +msgstr "" + +#: templates/contest/contest-tabs.html:10 +msgid "Hidden Rankings" +msgstr "" + +#: templates/contest/contest-tabs.html:18 +msgid "MOSS" +msgstr "" + +#: templates/contest/contest-tabs.html:23 +msgid "Clone" +msgstr "" + +#: templates/contest/contest-tabs.html:34 +#: templates/contest/contest-tabs.html:54 +msgid "Leave contest" +msgstr "" + +#: templates/contest/contest-tabs.html:41 templates/contest/list.html:293 +msgid "Virtual join" +msgstr "" + +#: templates/contest/contest-tabs.html:52 +msgid "Stop spectating" +msgstr "" + +#: templates/contest/contest-tabs.html:61 +msgid "Spectate contest" +msgstr "" + +#: templates/contest/contest-tabs.html:67 +#: templates/contest/contest-tabs.html:73 +msgid "Join contest" +msgstr "" + +#: templates/contest/contest-tabs.html:82 +msgid "Login to participate" +msgstr "" + +#: templates/contest/contest.html:37 +msgid "Participating virtually." +msgstr "" + +#: templates/contest/contest.html:43 +msgid "Contest is over." +msgstr "" + +#: templates/contest/contest.html:59 templates/contest/contest.html:63 +msgid "F j, Y, G:i T" +msgstr "" + +#: 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 +#, python-format +msgid "%(length)s long starting on %(start_time)s" +msgstr "" + +#: templates/contest/contest.html:85 +msgid "AC Rate" +msgstr "" + +#: templates/contest/contest.html:86 templates/contest/list.html:153 +#: templates/contest/list.html:195 templates/contest/list.html:271 +#: templates/problem/list.html:212 templates/problem/list.html:238 +msgid "Users" +msgstr "" + +#: templates/contest/contest.html:111 +msgid "Editorial" +msgstr "" + +#: templates/contest/list.html:31 templates/contest/media-js.html:9 +msgid "Are you sure you want to join?" +msgstr "" + +#: 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:65 +msgid "hidden" +msgstr "" + +#: templates/contest/list.html:70 +msgid "private" +msgstr "" + +#: templates/contest/list.html:84 +msgid "rated" +msgstr "" + +#: templates/contest/list.html:132 +msgid "Spectate" +msgstr "" + +#: templates/contest/list.html:138 +msgid "Join" +msgstr "" + +#: templates/contest/list.html:148 +msgid "Active Contests" +msgstr "" + +#: templates/contest/list.html:152 templates/contest/list.html:194 +#: templates/contest/list.html:232 templates/contest/list.html:270 +msgid "Contest" +msgstr "" + +#: templates/contest/list.html:190 +msgid "Ongoing Contests" +msgstr "" + +#: templates/contest/list.html:227 +msgid "Upcoming Contests" +msgstr "" + +#: templates/contest/list.html:255 +msgid "There are no scheduled contests at this time." +msgstr "" + +#: templates/contest/list.html:261 +msgid "Past Contests" +msgstr "" + +#: templates/contest/media-js.html:4 +msgid "Are you sure you want to leave?" +msgstr "" + +#: 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 +msgid "Joining a contest starts your timer, after which it becomes unstoppable." +msgstr "" + +#: 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:7 +msgid "Organization" +msgstr "" + +#: templates/contest/ranking-table.html:27 +#, python-brace-format +msgid "Started on {time}" +msgstr "" + +#: templates/contest/ranking-table.html:30 +msgid "Participation ended." +msgstr "" + +#: templates/contest/ranking.html:232 +msgid "View user participation" +msgstr "" + +#: templates/contest/ranking.html:236 +msgid "Show organizations" +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 +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 +msgid "activate" +msgstr "" + +#: 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 +msgid "Newsletter unsubscribe" +msgstr "" + +#: 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 +msgid "Do you want to unsubscribe from this newsletter?" +msgstr "" + +#: 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 +msgid "Newsletter update" +msgstr "" + +#: 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 +msgid "Update subscription" +msgstr "" + +#: templates/newsletter/subscription_update_activated.html:8 +msgid "Your subscription has successfully been updated." +msgstr "" + +#: 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:34 +#: templates/ticket/edit-notes.html:4 +msgid "Update" +msgstr "" + +#: 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:29 +msgid "Join organization" +msgstr "" + +#: templates/organization/home.html:33 +msgid "Request membership" +msgstr "" + +#: templates/organization/home.html:39 +msgid "Edit organization" +msgstr "" + +#: templates/organization/home.html:43 +msgid "View requests" +msgstr "" + +#: templates/organization/home.html:50 +msgid "Admin organization" +msgstr "" + +#: templates/organization/home.html:55 +msgid "View members" +msgstr "" + +#: templates/organization/list.html:23 templates/status/language-list.html:34 +msgid "Name" +msgstr "" + +#: templates/organization/list.html:24 +msgid "Members" +msgstr "" + +#: templates/organization/new.html:10 templates/ticket/new.html:38 +msgid "Create" +msgstr "" + +#: templates/organization/requests/detail.html:13 +msgid "User:" +msgstr "" + +#: templates/organization/requests/detail.html:17 +msgid "Organization:" +msgstr "" + +#: templates/organization/requests/detail.html:25 +msgid "Time:" +msgstr "" + +#: templates/organization/requests/detail.html:29 +msgid "Reason:" +msgstr "" + +#: 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:15 +msgid "Reason" +msgstr "" + +#: 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:17 +#: templates/problem/data.html:401 +msgid "Delete?" +msgstr "" + +#: templates/organization/requests/request.html:18 +msgid "Your reason for joining:" +msgstr "" + +#: templates/organization/requests/request.html:20 +msgid "Request" +msgstr "" + +#: templates/organization/requests/tabs.html:4 +msgid "Pending" +msgstr "" + +#: templates/organization/requests/tabs.html:7 +msgid "Log" +msgstr "" + +#: templates/organization/requests/tabs.html:10 +msgid "Approved" +msgstr "" + +#: templates/organization/requests/tabs.html:13 +msgid "Rejected" +msgstr "" + +#: templates/organization/users-table.html:15 +msgid "Kick" +msgstr "" + +#: templates/problem/clone.html:37 +msgid "Enter a new code for the cloned problem:" +msgstr "" + +#: templates/problem/data.html:353 +msgid "View YAML" +msgstr "" + +#: templates/problem/data.html:369 +msgid "Show columns:" +msgstr "" + +#: templates/problem/data.html:372 templates/problem/data.html:396 +msgid "Output prefix" +msgstr "" + +#: templates/problem/data.html:376 templates/problem/data.html:397 +msgid "Output limit" +msgstr "" + +#: templates/problem/data.html:380 templates/problem/data.html:398 +msgid "Checker" +msgstr "" + +#: templates/problem/data.html:384 templates/problem/data.html:399 +msgid "Generator args" +msgstr "" + +#: templates/problem/data.html:391 +msgid "Type" +msgstr "" + +#: templates/problem/data.html:392 +msgid "Input file" +msgstr "" + +#: templates/problem/data.html:393 +msgid "Output file" +msgstr "" + +#: templates/problem/data.html:395 +msgid "Pretest?" +msgstr "" + +#: templates/problem/data.html:447 templates/problem/submit.html:252 +msgid "Submit!" +msgstr "" + +#: templates/problem/data.html:448 +msgid "Add new case" +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 editorialist.

Submitting an official solution before solving the problem yourself is a bannable offence." +msgstr "" + +#: templates/problem/list.html:62 +msgid "Filter by type..." +msgstr "" + +#: templates/problem/list.html:185 +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:57 +msgid "Category" +msgstr "" + +#: templates/problem/list.html:209 templates/problem/list.html:228 +msgid "Types" +msgstr "" + +#: templates/problem/list.html:235 +#, python-format +msgid "AC %%" +msgstr "" + +#: 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:142 +msgid "Filter by result:" +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:101 templates/problem/problem.html:111 +#: templates/problem/problem.html:116 +msgid "Submit solution" +msgstr "" + +#: 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:112 +msgid "0 submissions left" +msgstr "" + +#: templates/problem/problem.html:124 +msgid "My submissions" +msgstr "" + +#: templates/problem/problem.html:128 +msgid "Best submissions" +msgstr "" + +#: templates/problem/problem.html:132 +msgid "Read editorial" +msgstr "" + +#: templates/problem/problem.html:137 +msgid "Manage tickets" +msgstr "" + +#: templates/problem/problem.html:141 +msgid "Edit problem" +msgstr "" + +#: templates/problem/problem.html:143 +msgid "Edit test data" +msgstr "" + +#: templates/problem/problem.html:148 +msgid "My tickets" +msgstr "" + +#: templates/problem/problem.html:156 +msgid "Manage submissions" +msgstr "" + +#: templates/problem/problem.html:162 +msgid "Clone problem" +msgstr "" + +#: templates/problem/problem.html:169 +msgid "Points:" +msgstr "" + +#: templates/problem/problem.html:172 templates/problem/problem.html:174 +msgid "(partial)" +msgstr "" + +#: templates/problem/problem.html:179 +msgid "Time limit:" +msgstr "" + +#: templates/problem/problem.html:191 +msgid "Memory limit:" +msgstr "" + +#: templates/problem/problem.html:210 +msgid "Author:" +msgid_plural "Authors:" +msgstr[0] "" +msgstr[1] "" + +#: templates/problem/problem.html:225 +msgid "Problem type" +msgid_plural "Problem types" +msgstr[0] "" +msgstr[1] "" + +#: templates/problem/problem.html:238 +msgid "Allowed languages" +msgstr "" + +#: templates/problem/problem.html:246 +#, python-format +msgid "No %(lang)s judge online" +msgstr "" + +#: templates/problem/problem.html:257 +msgid "Judge:" +msgid_plural "Judges:" +msgstr[0] "" +msgstr[1] "" + +#: templates/problem/problem.html:274 +msgid "none available" +msgstr "" + +#: templates/problem/problem.html:299 +msgid "Request clarification" +msgstr "" + +#: templates/problem/problem.html:301 +msgid "Report an issue" +msgstr "" + +#: 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 +msgid "Search problems..." +msgstr "" + +#: templates/problem/search-form.html:14 +msgid "Full text search" +msgstr "" + +#: templates/problem/search-form.html:21 +msgid "Hide solved problems" +msgstr "" + +#: 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 +msgid "All" +msgstr "" + +#: templates/problem/search-form.html:46 +msgid "Problem types" +msgstr "" + +#: templates/problem/search-form.html:57 +msgid "Point range" +msgstr "" + +#: templates/problem/search-form.html:63 templates/submission/list.html:337 +#: templates/ticket/list.html:248 +msgid "Go" +msgstr "" + +#: templates/problem/search-form.html:64 +msgid "Random" +msgstr "" + +#: templates/problem/submit.html:192 +#, python-format +msgid "Warning! Your default language, %(default_language)s, is unavailable for this problem and has been deselected." +msgstr "" + +#: templates/problem/submit.html:203 +#, python-format +msgid "\n" +" You have %(left)s submission left\n" +" " +msgid_plural "\n" +" You have %(left)s submissions left\n" +" " +msgstr[0] "" +msgstr[1] "" + +#: templates/problem/submit.html:212 +msgid "You have 0 submissions left" +msgstr "" + +#: templates/problem/submit.html:250 +msgid "No judge is available for this problem." +msgstr "" + +#: templates/registration/activate.html:3 +#, python-format +msgid "%(key)s is an invalid activation key." +msgstr "" + +#: templates/registration/activation_complete.html:3 +msgid "Your account has been successfully activated." +msgstr "" + +#: templates/registration/login.html:43 +msgid "Invalid username or password." +msgstr "" + +#: templates/registration/login.html:61 +#: templates/registration/totp_auth.html:39 +msgid "Login!" +msgstr "" + +#: templates/registration/login.html:64 +msgid "Forgot your password?" +msgstr "" + +#: templates/registration/login.html:67 +msgid "Or log in with..." +msgstr "" + +#: templates/registration/logout.html:3 +msgid "See you later!" +msgstr "" + +#: templates/registration/password_change_done.html:3 +msgid "Your password was sucessfully changed." +msgstr "" + +#: templates/registration/password_change_form.html:8 +msgid "Change Password" +msgstr "" + +#: templates/registration/password_reset.html:7 +msgid "Send Reset Email" +msgstr "" + +#: 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_confirm.html:9 +msgid "Reset Password" +msgstr "" + +#: 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 +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 +#, 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 +msgid "Please go to the following page and choose a new password:" +msgstr "" + +#: templates/registration/password_reset_email.txt:7 +msgid "Your username, in case you've forgotten:" +msgstr "" + +#: templates/registration/password_reset_email.txt:9 +msgid "Thanks for using our site!" +msgstr "" + +#: templates/registration/password_reset_email.txt:11 +#, python-format +msgid "The %(site_name)s team" +msgstr "" + +#: 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 +msgid "Continue >" +msgstr "" + +#: 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:166 +msgid "(again, for confirmation)" +msgstr "" + +#: templates/registration/registration_form.html:173 +msgid "(select your closest major city)" +msgstr "" + +#: templates/registration/registration_form.html:178 +msgid "pick from map" +msgstr "" + +#: templates/registration/registration_form.html:183 +msgid "Default language" +msgstr "" + +#: templates/registration/registration_form.html:186 +#: templates/user/edit-profile.html:162 +msgid "Affiliated organizations" +msgstr "" + +#: templates/registration/registration_form.html:192 +#: templates/user/edit-profile.html:121 +msgid "Notify me about upcoming contests" +msgstr "" + +#: templates/registration/registration_form.html:206 +msgid "By registering, you agree to our" +msgstr "" + +#: templates/registration/registration_form.html:207 +msgid "Terms & Conditions" +msgstr "" + +#: templates/registration/registration_form.html:210 +msgid "Register!" +msgstr "" + +#: templates/registration/totp_auth.html:36 +#: templates/registration/totp_disable.html:45 +#: templates/registration/totp_enable.html:83 +msgid "Enter the 6-digit code generated by your app:" +msgstr "" + +#: templates/registration/totp_auth.html:41 +#, python-format +msgid "If you lost your authentication device, please contact us at %(email)s." +msgstr "" + +#: templates/registration/totp_disable.html:38 +msgid "To protect your account, you must first authenticate before you can disable Two Factor Authentication." +msgstr "" + +#: templates/registration/totp_enable.html:71 +msgid "Scan this code with your authenticator app:" +msgstr "" + +#: templates/registration/totp_enable.html:72 +msgid "QR code" +msgstr "" + +#: templates/registration/totp_enable.html:73 +msgid "Or enter this code manually:" +msgstr "" + +#: templates/stats/base.html:9 templates/submission/list.html:345 +msgid "Statistics" +msgstr "" + +#: templates/stats/language.html:11 +msgid "Submission Statistics" +msgstr "" + +#: templates/stats/language.html:16 +msgid "Submissions by Language" +msgstr "" + +#: templates/stats/language.html:21 +msgid "AC Submissions by Language" +msgstr "" + +#: templates/stats/language.html:26 +msgid "Language AC Rate" +msgstr "" + +#: templates/status/judge-status-table.html:2 +msgid "Judge" +msgstr "" + +#: templates/status/judge-status-table.html:4 +msgid "Online" +msgstr "" + +#: templates/status/judge-status-table.html:6 +msgid "Uptime" +msgstr "" + +#: templates/status/judge-status-table.html:7 +msgid "Ping" +msgstr "" + +#: 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 +msgid "N/A" +msgstr "" + +#: templates/status/judge-status-table.html:64 +msgid "There are no judges available at this time." +msgstr "" + +#: templates/status/language-list.html:33 templates/ticket/list.html:261 +msgid "ID" +msgstr "" + +#: templates/status/language-list.html:35 +msgid "Runtime Info" +msgstr "" + +#: templates/status/status-tabs.html:4 +msgid "Judges" +msgstr "" + +#: templates/status/status-tabs.html:6 +msgid "Version Matrix" +msgstr "" + +#: templates/submission/internal-error-message.html:8 +msgid "An internal error occurred while grading." +msgstr "" + +#: templates/submission/internal-error-message.html:15 +msgid "Error information" +msgstr "" + +#: templates/submission/list.html:76 +msgid "Filter by status..." +msgstr "" + +#: templates/submission/list.html:82 +msgid "Filter by language..." +msgstr "" + +#: templates/submission/list.html:315 +msgid "Filter submissions" +msgstr "" + +#: templates/submission/list.html:351 +msgid "Total:" +msgstr "" + +#: templates/submission/list.html:361 +msgid "You were disconnected. Refresh to show latest updates." +msgstr "" + +#: templates/submission/row.html:39 +#, python-format +msgid "Case #%(case)s" +msgstr "" + +#: templates/submission/row.html:49 +msgid "view" +msgstr "" + +#: templates/submission/row.html:53 +msgid "rejudge" +msgstr "" + +#: templates/submission/row.html:58 +msgid "admin" +msgstr "" + +#: templates/submission/source.html:25 +msgid "View status" +msgstr "" + +#: templates/submission/source.html:26 +msgid "View raw source" +msgstr "" + +#: templates/submission/source.html:28 templates/submission/status.html:61 +msgid "Resubmit" +msgstr "" + +#: 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 +msgid "Your submission is being processed..." +msgstr "" + +#: templates/submission/status-testcases.html:14 +msgid "Compilation Error" +msgstr "" + +#: templates/submission/status-testcases.html:18 +msgid "Compilation Warnings" +msgstr "" + +#: templates/submission/status-testcases.html:23 +msgid "Pretest Execution Results" +msgstr "" + +#: templates/submission/status-testcases.html:25 +msgid "Execution Results" +msgstr "" + +#: templates/submission/status-testcases.html:31 +msgid "Batch " +msgstr "" + +#: templates/submission/status-testcases.html:43 +msgid "Case" +msgstr "" + +#: templates/submission/status-testcases.html:45 +msgid "Pretest" +msgstr "" + +#: templates/submission/status-testcases.html:47 +msgid "Test case" +msgstr "" + +#: templates/submission/status-testcases.html:79 +msgid "Your output (clipped)" +msgstr "" + +#: templates/submission/status-testcases.html:90 +msgid "Judge feedback" +msgstr "" + +#: templates/submission/status-testcases.html:106 +msgid "Resources:" +msgstr "" + +#: templates/submission/status-testcases.html:115 +msgid "Final pretest score:" +msgstr "" + +#: templates/submission/status-testcases.html:117 +msgid "Final score:" +msgstr "" + +#: templates/submission/status-testcases.html:131 +msgid "Passing pretests does not guarantee a full score on system tests." +msgstr "" + +#: templates/submission/status-testcases.html:134 +msgid "Submission aborted!" +msgstr "" + +#: templates/submission/status.html:59 +msgid "View source" +msgstr "" + +#: templates/submission/status.html:88 +msgid "Abort" +msgstr "" + +#: templates/submission/submission-list-tabs.html:6 +msgid "Mine" +msgstr "" + +#: templates/submission/submission-list-tabs.html:9 +msgid "Best" +msgstr "" + +#: templates/submission/submission-list-tabs.html:12 +#, python-format +msgid "%(user)s's" +msgstr "" + +#: templates/ticket/list.html:135 templates/ticket/ticket.html:257 +msgid "Reopened: " +msgstr "" + +#: templates/ticket/list.html:138 templates/ticket/ticket.html:258 +msgid "Closed: " +msgstr "" + +#: templates/ticket/list.html:221 +msgid "Use desktop notification" +msgstr "" + +#: templates/ticket/list.html:227 +msgid "Show my tickets only" +msgstr "" + +#: templates/ticket/list.html:231 +msgid "Filing user" +msgstr "" + +#: templates/ticket/list.html:240 +msgid "Assignee" +msgstr "" + +#: templates/ticket/list.html:262 +msgid "Title" +msgstr "" + +#: templates/ticket/list.html:264 templates/ticket/ticket.html:304 +msgid "Assignees" +msgstr "" + +#: templates/ticket/new_problem.html:7 +msgid "Thanks for opening a ticket!" +msgstr "" + +#: 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 +msgid "Associated object" +msgstr "" + +#: templates/ticket/ticket.html:309 +msgid "No one is assigned." +msgstr "" + +#: templates/ticket/ticket.html:315 +msgid "Close ticket" +msgstr "" + +#: templates/ticket/ticket.html:317 +msgid "Reopen ticket" +msgstr "" + +#: templates/ticket/ticket.html:321 +msgid "Assignee notes" +msgstr "" + +#: templates/ticket/ticket.html:328 templates/widgets/select_all.html:4 +msgid "Nothing here." +msgstr "" + +#: templates/ticket/ticket.html:378 +msgid "Post" +msgstr "" + +#: templates/user/base-users-table.html:3 +msgid "Rank" +msgstr "" + +#: templates/user/base-users.html:14 templates/user/base-users.html:69 +msgid "Search by handle..." +msgstr "" + +#: templates/user/edit-profile.html:90 +msgid "Self-description" +msgstr "" + +#: templates/user/edit-profile.html:98 +msgid "Select your closest major city" +msgstr "" + +#: templates/user/edit-profile.html:107 +msgid "Editor theme" +msgstr "" + +#: templates/user/edit-profile.html:112 +msgid "Math engine" +msgstr "" + +#: templates/user/edit-profile.html:136 templates/user/edit-profile.html:137 +msgid "Change your avatar" +msgstr "" + +#: templates/user/edit-profile.html:143 +msgid "Change your password" +msgstr "" + +#: templates/user/edit-profile.html:150 +msgid "Two Factor Authentication is enabled." +msgstr "" + +#: templates/user/edit-profile.html:153 +msgid "Two Factor Authentication is disabled." +msgstr "" + +#: templates/user/edit-profile.html:170 +msgid "User-script" +msgstr "" + +#: templates/user/edit-profile.html:174 +msgid "Update profile" +msgstr "" + +#: templates/user/pp-row.html:22 +#, python-format +msgid "\n" +" weighted %(weight)s%%\n" +" " +msgstr "" + +#: templates/user/pp-row.html:27 +#, python-format +msgid "%(pp).1fpp" +msgstr "" + +#: templates/user/pp-row.html:29 +#, python-format +msgid "%(pp).0fpp" +msgstr "" + +#: templates/user/user-about.html:14 +msgid "From" +msgstr "" + +#: 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:40 +msgid "You have not shared any information." +msgstr "" + +#: templates/user/user-about.html:42 +msgid "This user has not shared any information." +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:53 +msgid "Total points:" +msgstr "" + +#: templates/user/user-base.html:68 +msgid "Rank by rating:" +msgstr "" + +#: templates/user/user-base.html:70 +msgid "Rating:" +msgstr "" + +#: templates/user/user-base.html:71 +msgid "Volatility:" +msgstr "" + +#: templates/user/user-base.html:72 +msgid "Min. rating:" +msgstr "" + +#: templates/user/user-base.html:73 +msgid "Max rating:" +msgstr "" + +#: templates/user/user-problems.html:35 +msgid "Points Breakdown" +msgstr "" + +#: templates/user/user-problems.html:41 +msgid "Load more..." +msgstr "" + +#: templates/user/user-problems.html:45 +msgid "This user has not yet solved any problems." +msgstr "" + +#: templates/user/user-problems.html:51 +msgid "Authored Problems" +msgstr "" + +#: templates/user/user-problems.html:83 +msgid "Hide problems I've solved" +msgstr "" + +#: templates/user/user-problems.html:93 +#, python-format +msgid "%(points).1f points" +msgstr "" + +#: templates/user/user-problems.html:99 +msgid "Score" +msgstr "" + +#: templates/user/user-problems.html:110 +#, python-format +msgid "%(points)s / %(total)s" +msgstr "" + +#: templates/user/user-tabs.html:7 +msgid "Impersonate" +msgstr "" + +#: templates/user/user-tabs.html:13 +msgid "Admin User" +msgstr "" + +#: templates/user/user-tabs.html:16 +msgid "Admin Profile" +msgstr "" + +#: templates/widgets/select_all.html:8 +msgid "Check all" +msgstr "" + diff --git a/locale/pt/LC_MESSAGES/djangojs.po b/locale/pt/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..0bcbd6f --- /dev/null +++ b/locale/pt/LC_MESSAGES/djangojs.po @@ -0,0 +1,30 @@ +msgid "" +msgstr "" +"Project-Id-Version: dmoj\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-10-01 23:12+0000\n" +"PO-Revision-Date: 2019-11-11 22:05\n" +"Last-Translator: Icyene\n" +"Language-Team: Portuguese, Brazilian\n" +"Language: pt_BR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: crowdin.com\n" +"X-Crowdin-Project: dmoj\n" +"X-Crowdin-Language: pt-BR\n" +"X-Crowdin-File: djangojs.po\n" + +#: 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:210 +msgctxt "time format without day" +msgid "%h:%m:%s" +msgstr "" + diff --git a/locale/ro/LC_MESSAGES/django.po b/locale/ro/LC_MESSAGES/django.po new file mode 100644 index 0000000..4ca4cd5 --- /dev/null +++ b/locale/ro/LC_MESSAGES/django.po @@ -0,0 +1,4553 @@ +msgid "" +msgstr "" +"Project-Id-Version: dmoj\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-11-11 21:54+0000\n" +"PO-Revision-Date: 2019-11-11 22:05\n" +"Last-Translator: Icyene\n" +"Language-Team: Romanian\n" +"Language: ro_RO\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100>0 && n%100<20)) ? 1 : 2);\n" +"X-Generator: crowdin.com\n" +"X-Crowdin-Project: dmoj\n" +"X-Crowdin-Language: ro\n" +"X-Crowdin-File: django.po\n" + +#: dmoj/settings.py:337 +msgid "German" +msgstr "Germană" + +#: dmoj/settings.py:338 +msgid "English" +msgstr "Engleză" + +#: dmoj/settings.py:339 +msgid "Spanish" +msgstr "" + +#: dmoj/settings.py:340 +msgid "French" +msgstr "Franceză" + +#: dmoj/settings.py:341 +msgid "Croatian" +msgstr "" + +#: dmoj/settings.py:342 +msgid "Hungarian" +msgstr "" + +#: dmoj/settings.py:343 +msgid "Japanese" +msgstr "" + +#: dmoj/settings.py:344 +msgid "Korean" +msgstr "" + +#: dmoj/settings.py:345 +msgid "Brazilian Portuguese" +msgstr "" + +#: dmoj/settings.py:346 +msgid "Romanian" +msgstr "Română" + +#: dmoj/settings.py:347 +msgid "Russian" +msgstr "Rusă" + +#: dmoj/settings.py:348 +msgid "Serbian (Latin)" +msgstr "" + +#: dmoj/settings.py:349 +msgid "Turkish" +msgstr "" + +#: dmoj/settings.py:350 +msgid "Vietnamese" +msgstr "" + +#: dmoj/settings.py:351 +msgid "Simplified Chinese" +msgstr "Chineză simplificată" + +#: dmoj/urls.py:54 +msgid "Login" +msgstr "Login" + +#: dmoj/urls.py:102 templates/base.html:190 +msgid "Home" +msgstr "Start" + +#: judge/admin/comments.py:40 +#, python-format +msgid "%d comment successfully hidden." +msgid_plural "%d comments successfully hidden." +msgstr[0] "%d comentarii ascunse cu succes." +msgstr[1] "%d comentarii ascunse cu succes." +msgstr[2] "%d comentarii ascunse cu succes." + +#: judge/admin/comments.py:43 +msgid "Hide comments" +msgstr "Ascunde comentarii" + +#: judge/admin/comments.py:47 +#, python-format +msgid "%d comment successfully unhidden." +msgid_plural "%d comments successfully unhidden." +msgstr[0] "%d comentariu ascuns cu succes." +msgstr[1] "%d comentariu ascuns cu succes." +msgstr[2] "%d comentariu ascuns cu succes." + +#: judge/admin/comments.py:50 +msgid "Unhide comments" +msgstr "Reafişează comentariile" + +#: judge/admin/comments.py:58 +msgid "Associated page" +msgstr "Pagină associată" + +#: judge/admin/contest.py:29 +msgid "Included contests" +msgstr "Concursuri incluse" + +#: judge/admin/contest.py:65 templates/contest/contest.html:83 +#: templates/contest/moss.html:43 templates/problem/list.html:206 +#: templates/problem/list.html:221 templates/user/user-problems.html:56 +#: templates/user/user-problems.html:98 +msgid "Problem" +msgstr "Problemă" + +#: judge/admin/contest.py:113 +msgid "Settings" +msgstr "" + +#: judge/admin/contest.py:115 +msgid "Scheduling" +msgstr "Programare" + +#: judge/admin/contest.py:116 +msgid "Details" +msgstr "Detalii" + +#: judge/admin/contest.py:117 +msgid "Format" +msgstr "" + +#: judge/admin/contest.py:118 templates/contest/ranking-table.html:5 +msgid "Rating" +msgstr "Rating" + +#: judge/admin/contest.py:119 +msgid "Access" +msgstr "" + +#: judge/admin/contest.py:121 judge/admin/problem.py:131 +msgid "Justice" +msgstr "Justiţie" + +#: judge/admin/contest.py:159 +#, python-format +msgid "%d contest successfully marked as visible." +msgid_plural "%d contests successfully marked as visible." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: judge/admin/contest.py:162 +msgid "Mark contests as visible" +msgstr "" + +#: judge/admin/contest.py:166 +#, python-format +msgid "%d contest successfully marked as hidden." +msgid_plural "%d contests successfully marked as hidden." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: judge/admin/contest.py:169 +msgid "Mark contests as hidden" +msgstr "" + +#: judge/admin/contest.py:180 judge/admin/submission.py:149 +#: judge/admin/submission.py:171 +msgid "You do not have the permission to rejudge submissions." +msgstr "Nu aveţi permisiunea de a rejuriza submisii." + +#: judge/admin/contest.py:187 judge/admin/submission.py:155 +msgid "You do not have the permission to rejudge THAT many submissions." +msgstr "Nu aveţi permisiunea de a rejuriza ATÂT de multe submisii." + +#: judge/admin/contest.py:194 judge/admin/submission.py:164 +#, 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] "" + +#: judge/admin/contest.py:265 +#, python-format +msgid "%d participation recalculated." +msgid_plural "%d participations recalculated." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: judge/admin/contest.py:268 +msgid "Recalculate results" +msgstr "" + +#: judge/admin/contest.py:272 judge/admin/organization.py:65 +msgid "username" +msgstr "" + +#: judge/admin/contest.py:277 templates/base.html:258 +msgid "virtual" +msgstr "" + +#: judge/admin/interface.py:28 judge/models/interface.py:46 +msgid "link path" +msgstr "" + +#: judge/admin/interface.py:62 +msgid "Content" +msgstr "Conţinut" + +#: judge/admin/interface.py:63 +msgid "Summary" +msgstr "Rezumat" + +#: judge/admin/interface.py:107 judge/models/contest.py:251 +#: judge/models/contest.py:355 judge/models/profile.py:189 +msgid "user" +msgstr "" + +#: judge/admin/interface.py:148 +msgid "object" +msgstr "" + +#: judge/admin/organization.py:34 judge/admin/problem.py:171 +#: judge/admin/profile.py:78 +msgid "View on site" +msgstr "Vezi pe site" + +#: judge/admin/problem.py:28 +msgid "Describe the changes you made (optional)" +msgstr "Descrie modificările făcute (opţional)" + +#: judge/admin/problem.py:126 +msgid "Social Media" +msgstr "" + +#: judge/admin/problem.py:127 +msgid "Taxonomy" +msgstr "Taxonomie" + +#: judge/admin/problem.py:128 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:58 +msgid "Points" +msgstr "Puncte" + +#: judge/admin/problem.py:129 +msgid "Limits" +msgstr "Limite" + +#: judge/admin/problem.py:130 judge/admin/submission.py:232 +#: templates/stats/base.html:14 templates/submission/list.html:328 +msgid "Language" +msgstr "Limbaj" + +#: judge/admin/problem.py:132 +msgid "History" +msgstr "Istoric" + +#: judge/admin/problem.py:168 +msgid "Authors" +msgstr "Autori" + +#: judge/admin/problem.py:183 +#, python-format +msgid "%d problem successfully marked as public." +msgid_plural "%d problems successfully marked as public." +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:187 +msgid "Mark problems as public" +msgstr "Marchează probleme ca publice" + +#: judge/admin/problem.py:193 +#, python-format +msgid "%d problem successfully marked as private." +msgid_plural "%d problems successfully marked as private." +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:197 +msgid "Mark problems as private" +msgstr "Marchează probleme ca private" + +#: judge/admin/profile.py:32 +msgid "timezone" +msgstr "" + +#: judge/admin/profile.py:84 judge/admin/submission.py:211 +#: templates/organization/requests/log.html:9 +#: templates/organization/requests/pending.html:12 +#: templates/ticket/list.html:263 +msgid "User" +msgstr "Utilizator" + +#: judge/admin/profile.py:89 templates/registration/registration_form.html:145 +msgid "Email" +msgstr "Email" + +#: judge/admin/profile.py:94 judge/views/register.py:29 +#: templates/registration/registration_form.html:173 +#: templates/user/edit-profile.html:99 +msgid "Timezone" +msgstr "Fus orar" + +#: judge/admin/profile.py:99 +msgid "date joined" +msgstr "" + +#: judge/admin/profile.py:106 +#, python-format +msgid "%d user have scores recalculated." +msgid_plural "%d users have scores recalculated." +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:109 +msgid "Recalculate scores" +msgstr "Recalculați scorurile" + +#: judge/admin/runtime.py:19 +msgid "Disallowed problems" +msgstr "Probleme nepermise" + +#: judge/admin/runtime.py:22 +msgid "These problems are NOT allowed to be submitted in this language" +msgstr "Aceste probleme NU pot fi transmise în acest limbaj" + +#: judge/admin/runtime.py:83 +msgid "Description" +msgstr "Descriere" + +#: judge/admin/runtime.py:84 +msgid "Information" +msgstr "Informație" + +#: judge/admin/runtime.py:85 +msgid "Capabilities" +msgstr "Capabilități" + +#: judge/admin/submission.py:23 judge/admin/submission.py:42 +#: judge/admin/submission.py:221 +msgid "None" +msgstr "Gol" + +#: judge/admin/submission.py:23 +msgid "Not done" +msgstr "Not done" + +#: judge/admin/submission.py:23 +msgid "Exceptional" +msgstr "Excepțional" + +#: judge/admin/submission.py:42 +msgid "Unaccepted" +msgstr "Neacceptate" + +#: judge/admin/submission.py:89 +#, python-format +msgctxt "contest problem" +msgid "%(problem)s in %(contest)s" +msgstr "%(problem)s în %(contest)s" + +#: judge/admin/submission.py:167 +msgid "Rejudge the selected submissions" +msgstr "Rejurizează submisiile selectate" + +#: judge/admin/submission.py:193 judge/views/problem_manage.py:128 +#, python-format +msgid "%d submission were successfully rescored." +msgid_plural "%d submissions were successfully rescored." +msgstr[0] "%d submisie a fost repunctată cu succes." +msgstr[1] "%d submisie a fost repunctată cu succes." +msgstr[2] "%d submisii au fost repunctate cu succes." + +#: judge/admin/submission.py:196 +msgid "Rescore the selected submissions" +msgstr "Repunctează submisiile selectate" + +#: judge/admin/submission.py:200 +msgid "Problem code" +msgstr "Codul problemei" + +#: judge/admin/submission.py:205 +msgid "Problem name" +msgstr "" + +#: judge/admin/submission.py:215 templates/organization/requests/log.html:10 +#: templates/organization/requests/pending.html:13 +msgid "Time" +msgstr "Ora" + +#: judge/admin/submission.py:223 +#, python-format +msgid "%d KB" +msgstr "%d KB" + +#: judge/admin/submission.py:225 +#, python-format +msgid "%.2f MB" +msgstr "%.2f MB" + +#: judge/admin/submission.py:227 +msgid "Memory" +msgstr "" + +#: judge/admin/taxon.py:11 judge/admin/taxon.py:34 +msgid "Included problems" +msgstr "Probleme incluse" + +#: judge/admin/taxon.py:14 +msgid "These problems are included in this group of problems" +msgstr "Aceste probleme sunt incluse în acest grup de probleme" + +#: judge/admin/taxon.py:37 +msgid "These problems are included in this type of problems" +msgstr "Aceste probleme sunt incluse în acest tip de probleme" + +#: judge/apps.py:8 +msgid "Online Judge" +msgstr "Online Judge" + +#: judge/comments.py:41 +msgid "Comment body" +msgstr "Comentariu" + +#: judge/comments.py:47 judge/views/ticket.py:46 +msgid "Your part is silent, little toad." +msgstr "" + +#: judge/comments.py:50 templates/comments/list.html:131 +msgid "You need to have solved at least one problem before your voice can be heard." +msgstr "" + +#: judge/comments.py:92 +msgid "Posted comment" +msgstr "Comentariu postat" + +#: judge/contest_format/atcoder.py:19 +msgid "AtCoder" +msgstr "AtCoder" + +#: judge/contest_format/default.py:18 +msgid "Default" +msgstr "" + +#: judge/contest_format/ecoo.py:19 +msgid "ECOO" +msgstr "ECOO" + +#: judge/contest_format/ioi.py:19 +msgid "IOI" +msgstr "IOI" + +#: judge/forms.py:27 +msgid "Subscribe to contest updates" +msgstr "" + +#: judge/forms.py:28 +msgid "Enable experimental features" +msgstr "" + +#: judge/forms.py:57 judge/views/organization.py:127 +#, python-brace-format +msgid "You may not be part of more than {count} public organizations." +msgstr "" + +#: judge/forms.py:107 judge/views/register.py:26 +#: templates/registration/registration_form.html:139 +#: templates/user/base-users-table.html:5 +msgid "Username" +msgstr "Nume de utilizator" + +#: judge/forms.py:108 templates/registration/registration_form.html:151 +#: templates/registration/registration_form.html:165 +msgid "Password" +msgstr "" + +#: judge/forms.py:130 +msgid "Two Factor Authentication tokens must be 6 decimal digits." +msgstr "" + +#: judge/forms.py:139 templates/registration/totp_auth.html:32 +msgid "Invalid Two Factor Authentication token." +msgstr "" + +#: judge/forms.py:143 judge/models/problem.py:97 +msgid "Problem code must be ^[a-z0-9]+$" +msgstr "Codul problemei trebuie să fie ^[a-z0-9]+$" + +#: judge/forms.py:148 +msgid "Problem with code already exists." +msgstr "" + +#: judge/forms.py:153 judge/models/contest.py:51 +msgid "Contest id must be ^[a-z0-9]+$" +msgstr "Identificatorul de concurs trebuie să fie ^[a-z0-9]+$" + +#: judge/forms.py:158 +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 "N j, Y, g:i a" + +#: 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:59 +msgid "Leave as LaTeX" +msgstr "" + +#: judge/models/choices.py:60 +msgid "SVG with PNG fallback" +msgstr "" + +#: judge/models/choices.py:61 +msgid "MathML only" +msgstr "" + +#: judge/models/choices.py:62 +msgid "MathJax with SVG/PNG fallback" +msgstr "" + +#: judge/models/choices.py:63 +msgid "Detect best quality" +msgstr "" + +#: judge/models/comment.py:25 +msgid "Page code must be ^[pcs]:[a-z0-9]+$|^b:\\d+$" +msgstr "" + +#: judge/models/comment.py:41 +msgid "commenter" +msgstr "" + +#: judge/models/comment.py:42 +msgid "posted time" +msgstr "" + +#: judge/models/comment.py:43 judge/models/comment.py:176 +msgid "associated page" +msgstr "" + +#: judge/models/comment.py:45 +msgid "votes" +msgstr "" + +#: judge/models/comment.py:46 +msgid "body of comment" +msgstr "" + +#: judge/models/comment.py:47 +msgid "hide the comment" +msgstr "ascunde comentariul" + +#: judge/models/comment.py:48 +msgid "parent" +msgstr "" + +#: judge/models/comment.py:53 +msgid "comment" +msgstr "comentariu" + +#: judge/models/comment.py:54 +msgid "comments" +msgstr "comentarii" + +#: judge/models/comment.py:136 judge/models/problem.py:406 +#, python-format +msgid "Editorial for %s" +msgstr "" + +#: judge/models/comment.py:171 +msgid "comment vote" +msgstr "votul comentariului" + +#: judge/models/comment.py:172 +msgid "comment votes" +msgstr "voturile comentariului" + +#: judge/models/comment.py:181 +msgid "Override comment lock" +msgstr "" + +#: judge/models/contest.py:21 +msgid "Invalid colour." +msgstr "Culoare invalida." + +#: judge/models/contest.py:23 +msgid "tag name" +msgstr "nume de etichetă" + +#: judge/models/contest.py:24 +msgid "Lowercase letters and hyphens only." +msgstr "" + +#: judge/models/contest.py:25 +msgid "tag colour" +msgstr "culoare de eticheta" + +#: judge/models/contest.py:26 +msgid "tag description" +msgstr "descrierea etichetei" + +#: judge/models/contest.py:45 +msgid "contest tag" +msgstr "eticheta concursului" + +#: judge/models/contest.py:46 judge/models/contest.py:100 +msgid "contest tags" +msgstr "etichetele concursului" + +#: judge/models/contest.py:50 +msgid "contest id" +msgstr "" + +#: judge/models/contest.py:52 +msgid "contest name" +msgstr "" + +#: judge/models/contest.py:53 +msgid "These people will be able to edit the contest." +msgstr "Aceste persoane vor putea să editeze concursul." + +#: judge/models/contest.py:55 judge/models/runtime.py:124 +#: src/dmoj-wpadmin/test_project/apps/books/admin.py:20 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:27 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:27 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:27 +msgid "description" +msgstr "" + +#: judge/models/contest.py:56 judge/models/problem.py:353 +#: judge/models/runtime.py:126 +msgid "problems" +msgstr "probleme" + +#: judge/models/contest.py:57 judge/models/contest.py:252 +msgid "start time" +msgstr "" + +#: judge/models/contest.py:58 +msgid "end time" +msgstr "" + +#: judge/models/contest.py:59 judge/models/problem.py:118 +#: judge/models/problem.py:377 +msgid "time limit" +msgstr "" + +#: judge/models/contest.py:60 judge/models/problem.py:136 +msgid "publicly visible" +msgstr "" + +#: judge/models/contest.py:61 +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:64 +msgid "contest rated" +msgstr "" + +#: judge/models/contest.py:64 +msgid "Whether this contest can be rated." +msgstr "Dacă acest concurs poate fi evaluat." + +#: judge/models/contest.py:66 +msgid "hide scoreboard" +msgstr "" + +#: judge/models/contest.py:67 +msgid "Whether the scoreboard should remain hidden for the duration of the contest." +msgstr "" + +#: judge/models/contest.py:70 +msgid "no comments" +msgstr "" + +#: judge/models/contest.py:71 +msgid "Use clarification system instead of comments." +msgstr "" + +#: judge/models/contest.py:73 +msgid "Rating floor for contest" +msgstr "" + +#: judge/models/contest.py:75 +msgid "Rating ceiling for contest" +msgstr "" + +#: judge/models/contest.py:77 +msgid "rate all" +msgstr "" + +#: judge/models/contest.py:77 +msgid "Rate all users who joined." +msgstr "Evaluează toţi utilizatorii care s-au inscris." + +#: judge/models/contest.py:78 +msgid "exclude from ratings" +msgstr "" + +#: judge/models/contest.py:80 +msgid "private to specific users" +msgstr "" + +#: judge/models/contest.py:81 +msgid "private contestants" +msgstr "" + +#: judge/models/contest.py:82 +msgid "If private, only these users may see the contest" +msgstr "" + +#: judge/models/contest.py:84 +msgid "hide problem tags" +msgstr "" + +#: judge/models/contest.py:85 +msgid "Whether problem tags should be hidden by default." +msgstr "" + +#: judge/models/contest.py:87 +msgid "run pretests only" +msgstr "" + +#: judge/models/contest.py:88 +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:92 judge/models/problem.py:157 +msgid "private to organizations" +msgstr "" + +#: judge/models/contest.py:93 judge/models/problem.py:155 +#: judge/models/profile.py:76 +msgid "organizations" +msgstr "organizații" + +#: judge/models/contest.py:94 +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:95 judge/models/problem.py:145 +msgid "OpenGraph image" +msgstr "Imagine OpenGraph" + +#: judge/models/contest.py:96 judge/models/profile.py:47 +msgid "Logo override image" +msgstr "" + +#: judge/models/contest.py:98 +msgid "This image will replace the default site logo for users inside the contest." +msgstr "" + +#: judge/models/contest.py:101 +msgid "the amount of live participants" +msgstr "" + +#: judge/models/contest.py:102 +msgid "contest summary" +msgstr "" + +#: judge/models/contest.py:103 judge/models/problem.py:147 +msgid "Plain-text, shown in meta description tag, e.g. for social media." +msgstr "" + +#: judge/models/contest.py:104 judge/models/profile.py:46 +msgid "access code" +msgstr "" + +#: judge/models/contest.py:105 +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:107 judge/models/problem.py:141 +msgid "personae non gratae" +msgstr "" + +#: judge/models/contest.py:108 +msgid "Bans the selected users from joining this contest." +msgstr "" + +#: judge/models/contest.py:109 +msgid "contest format" +msgstr "" + +#: judge/models/contest.py:110 +msgid "The contest format module to use." +msgstr "" + +#: judge/models/contest.py:111 +msgid "contest format configuration" +msgstr "" + +#: judge/models/contest.py:112 +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:233 +msgid "See private contests" +msgstr "" + +#: judge/models/contest.py:234 +msgid "Edit own contests" +msgstr "" + +#: judge/models/contest.py:235 +msgid "Edit all contests" +msgstr "" + +#: judge/models/contest.py:236 +msgid "Clone contest" +msgstr "" + +#: judge/models/contest.py:237 templates/contest/moss.html:74 +msgid "MOSS contest" +msgstr "" + +#: judge/models/contest.py:238 +msgid "Rate contests" +msgstr "" + +#: judge/models/contest.py:239 +msgid "Contest access codes" +msgstr "" + +#: judge/models/contest.py:240 +msgid "Create private contests" +msgstr "" + +#: judge/models/contest.py:242 judge/models/contest.py:320 +#: judge/models/contest.py:356 judge/models/contest.py:378 +#: judge/models/submission.py:83 +msgid "contest" +msgstr "concurs" + +#: judge/models/contest.py:243 +msgid "contests" +msgstr "concursuri" + +#: judge/models/contest.py:250 +msgid "associated contest" +msgstr "" + +#: judge/models/contest.py:253 +msgid "score" +msgstr "scor" + +#: judge/models/contest.py:254 +msgid "cumulative time" +msgstr "" + +#: judge/models/contest.py:255 +msgid "virtual participation id" +msgstr "" + +#: judge/models/contest.py:256 +msgid "0 means non-virtual, otherwise the n-th virtual participation" +msgstr "" + +#: judge/models/contest.py:257 +msgid "contest format specific data" +msgstr "" + +#: judge/models/contest.py:306 +#, python-format +msgid "%s spectating in %s" +msgstr "" + +#: judge/models/contest.py:308 +#, python-format +msgid "%s in %s, v%d" +msgstr "" + +#: judge/models/contest.py:309 +#, python-format +msgid "%s in %s" +msgstr "" + +#: judge/models/contest.py:312 +msgid "contest participation" +msgstr "participarea la concurs" + +#: judge/models/contest.py:313 +msgid "contest participations" +msgstr "participările la concurs" + +#: judge/models/contest.py:319 judge/models/contest.py:340 +#: judge/models/contest.py:379 judge/models/problem.py:352 +#: judge/models/problem.py:357 judge/models/problem.py:375 +#: judge/models/problem_data.py:35 +msgid "problem" +msgstr "problemă" + +#: judge/models/contest.py:321 judge/models/contest.py:344 +#: judge/models/problem.py:129 +msgid "points" +msgstr "puncte" + +#: judge/models/contest.py:322 +msgid "partial" +msgstr "" + +#: judge/models/contest.py:323 judge/models/contest.py:345 +msgid "is pretested" +msgstr "" + +#: judge/models/contest.py:324 judge/models/interface.py:43 +msgid "order" +msgstr "" + +#: judge/models/contest.py:325 +msgid "output prefix length override" +msgstr "" + +#: judge/models/contest.py:326 +msgid "Maximum number of submissions for this problem, or 0 for no limit." +msgstr "" + +#: judge/models/contest.py:328 +msgid "Why include a problem you can't submit to?" +msgstr "" + +#: judge/models/contest.py:333 +msgid "contest problem" +msgstr "problema din concurs" + +#: judge/models/contest.py:334 +msgid "contest problems" +msgstr "problemele din concurs" + +#: judge/models/contest.py:338 judge/models/submission.py:181 +msgid "submission" +msgstr "submisie" + +#: judge/models/contest.py:342 judge/models/contest.py:357 +msgid "participation" +msgstr "" + +#: judge/models/contest.py:346 +msgid "Whether this submission was ran only on pretests." +msgstr "" + +#: judge/models/contest.py:350 +msgid "contest submission" +msgstr "submisie de concurs" + +#: judge/models/contest.py:351 +msgid "contest submissions" +msgstr "submisii de concurs" + +#: judge/models/contest.py:359 +msgid "rank" +msgstr "" + +#: judge/models/contest.py:360 +msgid "rating" +msgstr "" + +#: judge/models/contest.py:361 +msgid "volatility" +msgstr "" + +#: judge/models/contest.py:362 +msgid "last rated" +msgstr "" + +#: judge/models/contest.py:366 +msgid "contest rating" +msgstr "rating de la concurs" + +#: judge/models/contest.py:367 +msgid "contest ratings" +msgstr "ratinguri de la concurs" + +#: judge/models/contest.py:386 +msgid "contest moss result" +msgstr "" + +#: judge/models/contest.py:387 +msgid "contest moss results" +msgstr "" + +#: judge/models/interface.py:24 +msgid "configuration item" +msgstr "element de configurare" + +#: judge/models/interface.py:25 +msgid "miscellaneous configuration" +msgstr "configurare diversă" + +#: judge/models/interface.py:37 +msgid "navigation item" +msgstr "element de navigare" + +#: judge/models/interface.py:38 +msgid "navigation bar" +msgstr "bara de navigare" + +#: judge/models/interface.py:44 +msgid "identifier" +msgstr "" + +#: judge/models/interface.py:45 +msgid "label" +msgstr "" + +#: judge/models/interface.py:47 +msgid "highlight regex" +msgstr "" + +#: judge/models/interface.py:48 +msgid "parent item" +msgstr "" + +#: judge/models/interface.py:66 +msgid "post title" +msgstr "" + +#: judge/models/interface.py:67 judge/models/problem.py:395 +msgid "authors" +msgstr "" + +#: judge/models/interface.py:68 +msgid "slug" +msgstr "" + +#: judge/models/interface.py:69 judge/models/problem.py:393 +msgid "public visibility" +msgstr "" + +#: judge/models/interface.py:70 +msgid "sticky" +msgstr "" + +#: judge/models/interface.py:71 +msgid "publish after" +msgstr "" + +#: judge/models/interface.py:72 +msgid "post content" +msgstr "" + +#: judge/models/interface.py:73 +msgid "post summary" +msgstr "" + +#: judge/models/interface.py:74 +msgid "openGraph image" +msgstr "" + +#: judge/models/interface.py:91 +msgid "Edit all posts" +msgstr "" + +#: judge/models/interface.py:93 +msgid "blog post" +msgstr "postare pe blog" + +#: judge/models/interface.py:94 +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:29 +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:26 +msgid "problem category ID" +msgstr "" + +#: judge/models/problem.py:27 +msgid "problem category name" +msgstr "" + +#: judge/models/problem.py:34 +msgid "problem type" +msgstr "tipul problemei" + +#: judge/models/problem.py:35 judge/models/problem.py:113 +msgid "problem types" +msgstr "tipurile problemei" + +#: judge/models/problem.py:39 +msgid "problem group ID" +msgstr "" + +#: judge/models/problem.py:40 +msgid "problem group name" +msgstr "" + +#: judge/models/problem.py:47 judge/models/problem.py:116 +msgid "problem group" +msgstr "grupul problemei" + +#: judge/models/problem.py:48 +msgid "problem groups" +msgstr "grupurile problemei" + +#: judge/models/problem.py:52 +msgid "key" +msgstr "" + +#: judge/models/problem.py:54 +msgid "link" +msgstr "" + +#: judge/models/problem.py:55 +msgid "full name" +msgstr "nume complet" + +#: judge/models/problem.py:56 judge/models/profile.py:32 +#: judge/models/runtime.py:23 +msgid "short name" +msgstr "" + +#: judge/models/problem.py:57 +msgid "Displayed on pages under this license" +msgstr "Afişat pe paginile sub această licenţă" + +#: judge/models/problem.py:58 +msgid "icon" +msgstr "pictogramă" + +#: judge/models/problem.py:58 +msgid "URL to the icon" +msgstr "Hyperlink către icon" + +#: judge/models/problem.py:59 +msgid "license text" +msgstr "" + +#: judge/models/problem.py:68 +msgid "license" +msgstr "licență" + +#: judge/models/problem.py:69 +msgid "licenses" +msgstr "licențe" + +#: judge/models/problem.py:96 +msgid "problem code" +msgstr "codul problemei" + +#: judge/models/problem.py:98 +msgid "A short, unique code for the problem, used in the url after /problem/" +msgstr "" + +#: judge/models/problem.py:100 +msgid "problem name" +msgstr "numele problemei" + +#: judge/models/problem.py:101 +msgid "The full name of the problem, as shown in the problem list." +msgstr "" + +#: judge/models/problem.py:103 +msgid "problem body" +msgstr "" + +#: judge/models/problem.py:104 +msgid "creators" +msgstr "" + +#: judge/models/problem.py:105 +msgid "These users will be able to edit the problem, and be listed as authors." +msgstr "" + +#: judge/models/problem.py:107 +msgid "curators" +msgstr "" + +#: judge/models/problem.py:108 +msgid "These users will be able to edit the problem, but not be listed as authors." +msgstr "" + +#: judge/models/problem.py:110 +msgid "testers" +msgstr "" + +#: judge/models/problem.py:112 +msgid "These users will be able to view the private problem, but not edit it." +msgstr "" + +#: judge/models/problem.py:114 +msgid "The type of problem, as shown on the problem's page." +msgstr "" + +#: judge/models/problem.py:117 +msgid "The group of problem, shown under Category in the problem list." +msgstr "" + +#: judge/models/problem.py:119 +msgid "The time limit for this problem, in seconds. Fractional seconds (e.g. 1.5) are supported." +msgstr "" + +#: judge/models/problem.py:123 judge/models/problem.py:380 +msgid "memory limit" +msgstr "" + +#: judge/models/problem.py:124 +msgid "The memory limit for this problem, in kilobytes (e.g. 64mb = 65536 kilobytes)." +msgstr "" + +#: judge/models/problem.py:130 +msgid "Points awarded for problem completion. Points are displayed with a 'p' suffix if partial." +msgstr "" + +#: judge/models/problem.py:133 +msgid "allows partial points" +msgstr "" + +#: judge/models/problem.py:134 +msgid "allowed languages" +msgstr "" + +#: judge/models/problem.py:135 +msgid "List of allowed submission languages." +msgstr "" + +#: judge/models/problem.py:137 +msgid "manually managed" +msgstr "" + +#: judge/models/problem.py:138 +msgid "Whether judges should be allowed to manage data or not." +msgstr "" + +#: judge/models/problem.py:139 +msgid "date of publishing" +msgstr "" + +#: judge/models/problem.py:140 +msgid "Doesn't have magic ability to auto-publish due to backward compatibility" +msgstr "" + +#: judge/models/problem.py:142 +msgid "Bans the selected users from submitting to this problem." +msgstr "" + +#: judge/models/problem.py:144 +msgid "The license under which this problem is published." +msgstr "" + +#: judge/models/problem.py:146 +msgid "problem summary" +msgstr "" + +#: judge/models/problem.py:148 +msgid "number of users" +msgstr "" + +#: judge/models/problem.py:149 +msgid "The number of users who solved the problem." +msgstr "" + +#: judge/models/problem.py:150 +msgid "solve rate" +msgstr "" + +#: judge/models/problem.py:156 +msgid "If private, only these organizations may see the problem." +msgstr "" + +#: judge/models/problem.py:358 judge/models/problem.py:376 +#: judge/models/runtime.py:99 +msgid "language" +msgstr "limbaj" + +#: judge/models/problem.py:359 +msgid "translated name" +msgstr "" + +#: judge/models/problem.py:360 +msgid "translated description" +msgstr "" + +#: judge/models/problem.py:364 +msgid "problem translation" +msgstr "" + +#: judge/models/problem.py:365 +msgid "problem translations" +msgstr "" + +#: judge/models/problem.py:369 +msgid "clarified problem" +msgstr "" + +#: judge/models/problem.py:370 +msgid "clarification body" +msgstr "" + +#: judge/models/problem.py:371 +msgid "clarification timestamp" +msgstr "" + +#: judge/models/problem.py:386 +msgid "language-specific resource limit" +msgstr "limita de resurse specifică limbii" + +#: judge/models/problem.py:387 +msgid "language-specific resource limits" +msgstr "limite de resurse specifică limbii" + +#: judge/models/problem.py:391 +msgid "associated problem" +msgstr "" + +#: judge/models/problem.py:394 +msgid "publish date" +msgstr "" + +#: judge/models/problem.py:396 +msgid "editorial content" +msgstr "" + +#: judge/models/problem.py:412 +msgid "solution" +msgstr "soluţie" + +#: judge/models/problem.py:413 +msgid "solutions" +msgstr "soluţii" + +#: judge/models/problem_data.py:23 +msgid "Standard" +msgstr "" + +#: judge/models/problem_data.py:24 +msgid "Floats" +msgstr "" + +#: judge/models/problem_data.py:25 +msgid "Floats (absolute)" +msgstr "" + +#: judge/models/problem_data.py:26 +msgid "Floats (relative)" +msgstr "" + +#: judge/models/problem_data.py:27 +msgid "Non-trailing spaces" +msgstr "" + +#: judge/models/problem_data.py:28 +msgid "Unordered" +msgstr "" + +#: judge/models/problem_data.py:29 +msgid "Byte identical" +msgstr "" + +#: 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:39 +msgid "generator file" +msgstr "" + +#: judge/models/problem_data.py:41 judge/models/problem_data.py:90 +msgid "output prefix length" +msgstr "" + +#: judge/models/problem_data.py:42 judge/models/problem_data.py:91 +msgid "output limit length" +msgstr "" + +#: judge/models/problem_data.py:43 +msgid "init.yml generation feedback" +msgstr "" + +#: judge/models/problem_data.py:44 judge/models/problem_data.py:92 +msgid "checker" +msgstr "" + +#: judge/models/problem_data.py:45 judge/models/problem_data.py:93 +msgid "checker arguments" +msgstr "" + +#: 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:77 +msgid "problem data set" +msgstr "" + +#: judge/models/problem_data.py:79 +msgid "case position" +msgstr "" + +#: judge/models/problem_data.py:80 +msgid "case type" +msgstr "" + +#: judge/models/problem_data.py:81 +msgid "Normal case" +msgstr "" + +#: judge/models/problem_data.py:82 +msgid "Batch start" +msgstr "" + +#: judge/models/problem_data.py:83 +msgid "Batch end" +msgstr "" + +#: judge/models/problem_data.py:85 +msgid "input file name" +msgstr "" + +#: judge/models/problem_data.py:86 +msgid "output file name" +msgstr "" + +#: judge/models/problem_data.py:87 +msgid "generator arguments" +msgstr "" + +#: judge/models/problem_data.py:88 +msgid "point value" +msgstr "" + +#: judge/models/problem_data.py:89 +msgid "case is pretest?" +msgstr "" + +#: judge/models/profile.py:29 +msgid "organization title" +msgstr "" + +#: judge/models/profile.py:30 +msgid "organization slug" +msgstr "" + +#: judge/models/profile.py:31 +msgid "Organization name shown in URL" +msgstr "" + +#: judge/models/profile.py:33 +msgid "Displayed beside user name during contests" +msgstr "Afişat lângă numele de utilizator în timpul concursurilor" + +#: judge/models/profile.py:34 +msgid "organization description" +msgstr "" + +#: judge/models/profile.py:35 +msgid "registrant" +msgstr "" + +#: judge/models/profile.py:36 +msgid "User who registered this organization" +msgstr "Utilizatorul care a înregistrat această organizaţie" + +#: judge/models/profile.py:37 +msgid "administrators" +msgstr "" + +#: judge/models/profile.py:38 +msgid "Those who can edit this organization" +msgstr "Cei care pot edita această organizaţie" + +#: judge/models/profile.py:39 +msgid "creation date" +msgstr "" + +#: judge/models/profile.py:40 +msgid "is open organization?" +msgstr "" + +#: judge/models/profile.py:41 +msgid "Allow joining organization" +msgstr "Permite aderarea la organizaţie" + +#: judge/models/profile.py:42 +msgid "maximum size" +msgstr "" + +#: judge/models/profile.py:43 +msgid "Maximum amount of users in this organization, only applicable to private organizations" +msgstr "" + +#: judge/models/profile.py:45 +msgid "Student access code" +msgstr "" + +#: judge/models/profile.py:49 +msgid "This image will replace the default site logo for users viewing the organization." +msgstr "" + +#: judge/models/profile.py:75 judge/models/profile.py:91 +#: judge/models/profile.py:190 +msgid "organization" +msgstr "organizație" + +#: judge/models/profile.py:80 +msgid "user associated" +msgstr "" + +#: judge/models/profile.py:81 +msgid "self-description" +msgstr "" + +#: judge/models/profile.py:82 +msgid "location" +msgstr "" + +#: judge/models/profile.py:84 +msgid "preferred language" +msgstr "" + +#: judge/models/profile.py:89 +msgid "last access time" +msgstr "" + +#: judge/models/profile.py:90 +msgid "last IP" +msgstr "ultimul IP" + +#: judge/models/profile.py:93 +msgid "display rank" +msgstr "" + +#: judge/models/profile.py:95 +msgid "comment mute" +msgstr "" + +#: judge/models/profile.py:95 +msgid "Some users are at their best when silent." +msgstr "Pe unii utilizatori e preferabil sa nu ȋi auzi." + +#: judge/models/profile.py:97 +msgid "unlisted user" +msgstr "" + +#: judge/models/profile.py:97 +msgid "User will not be ranked." +msgstr "" + +#: judge/models/profile.py:100 +msgid "user script" +msgstr "" + +#: judge/models/profile.py:101 +msgid "User-defined JavaScript for site customization." +msgstr "JavaScript definit de utilizator pentru personalizarea site-ului." + +#: judge/models/profile.py:102 +msgid "current contest" +msgstr "" + +#: judge/models/profile.py:104 +msgid "math engine" +msgstr "" + +#: judge/models/profile.py:106 +msgid "the rendering engine used to render math" +msgstr "" + +#: judge/models/profile.py:107 +msgid "2FA enabled" +msgstr "" + +#: judge/models/profile.py:108 +msgid "check to enable TOTP-based two factor authentication" +msgstr "" + +#: judge/models/profile.py:109 +msgid "TOTP key" +msgstr "" + +#: judge/models/profile.py:110 +msgid "32 character base32-encoded key for TOTP" +msgstr "" + +#: judge/models/profile.py:112 +msgid "TOTP key must be empty or base32" +msgstr "" + +#: judge/models/profile.py:113 +msgid "internal notes" +msgstr "" + +#: judge/models/profile.py:114 +msgid "Notes for administrators regarding this user." +msgstr "" + +#: judge/models/profile.py:184 +msgid "user profile" +msgstr "profil utilizator" + +#: judge/models/profile.py:185 +msgid "user profiles" +msgstr "profiluri utilizatori" + +#: judge/models/profile.py:192 +msgid "request time" +msgstr "" + +#: judge/models/profile.py:193 +msgid "state" +msgstr "" + +#: judge/models/profile.py:198 +msgid "reason" +msgstr "" + +#: judge/models/profile.py:201 +msgid "organization join request" +msgstr "cerere de a se alătura organizaţiei" + +#: judge/models/profile.py:202 +msgid "organization join requests" +msgstr "cereri de a se alătura organizaţiei" + +#: judge/models/runtime.py:18 +msgid "short identifier" +msgstr "" + +#: judge/models/runtime.py:19 +msgid "The identifier for this language; the same as its executor id for judges." +msgstr "" + +#: judge/models/runtime.py:21 +msgid "long name" +msgstr "" + +#: judge/models/runtime.py:22 +msgid "Longer name for the language, e.g. \"Python 2\" or \"C++11\"." +msgstr "" + +#: judge/models/runtime.py:24 +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:28 +msgid "common name" +msgstr "" + +#: judge/models/runtime.py:29 +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:31 +msgid "ace mode name" +msgstr "" + +#: judge/models/runtime.py:32 +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:34 +msgid "pygments name" +msgstr "" + +#: judge/models/runtime.py:35 +msgid "Language ID for Pygments highlighting in source windows." +msgstr "" + +#: judge/models/runtime.py:36 +msgid "code template" +msgstr "" + +#: judge/models/runtime.py:37 +msgid "Code template to display in submission editor." +msgstr "" + +#: judge/models/runtime.py:38 +msgid "runtime info override" +msgstr "" + +#: judge/models/runtime.py:39 +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:41 +msgid "language description" +msgstr "" + +#: judge/models/runtime.py:42 +msgid "Use field this to inform users of quirks with your environment, additional restrictions, etc." +msgstr "" + +#: judge/models/runtime.py:44 +msgid "extension" +msgstr "" + +#: judge/models/runtime.py:45 +msgid "The extension of source files, e.g., \"py\" or \"cpp\"." +msgstr "" + +#: judge/models/runtime.py:100 +msgid "languages" +msgstr "limbaje" + +#: judge/models/runtime.py:104 +msgid "language to which this runtime belongs" +msgstr "" + +#: judge/models/runtime.py:105 +msgid "judge on which this runtime exists" +msgstr "" + +#: judge/models/runtime.py:106 +msgid "runtime name" +msgstr "" + +#: judge/models/runtime.py:107 +msgid "runtime version" +msgstr "" + +#: judge/models/runtime.py:108 +msgid "order in which to display this runtime" +msgstr "" + +#: judge/models/runtime.py:112 +msgid "Server name, hostname-style" +msgstr "Numele server-ului, in stil de hostname" + +#: judge/models/runtime.py:113 +msgid "time of creation" +msgstr "" + +#: judge/models/runtime.py:114 +msgid "A key to authenticated this judge" +msgstr "O cheie de autentificare pentru acest judge" + +#: judge/models/runtime.py:115 +msgid "authentication key" +msgstr "" + +#: judge/models/runtime.py:116 +msgid "block judge" +msgstr "" + +#: judge/models/runtime.py:117 +msgid "Whether this judge should be blocked from connecting, even if its key is correct." +msgstr "" + +#: judge/models/runtime.py:119 +msgid "judge online status" +msgstr "" + +#: judge/models/runtime.py:120 +msgid "judge start time" +msgstr "" + +#: judge/models/runtime.py:121 +msgid "response time" +msgstr "" + +#: judge/models/runtime.py:122 +msgid "system load" +msgstr "" + +#: judge/models/runtime.py:123 +msgid "Load for the last minute, divided by processors to be fair." +msgstr "Încărcarea in ultimul minut, împărţită la numarul de procesoare." + +#: judge/models/runtime.py:127 judge/models/runtime.py:167 +msgid "judges" +msgstr "evaluatoare" + +#: judge/models/runtime.py:166 +msgid "judge" +msgstr "evaluator" + +#: judge/models/submission.py:20 judge/models/submission.py:47 +#: judge/utils/problems.py:86 +msgid "Accepted" +msgstr "Accepted" + +#: judge/models/submission.py:21 judge/models/submission.py:48 +msgid "Wrong Answer" +msgstr "Wrong Answer" + +#: judge/models/submission.py:22 judge/models/submission.py:50 +msgid "Time Limit Exceeded" +msgstr "Time Limit Exceeded" + +#: judge/models/submission.py:23 judge/models/submission.py:51 +msgid "Memory Limit Exceeded" +msgstr "Memory Limit Exceeded" + +#: judge/models/submission.py:24 judge/models/submission.py:52 +msgid "Output Limit Exceeded" +msgstr "Output Limit Exceeded" + +#: judge/models/submission.py:25 judge/models/submission.py:53 +msgid "Invalid Return" +msgstr "Invalid Return" + +#: judge/models/submission.py:26 judge/models/submission.py:54 +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:88 +msgid "Compile Error" +msgstr "Compile Error" + +#: judge/models/submission.py:28 judge/models/submission.py:40 +msgid "Internal Error" +msgstr "Internal Error" + +#: judge/models/submission.py:29 +msgid "Short circuit" +msgstr "Short circuit" + +#: judge/models/submission.py:30 judge/models/submission.py:42 +#: judge/models/submission.py:61 +msgid "Aborted" +msgstr "Aborted" + +#: judge/models/submission.py:36 judge/models/submission.py:57 +msgid "Queued" +msgstr "Queued" + +#: judge/models/submission.py:37 judge/models/submission.py:58 +msgid "Processing" +msgstr "Processing" + +#: judge/models/submission.py:38 judge/models/submission.py:59 +msgid "Grading" +msgstr "Grading" + +#: judge/models/submission.py:39 judge/models/submission.py:60 +msgid "Completed" +msgstr "Completed" + +#: judge/models/submission.py:56 +msgid "Internal Error (judging server error)" +msgstr "Internal Error (judging server error)" + +#: judge/models/submission.py:66 +msgid "submission time" +msgstr "" + +#: judge/models/submission.py:67 judge/models/submission.py:201 +msgid "execution time" +msgstr "" + +#: judge/models/submission.py:68 judge/models/submission.py:202 +msgid "memory usage" +msgstr "" + +#: judge/models/submission.py:69 judge/models/submission.py:203 +msgid "points granted" +msgstr "" + +#: judge/models/submission.py:70 +msgid "submission language" +msgstr "" + +#: judge/models/submission.py:71 +msgid "status" +msgstr "" + +#: judge/models/submission.py:72 +msgid "result" +msgstr "" + +#: judge/models/submission.py:74 +msgid "compile errors" +msgstr "" + +#: judge/models/submission.py:76 +msgid "batched cases" +msgstr "" + +#: judge/models/submission.py:77 +msgid "test case points" +msgstr "" + +#: judge/models/submission.py:78 +msgid "test case total points" +msgstr "" + +#: judge/models/submission.py:79 +msgid "judged on" +msgstr "" + +#: judge/models/submission.py:81 +msgid "was rejudged by admin" +msgstr "" + +#: judge/models/submission.py:82 +msgid "was ran on pretests only" +msgstr "" + +#: judge/models/submission.py:182 templates/contest/moss.html:58 +msgid "submissions" +msgstr "submisii" + +#: judge/models/submission.py:186 judge/models/submission.py:197 +msgid "associated submission" +msgstr "" + +#: judge/models/submission.py:188 +msgid "source code" +msgstr "" + +#: judge/models/submission.py:199 +msgid "test case ID" +msgstr "" + +#: judge/models/submission.py:200 +msgid "status flag" +msgstr "" + +#: judge/models/submission.py:204 +msgid "points possible" +msgstr "" + +#: judge/models/submission.py:205 +msgid "batch number" +msgstr "" + +#: judge/models/submission.py:206 +msgid "judging feedback" +msgstr "" + +#: judge/models/submission.py:207 +msgid "extended judging feedback" +msgstr "" + +#: judge/models/submission.py:208 +msgid "program output" +msgstr "" + +#: judge/models/submission.py:216 +msgid "submission test case" +msgstr "testul submisiei" + +#: judge/models/submission.py:217 +msgid "submission test cases" +msgstr "testele submisiei" + +#: judge/models/ticket.py:10 +msgid "ticket title" +msgstr "" + +#: judge/models/ticket.py:11 +msgid "ticket creator" +msgstr "" + +#: judge/models/ticket.py:13 +msgid "creation time" +msgstr "" + +#: judge/models/ticket.py:14 +msgid "assignees" +msgstr "" + +#: judge/models/ticket.py:15 +msgid "quick notes" +msgstr "" + +#: judge/models/ticket.py:16 +msgid "Staff notes for this issue to aid in processing." +msgstr "" + +#: judge/models/ticket.py:17 +msgid "linked item type" +msgstr "" + +#: judge/models/ticket.py:19 +msgid "linked item ID" +msgstr "" + +#: judge/models/ticket.py:21 +msgid "is ticket open?" +msgstr "" + +#: judge/models/ticket.py:25 +msgid "ticket" +msgstr "" + +#: judge/models/ticket.py:27 +msgid "poster" +msgstr "" + +#: judge/models/ticket.py:30 +msgid "message time" +msgstr "" + +#: judge/pdf_problems.py:134 judge/pdf_problems.py:186 +#: judge/pdf_problems.py:246 +msgid "Page [page] of [topage]" +msgstr "" + +#: judge/tasks/moss.py:25 +msgid "Running MOSS" +msgstr "" + +#: judge/tasks/submission.py:43 +msgid "Modifying submissions" +msgstr "" + +#: judge/tasks/submission.py:56 +msgid "Recalculating user points" +msgstr "" + +#: judge/utils/problem_data.py:63 +msgid "Empty batches not allowed." +msgstr "" + +#: 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 +#, python-format +msgid "Input file for case %d does not exist: %s" +msgstr "" + +#: 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 +#, python-format +msgid "Batch start case #%d requires points." +msgstr "" + +#: 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 +msgid "How did you corrupt the zip path?" +msgstr "" + +#: judge/utils/problem_data.py:160 +msgid "How did you corrupt the generator path?" +msgstr "" + +#: judge/utils/problems.py:76 +msgid "Can't pass both queryset and keyword filters" +msgstr "Nu se poate trece amândoua queryset şi filtrele cu cuvinte cheie" + +#: judge/utils/problems.py:87 +msgid "Wrong" +msgstr "" + +#: judge/utils/problems.py:89 +msgid "Timeout" +msgstr "" + +#: judge/utils/problems.py:90 +msgid "Error" +msgstr "" + +#: 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/timedelta.py:49 +msgctxt "time format with day" +msgid "%d day %h:%m:%s" +msgid_plural "%d days %h:%m:%s" +msgstr[0] "%d zi %h:%m:%s" +msgstr[1] "%d zile %h:%m:%s" +msgstr[2] "%d zile %h:%m:%s" + +#: judge/utils/timedelta.py:53 +msgctxt "time format without day" +msgid "%h:%m:%s" +msgstr "%h:%m:%s" + +#: 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] "%d zi %h:%m" +msgstr[1] "%d zile % h:%m" +msgstr[2] "%d zile %h:%m" + +#: judge/utils/timedelta.py:61 +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d zi" +msgstr[1] "%d zile" +msgstr[2] "%d zile" + +#: judge/utils/timedelta.py:63 +msgctxt "hours and minutes" +msgid "%h:%m" +msgstr "%h:%m" + +#: judge/views/blog.py:38 +#, python-format +msgid "Page %d of Posts" +msgstr "Pagina %d din Posturi" + +#: judge/views/comment.py:27 +msgid "Messing around, are we?" +msgstr "Ne facem de cap, nu-i așa?" + +#: judge/views/comment.py:36 +msgid "You must solve at least one problem before you can vote." +msgstr "" + +#: judge/views/comment.py:63 +msgid "You already voted." +msgstr "Ai votat deja." + +#: judge/views/comment.py:120 judge/views/organization.py:299 +msgid "Edited from site" +msgstr "Editat de pe site" + +#: judge/views/comment.py:141 +msgid "Editing comment" +msgstr "" + +#: judge/views/contests.py:49 judge/views/contests.py:211 +#: judge/views/contests.py:214 judge/views/contests.py:385 +msgid "No such contest" +msgstr "Niciun concurs de acest fel" + +#: judge/views/contests.py:50 judge/views/contests.py:212 +#, python-format +msgid "Could not find a contest with the key \"%s\"." +msgstr "Niciun concurs găsit cu cheia \"%s\"." + +#: judge/views/contests.py:75 +msgid "Contests" +msgstr "Concursuri" + +#: judge/views/contests.py:215 +msgid "Could not find such contest." +msgstr "Nu am putut găsi un concurs de acest fel." + +#: judge/views/contests.py:218 +#, python-format +msgid "Access to contest \"%s\" denied" +msgstr "Nu aveți acces la concursul \"%s\"" + +#: judge/views/contests.py:242 +msgid "Clone Contest" +msgstr "" + +#: judge/views/contests.py:305 +msgid "Contest not ongoing" +msgstr "Concursul nu este în curs de desfăşurare" + +#: judge/views/contests.py:306 +#, python-format +msgid "\"%s\" is not currently ongoing." +msgstr "Momentan, \"%s\" nu este în curs de desfăşurare." + +#: judge/views/contests.py:310 +msgid "Already in contest" +msgstr "Deja în concurs" + +#: judge/views/contests.py:311 +#, python-format +msgid "You are already in a contest: \"%s\"." +msgstr "Sunteţi deja într-un concurs: \"%s\"." + +#: judge/views/contests.py:314 +msgid "Banned from joining" +msgstr "" + +#: judge/views/contests.py:315 +msgid "You have been declared persona non grata for this contest. You are permanently barred from joining this contest." +msgstr "" + +#: judge/views/contests.py:375 +#, python-format +msgid "Enter access code for \"%s\"" +msgstr "" + +#: judge/views/contests.py:386 +#, python-format +msgid "You are not in contest \"%s\"." +msgstr "Nu sunteţi în concursul \"%s\"." + +#: judge/views/contests.py:405 +msgid "ContestCalendar requires integer year and month" +msgstr "" + +#: judge/views/contests.py:445 +#, python-format +msgid "Contests in %(month)s" +msgstr "Concursuri în %(month)s" + +#: judge/views/contests.py:445 +msgid "F Y" +msgstr "" + +#: judge/views/contests.py:531 +msgid "???" +msgstr "" + +#: judge/views/contests.py:594 +#, python-format +msgid "%s Rankings" +msgstr "" + +#: judge/views/contests.py:610 +#, python-format +msgid "Your participation in %s" +msgstr "" + +#: judge/views/contests.py:611 +#, python-format +msgid "%s's participation in %s" +msgstr "" + +#: judge/views/contests.py:615 +msgid "Live" +msgstr "" + +#: judge/views/contests.py:627 templates/contest/contest-tabs.html:13 +msgid "Participation" +msgstr "" + +#: judge/views/contests.py:654 +#, python-format +msgid "%s MOSS Results" +msgstr "" + +#: judge/views/contests.py:681 +#, python-format +msgid "Running MOSS for %s..." +msgstr "" + +#: judge/views/contests.py:704 +#, python-format +msgid "Contest tag: %s" +msgstr "" + +#: judge/views/error.py:14 +msgid "404 error" +msgstr "eroare 404" + +#: judge/views/error.py:15 +#, python-format +msgid "Could not find page \"%s\"" +msgstr "Nu am putut găsi pagina \"%s\"" + +#: judge/views/error.py:22 +#, python-format +msgid "no permission for %s" +msgstr "nicio permisiune pentru %s" + +#: judge/views/error.py:30 +#, python-format +msgid "corrupt page %s" +msgstr "pagina corupta %s" + +#: judge/views/language.py:12 templates/status/judge-status-table.html:9 +#: templates/status/status-tabs.html:5 +msgid "Runtimes" +msgstr "Limbaje" + +#: judge/views/organization.py:44 judge/views/organization.py:47 +msgid "No such organization" +msgstr "Nicio organizaţie de acest fel" + +#: judge/views/organization.py:45 +#, 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 +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 +#: templates/organization/list.html:15 templates/user/user-list-tabs.html:5 +msgid "Organizations" +msgstr "Organizaţii" + +#: judge/views/organization.py:93 +#, python-format +msgid "%s Members" +msgstr "%s Membri" + +#: judge/views/organization.py:118 judge/views/organization.py:121 +#: judge/views/organization.py:126 +msgid "Joining organization" +msgstr "Aderarea la organizaţie" + +#: judge/views/organization.py:118 +msgid "You are already in the organization." +msgstr "Sunteţi deja în organizaţie." + +#: judge/views/organization.py:121 +msgid "This organization is not open." +msgstr "Această organizaţie nu este deschisă." + +#: judge/views/organization.py:138 +msgid "Leaving organization" +msgstr "Părăsire organizaţie" + +#: judge/views/organization.py:138 +#, python-format +msgid "You are not in \"%s\"." +msgstr "Nu sunteţi în \"%s\"." + +#: judge/views/organization.py:162 +#, python-format +msgid "Request to join %s" +msgstr "Cerere de adăugare la %s" + +#: judge/views/organization.py:180 +msgid "Join request detail" +msgstr "Detalii despre cererea de adăugare" + +#: judge/views/organization.py:209 +#, python-format +msgid "Managing join requests for %s" +msgstr "Gestionarea cererilor de asociere cu %s" + +#: judge/views/organization.py:240 +#, python-format +msgid "Your organization can only receive %d more members. You cannot approve %d users." +msgstr "" + +#: judge/views/organization.py:252 +#, python-format +msgid "Approved %d user." +msgid_plural "Approved %d users." +msgstr[0] "Aprobat %d utilizator." +msgstr[1] "Aprobat %d utilizatori." +msgstr[2] "Aprobat %d utilizatori." + +#: judge/views/organization.py:253 +#, python-format +msgid "Rejected %d user." +msgid_plural "Rejected %d users." +msgstr[0] "Respins %d utilizator." +msgstr[1] "Respins %d utilizatori." +msgstr[2] "Respins %d utilizatori." + +#: judge/views/organization.py:283 +#, python-format +msgid "Editing %s" +msgstr "Editare %s" + +#: judge/views/organization.py:307 judge/views/organization.py:315 +msgid "Can't edit organization" +msgstr "Nu puteţi edita organizaţia" + +#: judge/views/organization.py:308 +msgid "You are not allowed to edit this organization." +msgstr "Nu aveţi permisiunea pentru a edita această organizaţie." + +#: judge/views/organization.py:316 +msgid "You are not allowed to kick people from this organization." +msgstr "" + +#: judge/views/organization.py:321 judge/views/organization.py:325 +msgid "Can't kick user" +msgstr "" + +#: judge/views/organization.py:322 +msgid "The user you are trying to kick does not exist!" +msgstr "" + +#: judge/views/organization.py:326 +#, python-format +msgid "The user you are trying to kick is not in organization: %s." +msgstr "" + +#: judge/views/problem.py:68 +msgid "No such problem" +msgstr "Nicio problemă de acest fel" + +#: 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:111 +#, python-brace-format +msgid "Editorial for {0}" +msgstr "" + +#: judge/views/problem.py:114 +#, python-brace-format +msgid "Editorial for {0}" +msgstr "" + +#: judge/views/problem.py:285 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:546 +msgid "Banned from submitting" +msgstr "" + +#: judge/views/problem.py:547 +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:560 +msgid "Too many submissions" +msgstr "" + +#: judge/views/problem.py:561 +msgid "You have exceeded the submission limit for this problem." +msgstr "" + +#: judge/views/problem.py:627 judge/views/problem.py:630 +#, python-format +msgid "Submit to %(problem)s" +msgstr "" + +#: judge/views/problem.py:646 +msgid "Clone Problem" +msgstr "" + +#: judge/views/problem_data.py:37 +msgid "Checker arguments must be a JSON object" +msgstr "" + +#: judge/views/problem_data.py:39 +msgid "Checker arguments is invalid JSON" +msgstr "" + +#: judge/views/problem_data.py:46 +msgid "Your zip file is invalid!" +msgstr "" + +#: judge/views/problem_data.py:104 +#, python-brace-format +msgid "Comparing submissions for {0}" +msgstr "" + +#: judge/views/problem_data.py:107 +#, python-brace-format +msgid "Comparing submissions for {0}" +msgstr "" + +#: judge/views/problem_data.py:142 +#, python-brace-format +msgid "Editing data for {0}" +msgstr "" + +#: judge/views/problem_data.py:145 +#, python-format +msgid "Editing data for %s" +msgstr "" + +#: judge/views/problem_data.py:237 judge/views/problem_data.py:238 +#, python-format +msgid "Generated init.yml for %s" +msgstr "" + +#: 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] "" +msgstr[2] "" + +#: judge/views/ranked_submission.py:58 +#, python-format +msgid "Best solutions for %s" +msgstr "Cele mai bune soluţii pentru %s" + +#: judge/views/ranked_submission.py:61 +#, python-brace-format +msgid "Best solutions for {0}" +msgstr "Cele mai bune soluţii pentru {0}" + +#: judge/views/ranked_submission.py:71 +#, 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:74 +#, python-format +msgid "Best solutions for problem %(number)s in %(contest)s" +msgstr "" + +#: judge/views/ranked_submission.py:80 +#, 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:83 +#, python-brace-format +msgid "Best solutions for problem {0} in {1}" +msgstr "" + +#: judge/views/register.py:27 +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 templates/user/edit-profile.html:103 +msgid "Preferred language" +msgstr "Limba preferată" + +#: judge/views/register.py:38 +msgid "Subscribe to newsletter?" +msgstr "" + +#: judge/views/register.py:45 +#, 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 +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 +msgid "Registration" +msgstr "Înregistrare" + +#: judge/views/register.py:106 +msgid "Authentication failure" +msgstr "Problemă la autentificare" + +#: judge/views/stats.py:105 +msgid "Language statistics" +msgstr "Statistici ale limbei" + +#: judge/views/status.py:24 templates/submission/list.html:319 +msgid "Status" +msgstr "Stare" + +#: judge/views/status.py:108 +msgid "Version matrix" +msgstr "" + +#: judge/views/submission.py:59 judge/views/submission.py:66 +#, python-format +msgid "Submission of %(problem)s by %(user)s" +msgstr "Soluţia problemei %(problem)s de %(user)s" + +#: judge/views/submission.py:161 judge/views/submission.py:162 +#: templates/problem/problem.html:127 +msgid "All submissions" +msgstr "Toate soluţile" + +#: judge/views/submission.py:303 +msgid "All my submissions" +msgstr "" + +#: judge/views/submission.py:304 +#, python-format +msgid "All submissions by %s" +msgstr "Toate soluţiile submise de %s" + +#: judge/views/submission.py:335 +#, python-format +msgid "All submissions for %s" +msgstr "Toate soluţiile pentru %s" + +#: judge/views/submission.py:354 +msgid "Must pass a problem" +msgstr "Trebuie să rezolvaţi o problemă" + +#: judge/views/submission.py:397 +#, python-format +msgid "My submissions for %(problem)s" +msgstr "" + +#: judge/views/submission.py:398 +#, python-format +msgid "%(user)s's submissions for %(problem)s" +msgstr "Soluţiile lui %(user)s pentru %(problem)s" + +#: judge/views/submission.py:495 +msgid "Must pass a contest" +msgstr "Trebuie să completaţi un concurs" + +#: judge/views/submission.py:514 +#, python-brace-format +msgid "{0}'s submissions for {2} in {4}" +msgstr "Soluţiile lui {0} pentru {2} în {4}" + +#: judge/views/submission.py:519 +#, 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 "" + +#: judge/views/ticket.py:40 +msgid "Issue description" +msgstr "" + +#: judge/views/ticket.py:85 judge/views/ticket.py:88 +#, python-format +msgid "New ticket for %s" +msgstr "" + +#: judge/views/ticket.py:139 +#, python-format +msgid "%(title)s - Ticket %(id)d" +msgstr "" + +#: judge/views/ticket.py:248 +#, python-format +msgid "Tickets - Page %(number)d of %(total)d" +msgstr "" + +#: judge/views/ticket.py:297 +#, python-format +msgid "New Ticket: %s" +msgstr "" + +#: judge/views/ticket.py:298 +#, python-format +msgid "#%(id)d, assigned to: %(users)s" +msgstr "" + +#: judge/views/ticket.py:300 +msgid ", " +msgstr "" + +#: judge/views/ticket.py:300 +msgid "no one" +msgstr "" + +#: judge/views/totp.py:42 templates/registration/totp_enable.html:86 +msgid "Enable Two Factor Authentication" +msgstr "" + +#: judge/views/totp.py:89 templates/registration/totp_disable.html:48 +msgid "Disable Two Factor Authentication" +msgstr "" + +#: judge/views/totp.py:103 +msgid "Perform Two Factor Authentication" +msgstr "" + +#: judge/views/user.py:68 +msgid "No such user" +msgstr "Niciun astfel de utilizator" + +#: judge/views/user.py:68 +#, python-format +msgid "No user handle \"%s\"." +msgstr "Porecla de utilizator \"%s\" nu există." + +#: judge/views/user.py:72 +msgid "My account" +msgstr "" + +#: judge/views/user.py:73 +#, python-format +msgid "User %s" +msgstr "Utilizatorul %s" + +#: judge/views/user.py:136 +msgid "M j, Y, G:i" +msgstr "M j, Y, G:i" + +#: judge/views/user.py:221 +msgid "Updated on site" +msgstr "Actualizat pe loc" + +#: judge/views/user.py:253 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:10 +msgid "Edit profile" +msgstr "Editează-ți profilul" + +#: judge/views/user.py:262 templates/user/user-list-tabs.html:4 +msgid "Leaderboard" +msgstr "" + +#: judge/views/widgets.py:48 judge/views/widgets.py:58 +#, python-format +msgid "Invalid upstream data: %s" +msgstr "Informațiile trimise sunt invalide: %s" + +#: judge/views/widgets.py:68 +msgid "Bad latitude or longitude" +msgstr "Latitudine sau longitudine nepotrivită" + +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:13 +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:27 +msgid "Photo" +msgstr "" + +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:14 +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:28 +msgid "Photos" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:9 +msgid "first name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:10 +msgid "last name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:11 +msgid "biography" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/admin.py:24 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:30 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:30 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:30 +msgid "owner" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:12 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:12 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:12 +msgid "name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:19 +msgid "Category of Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:20 +msgid "Categories of Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:26 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:26 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:26 +msgid "title" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:28 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:28 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:28 +msgid "category" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:29 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:29 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:29 +msgid "author" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:31 +msgid "publication date" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:37 +msgid "Book" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:38 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:136 +msgid "Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:19 +msgid "Category of CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:20 +msgid "Categories of CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:36 +msgid "CD" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:37 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:141 +msgid "CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:19 +msgid "Category of DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:20 +msgid "Categories of DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:36 +msgid "DVD" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:37 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:146 +msgid "DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/templates/admin/base_site.html:7 +msgid "Django administration" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/forms.py:12 +#, python-format +msgid "Please enter the correct %(username)s and password for an admin account. Note that both fields may be case-sensitive." +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/forms.py:32 +#, python-format +msgid "Please enter the correct %(username)s and password for an user account. Note that both fields may be case-sensitive." +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:27 +msgid "Site" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:38 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:41 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:130 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:133 +msgid "Dashboard" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:48 +msgid "Applications" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:53 +msgid "Administration" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:64 +msgid "Color theme" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:66 +msgid "Change color theme" +msgstr "" + +#: 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 "Dă notă" + +#: templates/admin/judge/contest/change_list.html:9 +msgid "Rate all ratable contests" +msgstr "Dă o notă la toate concursurile adecvate" + +#: 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 "Vezi soluții" + +#: templates/admin/judge/profile/change_form.html:14 +#: templates/admin/judge/profile/change_form.html:17 +msgid "Edit user" +msgstr "Editează utilizator" + +#: 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 +msgid "Rejudge" +msgstr "Rejurizeză" + +#: templates/base.html:214 +#, python-format +msgid "Hello, %(username)s." +msgstr "Bună ziua, %(username)s." + +#: templates/base.html:220 templates/comments/list.html:89 +#: templates/contest/contest-list-tabs.html:24 +#: templates/problem/problem-list-tabs.html:6 +#: templates/submission/info-base.html:12 +#: templates/submission/submission-list-tabs.html:15 +msgid "Admin" +msgstr "Administrare" + +#: templates/base.html:229 +msgid "Log out" +msgstr "Log out" + +#: templates/base.html:238 +#: templates/registration/password_reset_complete.html:4 +msgid "Log in" +msgstr "Autentificare" + +#: templates/base.html:239 templates/registration/registration_form.html:177 +msgid "or" +msgstr "sau" + +#: templates/base.html:240 +msgid "Sign up" +msgstr "" + +#: templates/base.html:252 +msgid "spectating" +msgstr "" + +#: templates/base.html:265 +msgid "This site works best with JavaScript enabled." +msgstr "Acest site funcționează cel mai bine cu JavaScript activat." + +#: templates/blog/content.html:13 templates/comments/list.html:68 +#: templates/comments/list.html:83 templates/contest/contest-tabs.html:20 +#: 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 +msgid "Edit" +msgstr "Modifică" + +#: templates/blog/content.html:27 +#, python-format +msgid "\n" +" posted on %(time)s\n" +" " +msgstr "" + +#: templates/blog/dashboard.html:21 +#, python-format +msgid "\n" +" on %(time)s\n" +" " +msgstr "" + +#: templates/blog/list.html:85 +msgid "Blog" +msgstr "Blog" + +#: templates/blog/list.html:87 +msgid "Events" +msgstr "Evenimente" + +#: templates/blog/list.html:92 +msgid "News" +msgstr "" + +#: templates/blog/list.html:106 +#, python-brace-format +msgid "posted on {time}" +msgstr "" + +#: templates/blog/list.html:130 templates/problem/problem.html:310 +msgid "Clarifications" +msgstr "" + +#: templates/blog/list.html:146 templates/problem/problem.html:321 +msgid "No clarifications have been made at this time." +msgstr "" + +#: templates/blog/list.html:154 +msgid "Ongoing contests" +msgstr "Concursuri in desfășurare" + +#: templates/blog/list.html:172 +msgid "Upcoming contests" +msgstr "Concursuri programate" + +#: templates/blog/list.html:189 +msgid "Comment stream" +msgstr "Comentarii" + +#: templates/blog/list.html:208 +msgid "New problems" +msgstr "Probleme noi" + +#: templates/blog/list.html:225 +msgid "My open tickets" +msgstr "" + +#: templates/blog/list.html:246 +msgid "New tickets" +msgstr "" + +#: templates/comments/list.html:2 +msgid "Comments" +msgstr "Comentarii" + +#: templates/comments/list.html:18 templates/comments/list.html:27 +msgid "Please login to vote" +msgstr "" + +#: templates/comments/list.html:40 +#, python-brace-format +msgid "commented on {time}" +msgstr "" + +#: templates/comments/list.html:49 +#, python-format +msgid "edit %(edits)s" +msgstr "" + +#: templates/comments/list.html:51 templates/comments/media-js.html:77 +msgid "edited" +msgstr "" + +#: templates/comments/list.html:60 +msgid "Link" +msgstr "" + +#: templates/comments/list.html:73 templates/comments/list.html:80 +msgid "Reply" +msgstr "" + +#: templates/comments/list.html:86 +msgid "Hide" +msgstr "" + +#: templates/comments/list.html:101 +#, 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:120 +msgid "There are no comments at the moment." +msgstr "Nu sunt comentarii în acest moment." + +#: templates/comments/list.html:126 +msgid "New comment" +msgstr "Comentariu nou" + +#: templates/comments/list.html:140 +msgid "Invalid comment body." +msgstr "Invalid comment body." + +#: templates/comments/list.html:148 +msgid "Post!" +msgstr "Postează!" + +#: templates/comments/list.html:156 +msgid "Comments are disabled on this page." +msgstr "" + +#: templates/comments/media-js.html:72 +#, python-brace-format +msgid "edit {edits}" +msgstr "" + +#: templates/comments/media-js.html:75 +msgid "original" +msgstr "" + +#: templates/contest/access_code.html:26 +msgid "Invalid access code." +msgstr "" + +#: templates/contest/access_code.html:29 +msgid "Please enter your access code:" +msgstr "" + +#: templates/contest/access_code.html:32 +msgid "Join Contest" +msgstr "" + +#: templates/contest/calendar.html:12 +msgid "Sunday" +msgstr "Duminică" + +#: templates/contest/calendar.html:13 +msgid "Monday" +msgstr "Luni" + +#: templates/contest/calendar.html:14 +msgid "Tuesday" +msgstr "Marți" + +#: templates/contest/calendar.html:15 +msgid "Wednesday" +msgstr "Miercuri" + +#: templates/contest/calendar.html:16 +msgid "Thursday" +msgstr "Joi" + +#: templates/contest/calendar.html:17 +msgid "Friday" +msgstr "Vineri" + +#: templates/contest/calendar.html:18 +msgid "Saturday" +msgstr "Sâmbătă" + +#: 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 "Anterior" + +#: templates/contest/contest-list-tabs.html:10 +msgid "Today" +msgstr "" + +#: templates/contest/contest-list-tabs.html:13 +msgid "Next" +msgstr "Următor" + +#: templates/contest/contest-list-tabs.html:21 +#: templates/problem/problem-list-tabs.html:5 +msgid "List" +msgstr "" + +#: templates/contest/contest-list-tabs.html:22 +msgid "Calendar" +msgstr "" + +#: templates/contest/contest-tabs.html:4 +msgid "Info" +msgstr "" + +#: templates/contest/contest-tabs.html:8 +msgid "Rankings" +msgstr "" + +#: templates/contest/contest-tabs.html:10 +msgid "Hidden Rankings" +msgstr "" + +#: templates/contest/contest-tabs.html:18 +msgid "MOSS" +msgstr "" + +#: templates/contest/contest-tabs.html:23 +msgid "Clone" +msgstr "" + +#: templates/contest/contest-tabs.html:34 +#: templates/contest/contest-tabs.html:54 +msgid "Leave contest" +msgstr "Părăsiți concursul" + +#: templates/contest/contest-tabs.html:41 templates/contest/list.html:293 +msgid "Virtual join" +msgstr "" + +#: templates/contest/contest-tabs.html:52 +msgid "Stop spectating" +msgstr "" + +#: templates/contest/contest-tabs.html:61 +msgid "Spectate contest" +msgstr "" + +#: templates/contest/contest-tabs.html:67 +#: templates/contest/contest-tabs.html:73 +msgid "Join contest" +msgstr "Intră în concurs" + +#: templates/contest/contest-tabs.html:82 +msgid "Login to participate" +msgstr "" + +#: templates/contest/contest.html:37 +msgid "Participating virtually." +msgstr "" + +#: templates/contest/contest.html:43 +msgid "Contest is over." +msgstr "Concursul s-a terminat." + +#: templates/contest/contest.html:59 templates/contest/contest.html:63 +msgid "F j, Y, G:i T" +msgstr "F j, Y, G:i T" + +#: 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 +#, python-format +msgid "%(length)s long starting on %(start_time)s" +msgstr "%(length)s lung începând la %(start_time)s" + +#: templates/contest/contest.html:85 +msgid "AC Rate" +msgstr "" + +#: templates/contest/contest.html:86 templates/contest/list.html:153 +#: templates/contest/list.html:195 templates/contest/list.html:271 +#: templates/problem/list.html:212 templates/problem/list.html:238 +msgid "Users" +msgstr "Utilizatori" + +#: templates/contest/contest.html:111 +msgid "Editorial" +msgstr "" + +#: templates/contest/list.html:31 templates/contest/media-js.html:9 +msgid "Are you sure you want to join?" +msgstr "" + +#: 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:65 +msgid "hidden" +msgstr "" + +#: templates/contest/list.html:70 +msgid "private" +msgstr "" + +#: templates/contest/list.html:84 +msgid "rated" +msgstr "" + +#: templates/contest/list.html:132 +msgid "Spectate" +msgstr "" + +#: templates/contest/list.html:138 +msgid "Join" +msgstr "Intră" + +#: templates/contest/list.html:148 +msgid "Active Contests" +msgstr "" + +#: templates/contest/list.html:152 templates/contest/list.html:194 +#: templates/contest/list.html:232 templates/contest/list.html:270 +msgid "Contest" +msgstr "Concurs" + +#: templates/contest/list.html:190 +msgid "Ongoing Contests" +msgstr "Concursuri in desfășurare" + +#: templates/contest/list.html:227 +msgid "Upcoming Contests" +msgstr "Concursuri programate" + +#: templates/contest/list.html:255 +msgid "There are no scheduled contests at this time." +msgstr "Nu există concursuri programate în acest moment." + +#: templates/contest/list.html:261 +msgid "Past Contests" +msgstr "Concursuri terminate" + +#: templates/contest/media-js.html:4 +msgid "Are you sure you want to leave?" +msgstr "" + +#: 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 +msgid "Joining a contest starts your timer, after which it becomes unstoppable." +msgstr "" + +#: 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 "Numai următoarele organizații pot accesa acest concurs:" + +#: templates/contest/ranking-table.html:7 +msgid "Organization" +msgstr "Organizație" + +#: templates/contest/ranking-table.html:27 +#, python-brace-format +msgid "Started on {time}" +msgstr "" + +#: templates/contest/ranking-table.html:30 +msgid "Participation ended." +msgstr "" + +#: templates/contest/ranking.html:232 +msgid "View user participation" +msgstr "" + +#: templates/contest/ranking.html:236 +msgid "Show organizations" +msgstr "" + +#: templates/license.html:12 +msgid "Source:" +msgstr "Sursă:" + +#: 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 "Buletin" + +#: 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 "activează" + +#: templates/newsletter/subscription_unsubscribe_activated.html:8 +msgid "You have successfully been unsubscribed." +msgstr "Ați fost dezabonat cu succes." + +#: 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 "Dezabonare buletin" + +#: 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 "Solicitarea de dezabonare a fost primită cu succes. Un email a fost trimis către dumneavoastră cu un link pe care trebuie să îl accesați pentru a confirma dezabonarea." + +#: templates/newsletter/subscription_unsubscribe_user.html:17 +msgid "Do you want to unsubscribe from this newsletter?" +msgstr "Doriți să vă dezabonați de la acest buletin?" + +#: templates/newsletter/subscription_unsubscribe_user.html:21 +msgid "Unsubscribe" +msgstr "Dezabonare" + +#: 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 "Actualizare buletin" + +#: 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 "Din cauza unei erori tehnice, nu am fost capabili să trimitem email-ul de confirmare. Acest lucru ar putea fi din cauză că adresa de email introdusă nu este validă." + +#: templates/newsletter/subscription_update.html:14 +msgid "Update subscription" +msgstr "Actualizează abonamentul" + +#: templates/newsletter/subscription_update_activated.html:8 +msgid "Your subscription has successfully been updated." +msgstr "Abonamentul dumneavoastră a fost actualizat cu succes." + +#: 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 "Cererea dumneavoastră de actualizare a fost primită cu succes. Un email a fost trimis către dumneavoastră. Urmaţi link-ul de activare din acel email pentru a actualiza abonamentul." + +#: templates/organization/edit.html:46 +#: templates/organization/requests/pending.html:34 +#: templates/ticket/edit-notes.html:4 +msgid "Update" +msgstr "Actualizare" + +#: 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 "Părăsiţi organizaţia" + +#: templates/organization/home.html:29 +msgid "Join organization" +msgstr "Alăturaţi-vă organizaţiei" + +#: templates/organization/home.html:33 +msgid "Request membership" +msgstr "Cerere de membru" + +#: templates/organization/home.html:39 +msgid "Edit organization" +msgstr "Editează organizaţia" + +#: templates/organization/home.html:43 +msgid "View requests" +msgstr "Vezi solicitări" + +#: templates/organization/home.html:50 +msgid "Admin organization" +msgstr "" + +#: templates/organization/home.html:55 +msgid "View members" +msgstr "Vezi membrii" + +#: templates/organization/list.html:23 templates/status/language-list.html:34 +msgid "Name" +msgstr "Nume" + +#: templates/organization/list.html:24 +msgid "Members" +msgstr "Membrii" + +#: templates/organization/new.html:10 templates/ticket/new.html:38 +msgid "Create" +msgstr "Crează" + +#: templates/organization/requests/detail.html:13 +msgid "User:" +msgstr "Nume de utilizator:" + +#: templates/organization/requests/detail.html:17 +msgid "Organization:" +msgstr "Organizaţie:" + +#: templates/organization/requests/detail.html:25 +msgid "Time:" +msgstr "Ora:" + +#: templates/organization/requests/detail.html:29 +msgid "Reason:" +msgstr "Motiv:" + +#: templates/organization/requests/log.html:11 +#: templates/organization/requests/pending.html:14 +msgid "State" +msgstr "Stare" + +#: templates/organization/requests/log.html:12 +#: templates/organization/requests/pending.html:15 +msgid "Reason" +msgstr "Motiv" + +#: templates/organization/requests/log.html:28 +#: templates/organization/requests/pending.html:37 +msgid "There are no requests to approve." +msgstr "Nu aveți cereri de aprobare." + +#: templates/organization/requests/pending.html:17 +#: templates/problem/data.html:401 +msgid "Delete?" +msgstr "Ştergeţi?" + +#: templates/organization/requests/request.html:18 +msgid "Your reason for joining:" +msgstr "Motivul pentru care doriți să vă alăturați:" + +#: templates/organization/requests/request.html:20 +msgid "Request" +msgstr "Solicitare" + +#: templates/organization/requests/tabs.html:4 +msgid "Pending" +msgstr "Nehotărât" + +#: templates/organization/requests/tabs.html:7 +msgid "Log" +msgstr "Jurnal" + +#: templates/organization/requests/tabs.html:10 +msgid "Approved" +msgstr "Aprobat" + +#: templates/organization/requests/tabs.html:13 +msgid "Rejected" +msgstr "Respins" + +#: templates/organization/users-table.html:15 +msgid "Kick" +msgstr "" + +#: templates/problem/clone.html:37 +msgid "Enter a new code for the cloned problem:" +msgstr "" + +#: templates/problem/data.html:353 +msgid "View YAML" +msgstr "" + +#: templates/problem/data.html:369 +msgid "Show columns:" +msgstr "" + +#: templates/problem/data.html:372 templates/problem/data.html:396 +msgid "Output prefix" +msgstr "" + +#: templates/problem/data.html:376 templates/problem/data.html:397 +msgid "Output limit" +msgstr "" + +#: templates/problem/data.html:380 templates/problem/data.html:398 +msgid "Checker" +msgstr "" + +#: templates/problem/data.html:384 templates/problem/data.html:399 +msgid "Generator args" +msgstr "" + +#: templates/problem/data.html:391 +msgid "Type" +msgstr "" + +#: templates/problem/data.html:392 +msgid "Input file" +msgstr "" + +#: templates/problem/data.html:393 +msgid "Output file" +msgstr "" + +#: templates/problem/data.html:395 +msgid "Pretest?" +msgstr "" + +#: templates/problem/data.html:447 templates/problem/submit.html:252 +msgid "Submit!" +msgstr "Trimiteți!" + +#: templates/problem/data.html:448 +msgid "Add new case" +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 editorialist.

Submitting an official solution before solving the problem yourself is a bannable offence." +msgstr "" + +#: templates/problem/list.html:62 +msgid "Filter by type..." +msgstr "" + +#: templates/problem/list.html:185 +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:57 +msgid "Category" +msgstr "Categorie" + +#: templates/problem/list.html:209 templates/problem/list.html:228 +msgid "Types" +msgstr "Tipuri" + +#: templates/problem/list.html:235 +#, python-format +msgid "AC %%" +msgstr "" + +#: 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:142 +msgid "Filter by result:" +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 "Versiune PDF" + +#: templates/problem/problem.html:101 templates/problem/problem.html:111 +#: templates/problem/problem.html:116 +msgid "Submit solution" +msgstr "Trimite soluţie" + +#: templates/problem/problem.html:104 +#, python-format +msgid "%(counter)s submission left" +msgid_plural "%(counter)s submissions left" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: templates/problem/problem.html:112 +msgid "0 submissions left" +msgstr "" + +#: templates/problem/problem.html:124 +msgid "My submissions" +msgstr "Soluţiile mele" + +#: templates/problem/problem.html:128 +msgid "Best submissions" +msgstr "Cele mai bune soluţii" + +#: templates/problem/problem.html:132 +msgid "Read editorial" +msgstr "" + +#: templates/problem/problem.html:137 +msgid "Manage tickets" +msgstr "" + +#: templates/problem/problem.html:141 +msgid "Edit problem" +msgstr "Schimbă problema" + +#: templates/problem/problem.html:143 +msgid "Edit test data" +msgstr "" + +#: templates/problem/problem.html:148 +msgid "My tickets" +msgstr "" + +#: templates/problem/problem.html:156 +msgid "Manage submissions" +msgstr "" + +#: templates/problem/problem.html:162 +msgid "Clone problem" +msgstr "Duplică problemă" + +#: templates/problem/problem.html:169 +msgid "Points:" +msgstr "Puncte:" + +#: templates/problem/problem.html:172 templates/problem/problem.html:174 +msgid "(partial)" +msgstr "(parţial)" + +#: templates/problem/problem.html:179 +msgid "Time limit:" +msgstr "Limita de timp:" + +#: templates/problem/problem.html:191 +msgid "Memory limit:" +msgstr "Limita de memorie:" + +#: templates/problem/problem.html:210 +msgid "Author:" +msgid_plural "Authors:" +msgstr[0] "Autor:" +msgstr[1] "Autori:" +msgstr[2] "Autori:" + +#: templates/problem/problem.html:225 +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:238 +msgid "Allowed languages" +msgstr "Limbajele acceptate" + +#: templates/problem/problem.html:246 +#, python-format +msgid "No %(lang)s judge online" +msgstr "Nici un judge pentru %(lang)s e online" + +#: templates/problem/problem.html:257 +msgid "Judge:" +msgid_plural "Judges:" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: templates/problem/problem.html:274 +msgid "none available" +msgstr "" + +#: templates/problem/problem.html:299 +msgid "Request clarification" +msgstr "" + +#: templates/problem/problem.html:301 +msgid "Report an issue" +msgstr "" + +#: 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 +msgid "Search problems..." +msgstr "Căutaţi problemele..." + +#: templates/problem/search-form.html:14 +msgid "Full text search" +msgstr "" + +#: templates/problem/search-form.html:21 +msgid "Hide solved problems" +msgstr "Ascunde probleme rezolvate" + +#: 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 +msgid "All" +msgstr "Toate" + +#: templates/problem/search-form.html:46 +msgid "Problem types" +msgstr "" + +#: templates/problem/search-form.html:57 +msgid "Point range" +msgstr "" + +#: templates/problem/search-form.html:63 templates/submission/list.html:337 +#: templates/ticket/list.html:248 +msgid "Go" +msgstr "Caută" + +#: templates/problem/search-form.html:64 +msgid "Random" +msgstr "Aleatoriu" + +#: templates/problem/submit.html:192 +#, python-format +msgid "Warning! Your default language, %(default_language)s, is unavailable for this problem and has been deselected." +msgstr "" + +#: templates/problem/submit.html:203 +#, python-format +msgid "\n" +" You have %(left)s submission left\n" +" " +msgid_plural "\n" +" You have %(left)s submissions left\n" +" " +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: templates/problem/submit.html:212 +msgid "You have 0 submissions left" +msgstr "" + +#: templates/problem/submit.html:250 +msgid "No judge is available for this problem." +msgstr "Nici un judge nu este disponibil pentru această problemă." + +#: templates/registration/activate.html:3 +#, python-format +msgid "%(key)s is an invalid activation key." +msgstr "%(key)s este o cheie de activare invalidă." + +#: templates/registration/activation_complete.html:3 +msgid "Your account has been successfully activated." +msgstr "Contul a fost activat cu succes." + +#: templates/registration/login.html:43 +msgid "Invalid username or password." +msgstr "Nume de utilizator sau parolă invalide." + +#: templates/registration/login.html:61 +#: templates/registration/totp_auth.html:39 +msgid "Login!" +msgstr "Conectaţi-vă!" + +#: templates/registration/login.html:64 +msgid "Forgot your password?" +msgstr "Ai uitat parola?" + +#: templates/registration/login.html:67 +msgid "Or log in with..." +msgstr "Sau log in cu..." + +#: templates/registration/logout.html:3 +msgid "See you later!" +msgstr "Pe mai târziu!" + +#: templates/registration/password_change_done.html:3 +msgid "Your password was sucessfully changed." +msgstr "Parola a fost cu succes schimbată." + +#: templates/registration/password_change_form.html:8 +msgid "Change Password" +msgstr "Schimbă parola" + +#: templates/registration/password_reset.html:7 +msgid "Send Reset Email" +msgstr "Trimite email de resetare" + +#: templates/registration/password_reset_complete.html:3 +msgid "Your password has been set. You may go ahead and log in now" +msgstr "Parola dumneavoastră a fost setată. Acum puteți să vă logați" + +#: templates/registration/password_reset_confirm.html:9 +msgid "Reset Password" +msgstr "Resetează parola" + +#: 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 +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 +#, python-format +msgid "You're receiving this email because you requested a password reset for your user account at %(site_name)s." +msgstr "Ați primit acest email pentru că aţi solicitat resetarea parolei pentru contul dumneavoastră de utilizator pe %(site_name)s." + +#: templates/registration/password_reset_email.txt:3 +msgid "Please go to the following page and choose a new password:" +msgstr "Vă rugăm să accesați următoarea pagină şi să alegeţi o parolă nouă:" + +#: templates/registration/password_reset_email.txt:7 +msgid "Your username, in case you've forgotten:" +msgstr "Numele de utilizator, în cazul in care aţi uitat:" + +#: templates/registration/password_reset_email.txt:9 +msgid "Thanks for using our site!" +msgstr "Vă mulţumim pentru utilizarea site-ului nostru!" + +#: templates/registration/password_reset_email.txt:11 +#, python-format +msgid "The %(site_name)s team" +msgstr "Echipa %(site_name)s" + +#: templates/registration/password_reset_subject.txt:1 +#, python-format +msgid "Password reset on %(site_name)s" +msgstr "Parola resetată pe %(site_name)s" + +#: templates/registration/profile_creation.html:36 +#: templates/registration/username_select.html:7 +msgid "Continue >" +msgstr "Continuă >" + +#: 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 "V-ați înregistrat cu succes! Un email a fost trimis la adresa de email oferită pentru a confirma înregistrarea dumneavoastră." + +#: templates/registration/registration_form.html:166 +msgid "(again, for confirmation)" +msgstr "" + +#: templates/registration/registration_form.html:173 +msgid "(select your closest major city)" +msgstr "" + +#: templates/registration/registration_form.html:178 +msgid "pick from map" +msgstr "alege de pe hartă" + +#: templates/registration/registration_form.html:183 +msgid "Default language" +msgstr "" + +#: templates/registration/registration_form.html:186 +#: templates/user/edit-profile.html:162 +msgid "Affiliated organizations" +msgstr "" + +#: templates/registration/registration_form.html:192 +#: templates/user/edit-profile.html:121 +msgid "Notify me about upcoming contests" +msgstr "" + +#: templates/registration/registration_form.html:206 +msgid "By registering, you agree to our" +msgstr "" + +#: templates/registration/registration_form.html:207 +msgid "Terms & Conditions" +msgstr "" + +#: templates/registration/registration_form.html:210 +msgid "Register!" +msgstr "Înscrie-te!" + +#: templates/registration/totp_auth.html:36 +#: templates/registration/totp_disable.html:45 +#: templates/registration/totp_enable.html:83 +msgid "Enter the 6-digit code generated by your app:" +msgstr "" + +#: templates/registration/totp_auth.html:41 +#, python-format +msgid "If you lost your authentication device, please contact us at %(email)s." +msgstr "" + +#: templates/registration/totp_disable.html:38 +msgid "To protect your account, you must first authenticate before you can disable Two Factor Authentication." +msgstr "" + +#: templates/registration/totp_enable.html:71 +msgid "Scan this code with your authenticator app:" +msgstr "" + +#: templates/registration/totp_enable.html:72 +msgid "QR code" +msgstr "" + +#: templates/registration/totp_enable.html:73 +msgid "Or enter this code manually:" +msgstr "" + +#: templates/stats/base.html:9 templates/submission/list.html:345 +msgid "Statistics" +msgstr "Stastici" + +#: templates/stats/language.html:11 +msgid "Submission Statistics" +msgstr "" + +#: templates/stats/language.html:16 +msgid "Submissions by Language" +msgstr "Soluții după limbă" + +#: templates/stats/language.html:21 +msgid "AC Submissions by Language" +msgstr "Soluții corecte (AC) după limbă" + +#: templates/stats/language.html:26 +msgid "Language AC Rate" +msgstr "Procent soluții corecte (AC) după limbă" + +#: templates/status/judge-status-table.html:2 +msgid "Judge" +msgstr "" + +#: templates/status/judge-status-table.html:4 +msgid "Online" +msgstr "Conectat" + +#: templates/status/judge-status-table.html:6 +msgid "Uptime" +msgstr "Uptime" + +#: templates/status/judge-status-table.html:7 +msgid "Ping" +msgstr "Ping" + +#: templates/status/judge-status-table.html:8 +msgid "Load" +msgstr "Încărcare" + +#: 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 +msgid "There are no judges available at this time." +msgstr "" + +#: templates/status/language-list.html:33 templates/ticket/list.html:261 +msgid "ID" +msgstr "ID" + +#: templates/status/language-list.html:35 +msgid "Runtime Info" +msgstr "Runtime Info" + +#: templates/status/status-tabs.html:4 +msgid "Judges" +msgstr "Judges" + +#: templates/status/status-tabs.html:6 +msgid "Version Matrix" +msgstr "" + +#: templates/submission/internal-error-message.html:8 +msgid "An internal error occurred while grading." +msgstr "O eroare internă a apărut în timpul notării." + +#: templates/submission/internal-error-message.html:15 +msgid "Error information" +msgstr "" + +#: templates/submission/list.html:76 +msgid "Filter by status..." +msgstr "" + +#: templates/submission/list.html:82 +msgid "Filter by language..." +msgstr "" + +#: templates/submission/list.html:315 +msgid "Filter submissions" +msgstr "" + +#: templates/submission/list.html:351 +msgid "Total:" +msgstr "" + +#: templates/submission/list.html:361 +msgid "You were disconnected. Refresh to show latest updates." +msgstr "" + +#: templates/submission/row.html:39 +#, python-format +msgid "Case #%(case)s" +msgstr "" + +#: templates/submission/row.html:49 +msgid "view" +msgstr "vezi" + +#: templates/submission/row.html:53 +msgid "rejudge" +msgstr "rejurizează" + +#: templates/submission/row.html:58 +msgid "admin" +msgstr "admin" + +#: templates/submission/source.html:25 +msgid "View status" +msgstr "Vezi stare" + +#: templates/submission/source.html:26 +msgid "View raw source" +msgstr "" + +#: templates/submission/source.html:28 templates/submission/status.html:61 +msgid "Resubmit" +msgstr "Trimiteți din nou" + +#: templates/submission/status-testcases.html:10 +msgid "We are waiting for a suitable judge to process your submission..." +msgstr "Asteptam un judge potrivit pentru a procesa submiterea ta..." + +#: templates/submission/status-testcases.html:12 +msgid "Your submission is being processed..." +msgstr "Soluția ta este în curs de procesare..." + +#: templates/submission/status-testcases.html:14 +msgid "Compilation Error" +msgstr "Eroare de compilare" + +#: templates/submission/status-testcases.html:18 +msgid "Compilation Warnings" +msgstr "Avertismente de compilare" + +#: templates/submission/status-testcases.html:23 +msgid "Pretest Execution Results" +msgstr "" + +#: templates/submission/status-testcases.html:25 +msgid "Execution Results" +msgstr "Rezultate de executare" + +#: templates/submission/status-testcases.html:31 +msgid "Batch " +msgstr "Lot " + +#: templates/submission/status-testcases.html:43 +msgid "Case" +msgstr "Caz" + +#: templates/submission/status-testcases.html:45 +msgid "Pretest" +msgstr "Pretest" + +#: templates/submission/status-testcases.html:47 +msgid "Test case" +msgstr "Caz de test" + +#: templates/submission/status-testcases.html:79 +msgid "Your output (clipped)" +msgstr "Output-ul tau (micșorat)" + +#: templates/submission/status-testcases.html:90 +msgid "Judge feedback" +msgstr "" + +#: templates/submission/status-testcases.html:106 +msgid "Resources:" +msgstr "" + +#: templates/submission/status-testcases.html:115 +msgid "Final pretest score:" +msgstr "" + +#: templates/submission/status-testcases.html:117 +msgid "Final score:" +msgstr "Scor final:" + +#: templates/submission/status-testcases.html:131 +msgid "Passing pretests does not guarantee a full score on system tests." +msgstr "" + +#: templates/submission/status-testcases.html:134 +msgid "Submission aborted!" +msgstr "Soluția a fost anulată!" + +#: templates/submission/status.html:59 +msgid "View source" +msgstr "Vezi sursa" + +#: templates/submission/status.html:88 +msgid "Abort" +msgstr "Anuleaza" + +#: templates/submission/submission-list-tabs.html:6 +msgid "Mine" +msgstr "" + +#: templates/submission/submission-list-tabs.html:9 +msgid "Best" +msgstr "" + +#: templates/submission/submission-list-tabs.html:12 +#, python-format +msgid "%(user)s's" +msgstr "" + +#: templates/ticket/list.html:135 templates/ticket/ticket.html:257 +msgid "Reopened: " +msgstr "" + +#: templates/ticket/list.html:138 templates/ticket/ticket.html:258 +msgid "Closed: " +msgstr "" + +#: templates/ticket/list.html:221 +msgid "Use desktop notification" +msgstr "" + +#: templates/ticket/list.html:227 +msgid "Show my tickets only" +msgstr "" + +#: templates/ticket/list.html:231 +msgid "Filing user" +msgstr "" + +#: templates/ticket/list.html:240 +msgid "Assignee" +msgstr "" + +#: templates/ticket/list.html:262 +msgid "Title" +msgstr "" + +#: templates/ticket/list.html:264 templates/ticket/ticket.html:304 +msgid "Assignees" +msgstr "" + +#: templates/ticket/new_problem.html:7 +msgid "Thanks for opening a ticket!" +msgstr "" + +#: 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 +msgid "Associated object" +msgstr "" + +#: templates/ticket/ticket.html:309 +msgid "No one is assigned." +msgstr "" + +#: templates/ticket/ticket.html:315 +msgid "Close ticket" +msgstr "" + +#: templates/ticket/ticket.html:317 +msgid "Reopen ticket" +msgstr "" + +#: templates/ticket/ticket.html:321 +msgid "Assignee notes" +msgstr "" + +#: templates/ticket/ticket.html:328 templates/widgets/select_all.html:4 +msgid "Nothing here." +msgstr "Nimic aici." + +#: templates/ticket/ticket.html:378 +msgid "Post" +msgstr "" + +#: templates/user/base-users-table.html:3 +msgid "Rank" +msgstr "Rang" + +#: templates/user/base-users.html:14 templates/user/base-users.html:69 +msgid "Search by handle..." +msgstr "" + +#: templates/user/edit-profile.html:90 +msgid "Self-description" +msgstr "Auto-descriere" + +#: templates/user/edit-profile.html:98 +msgid "Select your closest major city" +msgstr "" + +#: templates/user/edit-profile.html:107 +msgid "Editor theme" +msgstr "" + +#: templates/user/edit-profile.html:112 +msgid "Math engine" +msgstr "" + +#: templates/user/edit-profile.html:136 templates/user/edit-profile.html:137 +msgid "Change your avatar" +msgstr "Schimbați avatarul" + +#: templates/user/edit-profile.html:143 +msgid "Change your password" +msgstr "Schimbați parola" + +#: templates/user/edit-profile.html:150 +msgid "Two Factor Authentication is enabled." +msgstr "" + +#: templates/user/edit-profile.html:153 +msgid "Two Factor Authentication is disabled." +msgstr "" + +#: templates/user/edit-profile.html:170 +msgid "User-script" +msgstr "Script de utilizator" + +#: templates/user/edit-profile.html:174 +msgid "Update profile" +msgstr "Actualizați profilul" + +#: templates/user/pp-row.html:22 +#, python-format +msgid "\n" +" weighted %(weight)s%%\n" +" " +msgstr "" + +#: templates/user/pp-row.html:27 +#, python-format +msgid "%(pp).1fpp" +msgstr "" + +#: templates/user/pp-row.html:29 +#, python-format +msgid "%(pp).0fpp" +msgstr "" + +#: templates/user/user-about.html:14 +msgid "From" +msgstr "De la" + +#: 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 "Despre" + +#: templates/user/user-about.html:40 +msgid "You have not shared any information." +msgstr "Nu aţi împărtăşit nicio informaţie." + +#: templates/user/user-about.html:42 +msgid "This user has not shared any information." +msgstr "Acest utilizator nu a împărtăşit nicio informaţie." + +#: templates/user/user-base.html:42 +#, python-format +msgid "%(counter)s problem solved" +msgid_plural "%(counter)s problems solved" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: templates/user/user-base.html:50 +msgid "Rank by points:" +msgstr "Clasament după puncte:" + +#: templates/user/user-base.html:53 +msgid "Total points:" +msgstr "Numărul total de puncte:" + +#: templates/user/user-base.html:68 +msgid "Rank by rating:" +msgstr "Clasament după rating:" + +#: templates/user/user-base.html:70 +msgid "Rating:" +msgstr "Rating:" + +#: templates/user/user-base.html:71 +msgid "Volatility:" +msgstr "Volatilitate:" + +#: templates/user/user-base.html:72 +msgid "Min. rating:" +msgstr "" + +#: templates/user/user-base.html:73 +msgid "Max rating:" +msgstr "" + +#: templates/user/user-problems.html:35 +msgid "Points Breakdown" +msgstr "" + +#: templates/user/user-problems.html:41 +msgid "Load more..." +msgstr "" + +#: templates/user/user-problems.html:45 +msgid "This user has not yet solved any problems." +msgstr "" + +#: templates/user/user-problems.html:51 +msgid "Authored Problems" +msgstr "Probleme create" + +#: templates/user/user-problems.html:83 +msgid "Hide problems I've solved" +msgstr "Ascunde probleme care am rezolvat" + +#: templates/user/user-problems.html:93 +#, python-format +msgid "%(points).1f points" +msgstr "" + +#: templates/user/user-problems.html:99 +msgid "Score" +msgstr "" + +#: templates/user/user-problems.html:110 +#, python-format +msgid "%(points)s / %(total)s" +msgstr "" + +#: templates/user/user-tabs.html:7 +msgid "Impersonate" +msgstr "" + +#: templates/user/user-tabs.html:13 +msgid "Admin User" +msgstr "" + +#: templates/user/user-tabs.html:16 +msgid "Admin Profile" +msgstr "" + +#: templates/widgets/select_all.html:8 +msgid "Check all" +msgstr "Selectează tot" + diff --git a/locale/ro/LC_MESSAGES/djangojs.po b/locale/ro/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..18cb4f6 --- /dev/null +++ b/locale/ro/LC_MESSAGES/djangojs.po @@ -0,0 +1,31 @@ +msgid "" +msgstr "" +"Project-Id-Version: dmoj\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-10-01 23:12+0000\n" +"PO-Revision-Date: 2019-11-11 22:05\n" +"Last-Translator: Icyene\n" +"Language-Team: Romanian\n" +"Language: ro_RO\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100>0 && n%100<20)) ? 1 : 2);\n" +"X-Generator: crowdin.com\n" +"X-Crowdin-Project: dmoj\n" +"X-Crowdin-Language: ro\n" +"X-Crowdin-File: djangojs.po\n" + +#: resources/common.js:207 +msgctxt "time format with day" +msgid "%d day %h:%m:%s" +msgid_plural "%d days %h:%m:%s" +msgstr[0] "%d zi %h:%m:%s" +msgstr[1] "%d zi %h:%m:%s" +msgstr[2] "%d zile %h:%m:%s" + +#: resources/common.js:210 +msgctxt "time format without day" +msgid "%h:%m:%s" +msgstr "%h:%m:%s" + diff --git a/locale/ru/LC_MESSAGES/django.po b/locale/ru/LC_MESSAGES/django.po new file mode 100644 index 0000000..1490303 --- /dev/null +++ b/locale/ru/LC_MESSAGES/django.po @@ -0,0 +1,4575 @@ +msgid "" +msgstr "" +"Project-Id-Version: dmoj\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-11-11 21:54+0000\n" +"PO-Revision-Date: 2019-11-11 22:05\n" +"Last-Translator: Icyene\n" +"Language-Team: Russian\n" +"Language: ru_RU\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n" +"X-Generator: crowdin.com\n" +"X-Crowdin-Project: dmoj\n" +"X-Crowdin-Language: ru\n" +"X-Crowdin-File: django.po\n" + +#: dmoj/settings.py:337 +msgid "German" +msgstr "немецкий" + +#: dmoj/settings.py:338 +msgid "English" +msgstr "английский" + +#: dmoj/settings.py:339 +msgid "Spanish" +msgstr "Испанский" + +#: dmoj/settings.py:340 +msgid "French" +msgstr "французский" + +#: dmoj/settings.py:341 +msgid "Croatian" +msgstr "Хорватский" + +#: dmoj/settings.py:342 +msgid "Hungarian" +msgstr "" + +#: dmoj/settings.py:343 +msgid "Japanese" +msgstr "" + +#: dmoj/settings.py:344 +msgid "Korean" +msgstr "Корейский" + +#: dmoj/settings.py:345 +msgid "Brazilian Portuguese" +msgstr "" + +#: dmoj/settings.py:346 +msgid "Romanian" +msgstr "Румынский" + +#: dmoj/settings.py:347 +msgid "Russian" +msgstr "русский" + +#: dmoj/settings.py:348 +msgid "Serbian (Latin)" +msgstr "Сербский (латиница)" + +#: dmoj/settings.py:349 +msgid "Turkish" +msgstr "Турецкий" + +#: dmoj/settings.py:350 +msgid "Vietnamese" +msgstr "Вьетнамский" + +#: dmoj/settings.py:351 +msgid "Simplified Chinese" +msgstr "Упрощенный китайский" + +#: dmoj/urls.py:54 +msgid "Login" +msgstr "Войти" + +#: dmoj/urls.py:102 templates/base.html:190 +msgid "Home" +msgstr "Главная" + +#: judge/admin/comments.py:40 +#, python-format +msgid "%d comment successfully hidden." +msgid_plural "%d comments successfully hidden." +msgstr[0] "%d комментарий успешно скрыт." +msgstr[1] "%d комментарий успешно скрыт." +msgstr[2] "%d комментариев успешно скрыты." +msgstr[3] "%d комментариев успешно скрыты." + +#: judge/admin/comments.py:43 +msgid "Hide comments" +msgstr "Скрыть комментарии" + +#: judge/admin/comments.py:47 +#, python-format +msgid "%d comment successfully unhidden." +msgid_plural "%d comments successfully unhidden." +msgstr[0] "%d комментарий успешно отображен." +msgstr[1] "%d комментарий успешно отображен." +msgstr[2] "%d комментарий успешно отображен." +msgstr[3] "%d комментарий успешно отображен." + +#: judge/admin/comments.py:50 +msgid "Unhide comments" +msgstr "Показать комментарии" + +#: judge/admin/comments.py:58 +msgid "Associated page" +msgstr "Связанная страница" + +#: judge/admin/contest.py:29 +msgid "Included contests" +msgstr "Включены конкурсы" + +#: judge/admin/contest.py:65 templates/contest/contest.html:83 +#: templates/contest/moss.html:43 templates/problem/list.html:206 +#: templates/problem/list.html:221 templates/user/user-problems.html:56 +#: templates/user/user-problems.html:98 +msgid "Problem" +msgstr "Проблема" + +#: judge/admin/contest.py:113 +msgid "Settings" +msgstr "" + +#: judge/admin/contest.py:115 +msgid "Scheduling" +msgstr "Расписание" + +#: judge/admin/contest.py:116 +msgid "Details" +msgstr "Детали" + +#: judge/admin/contest.py:117 +msgid "Format" +msgstr "" + +#: judge/admin/contest.py:118 templates/contest/ranking-table.html:5 +msgid "Rating" +msgstr "Рейтинг" + +#: judge/admin/contest.py:119 +msgid "Access" +msgstr "" + +#: judge/admin/contest.py:121 judge/admin/problem.py:131 +msgid "Justice" +msgstr "Судья" + +#: judge/admin/contest.py:159 +#, python-format +msgid "%d contest successfully marked as visible." +msgid_plural "%d contests successfully marked as visible." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: judge/admin/contest.py:162 +msgid "Mark contests as visible" +msgstr "" + +#: judge/admin/contest.py:166 +#, 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] "" + +#: judge/admin/contest.py:169 +msgid "Mark contests as hidden" +msgstr "" + +#: judge/admin/contest.py:180 judge/admin/submission.py:149 +#: judge/admin/submission.py:171 +msgid "You do not have the permission to rejudge submissions." +msgstr "У вас нет доступа перетестировать поссылки." + +#: judge/admin/contest.py:187 judge/admin/submission.py:155 +msgid "You do not have the permission to rejudge THAT many submissions." +msgstr "У вас нет доступа перетестировать ТАК много посылок." + +#: judge/admin/contest.py:194 judge/admin/submission.py:164 +#, 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] "" + +#: judge/admin/contest.py:265 +#, python-format +msgid "%d participation recalculated." +msgid_plural "%d participations recalculated." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: judge/admin/contest.py:268 +msgid "Recalculate results" +msgstr "" + +#: judge/admin/contest.py:272 judge/admin/organization.py:65 +msgid "username" +msgstr "имя пользователя" + +#: judge/admin/contest.py:277 templates/base.html:258 +msgid "virtual" +msgstr "виртуальный" + +#: judge/admin/interface.py:28 judge/models/interface.py:46 +msgid "link path" +msgstr "адресс ссылки" + +#: judge/admin/interface.py:62 +msgid "Content" +msgstr "Содержание" + +#: judge/admin/interface.py:63 +msgid "Summary" +msgstr "Сводка" + +#: judge/admin/interface.py:107 judge/models/contest.py:251 +#: judge/models/contest.py:355 judge/models/profile.py:189 +msgid "user" +msgstr "пользователь" + +#: judge/admin/interface.py:148 +msgid "object" +msgstr "" + +#: judge/admin/organization.py:34 judge/admin/problem.py:171 +#: judge/admin/profile.py:78 +msgid "View on site" +msgstr "Посмотреть на сайте" + +#: judge/admin/problem.py:28 +msgid "Describe the changes you made (optional)" +msgstr "Опишите изменения, которые вы сделали (не обязательно)" + +#: judge/admin/problem.py:126 +msgid "Social Media" +msgstr "Социальные сети" + +#: judge/admin/problem.py:127 +msgid "Taxonomy" +msgstr "" + +#: judge/admin/problem.py:128 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:58 +msgid "Points" +msgstr "Очки" + +#: judge/admin/problem.py:129 +msgid "Limits" +msgstr "Ограничения" + +#: judge/admin/problem.py:130 judge/admin/submission.py:232 +#: templates/stats/base.html:14 templates/submission/list.html:328 +msgid "Language" +msgstr "Язык" + +#: judge/admin/problem.py:132 +msgid "History" +msgstr "История" + +#: judge/admin/problem.py:168 +msgid "Authors" +msgstr "Авторы" + +#: judge/admin/problem.py:183 +#, python-format +msgid "%d problem successfully marked as public." +msgid_plural "%d problems successfully marked as public." +msgstr[0] "%d задача успешно сделана публичной." +msgstr[1] "%d задачи успешно сделаны публичными." +msgstr[2] "%d задачи успешно сделаны публичными." +msgstr[3] "%d задачи успешно сделаны публичными." + +#: judge/admin/problem.py:187 +msgid "Mark problems as public" +msgstr "Пометить задачу как публичную" + +#: judge/admin/problem.py:193 +#, python-format +msgid "%d problem successfully marked as private." +msgid_plural "%d problems successfully marked as private." +msgstr[0] "%d задача успешно сделана приватной." +msgstr[1] "%d задачи успешно сдаланы приватными." +msgstr[2] "%d задачи успешно сделаны приватными." +msgstr[3] "%d задачи успешно сделаны приватными." + +#: judge/admin/problem.py:197 +msgid "Mark problems as private" +msgstr "Пометить задачу как приватную" + +#: judge/admin/profile.py:32 +msgid "timezone" +msgstr "часовой пояс" + +#: judge/admin/profile.py:84 judge/admin/submission.py:211 +#: templates/organization/requests/log.html:9 +#: templates/organization/requests/pending.html:12 +#: templates/ticket/list.html:263 +msgid "User" +msgstr "Пользователь" + +#: judge/admin/profile.py:89 templates/registration/registration_form.html:145 +msgid "Email" +msgstr "Эл. почта" + +#: judge/admin/profile.py:94 judge/views/register.py:29 +#: templates/registration/registration_form.html:173 +#: templates/user/edit-profile.html:99 +msgid "Timezone" +msgstr "Часовой пояс" + +#: judge/admin/profile.py:99 +msgid "date joined" +msgstr "дата регистрации" + +#: judge/admin/profile.py:106 +#, python-format +msgid "%d user have scores recalculated." +msgid_plural "%d users have scores recalculated." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: judge/admin/profile.py:109 +msgid "Recalculate scores" +msgstr "Пересчитать баллы" + +#: judge/admin/runtime.py:19 +msgid "Disallowed problems" +msgstr "" + +#: judge/admin/runtime.py:22 +msgid "These problems are NOT allowed to be submitted in this language" +msgstr "Решения этих задач нельзя сдавать на этом языке" + +#: judge/admin/runtime.py:83 +msgid "Description" +msgstr "Описание" + +#: judge/admin/runtime.py:84 +msgid "Information" +msgstr "Информация" + +#: judge/admin/runtime.py:85 +msgid "Capabilities" +msgstr "Возможности" + +#: judge/admin/submission.py:23 judge/admin/submission.py:42 +#: judge/admin/submission.py:221 +msgid "None" +msgstr "Не указано" + +#: judge/admin/submission.py:23 +msgid "Not done" +msgstr "Не сделано" + +#: judge/admin/submission.py:23 +msgid "Exceptional" +msgstr "" + +#: judge/admin/submission.py:42 +msgid "Unaccepted" +msgstr "Незачтенный" + +#: judge/admin/submission.py:89 +#, python-format +msgctxt "contest problem" +msgid "%(problem)s in %(contest)s" +msgstr "%(problem)s в %(contest)s" + +#: judge/admin/submission.py:167 +msgid "Rejudge the selected submissions" +msgstr "Перетестировать выбранные посылки" + +#: judge/admin/submission.py:193 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] "" +msgstr[2] "" +msgstr[3] "" + +#: judge/admin/submission.py:196 +msgid "Rescore the selected submissions" +msgstr "" + +#: judge/admin/submission.py:200 +msgid "Problem code" +msgstr "Исходный код" + +#: judge/admin/submission.py:205 +msgid "Problem name" +msgstr "Название задачи" + +#: judge/admin/submission.py:215 templates/organization/requests/log.html:10 +#: templates/organization/requests/pending.html:13 +msgid "Time" +msgstr "Время" + +#: judge/admin/submission.py:223 +#, python-format +msgid "%d KB" +msgstr "%d KB" + +#: judge/admin/submission.py:225 +#, python-format +msgid "%.2f MB" +msgstr "%.2f MB" + +#: judge/admin/submission.py:227 +msgid "Memory" +msgstr "Память" + +#: judge/admin/taxon.py:11 judge/admin/taxon.py:34 +msgid "Included problems" +msgstr "" + +#: judge/admin/taxon.py:14 +msgid "These problems are included in this group of problems" +msgstr "Эти задачи включены в эту группу задач" + +#: judge/admin/taxon.py:37 +msgid "These problems are included in this type of problems" +msgstr "Эти задачи включены в этот тип задач" + +#: judge/apps.py:8 +msgid "Online Judge" +msgstr "Онлайн Judge" + +#: judge/comments.py:41 +msgid "Comment body" +msgstr "Содержание комментария" + +#: judge/comments.py:47 judge/views/ticket.py:46 +msgid "Your part is silent, little toad." +msgstr "" + +#: judge/comments.py:50 templates/comments/list.html:131 +msgid "You need to have solved at least one problem before your voice can be heard." +msgstr "Вам нужно решить хотя бы одну задачу, чтобы оставить комментарий." + +#: judge/comments.py:92 +msgid "Posted comment" +msgstr "" + +#: judge/contest_format/atcoder.py:19 +msgid "AtCoder" +msgstr "" + +#: judge/contest_format/default.py:18 +msgid "Default" +msgstr "" + +#: judge/contest_format/ecoo.py:19 +msgid "ECOO" +msgstr "" + +#: judge/contest_format/ioi.py:19 +msgid "IOI" +msgstr "" + +#: judge/forms.py:27 +msgid "Subscribe to contest updates" +msgstr "Уведомлять об изменениях в соревновании" + +#: judge/forms.py:28 +msgid "Enable experimental features" +msgstr "Включить экспериментальные возможности" + +#: judge/forms.py:57 judge/views/organization.py:127 +#, python-brace-format +msgid "You may not be part of more than {count} public organizations." +msgstr "Вы не можете состоять более чем в {count} публичных организациях." + +#: judge/forms.py:107 judge/views/register.py:26 +#: templates/registration/registration_form.html:139 +#: templates/user/base-users-table.html:5 +msgid "Username" +msgstr "Имя пользователя" + +#: judge/forms.py:108 templates/registration/registration_form.html:151 +#: templates/registration/registration_form.html:165 +msgid "Password" +msgstr "Пароль" + +#: judge/forms.py:130 +msgid "Two Factor Authentication tokens must be 6 decimal digits." +msgstr "" + +#: judge/forms.py:139 templates/registration/totp_auth.html:32 +msgid "Invalid Two Factor Authentication token." +msgstr "" + +#: judge/forms.py:143 judge/models/problem.py:97 +msgid "Problem code must be ^[a-z0-9]+$" +msgstr "" + +#: judge/forms.py:148 +msgid "Problem with code already exists." +msgstr "" + +#: judge/forms.py:153 judge/models/contest.py:51 +msgid "Contest id must be ^[a-z0-9]+$" +msgstr "" + +#: judge/forms.py:158 +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 "{time}" + +#: judge/jinja2/datetime.py:26 +#, python-brace-format +msgid "on {time}" +msgstr "" + +#: judge/models/choices.py:59 +msgid "Leave as LaTeX" +msgstr "Оставить LaTeX" + +#: judge/models/choices.py:60 +msgid "SVG with PNG fallback" +msgstr "" + +#: judge/models/choices.py:61 +msgid "MathML only" +msgstr "Только MathML" + +#: judge/models/choices.py:62 +msgid "MathJax with SVG/PNG fallback" +msgstr "" + +#: judge/models/choices.py:63 +msgid "Detect best quality" +msgstr "" + +#: judge/models/comment.py:25 +msgid "Page code must be ^[pcs]:[a-z0-9]+$|^b:\\d+$" +msgstr "" + +#: judge/models/comment.py:41 +msgid "commenter" +msgstr "комментатор" + +#: judge/models/comment.py:42 +msgid "posted time" +msgstr "время публикации" + +#: judge/models/comment.py:43 judge/models/comment.py:176 +msgid "associated page" +msgstr "" + +#: judge/models/comment.py:45 +msgid "votes" +msgstr "" + +#: judge/models/comment.py:46 +msgid "body of comment" +msgstr "тело комментария" + +#: judge/models/comment.py:47 +msgid "hide the comment" +msgstr "скрыть комментарий" + +#: judge/models/comment.py:48 +msgid "parent" +msgstr "родитель" + +#: judge/models/comment.py:53 +msgid "comment" +msgstr "комментарий" + +#: judge/models/comment.py:54 +msgid "comments" +msgstr "комментарии" + +#: judge/models/comment.py:136 judge/models/problem.py:406 +#, python-format +msgid "Editorial for %s" +msgstr "Разбор задач для %s" + +#: judge/models/comment.py:171 +msgid "comment vote" +msgstr "" + +#: judge/models/comment.py:172 +msgid "comment votes" +msgstr "" + +#: judge/models/comment.py:181 +msgid "Override comment lock" +msgstr "" + +#: judge/models/contest.py:21 +msgid "Invalid colour." +msgstr "Недопустимый цвет." + +#: judge/models/contest.py:23 +msgid "tag name" +msgstr "" + +#: judge/models/contest.py:24 +msgid "Lowercase letters and hyphens only." +msgstr "Только буквы нижнего регистра и дефисы." + +#: judge/models/contest.py:25 +msgid "tag colour" +msgstr "цвет тега" + +#: judge/models/contest.py:26 +msgid "tag description" +msgstr "описание тега" + +#: judge/models/contest.py:45 +msgid "contest tag" +msgstr "тег соревнования" + +#: judge/models/contest.py:46 judge/models/contest.py:100 +msgid "contest tags" +msgstr "теги соревнования" + +#: judge/models/contest.py:50 +msgid "contest id" +msgstr "" + +#: judge/models/contest.py:52 +msgid "contest name" +msgstr "название соревнования" + +#: judge/models/contest.py:53 +msgid "These people will be able to edit the contest." +msgstr "Эти люди будут иметь право изменять соревнование." + +#: judge/models/contest.py:55 judge/models/runtime.py:124 +#: src/dmoj-wpadmin/test_project/apps/books/admin.py:20 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:27 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:27 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:27 +msgid "description" +msgstr "описание" + +#: judge/models/contest.py:56 judge/models/problem.py:353 +#: judge/models/runtime.py:126 +msgid "problems" +msgstr "задачи" + +#: judge/models/contest.py:57 judge/models/contest.py:252 +msgid "start time" +msgstr "время начала" + +#: judge/models/contest.py:58 +msgid "end time" +msgstr "время конца" + +#: judge/models/contest.py:59 judge/models/problem.py:118 +#: judge/models/problem.py:377 +msgid "time limit" +msgstr "ограничение по памяти" + +#: judge/models/contest.py:60 judge/models/problem.py:136 +msgid "publicly visible" +msgstr "" + +#: judge/models/contest.py:61 +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:64 +msgid "contest rated" +msgstr "соревнование рейтинговое" + +#: judge/models/contest.py:64 +msgid "Whether this contest can be rated." +msgstr "Будте ли соревнование рейтинговым." + +#: judge/models/contest.py:66 +msgid "hide scoreboard" +msgstr "скрыть таблицу" + +#: judge/models/contest.py:67 +msgid "Whether the scoreboard should remain hidden for the duration of the contest." +msgstr "Должна ли таблица быть скрыта на протяжении соревнования." + +#: judge/models/contest.py:70 +msgid "no comments" +msgstr "без комментариев" + +#: judge/models/contest.py:71 +msgid "Use clarification system instead of comments." +msgstr "Используйте систему кларов вместо комментариев." + +#: judge/models/contest.py:73 +msgid "Rating floor for contest" +msgstr "" + +#: judge/models/contest.py:75 +msgid "Rating ceiling for contest" +msgstr "" + +#: judge/models/contest.py:77 +msgid "rate all" +msgstr "" + +#: judge/models/contest.py:77 +msgid "Rate all users who joined." +msgstr "" + +#: judge/models/contest.py:78 +msgid "exclude from ratings" +msgstr "" + +#: judge/models/contest.py:80 +msgid "private to specific users" +msgstr "" + +#: judge/models/contest.py:81 +msgid "private contestants" +msgstr "" + +#: judge/models/contest.py:82 +msgid "If private, only these users may see the contest" +msgstr "" + +#: judge/models/contest.py:84 +msgid "hide problem tags" +msgstr "спрятать тэги задач" + +#: judge/models/contest.py:85 +msgid "Whether problem tags should be hidden by default." +msgstr "" + +#: judge/models/contest.py:87 +msgid "run pretests only" +msgstr "запустить только претесты" + +#: judge/models/contest.py:88 +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:92 judge/models/problem.py:157 +msgid "private to organizations" +msgstr "" + +#: judge/models/contest.py:93 judge/models/problem.py:155 +#: judge/models/profile.py:76 +msgid "organizations" +msgstr "организации" + +#: judge/models/contest.py:94 +msgid "If private, only these organizations may see the contest" +msgstr "" + +#: judge/models/contest.py:95 judge/models/problem.py:145 +msgid "OpenGraph image" +msgstr "" + +#: judge/models/contest.py:96 judge/models/profile.py:47 +msgid "Logo override image" +msgstr "" + +#: judge/models/contest.py:98 +msgid "This image will replace the default site logo for users inside the contest." +msgstr "" + +#: judge/models/contest.py:101 +msgid "the amount of live participants" +msgstr "" + +#: judge/models/contest.py:102 +msgid "contest summary" +msgstr "" + +#: judge/models/contest.py:103 judge/models/problem.py:147 +msgid "Plain-text, shown in meta description tag, e.g. for social media." +msgstr "" + +#: judge/models/contest.py:104 judge/models/profile.py:46 +msgid "access code" +msgstr "" + +#: judge/models/contest.py:105 +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:107 judge/models/problem.py:141 +msgid "personae non gratae" +msgstr "" + +#: judge/models/contest.py:108 +msgid "Bans the selected users from joining this contest." +msgstr "" + +#: judge/models/contest.py:109 +msgid "contest format" +msgstr "" + +#: judge/models/contest.py:110 +msgid "The contest format module to use." +msgstr "" + +#: judge/models/contest.py:111 +msgid "contest format configuration" +msgstr "" + +#: judge/models/contest.py:112 +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:233 +msgid "See private contests" +msgstr "" + +#: judge/models/contest.py:234 +msgid "Edit own contests" +msgstr "" + +#: judge/models/contest.py:235 +msgid "Edit all contests" +msgstr "" + +#: judge/models/contest.py:236 +msgid "Clone contest" +msgstr "" + +#: judge/models/contest.py:237 templates/contest/moss.html:74 +msgid "MOSS contest" +msgstr "" + +#: judge/models/contest.py:238 +msgid "Rate contests" +msgstr "" + +#: judge/models/contest.py:239 +msgid "Contest access codes" +msgstr "" + +#: judge/models/contest.py:240 +msgid "Create private contests" +msgstr "" + +#: judge/models/contest.py:242 judge/models/contest.py:320 +#: judge/models/contest.py:356 judge/models/contest.py:378 +#: judge/models/submission.py:83 +msgid "contest" +msgstr "соревнование" + +#: judge/models/contest.py:243 +msgid "contests" +msgstr "соревнования" + +#: judge/models/contest.py:250 +msgid "associated contest" +msgstr "" + +#: judge/models/contest.py:253 +msgid "score" +msgstr "" + +#: judge/models/contest.py:254 +msgid "cumulative time" +msgstr "" + +#: judge/models/contest.py:255 +msgid "virtual participation id" +msgstr "" + +#: judge/models/contest.py:256 +msgid "0 means non-virtual, otherwise the n-th virtual participation" +msgstr "" + +#: judge/models/contest.py:257 +msgid "contest format specific data" +msgstr "" + +#: judge/models/contest.py:306 +#, python-format +msgid "%s spectating in %s" +msgstr "" + +#: judge/models/contest.py:308 +#, python-format +msgid "%s in %s, v%d" +msgstr "" + +#: judge/models/contest.py:309 +#, python-format +msgid "%s in %s" +msgstr "" + +#: judge/models/contest.py:312 +msgid "contest participation" +msgstr "участие в соревновании" + +#: judge/models/contest.py:313 +msgid "contest participations" +msgstr "" + +#: judge/models/contest.py:319 judge/models/contest.py:340 +#: judge/models/contest.py:379 judge/models/problem.py:352 +#: judge/models/problem.py:357 judge/models/problem.py:375 +#: judge/models/problem_data.py:35 +msgid "problem" +msgstr "задача" + +#: judge/models/contest.py:321 judge/models/contest.py:344 +#: judge/models/problem.py:129 +msgid "points" +msgstr "очки" + +#: judge/models/contest.py:322 +msgid "partial" +msgstr "частичный" + +#: judge/models/contest.py:323 judge/models/contest.py:345 +msgid "is pretested" +msgstr "" + +#: judge/models/contest.py:324 judge/models/interface.py:43 +msgid "order" +msgstr "порядок" + +#: judge/models/contest.py:325 +msgid "output prefix length override" +msgstr "" + +#: judge/models/contest.py:326 +msgid "Maximum number of submissions for this problem, or 0 for no limit." +msgstr "" + +#: judge/models/contest.py:328 +msgid "Why include a problem you can't submit to?" +msgstr "" + +#: judge/models/contest.py:333 +msgid "contest problem" +msgstr "" + +#: judge/models/contest.py:334 +msgid "contest problems" +msgstr "" + +#: judge/models/contest.py:338 judge/models/submission.py:181 +msgid "submission" +msgstr "посылка" + +#: judge/models/contest.py:342 judge/models/contest.py:357 +msgid "participation" +msgstr "участие" + +#: judge/models/contest.py:346 +msgid "Whether this submission was ran only on pretests." +msgstr "" + +#: judge/models/contest.py:350 +msgid "contest submission" +msgstr "" + +#: judge/models/contest.py:351 +msgid "contest submissions" +msgstr "" + +#: judge/models/contest.py:359 +msgid "rank" +msgstr "ранг" + +#: judge/models/contest.py:360 +msgid "rating" +msgstr "рейтинг" + +#: judge/models/contest.py:361 +msgid "volatility" +msgstr "" + +#: judge/models/contest.py:362 +msgid "last rated" +msgstr "" + +#: judge/models/contest.py:366 +msgid "contest rating" +msgstr "" + +#: judge/models/contest.py:367 +msgid "contest ratings" +msgstr "" + +#: judge/models/contest.py:386 +msgid "contest moss result" +msgstr "" + +#: judge/models/contest.py:387 +msgid "contest moss results" +msgstr "" + +#: judge/models/interface.py:24 +msgid "configuration item" +msgstr "" + +#: judge/models/interface.py:25 +msgid "miscellaneous configuration" +msgstr "" + +#: judge/models/interface.py:37 +msgid "navigation item" +msgstr "" + +#: judge/models/interface.py:38 +msgid "navigation bar" +msgstr "" + +#: judge/models/interface.py:44 +msgid "identifier" +msgstr "идентификатор" + +#: judge/models/interface.py:45 +msgid "label" +msgstr "метка" + +#: judge/models/interface.py:47 +msgid "highlight regex" +msgstr "подсветить regex" + +#: judge/models/interface.py:48 +msgid "parent item" +msgstr "" + +#: judge/models/interface.py:66 +msgid "post title" +msgstr "" + +#: judge/models/interface.py:67 judge/models/problem.py:395 +msgid "authors" +msgstr "авторы" + +#: judge/models/interface.py:68 +msgid "slug" +msgstr "" + +#: judge/models/interface.py:69 judge/models/problem.py:393 +msgid "public visibility" +msgstr "" + +#: judge/models/interface.py:70 +msgid "sticky" +msgstr "" + +#: judge/models/interface.py:71 +msgid "publish after" +msgstr "" + +#: judge/models/interface.py:72 +msgid "post content" +msgstr "" + +#: judge/models/interface.py:73 +msgid "post summary" +msgstr "" + +#: judge/models/interface.py:74 +msgid "openGraph image" +msgstr "" + +#: judge/models/interface.py:91 +msgid "Edit all posts" +msgstr "" + +#: judge/models/interface.py:93 +msgid "blog post" +msgstr "" + +#: judge/models/interface.py:94 +msgid "blog posts" +msgstr "" + +#: judge/models/message.py:11 +msgid "message title" +msgstr "заголовок сообщения" + +#: judge/models/message.py:12 judge/models/ticket.py:29 +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:26 +msgid "problem category ID" +msgstr "" + +#: judge/models/problem.py:27 +msgid "problem category name" +msgstr "" + +#: judge/models/problem.py:34 +msgid "problem type" +msgstr "" + +#: judge/models/problem.py:35 judge/models/problem.py:113 +msgid "problem types" +msgstr "" + +#: judge/models/problem.py:39 +msgid "problem group ID" +msgstr "" + +#: judge/models/problem.py:40 +msgid "problem group name" +msgstr "" + +#: judge/models/problem.py:47 judge/models/problem.py:116 +msgid "problem group" +msgstr "" + +#: judge/models/problem.py:48 +msgid "problem groups" +msgstr "" + +#: judge/models/problem.py:52 +msgid "key" +msgstr "" + +#: judge/models/problem.py:54 +msgid "link" +msgstr "" + +#: judge/models/problem.py:55 +msgid "full name" +msgstr "" + +#: judge/models/problem.py:56 judge/models/profile.py:32 +#: judge/models/runtime.py:23 +msgid "short name" +msgstr "" + +#: judge/models/problem.py:57 +msgid "Displayed on pages under this license" +msgstr "" + +#: judge/models/problem.py:58 +msgid "icon" +msgstr "" + +#: judge/models/problem.py:58 +msgid "URL to the icon" +msgstr "" + +#: judge/models/problem.py:59 +msgid "license text" +msgstr "" + +#: judge/models/problem.py:68 +msgid "license" +msgstr "" + +#: judge/models/problem.py:69 +msgid "licenses" +msgstr "" + +#: judge/models/problem.py:96 +msgid "problem code" +msgstr "" + +#: judge/models/problem.py:98 +msgid "A short, unique code for the problem, used in the url after /problem/" +msgstr "" + +#: judge/models/problem.py:100 +msgid "problem name" +msgstr "" + +#: judge/models/problem.py:101 +msgid "The full name of the problem, as shown in the problem list." +msgstr "" + +#: judge/models/problem.py:103 +msgid "problem body" +msgstr "" + +#: judge/models/problem.py:104 +msgid "creators" +msgstr "" + +#: judge/models/problem.py:105 +msgid "These users will be able to edit the problem, and be listed as authors." +msgstr "" + +#: judge/models/problem.py:107 +msgid "curators" +msgstr "" + +#: judge/models/problem.py:108 +msgid "These users will be able to edit the problem, but not be listed as authors." +msgstr "" + +#: judge/models/problem.py:110 +msgid "testers" +msgstr "" + +#: judge/models/problem.py:112 +msgid "These users will be able to view the private problem, but not edit it." +msgstr "" + +#: judge/models/problem.py:114 +msgid "The type of problem, as shown on the problem's page." +msgstr "" + +#: judge/models/problem.py:117 +msgid "The group of problem, shown under Category in the problem list." +msgstr "" + +#: judge/models/problem.py:119 +msgid "The time limit for this problem, in seconds. Fractional seconds (e.g. 1.5) are supported." +msgstr "" + +#: judge/models/problem.py:123 judge/models/problem.py:380 +msgid "memory limit" +msgstr "" + +#: judge/models/problem.py:124 +msgid "The memory limit for this problem, in kilobytes (e.g. 64mb = 65536 kilobytes)." +msgstr "" + +#: judge/models/problem.py:130 +msgid "Points awarded for problem completion. Points are displayed with a 'p' suffix if partial." +msgstr "" + +#: judge/models/problem.py:133 +msgid "allows partial points" +msgstr "" + +#: judge/models/problem.py:134 +msgid "allowed languages" +msgstr "" + +#: judge/models/problem.py:135 +msgid "List of allowed submission languages." +msgstr "" + +#: judge/models/problem.py:137 +msgid "manually managed" +msgstr "" + +#: judge/models/problem.py:138 +msgid "Whether judges should be allowed to manage data or not." +msgstr "" + +#: judge/models/problem.py:139 +msgid "date of publishing" +msgstr "" + +#: judge/models/problem.py:140 +msgid "Doesn't have magic ability to auto-publish due to backward compatibility" +msgstr "" + +#: judge/models/problem.py:142 +msgid "Bans the selected users from submitting to this problem." +msgstr "" + +#: judge/models/problem.py:144 +msgid "The license under which this problem is published." +msgstr "" + +#: judge/models/problem.py:146 +msgid "problem summary" +msgstr "" + +#: judge/models/problem.py:148 +msgid "number of users" +msgstr "" + +#: judge/models/problem.py:149 +msgid "The number of users who solved the problem." +msgstr "" + +#: judge/models/problem.py:150 +msgid "solve rate" +msgstr "" + +#: judge/models/problem.py:156 +msgid "If private, only these organizations may see the problem." +msgstr "" + +#: judge/models/problem.py:358 judge/models/problem.py:376 +#: judge/models/runtime.py:99 +msgid "language" +msgstr "язык" + +#: judge/models/problem.py:359 +msgid "translated name" +msgstr "" + +#: judge/models/problem.py:360 +msgid "translated description" +msgstr "" + +#: judge/models/problem.py:364 +msgid "problem translation" +msgstr "" + +#: judge/models/problem.py:365 +msgid "problem translations" +msgstr "" + +#: judge/models/problem.py:369 +msgid "clarified problem" +msgstr "" + +#: judge/models/problem.py:370 +msgid "clarification body" +msgstr "" + +#: judge/models/problem.py:371 +msgid "clarification timestamp" +msgstr "" + +#: judge/models/problem.py:386 +msgid "language-specific resource limit" +msgstr "" + +#: judge/models/problem.py:387 +msgid "language-specific resource limits" +msgstr "" + +#: judge/models/problem.py:391 +msgid "associated problem" +msgstr "" + +#: judge/models/problem.py:394 +msgid "publish date" +msgstr "" + +#: judge/models/problem.py:396 +msgid "editorial content" +msgstr "" + +#: judge/models/problem.py:412 +msgid "solution" +msgstr "" + +#: judge/models/problem.py:413 +msgid "solutions" +msgstr "" + +#: judge/models/problem_data.py:23 +msgid "Standard" +msgstr "" + +#: judge/models/problem_data.py:24 +msgid "Floats" +msgstr "" + +#: judge/models/problem_data.py:25 +msgid "Floats (absolute)" +msgstr "" + +#: judge/models/problem_data.py:26 +msgid "Floats (relative)" +msgstr "" + +#: judge/models/problem_data.py:27 +msgid "Non-trailing spaces" +msgstr "" + +#: judge/models/problem_data.py:28 +msgid "Unordered" +msgstr "" + +#: judge/models/problem_data.py:29 +msgid "Byte identical" +msgstr "" + +#: 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:39 +msgid "generator file" +msgstr "" + +#: judge/models/problem_data.py:41 judge/models/problem_data.py:90 +msgid "output prefix length" +msgstr "" + +#: judge/models/problem_data.py:42 judge/models/problem_data.py:91 +msgid "output limit length" +msgstr "" + +#: judge/models/problem_data.py:43 +msgid "init.yml generation feedback" +msgstr "" + +#: judge/models/problem_data.py:44 judge/models/problem_data.py:92 +msgid "checker" +msgstr "" + +#: judge/models/problem_data.py:45 judge/models/problem_data.py:93 +msgid "checker arguments" +msgstr "" + +#: 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:77 +msgid "problem data set" +msgstr "" + +#: judge/models/problem_data.py:79 +msgid "case position" +msgstr "" + +#: judge/models/problem_data.py:80 +msgid "case type" +msgstr "" + +#: judge/models/problem_data.py:81 +msgid "Normal case" +msgstr "" + +#: judge/models/problem_data.py:82 +msgid "Batch start" +msgstr "" + +#: judge/models/problem_data.py:83 +msgid "Batch end" +msgstr "" + +#: judge/models/problem_data.py:85 +msgid "input file name" +msgstr "" + +#: judge/models/problem_data.py:86 +msgid "output file name" +msgstr "" + +#: judge/models/problem_data.py:87 +msgid "generator arguments" +msgstr "" + +#: judge/models/problem_data.py:88 +msgid "point value" +msgstr "" + +#: judge/models/problem_data.py:89 +msgid "case is pretest?" +msgstr "" + +#: judge/models/profile.py:29 +msgid "organization title" +msgstr "" + +#: judge/models/profile.py:30 +msgid "organization slug" +msgstr "" + +#: judge/models/profile.py:31 +msgid "Organization name shown in URL" +msgstr "" + +#: judge/models/profile.py:33 +msgid "Displayed beside user name during contests" +msgstr "" + +#: judge/models/profile.py:34 +msgid "organization description" +msgstr "" + +#: judge/models/profile.py:35 +msgid "registrant" +msgstr "" + +#: judge/models/profile.py:36 +msgid "User who registered this organization" +msgstr "" + +#: judge/models/profile.py:37 +msgid "administrators" +msgstr "" + +#: judge/models/profile.py:38 +msgid "Those who can edit this organization" +msgstr "" + +#: judge/models/profile.py:39 +msgid "creation date" +msgstr "" + +#: judge/models/profile.py:40 +msgid "is open organization?" +msgstr "" + +#: judge/models/profile.py:41 +msgid "Allow joining organization" +msgstr "" + +#: judge/models/profile.py:42 +msgid "maximum size" +msgstr "" + +#: judge/models/profile.py:43 +msgid "Maximum amount of users in this organization, only applicable to private organizations" +msgstr "" + +#: judge/models/profile.py:45 +msgid "Student access code" +msgstr "" + +#: judge/models/profile.py:49 +msgid "This image will replace the default site logo for users viewing the organization." +msgstr "" + +#: judge/models/profile.py:75 judge/models/profile.py:91 +#: judge/models/profile.py:190 +msgid "organization" +msgstr "" + +#: judge/models/profile.py:80 +msgid "user associated" +msgstr "" + +#: judge/models/profile.py:81 +msgid "self-description" +msgstr "" + +#: judge/models/profile.py:82 +msgid "location" +msgstr "" + +#: judge/models/profile.py:84 +msgid "preferred language" +msgstr "" + +#: judge/models/profile.py:89 +msgid "last access time" +msgstr "" + +#: judge/models/profile.py:90 +msgid "last IP" +msgstr "" + +#: judge/models/profile.py:93 +msgid "display rank" +msgstr "" + +#: judge/models/profile.py:95 +msgid "comment mute" +msgstr "" + +#: judge/models/profile.py:95 +msgid "Some users are at their best when silent." +msgstr "" + +#: judge/models/profile.py:97 +msgid "unlisted user" +msgstr "" + +#: judge/models/profile.py:97 +msgid "User will not be ranked." +msgstr "" + +#: judge/models/profile.py:100 +msgid "user script" +msgstr "" + +#: judge/models/profile.py:101 +msgid "User-defined JavaScript for site customization." +msgstr "" + +#: judge/models/profile.py:102 +msgid "current contest" +msgstr "" + +#: judge/models/profile.py:104 +msgid "math engine" +msgstr "" + +#: judge/models/profile.py:106 +msgid "the rendering engine used to render math" +msgstr "" + +#: judge/models/profile.py:107 +msgid "2FA enabled" +msgstr "" + +#: judge/models/profile.py:108 +msgid "check to enable TOTP-based two factor authentication" +msgstr "" + +#: judge/models/profile.py:109 +msgid "TOTP key" +msgstr "" + +#: judge/models/profile.py:110 +msgid "32 character base32-encoded key for TOTP" +msgstr "" + +#: judge/models/profile.py:112 +msgid "TOTP key must be empty or base32" +msgstr "" + +#: judge/models/profile.py:113 +msgid "internal notes" +msgstr "" + +#: judge/models/profile.py:114 +msgid "Notes for administrators regarding this user." +msgstr "" + +#: judge/models/profile.py:184 +msgid "user profile" +msgstr "" + +#: judge/models/profile.py:185 +msgid "user profiles" +msgstr "" + +#: judge/models/profile.py:192 +msgid "request time" +msgstr "" + +#: judge/models/profile.py:193 +msgid "state" +msgstr "" + +#: judge/models/profile.py:198 +msgid "reason" +msgstr "" + +#: judge/models/profile.py:201 +msgid "organization join request" +msgstr "" + +#: judge/models/profile.py:202 +msgid "organization join requests" +msgstr "" + +#: judge/models/runtime.py:18 +msgid "short identifier" +msgstr "" + +#: judge/models/runtime.py:19 +msgid "The identifier for this language; the same as its executor id for judges." +msgstr "" + +#: judge/models/runtime.py:21 +msgid "long name" +msgstr "" + +#: judge/models/runtime.py:22 +msgid "Longer name for the language, e.g. \"Python 2\" or \"C++11\"." +msgstr "" + +#: judge/models/runtime.py:24 +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:28 +msgid "common name" +msgstr "" + +#: judge/models/runtime.py:29 +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:31 +msgid "ace mode name" +msgstr "" + +#: judge/models/runtime.py:32 +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:34 +msgid "pygments name" +msgstr "" + +#: judge/models/runtime.py:35 +msgid "Language ID for Pygments highlighting in source windows." +msgstr "" + +#: judge/models/runtime.py:36 +msgid "code template" +msgstr "" + +#: judge/models/runtime.py:37 +msgid "Code template to display in submission editor." +msgstr "" + +#: judge/models/runtime.py:38 +msgid "runtime info override" +msgstr "" + +#: judge/models/runtime.py:39 +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:41 +msgid "language description" +msgstr "" + +#: judge/models/runtime.py:42 +msgid "Use field this to inform users of quirks with your environment, additional restrictions, etc." +msgstr "" + +#: judge/models/runtime.py:44 +msgid "extension" +msgstr "" + +#: judge/models/runtime.py:45 +msgid "The extension of source files, e.g., \"py\" or \"cpp\"." +msgstr "" + +#: judge/models/runtime.py:100 +msgid "languages" +msgstr "Языки" + +#: judge/models/runtime.py:104 +msgid "language to which this runtime belongs" +msgstr "" + +#: judge/models/runtime.py:105 +msgid "judge on which this runtime exists" +msgstr "" + +#: judge/models/runtime.py:106 +msgid "runtime name" +msgstr "" + +#: judge/models/runtime.py:107 +msgid "runtime version" +msgstr "" + +#: judge/models/runtime.py:108 +msgid "order in which to display this runtime" +msgstr "" + +#: judge/models/runtime.py:112 +msgid "Server name, hostname-style" +msgstr "" + +#: judge/models/runtime.py:113 +msgid "time of creation" +msgstr "" + +#: judge/models/runtime.py:114 +msgid "A key to authenticated this judge" +msgstr "" + +#: judge/models/runtime.py:115 +msgid "authentication key" +msgstr "" + +#: judge/models/runtime.py:116 +msgid "block judge" +msgstr "" + +#: judge/models/runtime.py:117 +msgid "Whether this judge should be blocked from connecting, even if its key is correct." +msgstr "" + +#: judge/models/runtime.py:119 +msgid "judge online status" +msgstr "" + +#: judge/models/runtime.py:120 +msgid "judge start time" +msgstr "" + +#: judge/models/runtime.py:121 +msgid "response time" +msgstr "" + +#: judge/models/runtime.py:122 +msgid "system load" +msgstr "" + +#: judge/models/runtime.py:123 +msgid "Load for the last minute, divided by processors to be fair." +msgstr "" + +#: judge/models/runtime.py:127 judge/models/runtime.py:167 +msgid "judges" +msgstr "" + +#: judge/models/runtime.py:166 +msgid "judge" +msgstr "" + +#: judge/models/submission.py:20 judge/models/submission.py:47 +#: judge/utils/problems.py:86 +msgid "Accepted" +msgstr "" + +#: judge/models/submission.py:21 judge/models/submission.py:48 +msgid "Wrong Answer" +msgstr "" + +#: judge/models/submission.py:22 judge/models/submission.py:50 +msgid "Time Limit Exceeded" +msgstr "" + +#: judge/models/submission.py:23 judge/models/submission.py:51 +msgid "Memory Limit Exceeded" +msgstr "" + +#: judge/models/submission.py:24 judge/models/submission.py:52 +msgid "Output Limit Exceeded" +msgstr "" + +#: judge/models/submission.py:25 judge/models/submission.py:53 +msgid "Invalid Return" +msgstr "" + +#: judge/models/submission.py:26 judge/models/submission.py:54 +msgid "Runtime Error" +msgstr "" + +#: judge/models/submission.py:27 judge/models/submission.py:41 +#: judge/models/submission.py:55 judge/utils/problems.py:88 +msgid "Compile Error" +msgstr "" + +#: judge/models/submission.py:28 judge/models/submission.py:40 +msgid "Internal Error" +msgstr "" + +#: judge/models/submission.py:29 +msgid "Short circuit" +msgstr "" + +#: judge/models/submission.py:30 judge/models/submission.py:42 +#: judge/models/submission.py:61 +msgid "Aborted" +msgstr "" + +#: judge/models/submission.py:36 judge/models/submission.py:57 +msgid "Queued" +msgstr "" + +#: judge/models/submission.py:37 judge/models/submission.py:58 +msgid "Processing" +msgstr "" + +#: judge/models/submission.py:38 judge/models/submission.py:59 +msgid "Grading" +msgstr "" + +#: judge/models/submission.py:39 judge/models/submission.py:60 +msgid "Completed" +msgstr "" + +#: judge/models/submission.py:56 +msgid "Internal Error (judging server error)" +msgstr "" + +#: judge/models/submission.py:66 +msgid "submission time" +msgstr "" + +#: judge/models/submission.py:67 judge/models/submission.py:201 +msgid "execution time" +msgstr "" + +#: judge/models/submission.py:68 judge/models/submission.py:202 +msgid "memory usage" +msgstr "" + +#: judge/models/submission.py:69 judge/models/submission.py:203 +msgid "points granted" +msgstr "" + +#: judge/models/submission.py:70 +msgid "submission language" +msgstr "" + +#: judge/models/submission.py:71 +msgid "status" +msgstr "" + +#: judge/models/submission.py:72 +msgid "result" +msgstr "" + +#: judge/models/submission.py:74 +msgid "compile errors" +msgstr "" + +#: judge/models/submission.py:76 +msgid "batched cases" +msgstr "" + +#: judge/models/submission.py:77 +msgid "test case points" +msgstr "" + +#: judge/models/submission.py:78 +msgid "test case total points" +msgstr "" + +#: judge/models/submission.py:79 +msgid "judged on" +msgstr "" + +#: judge/models/submission.py:81 +msgid "was rejudged by admin" +msgstr "" + +#: judge/models/submission.py:82 +msgid "was ran on pretests only" +msgstr "" + +#: judge/models/submission.py:182 templates/contest/moss.html:58 +msgid "submissions" +msgstr "" + +#: judge/models/submission.py:186 judge/models/submission.py:197 +msgid "associated submission" +msgstr "" + +#: judge/models/submission.py:188 +msgid "source code" +msgstr "" + +#: judge/models/submission.py:199 +msgid "test case ID" +msgstr "" + +#: judge/models/submission.py:200 +msgid "status flag" +msgstr "" + +#: judge/models/submission.py:204 +msgid "points possible" +msgstr "" + +#: judge/models/submission.py:205 +msgid "batch number" +msgstr "" + +#: judge/models/submission.py:206 +msgid "judging feedback" +msgstr "" + +#: judge/models/submission.py:207 +msgid "extended judging feedback" +msgstr "" + +#: judge/models/submission.py:208 +msgid "program output" +msgstr "" + +#: judge/models/submission.py:216 +msgid "submission test case" +msgstr "" + +#: judge/models/submission.py:217 +msgid "submission test cases" +msgstr "" + +#: judge/models/ticket.py:10 +msgid "ticket title" +msgstr "" + +#: judge/models/ticket.py:11 +msgid "ticket creator" +msgstr "" + +#: judge/models/ticket.py:13 +msgid "creation time" +msgstr "" + +#: judge/models/ticket.py:14 +msgid "assignees" +msgstr "" + +#: judge/models/ticket.py:15 +msgid "quick notes" +msgstr "" + +#: judge/models/ticket.py:16 +msgid "Staff notes for this issue to aid in processing." +msgstr "" + +#: judge/models/ticket.py:17 +msgid "linked item type" +msgstr "" + +#: judge/models/ticket.py:19 +msgid "linked item ID" +msgstr "" + +#: judge/models/ticket.py:21 +msgid "is ticket open?" +msgstr "" + +#: judge/models/ticket.py:25 +msgid "ticket" +msgstr "" + +#: judge/models/ticket.py:27 +msgid "poster" +msgstr "" + +#: judge/models/ticket.py:30 +msgid "message time" +msgstr "" + +#: judge/pdf_problems.py:134 judge/pdf_problems.py:186 +#: judge/pdf_problems.py:246 +msgid "Page [page] of [topage]" +msgstr "" + +#: judge/tasks/moss.py:25 +msgid "Running MOSS" +msgstr "" + +#: judge/tasks/submission.py:43 +msgid "Modifying submissions" +msgstr "" + +#: judge/tasks/submission.py:56 +msgid "Recalculating user points" +msgstr "" + +#: judge/utils/problem_data.py:63 +msgid "Empty batches not allowed." +msgstr "" + +#: 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 +#, python-format +msgid "Input file for case %d does not exist: %s" +msgstr "" + +#: 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 +#, python-format +msgid "Batch start case #%d requires points." +msgstr "" + +#: 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 +msgid "How did you corrupt the zip path?" +msgstr "" + +#: judge/utils/problem_data.py:160 +msgid "How did you corrupt the generator path?" +msgstr "" + +#: judge/utils/problems.py:76 +msgid "Can't pass both queryset and keyword filters" +msgstr "" + +#: judge/utils/problems.py:87 +msgid "Wrong" +msgstr "" + +#: judge/utils/problems.py:89 +msgid "Timeout" +msgstr "" + +#: judge/utils/problems.py:90 +msgid "Error" +msgstr "" + +#: 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/timedelta.py:49 +msgctxt "time format with day" +msgid "%d day %h:%m:%s" +msgid_plural "%d days %h:%m:%s" +msgstr[0] "%d день %h:%m:%s" +msgstr[1] "%d дня %h:%m:%s" +msgstr[2] "%d дней %h:%m:%s" +msgstr[3] "%d дней %h:%m:%s" + +#: judge/utils/timedelta.py:53 +msgctxt "time format without day" +msgid "%h:%m:%s" +msgstr "%h:%m:%s" + +#: 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] "%d день %h:%m" +msgstr[1] "%d дня %h:%m" +msgstr[2] "%d дней %h:%m" +msgstr[3] "%d дней %h:%m" + +#: judge/utils/timedelta.py:61 +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d день" +msgstr[1] "%d дня" +msgstr[2] "%d дней" +msgstr[3] "%d дней" + +#: judge/utils/timedelta.py:63 +msgctxt "hours and minutes" +msgid "%h:%m" +msgstr "%h:%m" + +#: judge/views/blog.py:38 +#, python-format +msgid "Page %d of Posts" +msgstr "" + +#: judge/views/comment.py:27 +msgid "Messing around, are we?" +msgstr "" + +#: judge/views/comment.py:36 +msgid "You must solve at least one problem before you can vote." +msgstr "" + +#: judge/views/comment.py:63 +msgid "You already voted." +msgstr "" + +#: judge/views/comment.py:120 judge/views/organization.py:299 +msgid "Edited from site" +msgstr "" + +#: judge/views/comment.py:141 +msgid "Editing comment" +msgstr "" + +#: judge/views/contests.py:49 judge/views/contests.py:211 +#: judge/views/contests.py:214 judge/views/contests.py:385 +msgid "No such contest" +msgstr "" + +#: judge/views/contests.py:50 judge/views/contests.py:212 +#, python-format +msgid "Could not find a contest with the key \"%s\"." +msgstr "" + +#: judge/views/contests.py:75 +msgid "Contests" +msgstr "" + +#: judge/views/contests.py:215 +msgid "Could not find such contest." +msgstr "" + +#: judge/views/contests.py:218 +#, python-format +msgid "Access to contest \"%s\" denied" +msgstr "" + +#: judge/views/contests.py:242 +msgid "Clone Contest" +msgstr "" + +#: judge/views/contests.py:305 +msgid "Contest not ongoing" +msgstr "" + +#: judge/views/contests.py:306 +#, python-format +msgid "\"%s\" is not currently ongoing." +msgstr "" + +#: judge/views/contests.py:310 +msgid "Already in contest" +msgstr "" + +#: judge/views/contests.py:311 +#, python-format +msgid "You are already in a contest: \"%s\"." +msgstr "" + +#: judge/views/contests.py:314 +msgid "Banned from joining" +msgstr "" + +#: judge/views/contests.py:315 +msgid "You have been declared persona non grata for this contest. You are permanently barred from joining this contest." +msgstr "" + +#: judge/views/contests.py:375 +#, python-format +msgid "Enter access code for \"%s\"" +msgstr "" + +#: judge/views/contests.py:386 +#, python-format +msgid "You are not in contest \"%s\"." +msgstr "" + +#: judge/views/contests.py:405 +msgid "ContestCalendar requires integer year and month" +msgstr "" + +#: judge/views/contests.py:445 +#, python-format +msgid "Contests in %(month)s" +msgstr "" + +#: judge/views/contests.py:445 +msgid "F Y" +msgstr "" + +#: judge/views/contests.py:531 +msgid "???" +msgstr "" + +#: judge/views/contests.py:594 +#, python-format +msgid "%s Rankings" +msgstr "" + +#: judge/views/contests.py:610 +#, python-format +msgid "Your participation in %s" +msgstr "" + +#: judge/views/contests.py:611 +#, python-format +msgid "%s's participation in %s" +msgstr "" + +#: judge/views/contests.py:615 +msgid "Live" +msgstr "Онлайн" + +#: judge/views/contests.py:627 templates/contest/contest-tabs.html:13 +msgid "Participation" +msgstr "" + +#: judge/views/contests.py:654 +#, python-format +msgid "%s MOSS Results" +msgstr "" + +#: judge/views/contests.py:681 +#, python-format +msgid "Running MOSS for %s..." +msgstr "" + +#: judge/views/contests.py:704 +#, python-format +msgid "Contest tag: %s" +msgstr "" + +#: judge/views/error.py:14 +msgid "404 error" +msgstr "" + +#: judge/views/error.py:15 +#, python-format +msgid "Could not find page \"%s\"" +msgstr "" + +#: judge/views/error.py:22 +#, python-format +msgid "no permission for %s" +msgstr "" + +#: 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 +msgid "Runtimes" +msgstr "" + +#: judge/views/organization.py:44 judge/views/organization.py:47 +msgid "No such organization" +msgstr "" + +#: judge/views/organization.py:45 +#, python-format +msgid "Could not find an organization with the key \"%s\"." +msgstr "" + +#: judge/views/organization.py:48 +msgid "Could not find such organization." +msgstr "" + +#: judge/views/organization.py:72 judge/views/register.py:34 +#: templates/organization/list.html:15 templates/user/user-list-tabs.html:5 +msgid "Organizations" +msgstr "" + +#: judge/views/organization.py:93 +#, python-format +msgid "%s Members" +msgstr "" + +#: judge/views/organization.py:118 judge/views/organization.py:121 +#: judge/views/organization.py:126 +msgid "Joining organization" +msgstr "" + +#: judge/views/organization.py:118 +msgid "You are already in the organization." +msgstr "" + +#: judge/views/organization.py:121 +msgid "This organization is not open." +msgstr "" + +#: judge/views/organization.py:138 +msgid "Leaving organization" +msgstr "" + +#: judge/views/organization.py:138 +#, python-format +msgid "You are not in \"%s\"." +msgstr "" + +#: judge/views/organization.py:162 +#, python-format +msgid "Request to join %s" +msgstr "" + +#: judge/views/organization.py:180 +msgid "Join request detail" +msgstr "" + +#: judge/views/organization.py:209 +#, python-format +msgid "Managing join requests for %s" +msgstr "" + +#: judge/views/organization.py:240 +#, python-format +msgid "Your organization can only receive %d more members. You cannot approve %d users." +msgstr "" + +#: judge/views/organization.py:252 +#, python-format +msgid "Approved %d user." +msgid_plural "Approved %d users." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: judge/views/organization.py:253 +#, python-format +msgid "Rejected %d user." +msgid_plural "Rejected %d users." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: judge/views/organization.py:283 +#, python-format +msgid "Editing %s" +msgstr "" + +#: judge/views/organization.py:307 judge/views/organization.py:315 +msgid "Can't edit organization" +msgstr "" + +#: judge/views/organization.py:308 +msgid "You are not allowed to edit this organization." +msgstr "" + +#: judge/views/organization.py:316 +msgid "You are not allowed to kick people from this organization." +msgstr "" + +#: judge/views/organization.py:321 judge/views/organization.py:325 +msgid "Can't kick user" +msgstr "" + +#: judge/views/organization.py:322 +msgid "The user you are trying to kick does not exist!" +msgstr "" + +#: judge/views/organization.py:326 +#, python-format +msgid "The user you are trying to kick is not in organization: %s." +msgstr "" + +#: judge/views/problem.py:68 +msgid "No such problem" +msgstr "" + +#: judge/views/problem.py:69 +#, python-format +msgid "Could not find a problem with the code \"%s\"." +msgstr "" + +#: judge/views/problem.py:111 +#, python-brace-format +msgid "Editorial for {0}" +msgstr "" + +#: judge/views/problem.py:114 +#, python-brace-format +msgid "Editorial for {0}" +msgstr "" + +#: judge/views/problem.py:285 templates/contest/contest.html:79 +#: templates/user/user-tabs.html:5 templates/user/users-table.html:23 +msgid "Problems" +msgstr "Задачи" + +#: judge/views/problem.py:546 +msgid "Banned from submitting" +msgstr "" + +#: judge/views/problem.py:547 +msgid "You have been declared persona non grata for this problem. You are permanently barred from submitting this problem." +msgstr "" + +#: judge/views/problem.py:560 +msgid "Too many submissions" +msgstr "" + +#: judge/views/problem.py:561 +msgid "You have exceeded the submission limit for this problem." +msgstr "" + +#: judge/views/problem.py:627 judge/views/problem.py:630 +#, python-format +msgid "Submit to %(problem)s" +msgstr "" + +#: judge/views/problem.py:646 +msgid "Clone Problem" +msgstr "" + +#: judge/views/problem_data.py:37 +msgid "Checker arguments must be a JSON object" +msgstr "" + +#: judge/views/problem_data.py:39 +msgid "Checker arguments is invalid JSON" +msgstr "" + +#: judge/views/problem_data.py:46 +msgid "Your zip file is invalid!" +msgstr "" + +#: judge/views/problem_data.py:104 +#, python-brace-format +msgid "Comparing submissions for {0}" +msgstr "" + +#: judge/views/problem_data.py:107 +#, python-brace-format +msgid "Comparing submissions for {0}" +msgstr "" + +#: judge/views/problem_data.py:142 +#, python-brace-format +msgid "Editing data for {0}" +msgstr "" + +#: judge/views/problem_data.py:145 +#, python-format +msgid "Editing data for %s" +msgstr "" + +#: judge/views/problem_data.py:237 judge/views/problem_data.py:238 +#, python-format +msgid "Generated init.yml for %s" +msgstr "" + +#: 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] "" +msgstr[2] "" +msgstr[3] "" + +#: judge/views/ranked_submission.py:58 +#, python-format +msgid "Best solutions for %s" +msgstr "" + +#: judge/views/ranked_submission.py:61 +#, python-brace-format +msgid "Best solutions for {0}" +msgstr "" + +#: judge/views/ranked_submission.py:71 +#, python-format +msgid "Best solutions for %(problem)s in %(contest)s" +msgstr "" + +#: judge/views/ranked_submission.py:74 +#, python-format +msgid "Best solutions for problem %(number)s in %(contest)s" +msgstr "" + +#: judge/views/ranked_submission.py:80 +#, python-brace-format +msgid "Best solutions for {0} in {2}" +msgstr "" + +#: judge/views/ranked_submission.py:83 +#, python-brace-format +msgid "Best solutions for problem {0} in {1}" +msgstr "" + +#: judge/views/register.py:27 +msgid "A username must contain letters, numbers, or underscores" +msgstr "" + +#: judge/views/register.py:31 templates/user/edit-profile.html:103 +msgid "Preferred language" +msgstr "Предпочитаемый язык" + +#: judge/views/register.py:38 +msgid "Subscribe to newsletter?" +msgstr "" + +#: judge/views/register.py:45 +#, python-format +msgid "The email address \"%s\" is already taken. Only one registration is allowed per address." +msgstr "" + +#: judge/views/register.py:51 +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 +msgid "Registration" +msgstr "Регистрация" + +#: judge/views/register.py:106 +msgid "Authentication failure" +msgstr "Ошибка авторизации" + +#: judge/views/stats.py:105 +msgid "Language statistics" +msgstr "Статистика языка" + +#: judge/views/status.py:24 templates/submission/list.html:319 +msgid "Status" +msgstr "Статус" + +#: judge/views/status.py:108 +msgid "Version matrix" +msgstr "" + +#: judge/views/submission.py:59 judge/views/submission.py:66 +#, python-format +msgid "Submission of %(problem)s by %(user)s" +msgstr "" + +#: judge/views/submission.py:161 judge/views/submission.py:162 +#: templates/problem/problem.html:127 +msgid "All submissions" +msgstr "" + +#: judge/views/submission.py:303 +msgid "All my submissions" +msgstr "" + +#: judge/views/submission.py:304 +#, python-format +msgid "All submissions by %s" +msgstr "" + +#: judge/views/submission.py:335 +#, python-format +msgid "All submissions for %s" +msgstr "" + +#: judge/views/submission.py:354 +msgid "Must pass a problem" +msgstr "" + +#: judge/views/submission.py:397 +#, python-format +msgid "My submissions for %(problem)s" +msgstr "" + +#: judge/views/submission.py:398 +#, python-format +msgid "%(user)s's submissions for %(problem)s" +msgstr "" + +#: judge/views/submission.py:495 +msgid "Must pass a contest" +msgstr "" + +#: judge/views/submission.py:514 +#, python-brace-format +msgid "{0}'s submissions for {2} in {4}" +msgstr "" + +#: judge/views/submission.py:519 +#, 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 "" + +#: judge/views/ticket.py:40 +msgid "Issue description" +msgstr "" + +#: judge/views/ticket.py:85 judge/views/ticket.py:88 +#, python-format +msgid "New ticket for %s" +msgstr "" + +#: judge/views/ticket.py:139 +#, python-format +msgid "%(title)s - Ticket %(id)d" +msgstr "" + +#: judge/views/ticket.py:248 +#, python-format +msgid "Tickets - Page %(number)d of %(total)d" +msgstr "" + +#: judge/views/ticket.py:297 +#, python-format +msgid "New Ticket: %s" +msgstr "" + +#: judge/views/ticket.py:298 +#, python-format +msgid "#%(id)d, assigned to: %(users)s" +msgstr "" + +#: judge/views/ticket.py:300 +msgid ", " +msgstr "" + +#: judge/views/ticket.py:300 +msgid "no one" +msgstr "" + +#: judge/views/totp.py:42 templates/registration/totp_enable.html:86 +msgid "Enable Two Factor Authentication" +msgstr "" + +#: judge/views/totp.py:89 templates/registration/totp_disable.html:48 +msgid "Disable Two Factor Authentication" +msgstr "" + +#: judge/views/totp.py:103 +msgid "Perform Two Factor Authentication" +msgstr "" + +#: judge/views/user.py:68 +msgid "No such user" +msgstr "" + +#: judge/views/user.py:68 +#, python-format +msgid "No user handle \"%s\"." +msgstr "" + +#: judge/views/user.py:72 +msgid "My account" +msgstr "" + +#: judge/views/user.py:73 +#, python-format +msgid "User %s" +msgstr "Пользователь %s" + +#: judge/views/user.py:136 +msgid "M j, Y, G:i" +msgstr "" + +#: judge/views/user.py:221 +msgid "Updated on site" +msgstr "" + +#: judge/views/user.py:253 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:10 +msgid "Edit profile" +msgstr "" + +#: judge/views/user.py:262 templates/user/user-list-tabs.html:4 +msgid "Leaderboard" +msgstr "" + +#: judge/views/widgets.py:48 judge/views/widgets.py:58 +#, python-format +msgid "Invalid upstream data: %s" +msgstr "" + +#: judge/views/widgets.py:68 +msgid "Bad latitude or longitude" +msgstr "" + +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:13 +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:27 +msgid "Photo" +msgstr "" + +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:14 +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:28 +msgid "Photos" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:9 +msgid "first name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:10 +msgid "last name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:11 +msgid "biography" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/admin.py:24 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:30 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:30 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:30 +msgid "owner" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:12 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:12 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:12 +msgid "name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:19 +msgid "Category of Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:20 +msgid "Categories of Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:26 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:26 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:26 +msgid "title" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:28 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:28 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:28 +msgid "category" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:29 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:29 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:29 +msgid "author" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:31 +msgid "publication date" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:37 +msgid "Book" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:38 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:136 +msgid "Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:19 +msgid "Category of CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:20 +msgid "Categories of CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:36 +msgid "CD" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:37 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:141 +msgid "CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:19 +msgid "Category of DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:20 +msgid "Categories of DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:36 +msgid "DVD" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:37 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:146 +msgid "DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/templates/admin/base_site.html:7 +msgid "Django administration" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/forms.py:12 +#, python-format +msgid "Please enter the correct %(username)s and password for an admin account. Note that both fields may be case-sensitive." +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/forms.py:32 +#, python-format +msgid "Please enter the correct %(username)s and password for an user account. Note that both fields may be case-sensitive." +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:27 +msgid "Site" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:38 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:41 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:130 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:133 +msgid "Dashboard" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:48 +msgid "Applications" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:53 +msgid "Administration" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:64 +msgid "Color theme" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:66 +msgid "Change color theme" +msgstr "" + +#: 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 +msgid "Rate all ratable contests" +msgstr "" + +#: 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 +msgid "Rejudge" +msgstr "" + +#: templates/base.html:214 +#, python-format +msgid "Hello, %(username)s." +msgstr "" + +#: templates/base.html:220 templates/comments/list.html:89 +#: templates/contest/contest-list-tabs.html:24 +#: templates/problem/problem-list-tabs.html:6 +#: templates/submission/info-base.html:12 +#: templates/submission/submission-list-tabs.html:15 +msgid "Admin" +msgstr "" + +#: templates/base.html:229 +msgid "Log out" +msgstr "Bыйти" + +#: templates/base.html:238 +#: templates/registration/password_reset_complete.html:4 +msgid "Log in" +msgstr "Войти" + +#: templates/base.html:239 templates/registration/registration_form.html:177 +msgid "or" +msgstr "" + +#: templates/base.html:240 +msgid "Sign up" +msgstr "" + +#: templates/base.html:252 +msgid "spectating" +msgstr "" + +#: 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:20 +#: 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 +msgid "Edit" +msgstr "Редактировать" + +#: templates/blog/content.html:27 +#, python-format +msgid "\n" +" posted on %(time)s\n" +" " +msgstr "" + +#: templates/blog/dashboard.html:21 +#, python-format +msgid "\n" +" on %(time)s\n" +" " +msgstr "" + +#: templates/blog/list.html:85 +msgid "Blog" +msgstr "Блог" + +#: templates/blog/list.html:87 +msgid "Events" +msgstr "События" + +#: templates/blog/list.html:92 +msgid "News" +msgstr "Новости" + +#: templates/blog/list.html:106 +#, python-brace-format +msgid "posted on {time}" +msgstr "" + +#: templates/blog/list.html:130 templates/problem/problem.html:310 +msgid "Clarifications" +msgstr "" + +#: templates/blog/list.html:146 templates/problem/problem.html:321 +msgid "No clarifications have been made at this time." +msgstr "" + +#: templates/blog/list.html:154 +msgid "Ongoing contests" +msgstr "Текущие соревнования" + +#: templates/blog/list.html:172 +msgid "Upcoming contests" +msgstr "Предстоящие соревнования" + +#: templates/blog/list.html:189 +msgid "Comment stream" +msgstr "" + +#: templates/blog/list.html:208 +msgid "New problems" +msgstr "" + +#: templates/blog/list.html:225 +msgid "My open tickets" +msgstr "" + +#: templates/blog/list.html:246 +msgid "New tickets" +msgstr "" + +#: templates/comments/list.html:2 +msgid "Comments" +msgstr "" + +#: templates/comments/list.html:18 templates/comments/list.html:27 +msgid "Please login to vote" +msgstr "" + +#: templates/comments/list.html:40 +#, python-brace-format +msgid "commented on {time}" +msgstr "" + +#: templates/comments/list.html:49 +#, python-format +msgid "edit %(edits)s" +msgstr "" + +#: templates/comments/list.html:51 templates/comments/media-js.html:77 +msgid "edited" +msgstr "отредактирован" + +#: templates/comments/list.html:60 +msgid "Link" +msgstr "Ссылка" + +#: templates/comments/list.html:73 templates/comments/list.html:80 +msgid "Reply" +msgstr "Ответить" + +#: templates/comments/list.html:86 +msgid "Hide" +msgstr "" + +#: templates/comments/list.html:101 +#, 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:120 +msgid "There are no comments at the moment." +msgstr "Еще нет ни одного комментария." + +#: templates/comments/list.html:126 +msgid "New comment" +msgstr "Добавить комментарий" + +#: templates/comments/list.html:140 +msgid "Invalid comment body." +msgstr "" + +#: templates/comments/list.html:148 +msgid "Post!" +msgstr "" + +#: templates/comments/list.html:156 +msgid "Comments are disabled on this page." +msgstr "" + +#: templates/comments/media-js.html:72 +#, python-brace-format +msgid "edit {edits}" +msgstr "" + +#: templates/comments/media-js.html:75 +msgid "original" +msgstr "" + +#: templates/contest/access_code.html:26 +msgid "Invalid access code." +msgstr "" + +#: templates/contest/access_code.html:29 +msgid "Please enter your access code:" +msgstr "" + +#: templates/contest/access_code.html:32 +msgid "Join Contest" +msgstr "" + +#: templates/contest/calendar.html:12 +msgid "Sunday" +msgstr "Воскресенье" + +#: templates/contest/calendar.html:13 +msgid "Monday" +msgstr "Понедельник" + +#: templates/contest/calendar.html:14 +msgid "Tuesday" +msgstr "Вторник" + +#: templates/contest/calendar.html:15 +msgid "Wednesday" +msgstr "Среда" + +#: templates/contest/calendar.html:16 +msgid "Thursday" +msgstr "Четверг" + +#: templates/contest/calendar.html:17 +msgid "Friday" +msgstr "Пятница" + +#: templates/contest/calendar.html:18 +msgid "Saturday" +msgstr "Суббота" + +#: 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 +msgid "Today" +msgstr "Сегодня" + +#: templates/contest/contest-list-tabs.html:13 +msgid "Next" +msgstr "Следующая" + +#: templates/contest/contest-list-tabs.html:21 +#: templates/problem/problem-list-tabs.html:5 +msgid "List" +msgstr "" + +#: templates/contest/contest-list-tabs.html:22 +msgid "Calendar" +msgstr "" + +#: templates/contest/contest-tabs.html:4 +msgid "Info" +msgstr "" + +#: templates/contest/contest-tabs.html:8 +msgid "Rankings" +msgstr "Рейтинг" + +#: templates/contest/contest-tabs.html:10 +msgid "Hidden Rankings" +msgstr "" + +#: templates/contest/contest-tabs.html:18 +msgid "MOSS" +msgstr "" + +#: templates/contest/contest-tabs.html:23 +msgid "Clone" +msgstr "" + +#: templates/contest/contest-tabs.html:34 +#: templates/contest/contest-tabs.html:54 +msgid "Leave contest" +msgstr "Покинуть соревнование" + +#: templates/contest/contest-tabs.html:41 templates/contest/list.html:293 +msgid "Virtual join" +msgstr "Виртуальное участие" + +#: templates/contest/contest-tabs.html:52 +msgid "Stop spectating" +msgstr "" + +#: templates/contest/contest-tabs.html:61 +msgid "Spectate contest" +msgstr "" + +#: templates/contest/contest-tabs.html:67 +#: templates/contest/contest-tabs.html:73 +msgid "Join contest" +msgstr "Присоединиться к соревнованию" + +#: templates/contest/contest-tabs.html:82 +msgid "Login to participate" +msgstr "" + +#: templates/contest/contest.html:37 +msgid "Participating virtually." +msgstr "" + +#: templates/contest/contest.html:43 +msgid "Contest is over." +msgstr "Соревнование завершено." + +#: templates/contest/contest.html:59 templates/contest/contest.html:63 +msgid "F j, Y, G:i T" +msgstr "" + +#: 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 +#, python-format +msgid "%(length)s long starting on %(start_time)s" +msgstr "" + +#: templates/contest/contest.html:85 +msgid "AC Rate" +msgstr "" + +#: templates/contest/contest.html:86 templates/contest/list.html:153 +#: templates/contest/list.html:195 templates/contest/list.html:271 +#: templates/problem/list.html:212 templates/problem/list.html:238 +msgid "Users" +msgstr "Пользователи" + +#: templates/contest/contest.html:111 +msgid "Editorial" +msgstr "" + +#: templates/contest/list.html:31 templates/contest/media-js.html:9 +msgid "Are you sure you want to join?" +msgstr "" + +#: 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:65 +msgid "hidden" +msgstr "" + +#: templates/contest/list.html:70 +msgid "private" +msgstr "" + +#: templates/contest/list.html:84 +msgid "rated" +msgstr "" + +#: templates/contest/list.html:132 +msgid "Spectate" +msgstr "" + +#: templates/contest/list.html:138 +msgid "Join" +msgstr "Присоединиться" + +#: templates/contest/list.html:148 +msgid "Active Contests" +msgstr "" + +#: templates/contest/list.html:152 templates/contest/list.html:194 +#: templates/contest/list.html:232 templates/contest/list.html:270 +msgid "Contest" +msgstr "Соревнование" + +#: templates/contest/list.html:190 +msgid "Ongoing Contests" +msgstr "Текущие Соревнования" + +#: templates/contest/list.html:227 +msgid "Upcoming Contests" +msgstr "Предстоящие соревнования" + +#: templates/contest/list.html:255 +msgid "There are no scheduled contests at this time." +msgstr "" + +#: templates/contest/list.html:261 +msgid "Past Contests" +msgstr "Прошедшие соревнования" + +#: templates/contest/media-js.html:4 +msgid "Are you sure you want to leave?" +msgstr "Вы уверены, что вы хотите выйти?" + +#: 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 +msgid "Joining a contest starts your timer, after which it becomes unstoppable." +msgstr "" + +#: 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:7 +msgid "Organization" +msgstr "Организация" + +#: templates/contest/ranking-table.html:27 +#, python-brace-format +msgid "Started on {time}" +msgstr "" + +#: templates/contest/ranking-table.html:30 +msgid "Participation ended." +msgstr "" + +#: templates/contest/ranking.html:232 +msgid "View user participation" +msgstr "" + +#: templates/contest/ranking.html:236 +msgid "Show organizations" +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 +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 +msgid "activate" +msgstr "активировать" + +#: 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 +msgid "Newsletter unsubscribe" +msgstr "" + +#: 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 +msgid "Do you want to unsubscribe from this newsletter?" +msgstr "" + +#: 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 +msgid "Newsletter update" +msgstr "" + +#: 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 +msgid "Update subscription" +msgstr "" + +#: templates/newsletter/subscription_update_activated.html:8 +msgid "Your subscription has successfully been updated." +msgstr "" + +#: 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:34 +#: templates/ticket/edit-notes.html:4 +msgid "Update" +msgstr "Обновить" + +#: 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:29 +msgid "Join organization" +msgstr "Присоединиться к организации" + +#: templates/organization/home.html:33 +msgid "Request membership" +msgstr "" + +#: templates/organization/home.html:39 +msgid "Edit organization" +msgstr "Редактировать организацию" + +#: templates/organization/home.html:43 +msgid "View requests" +msgstr "Просмотр запросов" + +#: templates/organization/home.html:50 +msgid "Admin organization" +msgstr "" + +#: templates/organization/home.html:55 +msgid "View members" +msgstr "" + +#: templates/organization/list.html:23 templates/status/language-list.html:34 +msgid "Name" +msgstr "Имя" + +#: templates/organization/list.html:24 +msgid "Members" +msgstr "" + +#: templates/organization/new.html:10 templates/ticket/new.html:38 +msgid "Create" +msgstr "Создать" + +#: templates/organization/requests/detail.html:13 +msgid "User:" +msgstr "Пользователь:" + +#: templates/organization/requests/detail.html:17 +msgid "Organization:" +msgstr "Организация:" + +#: templates/organization/requests/detail.html:25 +msgid "Time:" +msgstr "Время:" + +#: templates/organization/requests/detail.html:29 +msgid "Reason:" +msgstr "Причина:" + +#: 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:15 +msgid "Reason" +msgstr "Причина" + +#: 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:17 +#: templates/problem/data.html:401 +msgid "Delete?" +msgstr "" + +#: templates/organization/requests/request.html:18 +msgid "Your reason for joining:" +msgstr "" + +#: templates/organization/requests/request.html:20 +msgid "Request" +msgstr "" + +#: templates/organization/requests/tabs.html:4 +msgid "Pending" +msgstr "" + +#: templates/organization/requests/tabs.html:7 +msgid "Log" +msgstr "Лог" + +#: templates/organization/requests/tabs.html:10 +msgid "Approved" +msgstr "" + +#: templates/organization/requests/tabs.html:13 +msgid "Rejected" +msgstr "" + +#: templates/organization/users-table.html:15 +msgid "Kick" +msgstr "" + +#: templates/problem/clone.html:37 +msgid "Enter a new code for the cloned problem:" +msgstr "" + +#: templates/problem/data.html:353 +msgid "View YAML" +msgstr "" + +#: templates/problem/data.html:369 +msgid "Show columns:" +msgstr "" + +#: templates/problem/data.html:372 templates/problem/data.html:396 +msgid "Output prefix" +msgstr "" + +#: templates/problem/data.html:376 templates/problem/data.html:397 +msgid "Output limit" +msgstr "" + +#: templates/problem/data.html:380 templates/problem/data.html:398 +msgid "Checker" +msgstr "" + +#: templates/problem/data.html:384 templates/problem/data.html:399 +msgid "Generator args" +msgstr "" + +#: templates/problem/data.html:391 +msgid "Type" +msgstr "Тип" + +#: templates/problem/data.html:392 +msgid "Input file" +msgstr "" + +#: templates/problem/data.html:393 +msgid "Output file" +msgstr "" + +#: templates/problem/data.html:395 +msgid "Pretest?" +msgstr "" + +#: templates/problem/data.html:447 templates/problem/submit.html:252 +msgid "Submit!" +msgstr "Отправить!" + +#: templates/problem/data.html:448 +msgid "Add new case" +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 editorialist.

Submitting an official solution before solving the problem yourself is a bannable offence." +msgstr "" + +#: templates/problem/list.html:62 +msgid "Filter by type..." +msgstr "" + +#: templates/problem/list.html:185 +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:57 +msgid "Category" +msgstr "Категория" + +#: templates/problem/list.html:209 templates/problem/list.html:228 +msgid "Types" +msgstr "Типы" + +#: templates/problem/list.html:235 +#, python-format +msgid "AC %%" +msgstr "" + +#: 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:142 +msgid "Filter by result:" +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 "Просмотр в формате PDF" + +#: templates/problem/problem.html:101 templates/problem/problem.html:111 +#: templates/problem/problem.html:116 +msgid "Submit solution" +msgstr "" + +#: templates/problem/problem.html:104 +#, python-format +msgid "%(counter)s submission left" +msgid_plural "%(counter)s submissions left" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: templates/problem/problem.html:112 +msgid "0 submissions left" +msgstr "" + +#: templates/problem/problem.html:124 +msgid "My submissions" +msgstr "" + +#: templates/problem/problem.html:128 +msgid "Best submissions" +msgstr "" + +#: templates/problem/problem.html:132 +msgid "Read editorial" +msgstr "" + +#: templates/problem/problem.html:137 +msgid "Manage tickets" +msgstr "" + +#: templates/problem/problem.html:141 +msgid "Edit problem" +msgstr "Редактировать задачу" + +#: templates/problem/problem.html:143 +msgid "Edit test data" +msgstr "" + +#: templates/problem/problem.html:148 +msgid "My tickets" +msgstr "" + +#: templates/problem/problem.html:156 +msgid "Manage submissions" +msgstr "" + +#: templates/problem/problem.html:162 +msgid "Clone problem" +msgstr "" + +#: templates/problem/problem.html:169 +msgid "Points:" +msgstr "" + +#: templates/problem/problem.html:172 templates/problem/problem.html:174 +msgid "(partial)" +msgstr "" + +#: templates/problem/problem.html:179 +msgid "Time limit:" +msgstr "" + +#: templates/problem/problem.html:191 +msgid "Memory limit:" +msgstr "" + +#: templates/problem/problem.html:210 +msgid "Author:" +msgid_plural "Authors:" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: templates/problem/problem.html:225 +msgid "Problem type" +msgid_plural "Problem types" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: templates/problem/problem.html:238 +msgid "Allowed languages" +msgstr "" + +#: templates/problem/problem.html:246 +#, python-format +msgid "No %(lang)s judge online" +msgstr "" + +#: templates/problem/problem.html:257 +msgid "Judge:" +msgid_plural "Judges:" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: templates/problem/problem.html:274 +msgid "none available" +msgstr "" + +#: templates/problem/problem.html:299 +msgid "Request clarification" +msgstr "" + +#: templates/problem/problem.html:301 +msgid "Report an issue" +msgstr "" + +#: 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 +msgid "Search problems..." +msgstr "" + +#: templates/problem/search-form.html:14 +msgid "Full text search" +msgstr "Полнотекстовый поиск" + +#: templates/problem/search-form.html:21 +msgid "Hide solved problems" +msgstr "" + +#: 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 +msgid "All" +msgstr "Все" + +#: templates/problem/search-form.html:46 +msgid "Problem types" +msgstr "" + +#: templates/problem/search-form.html:57 +msgid "Point range" +msgstr "" + +#: templates/problem/search-form.html:63 templates/submission/list.html:337 +#: templates/ticket/list.html:248 +msgid "Go" +msgstr "" + +#: templates/problem/search-form.html:64 +msgid "Random" +msgstr "Случайная задача" + +#: templates/problem/submit.html:192 +#, python-format +msgid "Warning! Your default language, %(default_language)s, is unavailable for this problem and has been deselected." +msgstr "" + +#: templates/problem/submit.html:203 +#, python-format +msgid "\n" +" You have %(left)s submission left\n" +" " +msgid_plural "\n" +" You have %(left)s submissions left\n" +" " +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: templates/problem/submit.html:212 +msgid "You have 0 submissions left" +msgstr "" + +#: templates/problem/submit.html:250 +msgid "No judge is available for this problem." +msgstr "" + +#: templates/registration/activate.html:3 +#, python-format +msgid "%(key)s is an invalid activation key." +msgstr "" + +#: templates/registration/activation_complete.html:3 +msgid "Your account has been successfully activated." +msgstr "" + +#: templates/registration/login.html:43 +msgid "Invalid username or password." +msgstr "" + +#: templates/registration/login.html:61 +#: templates/registration/totp_auth.html:39 +msgid "Login!" +msgstr "Войти!" + +#: templates/registration/login.html:64 +msgid "Forgot your password?" +msgstr "" + +#: templates/registration/login.html:67 +msgid "Or log in with..." +msgstr "" + +#: templates/registration/logout.html:3 +msgid "See you later!" +msgstr "Увидимся!" + +#: templates/registration/password_change_done.html:3 +msgid "Your password was sucessfully changed." +msgstr "" + +#: templates/registration/password_change_form.html:8 +msgid "Change Password" +msgstr "Смена пароля" + +#: templates/registration/password_reset.html:7 +msgid "Send Reset Email" +msgstr "Отправить письмо сброса" + +#: 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_confirm.html:9 +msgid "Reset Password" +msgstr "Сброс пароля" + +#: 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 +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 +#, 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 +msgid "Please go to the following page and choose a new password:" +msgstr "" + +#: templates/registration/password_reset_email.txt:7 +msgid "Your username, in case you've forgotten:" +msgstr "" + +#: templates/registration/password_reset_email.txt:9 +msgid "Thanks for using our site!" +msgstr "" + +#: templates/registration/password_reset_email.txt:11 +#, python-format +msgid "The %(site_name)s team" +msgstr "" + +#: 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 +msgid "Continue >" +msgstr "Продолжить >" + +#: 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:166 +msgid "(again, for confirmation)" +msgstr "" + +#: templates/registration/registration_form.html:173 +msgid "(select your closest major city)" +msgstr "" + +#: templates/registration/registration_form.html:178 +msgid "pick from map" +msgstr "выбрать на карте" + +#: templates/registration/registration_form.html:183 +msgid "Default language" +msgstr "" + +#: templates/registration/registration_form.html:186 +#: templates/user/edit-profile.html:162 +msgid "Affiliated organizations" +msgstr "" + +#: templates/registration/registration_form.html:192 +#: templates/user/edit-profile.html:121 +msgid "Notify me about upcoming contests" +msgstr "Уведомлять меня о предстоящих соревнованиях" + +#: templates/registration/registration_form.html:206 +msgid "By registering, you agree to our" +msgstr "" + +#: templates/registration/registration_form.html:207 +msgid "Terms & Conditions" +msgstr "Условия использования" + +#: templates/registration/registration_form.html:210 +msgid "Register!" +msgstr "Зарегистрироваться!" + +#: templates/registration/totp_auth.html:36 +#: templates/registration/totp_disable.html:45 +#: templates/registration/totp_enable.html:83 +msgid "Enter the 6-digit code generated by your app:" +msgstr "" + +#: templates/registration/totp_auth.html:41 +#, python-format +msgid "If you lost your authentication device, please contact us at %(email)s." +msgstr "" + +#: templates/registration/totp_disable.html:38 +msgid "To protect your account, you must first authenticate before you can disable Two Factor Authentication." +msgstr "" + +#: templates/registration/totp_enable.html:71 +msgid "Scan this code with your authenticator app:" +msgstr "" + +#: templates/registration/totp_enable.html:72 +msgid "QR code" +msgstr "" + +#: templates/registration/totp_enable.html:73 +msgid "Or enter this code manually:" +msgstr "" + +#: templates/stats/base.html:9 templates/submission/list.html:345 +msgid "Statistics" +msgstr "Статистика" + +#: templates/stats/language.html:11 +msgid "Submission Statistics" +msgstr "" + +#: templates/stats/language.html:16 +msgid "Submissions by Language" +msgstr "" + +#: templates/stats/language.html:21 +msgid "AC Submissions by Language" +msgstr "" + +#: templates/stats/language.html:26 +msgid "Language AC Rate" +msgstr "" + +#: templates/status/judge-status-table.html:2 +msgid "Judge" +msgstr "" + +#: templates/status/judge-status-table.html:4 +msgid "Online" +msgstr "Онлайн" + +#: templates/status/judge-status-table.html:6 +msgid "Uptime" +msgstr "Время безотказной работы" + +#: templates/status/judge-status-table.html:7 +msgid "Ping" +msgstr "Пинг" + +#: 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 +msgid "N/A" +msgstr "" + +#: templates/status/judge-status-table.html:64 +msgid "There are no judges available at this time." +msgstr "" + +#: templates/status/language-list.html:33 templates/ticket/list.html:261 +msgid "ID" +msgstr "ID" + +#: templates/status/language-list.html:35 +msgid "Runtime Info" +msgstr "" + +#: templates/status/status-tabs.html:4 +msgid "Judges" +msgstr "" + +#: templates/status/status-tabs.html:6 +msgid "Version Matrix" +msgstr "" + +#: templates/submission/internal-error-message.html:8 +msgid "An internal error occurred while grading." +msgstr "" + +#: templates/submission/internal-error-message.html:15 +msgid "Error information" +msgstr "Сведения об ошибке" + +#: templates/submission/list.html:76 +msgid "Filter by status..." +msgstr "" + +#: templates/submission/list.html:82 +msgid "Filter by language..." +msgstr "" + +#: templates/submission/list.html:315 +msgid "Filter submissions" +msgstr "" + +#: templates/submission/list.html:351 +msgid "Total:" +msgstr "" + +#: templates/submission/list.html:361 +msgid "You were disconnected. Refresh to show latest updates." +msgstr "" + +#: templates/submission/row.html:39 +#, python-format +msgid "Case #%(case)s" +msgstr "" + +#: templates/submission/row.html:49 +msgid "view" +msgstr "" + +#: templates/submission/row.html:53 +msgid "rejudge" +msgstr "" + +#: templates/submission/row.html:58 +msgid "admin" +msgstr "" + +#: templates/submission/source.html:25 +msgid "View status" +msgstr "" + +#: templates/submission/source.html:26 +msgid "View raw source" +msgstr "" + +#: templates/submission/source.html:28 templates/submission/status.html:61 +msgid "Resubmit" +msgstr "" + +#: 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 +msgid "Your submission is being processed..." +msgstr "" + +#: templates/submission/status-testcases.html:14 +msgid "Compilation Error" +msgstr "" + +#: templates/submission/status-testcases.html:18 +msgid "Compilation Warnings" +msgstr "" + +#: templates/submission/status-testcases.html:23 +msgid "Pretest Execution Results" +msgstr "" + +#: templates/submission/status-testcases.html:25 +msgid "Execution Results" +msgstr "" + +#: templates/submission/status-testcases.html:31 +msgid "Batch " +msgstr "" + +#: templates/submission/status-testcases.html:43 +msgid "Case" +msgstr "" + +#: templates/submission/status-testcases.html:45 +msgid "Pretest" +msgstr "" + +#: templates/submission/status-testcases.html:47 +msgid "Test case" +msgstr "" + +#: templates/submission/status-testcases.html:79 +msgid "Your output (clipped)" +msgstr "" + +#: templates/submission/status-testcases.html:90 +msgid "Judge feedback" +msgstr "" + +#: templates/submission/status-testcases.html:106 +msgid "Resources:" +msgstr "" + +#: templates/submission/status-testcases.html:115 +msgid "Final pretest score:" +msgstr "" + +#: templates/submission/status-testcases.html:117 +msgid "Final score:" +msgstr "" + +#: templates/submission/status-testcases.html:131 +msgid "Passing pretests does not guarantee a full score on system tests." +msgstr "" + +#: templates/submission/status-testcases.html:134 +msgid "Submission aborted!" +msgstr "" + +#: templates/submission/status.html:59 +msgid "View source" +msgstr "" + +#: templates/submission/status.html:88 +msgid "Abort" +msgstr "" + +#: templates/submission/submission-list-tabs.html:6 +msgid "Mine" +msgstr "" + +#: templates/submission/submission-list-tabs.html:9 +msgid "Best" +msgstr "" + +#: templates/submission/submission-list-tabs.html:12 +#, python-format +msgid "%(user)s's" +msgstr "" + +#: templates/ticket/list.html:135 templates/ticket/ticket.html:257 +msgid "Reopened: " +msgstr "" + +#: templates/ticket/list.html:138 templates/ticket/ticket.html:258 +msgid "Closed: " +msgstr "" + +#: templates/ticket/list.html:221 +msgid "Use desktop notification" +msgstr "" + +#: templates/ticket/list.html:227 +msgid "Show my tickets only" +msgstr "" + +#: templates/ticket/list.html:231 +msgid "Filing user" +msgstr "" + +#: templates/ticket/list.html:240 +msgid "Assignee" +msgstr "" + +#: templates/ticket/list.html:262 +msgid "Title" +msgstr "" + +#: templates/ticket/list.html:264 templates/ticket/ticket.html:304 +msgid "Assignees" +msgstr "" + +#: templates/ticket/new_problem.html:7 +msgid "Thanks for opening a ticket!" +msgstr "" + +#: 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 +msgid "Associated object" +msgstr "" + +#: templates/ticket/ticket.html:309 +msgid "No one is assigned." +msgstr "" + +#: templates/ticket/ticket.html:315 +msgid "Close ticket" +msgstr "" + +#: templates/ticket/ticket.html:317 +msgid "Reopen ticket" +msgstr "" + +#: templates/ticket/ticket.html:321 +msgid "Assignee notes" +msgstr "" + +#: templates/ticket/ticket.html:328 templates/widgets/select_all.html:4 +msgid "Nothing here." +msgstr "" + +#: templates/ticket/ticket.html:378 +msgid "Post" +msgstr "" + +#: templates/user/base-users-table.html:3 +msgid "Rank" +msgstr "" + +#: templates/user/base-users.html:14 templates/user/base-users.html:69 +msgid "Search by handle..." +msgstr "" + +#: templates/user/edit-profile.html:90 +msgid "Self-description" +msgstr "" + +#: templates/user/edit-profile.html:98 +msgid "Select your closest major city" +msgstr "" + +#: templates/user/edit-profile.html:107 +msgid "Editor theme" +msgstr "" + +#: templates/user/edit-profile.html:112 +msgid "Math engine" +msgstr "" + +#: templates/user/edit-profile.html:136 templates/user/edit-profile.html:137 +msgid "Change your avatar" +msgstr "" + +#: templates/user/edit-profile.html:143 +msgid "Change your password" +msgstr "" + +#: templates/user/edit-profile.html:150 +msgid "Two Factor Authentication is enabled." +msgstr "" + +#: templates/user/edit-profile.html:153 +msgid "Two Factor Authentication is disabled." +msgstr "" + +#: templates/user/edit-profile.html:170 +msgid "User-script" +msgstr "" + +#: templates/user/edit-profile.html:174 +msgid "Update profile" +msgstr "" + +#: templates/user/pp-row.html:22 +#, python-format +msgid "\n" +" weighted %(weight)s%%\n" +" " +msgstr "" + +#: templates/user/pp-row.html:27 +#, python-format +msgid "%(pp).1fpp" +msgstr "" + +#: templates/user/pp-row.html:29 +#, python-format +msgid "%(pp).0fpp" +msgstr "" + +#: templates/user/user-about.html:14 +msgid "From" +msgstr "От" + +#: 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:40 +msgid "You have not shared any information." +msgstr "" + +#: templates/user/user-about.html:42 +msgid "This user has not shared any information." +msgstr "" + +#: templates/user/user-base.html:42 +#, python-format +msgid "%(counter)s problem solved" +msgid_plural "%(counter)s problems solved" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + +#: templates/user/user-base.html:50 +msgid "Rank by points:" +msgstr "" + +#: templates/user/user-base.html:53 +msgid "Total points:" +msgstr "" + +#: templates/user/user-base.html:68 +msgid "Rank by rating:" +msgstr "" + +#: templates/user/user-base.html:70 +msgid "Rating:" +msgstr "Рейтинг:" + +#: templates/user/user-base.html:71 +msgid "Volatility:" +msgstr "" + +#: templates/user/user-base.html:72 +msgid "Min. rating:" +msgstr "Мин рейтинг:" + +#: templates/user/user-base.html:73 +msgid "Max rating:" +msgstr "Макс рейтинг:" + +#: templates/user/user-problems.html:35 +msgid "Points Breakdown" +msgstr "" + +#: templates/user/user-problems.html:41 +msgid "Load more..." +msgstr "" + +#: templates/user/user-problems.html:45 +msgid "This user has not yet solved any problems." +msgstr "" + +#: templates/user/user-problems.html:51 +msgid "Authored Problems" +msgstr "" + +#: templates/user/user-problems.html:83 +msgid "Hide problems I've solved" +msgstr "" + +#: templates/user/user-problems.html:93 +#, python-format +msgid "%(points).1f points" +msgstr "" + +#: templates/user/user-problems.html:99 +msgid "Score" +msgstr "" + +#: templates/user/user-problems.html:110 +#, python-format +msgid "%(points)s / %(total)s" +msgstr "" + +#: templates/user/user-tabs.html:7 +msgid "Impersonate" +msgstr "" + +#: templates/user/user-tabs.html:13 +msgid "Admin User" +msgstr "Администратор" + +#: templates/user/user-tabs.html:16 +msgid "Admin Profile" +msgstr "Профиль администратора" + +#: templates/widgets/select_all.html:8 +msgid "Check all" +msgstr "Выбрать всё" + diff --git a/locale/ru/LC_MESSAGES/djangojs.po b/locale/ru/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..ba308f5 --- /dev/null +++ b/locale/ru/LC_MESSAGES/djangojs.po @@ -0,0 +1,32 @@ +msgid "" +msgstr "" +"Project-Id-Version: dmoj\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-10-01 23:12+0000\n" +"PO-Revision-Date: 2019-11-11 22:06\n" +"Last-Translator: Icyene\n" +"Language-Team: Russian\n" +"Language: ru_RU\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n" +"X-Generator: crowdin.com\n" +"X-Crowdin-Project: dmoj\n" +"X-Crowdin-Language: ru\n" +"X-Crowdin-File: djangojs.po\n" + +#: resources/common.js:207 +msgctxt "time format with day" +msgid "%d day %h:%m:%s" +msgid_plural "%d days %h:%m:%s" +msgstr[0] "%d день %h:%m:%s" +msgstr[1] "%d дней %h:%m:%s" +msgstr[2] "%d дней %h:%m:%s" +msgstr[3] "%d дней %h:%m:%s" + +#: resources/common.js:210 +msgctxt "time format without day" +msgid "%h:%m:%s" +msgstr "%h:%m:%s" + diff --git a/locale/ru/LC_MESSAGES/dmoj-user.po b/locale/ru/LC_MESSAGES/dmoj-user.po new file mode 100644 index 0000000..9398a22 --- /dev/null +++ b/locale/ru/LC_MESSAGES/dmoj-user.po @@ -0,0 +1,90 @@ +msgid "Problems" +msgstr "Problemes" + +msgid "Editorials" +msgstr "Editorialsssssssssssssss" + +msgid "Submissions" +msgstr "" + +msgid "Users" +msgstr "" + +msgid "Organizations" +msgstr "" + +msgid "Contests" +msgstr "" + +msgid "About" +msgstr "" + +msgid "Status" +msgstr "" + +msgid "Runtimes" +msgstr "" + +msgid "Tips" +msgstr "" + +msgid "API" +msgstr "" + +msgid "Github" +msgstr "" + +msgid "???" +msgstr "???" + +msgid "Ad Hoc" +msgstr "" + +msgid "Advanced Math" +msgstr "" + +msgid "Brute Force" +msgstr "" + +msgid "Data Structures" +msgstr "" + +msgid "Divide and Conquer" +msgstr "" + +msgid "Dynamic Programming" +msgstr "" + +msgid "Game Theory" +msgstr "" + +msgid "Geometry" +msgstr "" + +msgid "Graph Theory" +msgstr "" + +msgid "Greedy Algorithms" +msgstr "" + +msgid "Implementation" +msgstr "" + +msgid "Intermediate Math" +msgstr "" + +msgid "Recursion" +msgstr "" + +msgid "Regular Expressions" +msgstr "" + +msgid "Simple Math" +msgstr "" + +msgid "Simulation" +msgstr "" + +msgid "String Algorithms" +msgstr "Le string du algorithemssss lMAO" + diff --git a/locale/sr/LC_MESSAGES/django.po b/locale/sr/LC_MESSAGES/django.po new file mode 100644 index 0000000..df131ec --- /dev/null +++ b/locale/sr/LC_MESSAGES/django.po @@ -0,0 +1,3303 @@ +msgid "" +msgstr "" +"Project-Id-Version: dmoj\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-11-12 22:43-0500\n" +"PO-Revision-Date: 2016-12-22 21:23-0500\n" +"Last-Translator: Icyene \n" +"Language-Team: Serbian (Latin)\n" +"Language: sr_CS\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: crowdin.com\n" +"X-Crowdin-Project: dmoj\n" +"X-Crowdin-Language: sr-CS\n" +"X-Crowdin-File: django.po\n" + +#: .\dmoj\settings.py:213 +msgid "German" +msgstr "" + +#: .\dmoj\settings.py:214 +msgid "English" +msgstr "" + +#: .\dmoj\settings.py:215 +msgid "French" +msgstr "" + +#: .\dmoj\settings.py:216 +msgid "Romanian" +msgstr "" + +#: .\dmoj\settings.py:217 +msgid "Russian" +msgstr "" + +#: .\dmoj\settings.py:218 +msgid "Serbian (Latin)" +msgstr "" + +#: .\dmoj\settings.py:219 +msgid "Simplified Chinese" +msgstr "" + +#: .\dmoj\urls.py:102 .\templates\base.jade:84 +msgid "Home" +msgstr "" + +#: .\judge\admin.py:65 .\judge\views\register.py:29 +#: .\templates\registration\registration_form.jade:133 +#: .\templates\user\edit_profile.jade:72 +msgid "Location" +msgstr "" + +#: .\judge\admin.py:91 .\judge\admin.py:240 .\judge\admin.py:1004 +#: .\judge\admin.py:1081 +msgid "View on site" +msgstr "" + +#: .\judge\admin.py:100 .\judge\admin.py:424 +#: .\templates\organization\requests\log.jade:4 +#: .\templates\organization\requests\pending.jade:9 +msgid "User" +msgstr "" + +#: .\judge\admin.py:106 .\templates\registration\registration_form.jade:120 +msgid "Email" +msgstr "" + +#: .\judge\admin.py:112 +msgid "Timezone" +msgstr "" + +#: .\judge\admin.py:118 +msgid "date joined" +msgstr "" + +#: .\judge\admin.py:125 +#, python-format +msgid "%d user have scores recalculated." +msgid_plural "%d users have scores recalculated." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: .\judge\admin.py:129 .\judge\admin.py:973 +msgid "Recalculate scores" +msgstr "" + +#: .\judge\admin.py:141 +msgid "Describe the changes you made (optional)" +msgstr "" + +#: .\judge\admin.py:200 +msgid "Taxonomy" +msgstr "" + +#: .\judge\admin.py:201 .\templates\problem\data.jade:376 +#: .\templates\problem\list.jade:135 .\templates\problem\list.jade:145 +#: .\templates\user\base_users_table.jade:6 +#: .\templates\user\base_users_table.jade:8 +msgid "Points" +msgstr "" + +#: .\judge\admin.py:202 +msgid "Limits" +msgstr "" + +#: .\judge\admin.py:203 .\templates\stats\base.jade:7 +#: .\templates\submission\list.jade:161 +msgid "Language" +msgstr "" + +#: .\judge\admin.py:204 +msgid "Justice" +msgstr "" + +#: .\judge\admin.py:205 .\templates\comments\list.jade:11 +msgid "History" +msgstr "" + +#: .\judge\admin.py:237 +msgid "Authors" +msgstr "" + +#: .\judge\admin.py:275 +#, python-format +msgid "%d problem successfully marked as public." +msgid_plural "%d problems successfully marked as public." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: .\judge\admin.py:279 +msgid "Mark problems as public" +msgstr "" + +#: .\judge\admin.py:284 +#, python-format +msgid "%d problem successfully marked as private." +msgid_plural "%d problems successfully marked as private." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: .\judge\admin.py:288 +msgid "Mark problems as private" +msgstr "" + +#: .\judge\admin.py:334 .\judge\admin.py:353 .\judge\admin.py:474 +msgid "None" +msgstr "" + +#: .\judge\admin.py:334 +msgid "Not done" +msgstr "" + +#: .\judge\admin.py:334 +msgid "Exceptional" +msgstr "" + +#: .\judge\admin.py:353 +msgid "Unaccepted" +msgstr "" + +#: .\judge\admin.py:396 +#, python-format +msgctxt "contest problem" +msgid "%(problem)s in %(contest)s" +msgstr "" + +#: .\judge\admin.py:447 .\judge\admin.py:485 +msgid "You do not have the permission to rejudge submissions." +msgstr "" + +#: .\judge\admin.py:452 +msgid "You do not have the permission to rejudge THAT many submissions." +msgstr "" + +#: .\judge\admin.py:460 +#, python-format +msgid "%d submission were successfully scheduled for rejudging." +msgid_plural "%d submissions were successfully scheduled for rejudging." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: .\judge\admin.py:464 +msgid "Rejudge the selected submissions" +msgstr "" + +#: .\judge\admin.py:476 +#, python-format +msgid "%d KB" +msgstr "" + +#: .\judge\admin.py:478 +#, python-format +msgid "%.2f MB" +msgstr "" + +#: .\judge\admin.py:481 +msgid "Memory Usage" +msgstr "" + +#: .\judge\admin.py:514 +#, python-format +msgid "%d submission were successfully rescored." +msgid_plural "%d submissions were successfully rescored." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: .\judge\admin.py:518 +msgid "Rescore the selected submissions" +msgstr "" + +#: .\judge\admin.py:574 +#, python-format +msgid "%d comment successfully hidden." +msgid_plural "%d comments successfully hidden." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: .\judge\admin.py:578 +msgid "Hide comments" +msgstr "" + +#: .\judge\admin.py:582 +#, python-format +msgid "%d comment successfully unhidden." +msgid_plural "%d comments successfully unhidden." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: .\judge\admin.py:586 +msgid "Unhide comments" +msgstr "" + +#: .\judge\admin.py:599 +msgid "Associated page" +msgstr "" + +#: .\judge\admin.py:611 +msgid "Disallowed problems" +msgstr "" + +#: .\judge\admin.py:614 +msgid "These problems are NOT allowed to be submitted in this language" +msgstr "" + +#: .\judge\admin.py:640 .\judge\admin.py:663 +msgid "Included problems" +msgstr "" + +#: .\judge\admin.py:643 +msgid "These problems are included in this group of problems" +msgstr "" + +#: .\judge\admin.py:666 +msgid "These problems are included in this type of problems" +msgstr "" + +#: .\judge\admin.py:745 +msgid "Description" +msgstr "" + +#: .\judge\admin.py:746 +msgid "Information" +msgstr "" + +#: .\judge\admin.py:747 +msgid "Capabilities" +msgstr "" + +#: .\judge\admin.py:771 +msgid "Included contests" +msgstr "" + +#: .\judge\admin.py:809 .\templates\problem\list.jade:132 +#: .\templates\problem\list.jade:139 .\templates\solution.jade:3 +msgid "Problem" +msgstr "" + +#: .\judge\admin.py:839 +msgid "Scheduling" +msgstr "" + +#: .\judge\admin.py:840 +msgid "Details" +msgstr "" + +#: .\judge\admin.py:841 .\templates\contest\ranking_table.jade:2 +msgid "Rating" +msgstr "" + +#: .\judge\admin.py:842 +msgid "Organization" +msgstr "" + +#: .\judge\admin.py:855 +#, python-format +msgid "%d contest successfully marked as public." +msgid_plural "%d contests successfully marked as public." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: .\judge\admin.py:859 +msgid "Mark contests as public" +msgstr "" + +#: .\judge\admin.py:863 +#, python-format +msgid "%d contest successfully marked as private." +msgid_plural "%d contests successfully marked as private." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: .\judge\admin.py:867 +msgid "Mark contests as private" +msgstr "" + +#: .\judge\admin.py:961 .\templates\base.jade:112 +msgid "virtual" +msgstr "" + +#: .\judge\admin.py:969 +#, python-format +msgid "%d participation have scores recalculated." +msgid_plural "%d participations have scores recalculated." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: .\judge\admin.py:980 +#, python-format +msgid "%d participation have times recalculated." +msgid_plural "%d participations have times recalculated." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: .\judge\admin.py:984 +msgid "Recalculate cumulative time" +msgstr "" + +#: .\judge\admin.py:1053 +msgid "Content" +msgstr "" + +#: .\judge\admin.py:1054 +msgid "Summary" +msgstr "" + +#: .\judge\apps.py:7 +msgid "Online Judge" +msgstr "" + +#: .\judge\comments.py:38 +msgid "Comment title" +msgstr "" + +#: .\judge\comments.py:39 +msgid "Comment body" +msgstr "" + +#: .\judge\comments.py:43 +msgid "Your part is silent, little toad." +msgstr "" + +#: .\judge\comments.py:68 +msgid "Posted comment" +msgstr "" + +#: .\judge\forms.py:23 .\judge\views\register.py:38 +msgid "Subscribe to newsletter?" +msgstr "" + +#: .\judge\models\choices.py:60 +msgid "Leave as LaTeX" +msgstr "" + +#: .\judge\models\choices.py:61 +msgid "SVG with PNG fallback" +msgstr "" + +#: .\judge\models\choices.py:62 +msgid "MathML only" +msgstr "" + +#: .\judge\models\choices.py:63 +msgid "MathJax with SVG/PNG fallback" +msgstr "" + +#: .\judge\models\choices.py:64 +msgid "Detect best quality" +msgstr "" + +#: .\judge\models\comment.py:24 +msgid "commenter" +msgstr "" + +#: .\judge\models\comment.py:25 +msgid "posted time" +msgstr "" + +#: .\judge\models\comment.py:26 +msgid "associated Page" +msgstr "" + +#: .\judge\models\comment.py:28 +msgid "Page code must be ^[pc]:[a-z0-9]+$|^b:\\d+$" +msgstr "" + +#: .\judge\models\comment.py:29 +msgid "votes" +msgstr "" + +#: .\judge\models\comment.py:30 +msgid "title of comment" +msgstr "" + +#: .\judge\models\comment.py:31 +msgid "body of comment" +msgstr "" + +#: .\judge\models\comment.py:32 +msgid "hide the comment" +msgstr "" + +#: .\judge\models\comment.py:33 +msgid "parent" +msgstr "" + +#: .\judge\models\comment.py:37 +msgid "comment" +msgstr "" + +#: .\judge\models\comment.py:38 +msgid "comments" +msgstr "" + +#: .\judge\models\comment.py:128 +msgid "comment vote" +msgstr "" + +#: .\judge\models\comment.py:129 +msgid "comment votes" +msgstr "" + +#: .\judge\models\contest.py:21 +msgid "Invalid colour." +msgstr "" + +#: .\judge\models\contest.py:23 +msgid "tag name" +msgstr "" + +#: .\judge\models\contest.py:24 +msgid "Lowercase letters and hyphens only." +msgstr "" + +#: .\judge\models\contest.py:25 +msgid "tag colour" +msgstr "" + +#: .\judge\models\contest.py:26 +msgid "tag description" +msgstr "" + +#: .\judge\models\contest.py:45 +msgid "contest tag" +msgstr "" + +#: .\judge\models\contest.py:46 .\judge\models\contest.py:81 +msgid "contest tags" +msgstr "" + +#: .\judge\models\contest.py:50 +msgid "contest id" +msgstr "" + +#: .\judge\models\contest.py:51 +msgid "Contest id must be ^[a-z0-9]+$" +msgstr "" + +#: .\judge\models\contest.py:52 +msgid "contest name" +msgstr "" + +#: .\judge\models\contest.py:53 +msgid "These people will be able to edit the contest." +msgstr "" + +#: .\judge\models\contest.py:56 .\judge\models\problem.py:252 +#: .\judge\models\runtime.py:118 +msgid "problems" +msgstr "" + +#: .\judge\models\contest.py:59 .\judge\models\problem.py:105 +#: .\judge\models\problem.py:270 +msgid "time limit" +msgstr "" + +#: .\judge\models\contest.py:60 .\judge\models\problem.py:111 +msgid "publicly visible" +msgstr "" + +#: .\judge\models\contest.py:61 +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:64 +msgid "contest rated" +msgstr "" + +#: .\judge\models\contest.py:64 +msgid "Whether this contest can be rated." +msgstr "" + +#: .\judge\models\contest.py:66 +msgid "rate all" +msgstr "" + +#: .\judge\models\contest.py:66 +msgid "Rate all users who joined." +msgstr "" + +#: .\judge\models\contest.py:67 +msgid "exclude from ratings" +msgstr "" + +#: .\judge\models\contest.py:69 +msgid "private to organizations" +msgstr "" + +#: .\judge\models\contest.py:70 +msgid "hide problem tags" +msgstr "" + +#: .\judge\models\contest.py:71 +msgid "Whether problem tags should be hidden by default." +msgstr "" + +#: .\judge\models\contest.py:73 +msgid "run pretests only" +msgstr "" + +#: .\judge\models\contest.py:74 +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:78 .\judge\models\profile.py:66 +msgid "organizations" +msgstr "" + +#: .\judge\models\contest.py:79 +msgid "If private, only these organizations may see the contest" +msgstr "" + +#: .\judge\models\contest.py:80 +msgid "OpenGraph image" +msgstr "" + +#: .\judge\models\contest.py:82 +msgid "the amount of live participants" +msgstr "" + +#: .\judge\models\contest.py:83 +msgid "contest summary" +msgstr "" + +#: .\judge\models\contest.py:84 +msgid "Plain-text, shown in meta description tag, e.g. for social media." +msgstr "" + +#: .\judge\models\contest.py:140 .\judge\models\contest.py:222 +#: .\judge\models\contest.py:252 +msgid "contest" +msgstr "" + +#: .\judge\models\contest.py:141 +msgid "contests" +msgstr "" + +#: .\judge\models\contest.py:145 +msgid "associated contest" +msgstr "" + +#: .\judge\models\contest.py:146 .\judge\models\contest.py:251 +#: .\judge\models\profile.py:159 +msgid "user" +msgstr "" + +#: .\judge\models\contest.py:147 +msgid "start time" +msgstr "" + +#: .\judge\models\contest.py:148 +msgid "score" +msgstr "" + +#: .\judge\models\contest.py:149 +msgid "cumulative time" +msgstr "" + +#: .\judge\models\contest.py:150 +msgid "virtual participation id" +msgstr "" + +#: .\judge\models\contest.py:151 +msgid "0 means non-virtual, otherwise the n-th virtual participation" +msgstr "" + +#: .\judge\models\contest.py:208 +#, python-format +msgid "%s spectating in %s" +msgstr "" + +#: .\judge\models\contest.py:210 +#, python-format +msgid "%s in %s, v%d" +msgstr "" + +#: .\judge\models\contest.py:211 +#, python-format +msgid "%s in %s" +msgstr "" + +#: .\judge\models\contest.py:214 +msgid "contest participation" +msgstr "" + +#: .\judge\models\contest.py:215 +msgid "contest participations" +msgstr "" + +#: .\judge\models\contest.py:221 .\judge\models\contest.py:236 +#: .\judge\models\problem.py:251 .\judge\models\problem.py:256 +#: .\judge\models\problem.py:268 .\judge\models\problem_data.py:29 +msgid "problem" +msgstr "" + +#: .\judge\models\contest.py:223 .\judge\models\contest.py:240 +#: .\judge\models\problem.py:108 .\templates\user\user_problems.jade:87 +msgid "points" +msgstr "" + +#: .\judge\models\contest.py:224 +msgid "partial" +msgstr "" + +#: .\judge\models\contest.py:225 .\judge\models\interface.py:43 +msgid "order" +msgstr "" + +#: .\judge\models\contest.py:226 +msgid "output prefix length override" +msgstr "" + +#: .\judge\models\contest.py:230 +msgid "contest problem" +msgstr "" + +#: .\judge\models\contest.py:231 +msgid "contest problems" +msgstr "" + +#: .\judge\models\contest.py:235 .\judge\models\submission.py:144 +msgid "submission" +msgstr "" + +#: .\judge\models\contest.py:238 .\judge\models\contest.py:253 +msgid "participation" +msgstr "" + +#: .\judge\models\contest.py:241 +msgid "is pretested" +msgstr "" + +#: .\judge\models\contest.py:242 +msgid "Whether this submission was ran only on pretests." +msgstr "" + +#: .\judge\models\contest.py:246 +msgid "contest submission" +msgstr "" + +#: .\judge\models\contest.py:247 +msgid "contest submissions" +msgstr "" + +#: .\judge\models\contest.py:254 +msgid "rank" +msgstr "" + +#: .\judge\models\contest.py:255 +msgid "rating" +msgstr "" + +#: .\judge\models\contest.py:256 +msgid "volatility" +msgstr "" + +#: .\judge\models\contest.py:257 +msgid "last rated" +msgstr "" + +#: .\judge\models\contest.py:261 +msgid "contest rating" +msgstr "" + +#: .\judge\models\contest.py:262 +msgid "contest ratings" +msgstr "" + +#: .\judge\models\interface.py:24 +msgid "configuration item" +msgstr "" + +#: .\judge\models\interface.py:25 +msgid "miscellaneous configuration" +msgstr "" + +#: .\judge\models\interface.py:37 +msgid "navigation item" +msgstr "" + +#: .\judge\models\interface.py:38 +msgid "navigation bar" +msgstr "" + +#: .\judge\models\interface.py:44 .\judge\models\profile.py:21 +msgid "identifier" +msgstr "" + +#: .\judge\models\interface.py:45 +msgid "label" +msgstr "" + +#: .\judge\models\interface.py:46 +msgid "link path" +msgstr "" + +#: .\judge\models\interface.py:47 +msgid "highlight regex" +msgstr "" + +#: .\judge\models\interface.py:48 +msgid "parent item" +msgstr "" + +#: .\judge\models\interface.py:65 +msgid "post title" +msgstr "" + +#: .\judge\models\interface.py:66 +msgid "authors" +msgstr "" + +#: .\judge\models\interface.py:67 +msgid "slug" +msgstr "" + +#: .\judge\models\interface.py:68 +msgid "public visibility" +msgstr "" + +#: .\judge\models\interface.py:69 +msgid "sticky" +msgstr "" + +#: .\judge\models\interface.py:70 +msgid "publish after" +msgstr "" + +#: .\judge\models\interface.py:71 +msgid "post content" +msgstr "" + +#: .\judge\models\interface.py:72 +msgid "post summary" +msgstr "" + +#: .\judge\models\interface.py:73 +msgid "openGraph image" +msgstr "" + +#: .\judge\models\interface.py:85 +msgid "blog post" +msgstr "" + +#: .\judge\models\interface.py:86 +msgid "blog posts" +msgstr "" + +#: .\judge\models\interface.py:96 +msgid "associated problem" +msgstr "" + +#: .\judge\models\interface.py:109 +msgid "solution" +msgstr "" + +#: .\judge\models\interface.py:110 +msgid "solutions" +msgstr "" + +#: .\judge\models\message.py:10 +msgid "message title" +msgstr "" + +#: .\judge\models\message.py:11 +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" +msgstr "" + +#: .\judge\models\problem.py:25 +msgid "problem category ID" +msgstr "" + +#: .\judge\models\problem.py:26 +msgid "problem category name" +msgstr "" + +#: .\judge\models\problem.py:33 +msgid "problem type" +msgstr "" + +#: .\judge\models\problem.py:34 .\judge\models\problem.py:103 +msgid "problem types" +msgstr "" + +#: .\judge\models\problem.py:38 +msgid "problem group ID" +msgstr "" + +#: .\judge\models\problem.py:39 +msgid "problem group name" +msgstr "" + +#: .\judge\models\problem.py:46 .\judge\models\problem.py:104 +msgid "problem group" +msgstr "" + +#: .\judge\models\problem.py:47 +msgid "problem groups" +msgstr "" + +#: .\judge\models\problem.py:51 +msgid "key" +msgstr "" + +#: .\judge\models\problem.py:53 +msgid "link" +msgstr "" + +#: .\judge\models\problem.py:54 +msgid "full name" +msgstr "" + +#: .\judge\models\problem.py:55 .\judge\models\profile.py:25 +#: .\judge\models\runtime.py:20 +msgid "short name" +msgstr "" + +#: .\judge\models\problem.py:56 +msgid "Displayed on pages under this license" +msgstr "" + +#: .\judge\models\problem.py:57 +msgid "icon" +msgstr "" + +#: .\judge\models\problem.py:57 +msgid "URL to the icon" +msgstr "" + +#: .\judge\models\problem.py:58 +msgid "license text" +msgstr "" + +#: .\judge\models\problem.py:67 +msgid "license" +msgstr "" + +#: .\judge\models\problem.py:68 +msgid "licenses" +msgstr "" + +#: .\judge\models\problem.py:95 +msgid "problem code" +msgstr "" + +#: .\judge\models\problem.py:96 +msgid "Problem code must be ^[a-z0-9]+$" +msgstr "" + +#: .\judge\models\problem.py:97 +msgid "problem name" +msgstr "" + +#: .\judge\models\problem.py:98 +msgid "problem body" +msgstr "" + +#: .\judge\models\problem.py:99 +msgid "creators" +msgstr "" + +#: .\judge\models\problem.py:100 +msgid "testers" +msgstr "" + +#: .\judge\models\problem.py:102 +msgid "These users will be able to view a private problem, but not edit it." +msgstr "" + +#: .\judge\models\problem.py:106 .\judge\models\problem.py:271 +msgid "memory limit" +msgstr "" + +#: .\judge\models\problem.py:109 +msgid "allows partial points" +msgstr "" + +#: .\judge\models\problem.py:110 +msgid "allowed languages" +msgstr "" + +#: .\judge\models\problem.py:112 +msgid "date of publishing" +msgstr "" + +#: .\judge\models\problem.py:113 +msgid "Doesn't have magic ability to auto-publish due to backward compatibility" +msgstr "" + +#: .\judge\models\problem.py:114 +msgid "personae non gratae" +msgstr "" + +#: .\judge\models\problem.py:115 +msgid "Bans the selected users from submitting to this problem" +msgstr "" + +#: .\judge\models\problem.py:117 +msgid "amount of users" +msgstr "" + +#: .\judge\models\problem.py:118 +msgid "The amount of users on the best solutions page." +msgstr "" + +#: .\judge\models\problem.py:119 +msgid "rate of AC submissions" +msgstr "" + +#: .\judge\models\problem.py:257 .\judge\models\problem.py:269 +#: .\judge\models\runtime.py:94 +msgid "language" +msgstr "" + +#: .\judge\models\problem.py:258 +msgid "translated name" +msgstr "" + +#: .\judge\models\problem.py:259 +msgid "translated description" +msgstr "" + +#: .\judge\models\problem.py:263 +msgid "problem translation" +msgstr "" + +#: .\judge\models\problem.py:264 +msgid "problem translations" +msgstr "" + +#: .\judge\models\problem.py:275 +msgid "language-specific resource limit" +msgstr "" + +#: .\judge\models\problem.py:276 +msgid "language-specific resource limits" +msgstr "" + +#: .\judge\models\problem_data.py:18 +msgid "Standard" +msgstr "" + +#: .\judge\models\problem_data.py:19 +msgid "Floats" +msgstr "" + +#: .\judge\models\problem_data.py:20 +msgid "Floats (absolute)" +msgstr "" + +#: .\judge\models\problem_data.py:21 +msgid "Floats (relative)" +msgstr "" + +#: .\judge\models\problem_data.py:22 +msgid "Non-trailing spaces" +msgstr "" + +#: .\judge\models\problem_data.py:23 +msgid "Unordered" +msgstr "" + +#: .\judge\models\problem_data.py:24 +msgid "Byte identical" +msgstr "" + +#: .\judge\models\problem_data.py:30 +msgid "data zip file" +msgstr "" + +#: .\judge\models\problem_data.py:32 +msgid "generator file" +msgstr "" + +#: .\judge\models\problem_data.py:34 .\judge\models\problem_data.py:68 +msgid "output prefix length" +msgstr "" + +#: .\judge\models\problem_data.py:35 .\judge\models\problem_data.py:69 +msgid "output limit length" +msgstr "" + +#: .\judge\models\problem_data.py:36 +msgid "init.yml generation feedback" +msgstr "" + +#: .\judge\models\problem_data.py:37 .\judge\models\problem_data.py:70 +msgid "checker" +msgstr "" + +#: .\judge\models\problem_data.py:38 .\judge\models\problem_data.py:71 +msgid "checker arguments" +msgstr "" + +#: .\judge\models\problem_data.py:39 .\judge\models\problem_data.py:72 +msgid "checker arguments as a JSON object" +msgstr "" + +#: .\judge\models\problem_data.py:57 +msgid "problem data set" +msgstr "" + +#: .\judge\models\problem_data.py:58 +msgid "case position" +msgstr "" + +#: .\judge\models\problem_data.py:59 +msgid "case type" +msgstr "" + +#: .\judge\models\problem_data.py:60 +msgid "Normal case" +msgstr "" + +#: .\judge\models\problem_data.py:61 +msgid "Batch start" +msgstr "" + +#: .\judge\models\problem_data.py:62 +msgid "Batch end" +msgstr "" + +#: .\judge\models\problem_data.py:63 +msgid "input file name" +msgstr "" + +#: .\judge\models\problem_data.py:64 +msgid "output file name" +msgstr "" + +#: .\judge\models\problem_data.py:65 +msgid "generator arguments" +msgstr "" + +#: .\judge\models\problem_data.py:66 +msgid "point value" +msgstr "" + +#: .\judge\models\problem_data.py:67 +msgid "case is pretest?" +msgstr "" + +#: .\judge\models\profile.py:20 +msgid "organization title" +msgstr "" + +#: .\judge\models\profile.py:22 +msgid "Organization name shows in URL" +msgstr "" + +#: .\judge\models\profile.py:26 +msgid "Displayed beside user name during contests" +msgstr "" + +#: .\judge\models\profile.py:27 +msgid "organization description" +msgstr "" + +#: .\judge\models\profile.py:28 +msgid "registrant" +msgstr "" + +#: .\judge\models\profile.py:30 +msgid "User who registered this organization" +msgstr "" + +#: .\judge\models\profile.py:31 +msgid "administrators" +msgstr "" + +#: .\judge\models\profile.py:32 +msgid "Those who can edit this organization" +msgstr "" + +#: .\judge\models\profile.py:33 +msgid "creation date" +msgstr "" + +#: .\judge\models\profile.py:34 +msgid "Allow joining organization" +msgstr "" + +#: .\judge\models\profile.py:35 +msgid "maximum size" +msgstr "" + +#: .\judge\models\profile.py:36 +msgid "Maximum amount of users in this organization, only applicable to private organizations" +msgstr "" + +#: .\judge\models\profile.py:38 +msgid "Student access code" +msgstr "" + +#: .\judge\models\profile.py:39 +msgid "access code" +msgstr "" + +#: .\judge\models\profile.py:65 .\judge\models\profile.py:81 +#: .\judge\models\profile.py:160 +msgid "organization" +msgstr "" + +#: .\judge\models\profile.py:70 +msgid "user associated" +msgstr "" + +#: .\judge\models\profile.py:71 +msgid "display name" +msgstr "" + +#: .\judge\models\profile.py:72 +msgid "self-description" +msgstr "" + +#: .\judge\models\profile.py:73 +msgid "location" +msgstr "" + +#: .\judge\models\profile.py:75 +msgid "preferred language" +msgstr "" + +#: .\judge\models\profile.py:79 +msgid "last access time" +msgstr "" + +#: .\judge\models\profile.py:80 +msgid "last IP" +msgstr "" + +#: .\judge\models\profile.py:83 +msgid "display rank" +msgstr "" + +#: .\judge\models\profile.py:85 +msgid "comment mute" +msgstr "" + +#: .\judge\models\profile.py:85 +msgid "Some users are at their best when silent." +msgstr "" + +#: .\judge\models\profile.py:88 +msgid "user script" +msgstr "" + +#: .\judge\models\profile.py:89 +msgid "User-defined JavaScript for site customization." +msgstr "" + +#: .\judge\models\profile.py:90 +msgid "current contest" +msgstr "" + +#: .\judge\models\profile.py:92 +msgid "math engine" +msgstr "" + +#: .\judge\models\profile.py:94 +msgid "the rendering engine used to render math" +msgstr "" + +#: .\judge\models\profile.py:126 +#, python-format +msgctxt "user display name" +msgid "%(username)s (%(display)s)" +msgstr "" + +#: .\judge\models\profile.py:154 +msgid "user profile" +msgstr "" + +#: .\judge\models\profile.py:155 +msgid "user profiles" +msgstr "" + +#: .\judge\models\profile.py:161 +msgid "request time" +msgstr "" + +#: .\judge\models\profile.py:162 +msgid "state" +msgstr "" + +#: .\judge\models\profile.py:167 +msgid "reason" +msgstr "" + +#: .\judge\models\profile.py:170 +msgid "organization join request" +msgstr "" + +#: .\judge\models\profile.py:171 +msgid "organization join requests" +msgstr "" + +#: .\judge\models\runtime.py:15 +msgid "short identifier" +msgstr "" + +#: .\judge\models\runtime.py:16 +msgid "The identifier for this language; the same as its executor id for judges." +msgstr "" + +#: .\judge\models\runtime.py:18 +msgid "long name" +msgstr "" + +#: .\judge\models\runtime.py:19 +msgid "Longer name for the language, e.g. \"Python 2\" or \"C++11\"." +msgstr "" + +#: .\judge\models\runtime.py:21 +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 +msgid "common name" +msgstr "" + +#: .\judge\models\runtime.py:26 +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 +msgid "ace mode name" +msgstr "" + +#: .\judge\models\runtime.py:29 +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 +msgid "pygments name" +msgstr "" + +#: .\judge\models\runtime.py:32 +msgid "Language ID for Pygments highlighting in source windows." +msgstr "" + +#: .\judge\models\runtime.py:33 +msgid "runtime info override" +msgstr "" + +#: .\judge\models\runtime.py:34 +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:36 +msgid "language description" +msgstr "" + +#: .\judge\models\runtime.py:37 +msgid "Use field this to inform users of quirks with your environment, additional restrictions, etc." +msgstr "" + +#: .\judge\models\runtime.py:39 +msgid "extension" +msgstr "" + +#: .\judge\models\runtime.py:40 +msgid "The extension of source files, e.g., \"py\" or \"cpp\"." +msgstr "" + +#: .\judge\models\runtime.py:95 +msgid "languages" +msgstr "" + +#: .\judge\models\runtime.py:99 +msgid "language to which this runtime belongs" +msgstr "" + +#: .\judge\models\runtime.py:100 +msgid "judge on which this runtime exists" +msgstr "" + +#: .\judge\models\runtime.py:101 +msgid "runtime name" +msgstr "" + +#: .\judge\models\runtime.py:102 +msgid "runtime version" +msgstr "" + +#: .\judge\models\runtime.py:103 +msgid "order in which to display this runtime" +msgstr "" + +#: .\judge\models\runtime.py:107 +msgid "Server name, hostname-style" +msgstr "" + +#: .\judge\models\runtime.py:108 +msgid "time of creation" +msgstr "" + +#: .\judge\models\runtime.py:109 +msgid "A key to authenticated this judge" +msgstr "" + +#: .\judge\models\runtime.py:110 +msgid "authentication key" +msgstr "" + +#: .\judge\models\runtime.py:111 +msgid "judge online status" +msgstr "" + +#: .\judge\models\runtime.py:112 +msgid "judge start time" +msgstr "" + +#: .\judge\models\runtime.py:113 +msgid "response time" +msgstr "" + +#: .\judge\models\runtime.py:114 +msgid "system load" +msgstr "" + +#: .\judge\models\runtime.py:115 +msgid "Load for the last minute, divided by processors to be fair." +msgstr "" + +#: .\judge\models\runtime.py:116 +msgid "description" +msgstr "" + +#: .\judge\models\runtime.py:119 .\judge\models\runtime.py:154 +msgid "judges" +msgstr "" + +#: .\judge\models\runtime.py:153 +msgid "judge" +msgstr "" + +#: .\judge\models\submission.py:15 .\judge\models\submission.py:41 +#: .\judge\utils\problems.py:67 +msgid "Accepted" +msgstr "" + +#: .\judge\models\submission.py:16 .\judge\models\submission.py:42 +#: .\judge\utils\problems.py:68 +msgid "Wrong Answer" +msgstr "" + +#: .\judge\models\submission.py:17 .\judge\models\submission.py:44 +#: .\judge\utils\problems.py:70 +msgid "Time Limit Exceeded" +msgstr "" + +#: .\judge\models\submission.py:18 .\judge\models\submission.py:45 +#: .\judge\utils\problems.py:71 +msgid "Memory Limit Exceeded" +msgstr "" + +#: .\judge\models\submission.py:19 .\judge\models\submission.py:46 +msgid "Output Limit Exceeded" +msgstr "" + +#: .\judge\models\submission.py:20 .\judge\models\submission.py:47 +#: .\judge\utils\problems.py:72 +msgid "Invalid Return" +msgstr "" + +#: .\judge\models\submission.py:21 .\judge\models\submission.py:48 +msgid "Runtime Error" +msgstr "" + +#: .\judge\models\submission.py:22 .\judge\models\submission.py:36 +#: .\judge\models\submission.py:49 .\judge\utils\problems.py:69 +msgid "Compile Error" +msgstr "" + +#: .\judge\models\submission.py:23 .\judge\models\submission.py:35 +msgid "Internal Error" +msgstr "" + +#: .\judge\models\submission.py:24 +msgid "Short circuit" +msgstr "" + +#: .\judge\models\submission.py:25 .\judge\models\submission.py:37 +#: .\judge\models\submission.py:55 +msgid "Aborted" +msgstr "" + +#: .\judge\models\submission.py:31 .\judge\models\submission.py:51 +msgid "Queued" +msgstr "" + +#: .\judge\models\submission.py:32 .\judge\models\submission.py:52 +msgid "Processing" +msgstr "" + +#: .\judge\models\submission.py:33 .\judge\models\submission.py:53 +msgid "Grading" +msgstr "" + +#: .\judge\models\submission.py:34 .\judge\models\submission.py:54 +msgid "Completed" +msgstr "" + +#: .\judge\models\submission.py:50 +msgid "Internal Error (judging server error)" +msgstr "" + +#: .\judge\models\submission.py:60 +msgid "submission time" +msgstr "" + +#: .\judge\models\submission.py:61 .\judge\models\submission.py:154 +msgid "execution time" +msgstr "" + +#: .\judge\models\submission.py:62 .\judge\models\submission.py:155 +msgid "memory usage" +msgstr "" + +#: .\judge\models\submission.py:63 .\judge\models\submission.py:156 +msgid "points granted" +msgstr "" + +#: .\judge\models\submission.py:64 +msgid "submission language" +msgstr "" + +#: .\judge\models\submission.py:65 +msgid "source code" +msgstr "" + +#: .\judge\models\submission.py:69 +msgid "compile errors" +msgstr "" + +#: .\judge\models\submission.py:71 +msgid "batched cases" +msgstr "" + +#: .\judge\models\submission.py:72 +msgid "test case points" +msgstr "" + +#: .\judge\models\submission.py:73 +msgid "test case total points" +msgstr "" + +#: .\judge\models\submission.py:74 +msgid "judged on" +msgstr "" + +#: .\judge\models\submission.py:76 +msgid "was rejudged by admin" +msgstr "" + +#: .\judge\models\submission.py:77 +msgid "was ran on pretests only" +msgstr "" + +#: .\judge\models\submission.py:145 +msgid "submissions" +msgstr "" + +#: .\judge\models\submission.py:151 +msgid "associated submission" +msgstr "" + +#: .\judge\models\submission.py:152 +msgid "test case ID" +msgstr "" + +#: .\judge\models\submission.py:153 +msgid "status flag" +msgstr "" + +#: .\judge\models\submission.py:157 +msgid "points possible" +msgstr "" + +#: .\judge\models\submission.py:158 +msgid "batch number" +msgstr "" + +#: .\judge\models\submission.py:159 +msgid "judging feedback" +msgstr "" + +#: .\judge\models\submission.py:160 +msgid "program output" +msgstr "" + +#: .\judge\models\submission.py:167 +msgid "submission test case" +msgstr "" + +#: .\judge\models\submission.py:168 +msgid "submission test cases" +msgstr "" + +#: .\judge\pdf_problems.py:70 .\judge\pdf_problems.py:126 +msgid "Page [page] of [topage]" +msgstr "" + +#: .\judge\templatetags\timedelta.py:53 +msgctxt "time format with day" +msgid "%d day %h:%m:%s" +msgid_plural "%d days %h:%m:%s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: .\judge\templatetags\timedelta.py:57 +msgctxt "time format without day" +msgid "%h:%m:%s" +msgstr "" + +#: .\judge\templatetags\timedelta.py:63 +msgctxt "time format no seconds with day" +msgid "%d day %h:%m" +msgid_plural "%d days %h:%m" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: .\judge\templatetags\timedelta.py:65 +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: .\judge\templatetags\timedelta.py:67 +msgctxt "hours and minutes" +msgid "%h:%m" +msgstr "" + +#: .\judge\utils\problem_data.py:60 +msgid "Empty batches not allowed." +msgstr "" + +#: .\judge\utils\problem_data.py:79 +#, python-format +msgid "Points must be defined for non-batch case #%d." +msgstr "" + +#: .\judge\utils\problem_data.py:84 +#, python-format +msgid "Input file for case %d does not exist: %s" +msgstr "" + +#: .\judge\utils\problem_data.py:87 +#, python-format +msgid "Output file for case %d does not exist: %s" +msgstr "" + +#: .\judge\utils\problem_data.py:112 +#, python-format +msgid "Batch start case #%d requires points." +msgstr "" + +#: .\judge\utils\problem_data.py:133 +#, python-format +msgid "Attempt to end batch outside of one in case #%d" +msgstr "" + +#: .\judge\utils\problem_data.py:148 +msgid "How did you corrupt the zip path?" +msgstr "" + +#: .\judge\utils\problems.py:62 +msgid "Can't pass both queryset and keyword filters" +msgstr "" + +#: .\judge\utils\problems.py:73 +msgid "Total" +msgstr "" + +#: .\judge\views\blog.py:32 +#, python-format +msgid "Page %d of Posts" +msgstr "" + +#: .\judge\views\comment.py:22 +msgid "Messing around, are we?" +msgstr "" + +#: .\judge\views\comment.py:46 +msgid "You already voted." +msgstr "" + +#: .\judge\views\comment.py:86 +#, python-format +msgid "Revisions for %s" +msgstr "" + +#: .\judge\views\comment.py:103 .\judge\views\organization.py:274 +msgid "Edited from site" +msgstr "" + +#: .\judge\views\comment.py:124 .\judge\views\organization.py:264 +#, python-format +msgid "Editing %s" +msgstr "" + +#: .\judge\views\contests.py:47 .\judge\views\contests.py:131 +#: .\judge\views\contests.py:134 .\judge\views\contests.py:249 +msgid "No such contest" +msgstr "" + +#: .\judge\views\contests.py:48 .\judge\views\contests.py:132 +#, python-format +msgid "Could not find a contest with the key \"%s\"." +msgstr "" + +#: .\judge\views\contests.py:68 +msgid "Contests" +msgstr "" + +#: .\judge\views\contests.py:135 +msgid "Could not find such contest." +msgstr "" + +#: .\judge\views\contests.py:138 +#, python-format +msgid "Access to contest \"%s\" denied" +msgstr "" + +#: .\judge\views\contests.py:198 +msgid "Contest not ongoing" +msgstr "" + +#: .\judge\views\contests.py:199 +#, python-format +msgid "\"%s\" is not currently ongoing." +msgstr "" + +#: .\judge\views\contests.py:203 +msgid "Already in contest" +msgstr "" + +#: .\judge\views\contests.py:204 +#, python-format +msgid "You are already in a contest: \"%s\"." +msgstr "" + +#: .\judge\views\contests.py:250 +#, python-format +msgid "You are not in contest \"%s\"." +msgstr "" + +#: .\judge\views\contests.py:269 +msgid "ContestCalender requires integer year and month" +msgstr "" + +#: .\judge\views\contests.py:467 +#, python-format +msgid "%s Rankings" +msgstr "" + +#: .\judge\views\contests.py:469 +msgid "Rankings" +msgstr "" + +#: .\judge\views\contests.py:495 +msgid "Live" +msgstr "" + +#: .\judge\views\contests.py:503 +#, python-format +msgid "Your participation in %s" +msgstr "" + +#: .\judge\views\contests.py:504 +#, python-format +msgid "%s's participation in %s" +msgstr "" + +#: .\judge\views\contests.py:506 +msgid "Your participation" +msgstr "" + +#: .\judge\views\contests.py:507 +#, python-format +msgid "%s's participation" +msgstr "" + +#: .\judge\views\contests.py:513 +msgid "Participation" +msgstr "" + +#: .\judge\views\contests.py:537 +#, python-format +msgid "Contest tag: %s" +msgstr "" + +#: .\judge\views\error.py:14 +msgid "404 error" +msgstr "" + +#: .\judge\views\error.py:15 +#, python-format +msgid "Could not find page \"%s\"" +msgstr "" + +#: .\judge\views\error.py:21 +#, python-format +msgid "no permission for %s" +msgstr "" + +#: .\judge\views\error.py:27 +#, python-format +msgid "corrupt page %s" +msgstr "" + +#: .\judge\views\language.py:14 .\templates\judge_status_table.jade:8 +msgid "Runtimes" +msgstr "" + +#: .\judge\views\organization.py:43 .\judge\views\organization.py:46 +msgid "No such organization" +msgstr "" + +#: .\judge\views\organization.py:44 +#, python-format +msgid "Could not find an organization with the key \"%s\"." +msgstr "" + +#: .\judge\views\organization.py:47 +msgid "Could not find such organization." +msgstr "" + +#: .\judge\views\organization.py:62 .\judge\views\register.py:34 +#: .\templates\user\user_list_tabs.jade:7 +msgid "Organizations" +msgstr "" + +#: .\judge\views\organization.py:80 +#, python-format +msgid "%s Members" +msgstr "" + +#: .\judge\views\organization.py:110 .\judge\views\organization.py:112 +msgid "Joining organization" +msgstr "" + +#: .\judge\views\organization.py:110 +msgid "You are already in the organization." +msgstr "" + +#: .\judge\views\organization.py:112 +msgid "This organization is not open." +msgstr "" + +#: .\judge\views\organization.py:121 +msgid "Leaving organization" +msgstr "" + +#: .\judge\views\organization.py:121 +#, python-format +msgid "You are not in \"%s\"." +msgstr "" + +#: .\judge\views\organization.py:145 +#, python-format +msgid "Request to join %s" +msgstr "" + +#: .\judge\views\organization.py:161 +msgid "Join request detail" +msgstr "" + +#: .\judge\views\organization.py:190 +#, python-format +msgid "Managing join requests for %s" +msgstr "" + +#: .\judge\views\organization.py:221 +#, python-format +msgid "Your organization can only receive %d more members. You cannot approve %d users." +msgstr "" + +#: .\judge\views\organization.py:233 +#, python-format +msgid "Approved %d user." +msgid_plural "Approved %d users." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: .\judge\views\organization.py:234 +#, python-format +msgid "Rejected %d user." +msgid_plural "Rejected %d users." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: .\judge\views\organization.py:282 .\judge\views\organization.py:290 +msgid "Can't edit organization" +msgstr "" + +#: .\judge\views\organization.py:283 +msgid "You are not allowed to edit this organization." +msgstr "" + +#: .\judge\views\organization.py:291 +msgid "You are not allowed to kick people from this organization." +msgstr "" + +#: .\judge\views\organization.py:296 .\judge\views\organization.py:300 +msgid "Can't kick user" +msgstr "" + +#: .\judge\views\organization.py:297 +msgid "The user you are trying to kick does not exist!" +msgstr "" + +#: .\judge\views\organization.py:301 +#, python-format +msgid "The user you are trying to kick is not in organization: %s." +msgstr "" + +#: .\judge\views\problem.py:60 +msgid "No such problem" +msgstr "" + +#: .\judge\views\problem.py:61 +#, python-format +msgid "Could not find a problem with the code \"%s\"." +msgstr "" + +#: .\judge\views\problem.py:183 .\templates\problem\problem_list_tabs.jade:5 +#: .\templates\user\user_tabs.jade:7 .\templates\user\users_table.jade:7 +#: .\templates\user\users_table.jade:9 +msgid "Problems" +msgstr "" + +#: .\judge\views\problem.py:400 +msgid "Banned from Submitting" +msgstr "" + +#: .\judge\views\problem.py:401 +msgid "You have been declared persona non grata for this problem. You are permanently barred from submitting this problem." +msgstr "" + +#: .\judge\views\problem.py:444 +msgid "Submit" +msgstr "" + +#: .\judge\views\problem_data.py:36 +msgid "Checker arguments must be a JSON object" +msgstr "" + +#: .\judge\views\problem_data.py:38 +msgid "Checker arguments is invalid JSON" +msgstr "" + +#: .\judge\views\problem_data.py:45 +msgid "Your zip file is invalid!" +msgstr "" + +#: .\judge\views\problem_data.py:91 .\judge\views\problem_data.py:94 +#, python-format +msgid "Editing data for %s" +msgstr "" + +#: .\judge\views\problem_data.py:195 .\judge\views\problem_data.py:196 +#, python-format +msgid "Generated init.yml for %s" +msgstr "" + +#: .\judge\views\ranked_submission.py:58 +#, python-format +msgid "Best solutions for %s" +msgstr "" + +#: .\judge\views\ranked_submission.py:61 +#, python-brace-format +msgid "Best solutions for {0}" +msgstr "" + +#: .\judge\views\ranked_submission.py:70 +#, python-format +msgid "Best solutions for %(problem)s in %(contest)s" +msgstr "" + +#: .\judge\views\ranked_submission.py:74 +#, python-brace-format +msgid "Best solutions for {0} in {2}" +msgstr "" + +#: .\judge\views\register.py:25 +#: .\templates\registration\registration_form.jade:118 +#: .\templates\user\base_users_table.jade:5 +msgid "Username" +msgstr "" + +#: .\judge\views\register.py:26 +msgid "A username must contain letters, numbers, or underscores" +msgstr "" + +#: .\judge\views\register.py:28 +msgid "Real name (optional)" +msgstr "" + +#: .\judge\views\register.py:31 .\templates\user\edit_profile.jade:79 +msgid "Preferred language" +msgstr "" + +#: .\judge\views\register.py:42 +#, python-format +msgid "The email address \"%s\" is already taken. Only one registration is allowed per address." +msgstr "" + +#: .\judge\views\register.py:48 +msgid "Your email provider is not allowed due to history of abuse. Please use a reputable email provider." +msgstr "" + +#: .\judge\views\register.py:54 .\judge\views\register.py:93 +msgid "Registration" +msgstr "" + +#: .\judge\views\register.py:104 +msgid "Authentication failure" +msgstr "" + +#: .\judge\views\stats.py:94 +msgid "Language statistics" +msgstr "" + +#: .\judge\views\status.py:25 .\templates\submission\list.jade:153 +msgid "Status" +msgstr "" + +#: .\judge\views\status.py:51 +msgid "No such judge" +msgstr "" + +#: .\judge\views\status.py:52 +#, python-format +msgid "Could not find a judge with the name \"%s\"." +msgstr "" + +#: .\judge\views\status.py:55 +#, python-format +msgid "Judge %s" +msgstr "" + +#: .\judge\views\submission.py:52 .\judge\views\submission.py:59 +#, python-format +msgid "Submission of %(problem)s by %(user)s" +msgstr "" + +#: .\judge\views\submission.py:128 .\templates\problem\problem.jade:18 +msgid "All submissions" +msgstr "" + +#: .\judge\views\submission.py:201 +#, python-format +msgid "All submissions by %s" +msgstr "" + +#: .\judge\views\submission.py:225 +#, python-format +msgid "All submissions for %s" +msgstr "" + +#: .\judge\views\submission.py:244 +msgid "Must pass a problem" +msgstr "" + +#: .\judge\views\submission.py:270 +#, python-format +msgid "%(user)s's submissions for %(problem)s" +msgstr "" + +#: .\judge\views\submission.py:359 +msgid "Must pass a contest" +msgstr "" + +#: .\judge\views\submission.py:374 +#, python-brace-format +msgid "{0}'s submissions for {2} in {4}" +msgstr "" + +#: .\judge\views\user.py:66 +msgid "No such user" +msgstr "" + +#: .\judge\views\user.py:66 +#, python-format +msgid "No user handle \"%s\"." +msgstr "" + +#: .\judge\views\user.py:70 +msgid "My Account" +msgstr "" + +#: .\judge\views\user.py:71 +#, python-format +msgid "User %s" +msgstr "" + +#: .\judge\views\user.py:138 .\templates\contest\list.jade:31 +#: .\templates\contest\list.jade:32 .\templates\contest\list.jade:59 +#: .\templates\contest\list.jade:60 .\templates\contest\list.jade:84 +#: .\templates\contest\list.jade:85 +msgid "M j, Y, G:i" +msgstr "" + +#: .\judge\views\user.py:171 +msgid "Updated on site" +msgstr "" + +#: .\judge\views\user.py:196 .\templates\admin\auth\user\change_form.html:14 +#: .\templates\admin\auth\user\change_form.html:17 .\templates\base.jade:97 +#: .\templates\user\user_tabs.jade:9 +msgid "Edit profile" +msgstr "" + +#: .\judge\views\user.py:204 .\templates\user\user_list_tabs.jade:5 +msgid "Leaderboard" +msgstr "" + +#: .\judge\views\widgets.py:53 .\judge\views\widgets.py:64 +#, python-format +msgid "Invalid upstream data: %s" +msgstr "" + +#: .\judge\views\widgets.py:74 +msgid "Bad latitude or longitude" +msgstr "" + +#: .\templates\admin\judge\contest\change_form.html:14 +#: .\templates\admin\judge\contest\change_form.html:17 +msgid "Rate" +msgstr "" + +#: .\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 +msgid "Edit user" +msgstr "" + +#: .\templates\admin\judge\submission\change_form.html:14 +#: .\templates\admin\judge\submission\change_form.html:17 +#: .\templates\submission\source.jade:19 .\templates\submission\status.jade:136 +msgid "Rejudge" +msgstr "" + +#: .\templates\base.jade:93 +#, python-format +msgid "Hello, %(username)s." +msgstr "" + +#: .\templates\base.jade:95 .\templates\comments\list.jade:11 +#: .\templates\judge_status.jade:2 .\templates\problem\problem_list_tabs.jade:9 +#: .\templates\submission\info_base.jade:2 +msgid "Admin" +msgstr "" + +#: .\templates\base.jade:99 +msgid "Log out" +msgstr "" + +#: .\templates\base.jade:103 +msgid "Login" +msgstr "" + +#: .\templates\base.jade:103 +msgid "Register" +msgstr "" + +#: .\templates\base.jade:108 +msgid "spectating" +msgstr "" + +#: .\templates\base.jade:116 +msgid "This site works best with JavaScript enabled." +msgstr "" + +#: .\templates\blog\content.jade:2 .\templates\comments\list.jade:11 +#: .\templates\contest\tag_title.jade:4 .\templates\flatpages\admin_link.jade:2 +#: .\templates\flatpages\dmsolutions.jade:3 .\templates\judge.jade:2 +#: .\templates\language.jade:16 .\templates\problem\data.jade:404 +#: .\templates\solution.jade:4 +msgid "Edit" +msgstr "" + +#: .\templates\blog\content.jade:6 .\templates\contest\list.jade:30 +msgid "N j, Y, G:i" +msgstr "" + +#: .\templates\blog\content.jade:13 .\templates\contest\contest.jade:77 +#: .\templates\problem\problem.jade:67 +msgid "Comments" +msgstr "" + +#: .\templates\blog\dashboard.jade:11 .\templates\blog\list.jade:93 +msgid "N j, Y, g:i" +msgstr "" + +#: .\templates\blog\dashboard.jade:11 .\templates\blog\list.jade:93 +#: .\templates\comments\list.jade:10 .\templates\submission\row.jade:13 +#, python-format +msgid "on %(time)s" +msgstr "" + +#: .\templates\blog\list.jade:79 +msgid "Blog" +msgstr "" + +#: .\templates\blog\list.jade:81 +msgid "Events" +msgstr "" + +#: .\templates\blog\list.jade:86 +msgid "News" +msgstr "" + +#: .\templates\blog\list.jade:92 +msgid "posted" +msgstr "" + +#: .\templates\blog\list.jade:105 +msgid "Ongoing contests" +msgstr "" + +#: .\templates\blog\list.jade:111 .\templates\contest\list.jade:29 +#, python-format +msgid "Ends in %(countdown)s." +msgstr "" + +#: .\templates\blog\list.jade:118 +msgid "Upcoming contests" +msgstr "" + +#: .\templates\blog\list.jade:124 .\templates\contest\contest.jade:64 +#: .\templates\contest\list.jade:58 +#, python-format +msgid "Starting in %(countdown)s." +msgstr "" + +#: .\templates\blog\list.jade:130 +msgid "Comment stream" +msgstr "" + +#: .\templates\blog\list.jade:143 +msgid "New problems" +msgstr "" + +#: .\templates\comments\history_ajax.jade:7 .\templates\comments\list.jade:10 +#: .\templates\organization\requests\detail.jade:19 +#: .\templates\submission\info_base.jade:1 .\templates\submission\row.jade:13 +msgid "N j, Y, g:i a" +msgstr "" + +#: .\templates\comments\list.jade:5 .\templates\comments\list.jade:6 +msgid "Please login to vote" +msgstr "" + +#: .\templates\comments\list.jade:10 +#, python-format +msgid "%(edits)s edits" +msgstr "" + +#: .\templates\comments\list.jade:11 +msgid "edited" +msgstr "" + +#: .\templates\comments\list.jade:11 +msgid "Link" +msgstr "" + +#: .\templates\comments\list.jade:11 +msgid "Reply" +msgstr "" + +#: .\templates\comments\list.jade:19 +msgid "There are no comments at the moment." +msgstr "" + +#: .\templates\comments\list.jade:22 +msgid "New comment" +msgstr "" + +#: .\templates\comments\list.jade:27 +msgid "Invalid comment title." +msgstr "" + +#: .\templates\comments\list.jade:27 +msgid "Invalid comment body." +msgstr "" + +#: .\templates\comments\list.jade:37 +msgid "Post!" +msgstr "" + +#: .\templates\contest\calendar.jade:1 .\templates\contest\calendar.jade:4 +msgid "F Y" +msgstr "" + +#: .\templates\contest\calendar.jade:1 .\templates\contest\calendar.jade:4 +#, python-format +msgid "Contests in %(month)s" +msgstr "" + +#: .\templates\contest\calendar.jade:7 +msgid "Prev" +msgstr "" + +#: .\templates\contest\calendar.jade:7 +msgid "Next" +msgstr "" + +#: .\templates\contest\calendar.jade:12 +msgid "Sunday" +msgstr "" + +#: .\templates\contest\calendar.jade:13 +msgid "Monday" +msgstr "" + +#: .\templates\contest\calendar.jade:14 +msgid "Tuesday" +msgstr "" + +#: .\templates\contest\calendar.jade:15 +msgid "Wednesday" +msgstr "" + +#: .\templates\contest\calendar.jade:16 +msgid "Thursday" +msgstr "" + +#: .\templates\contest\calendar.jade:17 +msgid "Friday" +msgstr "" + +#: .\templates\contest\calendar.jade:18 +msgid "Saturday" +msgstr "" + +#: .\templates\contest\contest.jade:34 +msgid "Are you sure you want to leave?" +msgstr "" + +#: .\templates\contest\contest.jade:35 +msgid "You cannot come back to a virtual participation. You will have to start a new one." +msgstr "" + +#: .\templates\contest\contest.jade:48 .\templates\contest\contest.jade:53 +msgid "Leave contest" +msgstr "" + +#: .\templates\contest\contest.jade:50 .\templates\contest\list.jade:91 +msgid "Virtual join" +msgstr "" + +#: .\templates\contest\contest.jade:52 +msgid "Stop spectating" +msgstr "" + +#: .\templates\contest\contest.jade:54 +msgid "Spectate contest" +msgstr "" + +#: .\templates\contest\contest.jade:55 +msgid "Join contest" +msgstr "" + +#: .\templates\contest\contest.jade:57 +msgid "View rankings" +msgstr "" + +#: .\templates\contest\contest.jade:57 +msgid "My participation" +msgstr "" + +#: .\templates\contest\contest.jade:58 +msgid "View user participation" +msgstr "" + +#: .\templates\contest\contest.jade:59 +msgid "Edit contest" +msgstr "" + +#: .\templates\contest\contest.jade:61 +#, python-format +msgid "Spectating, contest ends in %(countdown)s." +msgstr "" + +#: .\templates\contest\contest.jade:62 +#, python-format +msgid "Participating virtually, %(countdown)s remaining." +msgstr "" + +#: .\templates\contest\contest.jade:63 +msgid "Participating virtually." +msgstr "" + +#: .\templates\contest\contest.jade:65 +msgid "Contest is over." +msgstr "" + +#: .\templates\contest\contest.jade:66 +#, python-format +msgid "Your time is up! Contest ends in %(countdown)s." +msgstr "" + +#: .\templates\contest\contest.jade:67 +#, python-format +msgid "You have %(countdown)s remaining." +msgstr "" + +#: .\templates\contest\contest.jade:68 +#, python-format +msgid "Contest ends in %(countdown)s." +msgstr "" + +#: .\templates\contest\contest.jade:69 .\templates\contest\contest.jade:70 +msgid "F j, Y, G:i T" +msgstr "" + +#: .\templates\contest\contest.jade:69 +#, python-format +msgid "%(time_limit)s window between %(start_time)s and %(end_time)s" +msgstr "" + +#: .\templates\contest\contest.jade:70 +#, python-format +msgid "%(length)s long starting on %(start_time)s" +msgstr "" + +#: .\templates\contest\list.jade:13 +msgid "Calendar view" +msgstr "" + +#: .\templates\contest\list.jade:15 +msgid "Ongoing Contests" +msgstr "" + +#: .\templates\contest\list.jade:19 .\templates\contest\list.jade:50 +#: .\templates\contest\list.jade:74 +msgid "Contest" +msgstr "" + +#: .\templates\contest\list.jade:20 .\templates\contest\list.jade:75 +#: .\templates\problem\list.jade:136 .\templates\problem\list.jade:149 +msgid "Users" +msgstr "" + +#: .\templates\contest\list.jade:30 +msgid "Started at" +msgstr "" + +#: .\templates\contest\list.jade:32 .\templates\contest\list.jade:60 +#: .\templates\contest\list.jade:85 +#, python-format +msgid "%(time_limit)s window" +msgstr "" + +#: .\templates\contest\list.jade:33 .\templates\contest\list.jade:61 +#: .\templates\contest\list.jade:86 +#, python-format +msgid "%(window_length)s long" +msgstr "" + +#: .\templates\contest\list.jade:39 +msgid "Spectate" +msgstr "" + +#: .\templates\contest\list.jade:40 +msgid "Join" +msgstr "" + +#: .\templates\contest\list.jade:46 +msgid "Upcoming Contests" +msgstr "" + +#: .\templates\contest\list.jade:68 +msgid "There are no scheduled contests at this time." +msgstr "" + +#: .\templates\contest\list.jade:70 +msgid "Past Contests" +msgstr "" + +#: .\templates\contest\private.jade:2 +msgid "Only the following organizations may access this contest:" +msgstr "" + +#: .\templates\contest\ranking_table.jade:5 +msgid "Started" +msgstr "" + +#: .\templates\contest\ranking_table.jade:7 +msgid "Participation ended." +msgstr "" + +#: .\templates\contest\tag_title.jade:2 +msgid "Contest tag" +msgstr "" + +#: .\templates\judge.jade:7 +msgid "All Judges" +msgstr "" + +#: .\templates\judge_status.jade:5 +#, python-format +msgid "This page shows the live status of %(name)s's judging servers." +msgstr "" + +#: .\templates\judge_status.jade:7 +msgid "Judges" +msgstr "" + +#: .\templates\judge_status_table.jade:3 .\templates\language_list.jade:20 +#: .\templates\organization\list.jade:12 +msgid "Name" +msgstr "" + +#: .\templates\judge_status_table.jade:4 +msgid "Online" +msgstr "" + +#: .\templates\judge_status_table.jade:5 +msgid "Uptime" +msgstr "" + +#: .\templates\judge_status_table.jade:6 +msgid "Ping" +msgstr "" + +#: .\templates\judge_status_table.jade:7 +msgid "Load" +msgstr "" + +#: .\templates\judge_status_table.jade:29 +msgid "There are no judges available at this time." +msgstr "" + +#: .\templates\language.jade:20 +msgid "Short name:" +msgstr "" + +#: .\templates\language.jade:22 +msgid "Category:" +msgstr "" + +#: .\templates\language.jade:24 +msgid "Basic Runtime Info:" +msgstr "" + +#: .\templates\language_list.jade:19 .\templates\organization\list.jade:11 +msgid "ID" +msgstr "" + +#: .\templates\language_list.jade:21 +msgid "Runtime Info" +msgstr "" + +#: .\templates\license.jade:2 +msgid "Source:" +msgstr "" + +#: .\templates\messages\new.jade:5 +msgid "To:" +msgstr "" + +#: .\templates\messages\new.jade:10 +msgid "Send!" +msgstr "" + +#: .\templates\newsletter\common.html:7 +#: .\templates\newsletter\subscription_unsubscribe_activated.html:5 +#: .\templates\newsletter\subscription_unsubscribe_activated.html:8 +#: .\templates\newsletter\subscription_update_activated.html:5 +#: .\templates\newsletter\subscription_update_activated.html:8 +msgid "Newsletter" +msgstr "" + +#: .\templates\newsletter\subscription_unsubscribe_activated.html:5 +#: .\templates\newsletter\subscription_unsubscribe_activated.html:8 +#: .\templates\newsletter\subscription_update_activated.html:5 +#: .\templates\newsletter\subscription_update_activated.html:8 +msgid "activate" +msgstr "" + +#: .\templates\newsletter\subscription_unsubscribe_activated.html:10 +msgid "You have successfully been unsubscribed." +msgstr "" + +#: .\templates\newsletter\subscription_unsubscribe_email_sent.html:5 +#: .\templates\newsletter\subscription_unsubscribe_email_sent.html:8 +#: .\templates\newsletter\subscription_unsubscribe_user.html:5 +#: .\templates\newsletter\subscription_unsubscribe_user.html:8 +msgid "Newsletter unsubscribe" +msgstr "" + +#: .\templates\newsletter\subscription_unsubscribe_email_sent.html:10 +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:20 +msgid "Do you want to unsubscribe from this newsletter?" +msgstr "" + +#: .\templates\newsletter\subscription_unsubscribe_user.html:23 +msgid "Unsubscribe" +msgstr "" + +#: .\templates\newsletter\subscription_update.html:5 +#: .\templates\newsletter\subscription_update.html:8 +#: .\templates\newsletter\subscription_update_email_sent.html:5 +#: .\templates\newsletter\subscription_update_email_sent.html:8 +msgid "Newsletter update" +msgstr "" + +#: .\templates\newsletter\subscription_update.html:11 +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:23 +msgid "Update subscription" +msgstr "" + +#: .\templates\newsletter\subscription_update_activated.html:10 +msgid "Your subscription has successfully been updated." +msgstr "" + +#: .\templates\newsletter\subscription_update_email_sent.html:10 +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.jade:20 +#: .\templates\organization\requests\pending.jade:25 +msgid "Update" +msgstr "" + +#: .\templates\organization\home.jade:1 +msgid "Leave organization" +msgstr "" + +#: .\templates\organization\home.jade:3 +msgid "Join organization" +msgstr "" + +#: .\templates\organization\home.jade:5 +msgid "Request membership" +msgstr "" + +#: .\templates\organization\home.jade:7 +msgid "Edit organization" +msgstr "" + +#: .\templates\organization\home.jade:7 +msgid "View requests" +msgstr "" + +#: .\templates\organization\home.jade:7 +msgid "View members" +msgstr "" + +#: .\templates\organization\list.jade:13 +msgid "Members" +msgstr "" + +#: .\templates\organization\new.jade:6 +msgid "Create" +msgstr "" + +#: .\templates\organization\requests\detail.jade:8 +msgid "User:" +msgstr "" + +#: .\templates\organization\requests\detail.jade:13 +msgid "Organization:" +msgstr "" + +#: .\templates\organization\requests\detail.jade:18 +msgid "Time:" +msgstr "" + +#: .\templates\organization\requests\detail.jade:22 +msgid "Reason:" +msgstr "" + +#: .\templates\organization\requests\log.jade:5 +#: .\templates\organization\requests\pending.jade:10 +msgid "Time" +msgstr "" + +#: .\templates\organization\requests\log.jade:6 +#: .\templates\organization\requests\pending.jade:11 +msgid "State" +msgstr "" + +#: .\templates\organization\requests\log.jade:7 +#: .\templates\organization\requests\pending.jade:12 +msgid "Reason" +msgstr "" + +#: .\templates\organization\requests\log.jade:12 +#: .\templates\organization\requests\pending.jade:18 +msgid "N j, Y, H:i" +msgstr "" + +#: .\templates\organization\requests\log.jade:18 +#: .\templates\organization\requests\pending.jade:27 +msgid "There are no requests to approve." +msgstr "" + +#: .\templates\organization\requests\pending.jade:13 +#: .\templates\problem\data.jade:382 +msgid "Delete?" +msgstr "" + +#: .\templates\organization\requests\request.jade:13 +msgid "Your reason for joining:" +msgstr "" + +#: .\templates\organization\requests\request.jade:17 +msgid "Request" +msgstr "" + +#: .\templates\organization\requests\tabs.jade:3 +msgid "Pending" +msgstr "" + +#: .\templates\organization\requests\tabs.jade:5 +msgid "Log" +msgstr "" + +#: .\templates\organization\requests\tabs.jade:7 +msgid "Approved" +msgstr "" + +#: .\templates\organization\requests\tabs.jade:9 +msgid "Rejected" +msgstr "" + +#: .\templates\organization\users_table.jade:5 +msgid "Kick" +msgstr "" + +#: .\templates\problem\data.jade:342 +msgid "View YAML" +msgstr "" + +#: .\templates\problem\data.jade:351 +msgid "Show columns:" +msgstr "" + +#: .\templates\problem\data.jade:354 .\templates\problem\data.jade:378 +msgid "Output prefix" +msgstr "" + +#: .\templates\problem\data.jade:358 .\templates\problem\data.jade:379 +msgid "Output limit" +msgstr "" + +#: .\templates\problem\data.jade:362 .\templates\problem\data.jade:380 +msgid "Checker" +msgstr "" + +#: .\templates\problem\data.jade:366 .\templates\problem\data.jade:381 +msgid "Generator args" +msgstr "" + +#: .\templates\problem\data.jade:372 +msgid "Order" +msgstr "" + +#: .\templates\problem\data.jade:373 +msgid "Type" +msgstr "" + +#: .\templates\problem\data.jade:374 +msgid "Input file" +msgstr "" + +#: .\templates\problem\data.jade:375 +msgid "Output file" +msgstr "" + +#: .\templates\problem\data.jade:377 +msgid "Pretest?" +msgstr "" + +#: .\templates\problem\data.jade:411 .\templates\problem\submit.jade:206 +msgid "Submit!" +msgstr "" + +#: .\templates\problem\data.jade:411 +msgid "Add new case" +msgstr "" + +#: .\templates\problem\list.jade:54 +msgid "Filter by type..." +msgstr "" + +#: .\templates\problem\list.jade:133 .\templates\problem\list.jade:141 +#: .\templates\problem\search_form.jade:21 +msgid "Category" +msgstr "" + +#: .\templates\problem\list.jade:134 .\templates\problem\list.jade:143 +msgid "Types" +msgstr "" + +#: .\templates\problem\list.jade:147 +#, python-format +msgid "AC %%" +msgstr "" + +#: .\templates\problem\problem.jade:12 +msgid "View as PDF" +msgstr "" + +#: .\templates\problem\problem.jade:14 +msgid "Submit solution" +msgstr "" + +#: .\templates\problem\problem.jade:16 .\templates\submission\list.jade:138 +msgid "My submissions" +msgstr "" + +#: .\templates\problem\problem.jade:20 +msgid "Best submissions" +msgstr "" + +#: .\templates\problem\problem.jade:26 +msgid "Edit problem" +msgstr "" + +#: .\templates\problem\problem.jade:29 +msgid "Clone problem" +msgstr "" + +#: .\templates\problem\problem.jade:33 .\templates\problem\raw.jade:45 +msgid "Points:" +msgstr "" + +#: .\templates\problem\problem.jade:34 .\templates\problem\problem.jade:35 +msgid "(partial)" +msgstr "" + +#: .\templates\problem\problem.jade:37 .\templates\problem\raw.jade:55 +msgid "Time limit:" +msgstr "" + +#: .\templates\problem\problem.jade:43 .\templates\problem\raw.jade:63 +msgid "Memory limit:" +msgstr "" + +#: .\templates\problem\problem.jade:49 .\templates\problem\raw.jade:65 +msgid "Author:" +msgid_plural "Authors:" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: .\templates\problem\problem.jade:53 .\templates\problem\raw.jade:49 +msgid "Problem type" +msgid_plural "Problem types" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: .\templates\problem\problem.jade:59 .\templates\problem\raw.jade:57 +msgid "Allowed languages" +msgstr "" + +#: .\templates\problem\problem.jade:62 +#, python-format +msgid "No %(lang)s judge online" +msgstr "" + +#: .\templates\problem\problem_list_tabs.jade:7 +msgid "Editorials" +msgstr "" + +#: .\templates\problem\raw.jade:59 +msgctxt "languages" +msgid "All" +msgstr "" + +#: .\templates\problem\search_form.jade:2 +msgid "Problem search" +msgstr "" + +#: .\templates\problem\search_form.jade:6 +msgid "Search problems..." +msgstr "" + +#: .\templates\problem\search_form.jade:10 +msgid "Full text search" +msgstr "" + +#: .\templates\problem\search_form.jade:14 +msgid "Hide solved problems" +msgstr "" + +#: .\templates\problem\search_form.jade:18 +msgid "Show problem types" +msgstr "" + +#: .\templates\problem\search_form.jade:24 +#: .\templates\problem\search_form.jade:25 +msgid "All" +msgstr "" + +#: .\templates\problem\search_form.jade:32 +msgid "Problem types" +msgstr "" + +#: .\templates\problem\search_form.jade:39 .\templates\submission\list.jade:168 +msgid "Go" +msgstr "" + +#: .\templates\problem\search_form.jade:39 +msgid "Random" +msgstr "" + +#: .\templates\problem\statistics_table.jade:2 .\templates\stats\base.jade:4 +msgid "Statistics" +msgstr "" + +#: .\templates\problem\submit.jade:205 +msgid "No judge is available for this problem." +msgstr "" + +#: .\templates\registration\activate.jade:2 +#, python-format +msgid "%(key)s is an invalid activation key." +msgstr "" + +#: .\templates\registration\activation_complete.jade:2 +msgid "Your account has been successfully activated." +msgstr "" + +#: .\templates\registration\login.jade:33 +msgid "Invalid username or password." +msgstr "" + +#: .\templates\registration\login.jade:50 +msgid "Login!" +msgstr "" + +#: .\templates\registration\login.jade:52 +msgid "Forgot your password?" +msgstr "" + +#: .\templates\registration\login.jade:53 +msgid "Or log in with..." +msgstr "" + +#: .\templates\registration\logout.jade:2 +msgid "See you later!" +msgstr "" + +#: .\templates\registration\password_change_done.jade:2 +msgid "Your password was sucessfully changed." +msgstr "" + +#: .\templates\registration\password_change_form.jade:5 +msgid "Change Password" +msgstr "" + +#: .\templates\registration\password_reset.jade:5 +msgid "Send Reset Email" +msgstr "" + +#: .\templates\registration\password_reset_complete.jade:2 +msgid "Your password has been set. You may go ahead and log in now" +msgstr "" + +#: .\templates\registration\password_reset_complete.jade:2 +msgid "Log in" +msgstr "" + +#: .\templates\registration\password_reset_confirm.jade:5 +msgid "Reset Password" +msgstr "" + +#: .\templates\registration\password_reset_done.jade:1 +msgid "

We've emailed you instructions for setting your password. You should be receiving them shortly.

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:2 +#, 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:4 +msgid "Please go to the following page and choose a new password:" +msgstr "" + +#: .\templates\registration\password_reset_email.txt:8 +msgid "Your username, in case you've forgotten:" +msgstr "" + +#: .\templates\registration\password_reset_email.txt:10 +msgid "Thanks for using our site!" +msgstr "" + +#: .\templates\registration\password_reset_email.txt:12 +#, python-format +msgid "The %(site_name)s team" +msgstr "" + +#: .\templates\registration\password_reset_subject.txt:2 +#, python-format +msgid "Password reset on %(site_name)s" +msgstr "" + +#: .\templates\registration\profile_creation.jade:16 +#: .\templates\registration\username_select.jade:4 +msgid "Continue >" +msgstr "" + +#: .\templates\registration\registration_complete.jade:2 +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.jade:122 +#: .\templates\registration\registration_form.jade:130 +msgid "Password" +msgstr "" + +#: .\templates\registration\registration_form.jade:130 +msgid "(again, for confirmation)" +msgstr "" + +#: .\templates\registration\registration_form.jade:135 +msgid "or" +msgstr "" + +#: .\templates\registration\registration_form.jade:136 +msgid "pick from map" +msgstr "" + +#: .\templates\registration\registration_form.jade:139 +msgid "Default language" +msgstr "" + +#: .\templates\registration\registration_form.jade:140 +#: .\templates\user\edit_profile.jade:114 +msgid "Affiliated organizations" +msgstr "" + +#: .\templates\registration\registration_form.jade:143 +msgid "Notify me about upcoming contests" +msgstr "" + +#: .\templates\registration\registration_form.jade:145 +msgid "By registering, you agree to our " +msgstr "" + +#: .\templates\registration\registration_form.jade:145 +msgid "Terms & Conditions" +msgstr "" + +#: .\templates\registration\registration_form.jade:146 +msgid "Register!" +msgstr "" + +#: .\templates\stats\language.jade:40 +msgid "Submission Statistics" +msgstr "" + +#: .\templates\stats\language.jade:45 +msgid "Submissions by Language" +msgstr "" + +#: .\templates\stats\language.jade:50 +msgid "AC Submissions by Language" +msgstr "" + +#: .\templates\stats\language.jade:55 +msgid "Language AC Rate" +msgstr "" + +#: .\templates\submission\internal_error_message.jade:2 +#, 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.jade:3 +msgid "An internal error occurred while grading." +msgstr "" + +#: .\templates\submission\internal_error_message.jade:7 +msgid "Error information" +msgstr "" + +#: .\templates\submission\list.jade:14 +msgid "Filter by status..." +msgstr "" + +#: .\templates\submission\list.jade:16 +msgid "Filter by language..." +msgstr "" + +#: .\templates\submission\list.jade:149 +msgid "Filter submissions" +msgstr "" + +#: .\templates\submission\row.jade:18 +msgid "Case " +msgstr "" + +#: .\templates\submission\row.jade:22 +msgid "view" +msgstr "" + +#: .\templates\submission\row.jade:22 +msgid "rejudge" +msgstr "" + +#: .\templates\submission\row.jade:22 +msgid "admin" +msgstr "" + +#: .\templates\submission\source.jade:12 +msgid "View status" +msgstr "" + +#: .\templates\submission\source.jade:14 +msgid "View raw source" +msgstr "" + +#: .\templates\submission\source.jade:16 .\templates\submission\status.jade:134 +msgid "Resubmit" +msgstr "" + +#: .\templates\submission\status.jade:132 +msgid "View source" +msgstr "" + +#: .\templates\submission\status.jade:146 +msgid "Abort" +msgstr "" + +#: .\templates\submission\status_testcases.jade:2 +msgid "We are waiting for a suitable judge to process your submission..." +msgstr "" + +#: .\templates\submission\status_testcases.jade:3 +msgid "Your submission is being processed..." +msgstr "" + +#: .\templates\submission\status_testcases.jade:4 +msgid "Compilation Error" +msgstr "" + +#: .\templates\submission\status_testcases.jade:6 +msgid "Compilation Warnings" +msgstr "" + +#: .\templates\submission\status_testcases.jade:9 +msgid "Pretest Execution Results" +msgstr "" + +#: .\templates\submission\status_testcases.jade:10 +msgid "Execution Results" +msgstr "" + +#: .\templates\submission\status_testcases.jade:10 +msgid "Batch " +msgstr "" + +#: .\templates\submission\status_testcases.jade:10 +#: .\templates\submission\status_testcases.jade:34 +#: .\templates\submission\status_testcases.jade:35 +#, python-format +msgid "(%(points)s/%(total)s points)" +msgstr "" + +#: .\templates\submission\status_testcases.jade:13 +msgid "Case" +msgstr "" + +#: .\templates\submission\status_testcases.jade:13 +msgid "Pretest" +msgstr "" + +#: .\templates\submission\status_testcases.jade:13 +msgid "Test case" +msgstr "" + +#: .\templates\submission\status_testcases.jade:27 +msgid "Your output (clipped)" +msgstr "" + +#: .\templates\submission\status_testcases.jade:33 +msgid "Final pretest score:" +msgstr "" + +#: .\templates\submission\status_testcases.jade:33 +msgid "Final score:" +msgstr "" + +#: .\templates\submission\status_testcases.jade:36 +msgid "Passing pretests does not guarantee a full score on system tests." +msgstr "" + +#: .\templates\submission\status_testcases.jade:36 +msgid "Submission aborted!" +msgstr "" + +#: .\templates\user\base_users.jade:11 .\templates\user\base_users.jade:138 +msgid "Search by handle..." +msgstr "" + +#: .\templates\user\base_users_table.jade:4 +msgid "Rank" +msgstr "" + +#: .\templates\user\edit_profile.jade:62 +msgid "Display name" +msgstr "" + +#: .\templates\user\edit_profile.jade:64 +msgid "Self-description" +msgstr "" + +#: .\templates\user\edit_profile.jade:86 +msgid "Editor theme" +msgstr "" + +#: .\templates\user\edit_profile.jade:93 +msgid "Math engine" +msgstr "" + +#: .\templates\user\edit_profile.jade:104 +msgid "Change your avatar" +msgstr "" + +#: .\templates\user\edit_profile.jade:108 +msgid "Change your password" +msgstr "" + +#: .\templates\user\edit_profile.jade:119 +msgid "User-script" +msgstr "" + +#: .\templates\user\edit_profile.jade:121 +msgid "Update profile" +msgstr "" + +#: .\templates\user\user_about.jade:88 +msgid "From" +msgstr "" + +#: .\templates\user\user_about.jade:90 .\templates\user\user_tabs.jade:5 +msgid "About" +msgstr "" + +#: .\templates\user\user_about.jade:91 +msgid "You have not shared any information." +msgstr "" + +#: .\templates\user\user_about.jade:92 +msgid "This user has not shared any information." +msgstr "" + +#: .\templates\user\user_base.jade:33 +msgid "Rank by points:" +msgstr "" + +#: .\templates\user\user_base.jade:33 +msgid "Total points:" +msgstr "" + +#: .\templates\user\user_base.jade:33 +msgid "View submissions" +msgstr "" + +#: .\templates\user\user_base.jade:34 +msgid "Rank by rating:" +msgstr "" + +#: .\templates\user\user_base.jade:34 +msgid "Rating:" +msgstr "" + +#: .\templates\user\user_base.jade:34 +msgid "Volatility:" +msgstr "" + +#: .\templates\user\user_base.jade:34 +msgid "Min. rating:" +msgstr "" + +#: .\templates\user\user_base.jade:34 +msgid "Max rating:" +msgstr "" + +#: .\templates\user\user_problems.jade:70 +msgid "Authored Problems" +msgstr "" + +#: .\templates\user\user_problems.jade:81 +msgid "Hide problems I've solved" +msgstr "" + +#: .\templates\user\user_tabs.jade:11 +msgid "Admin User" +msgstr "" + +#: .\templates\user\user_tabs.jade:13 +msgid "Admin Profile" +msgstr "" + +#: .\templates\widgets\select_all.jade:5 +msgid "Nothing here." +msgstr "" + +#: .\templates\widgets\select_all.jade:8 +msgid "Check all" +msgstr "" + diff --git a/locale/sr/LC_MESSAGES/djangojs.po b/locale/sr/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..db00c34 --- /dev/null +++ b/locale/sr/LC_MESSAGES/djangojs.po @@ -0,0 +1,31 @@ +msgid "" +msgstr "" +"Project-Id-Version: dmoj\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-11-12 01:20-0500\n" +"PO-Revision-Date: 2016-12-22 21:23-0500\n" +"Last-Translator: Icyene \n" +"Language-Team: Serbian (Latin)\n" +"Language: sr_CS\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: crowdin.com\n" +"X-Crowdin-Project: dmoj\n" +"X-Crowdin-Language: sr-CS\n" +"X-Crowdin-File: djangojs.po\n" + +#: .\resources\common.js:185 +msgctxt "time format with day" +msgid "%d day %h:%m:%s" +msgid_plural "%d days %h:%m:%s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: .\resources\common.js:188 +msgctxt "time format without day" +msgid "%h:%m:%s" +msgstr "" + diff --git a/locale/sr/LC_MESSAGES/dmoj-user.po b/locale/sr/LC_MESSAGES/dmoj-user.po new file mode 100644 index 0000000..cd0f485 --- /dev/null +++ b/locale/sr/LC_MESSAGES/dmoj-user.po @@ -0,0 +1,90 @@ +msgid "Problems" +msgstr "" + +msgid "Editorials" +msgstr "" + +msgid "Submissions" +msgstr "" + +msgid "Users" +msgstr "" + +msgid "Organizations" +msgstr "" + +msgid "Contests" +msgstr "" + +msgid "About" +msgstr "" + +msgid "Status" +msgstr "" + +msgid "Runtimes" +msgstr "" + +msgid "Tips" +msgstr "" + +msgid "API" +msgstr "" + +msgid "Github" +msgstr "" + +msgid "???" +msgstr "" + +msgid "Ad Hoc" +msgstr "" + +msgid "Advanced Math" +msgstr "" + +msgid "Brute Force" +msgstr "" + +msgid "Data Structures" +msgstr "" + +msgid "Divide and Conquer" +msgstr "" + +msgid "Dynamic Programming" +msgstr "" + +msgid "Game Theory" +msgstr "" + +msgid "Geometry" +msgstr "" + +msgid "Graph Theory" +msgstr "" + +msgid "Greedy Algorithms" +msgstr "" + +msgid "Implementation" +msgstr "" + +msgid "Intermediate Math" +msgstr "" + +msgid "Recursion" +msgstr "" + +msgid "Regular Expressions" +msgstr "" + +msgid "Simple Math" +msgstr "" + +msgid "Simulation" +msgstr "" + +msgid "String Algorithms" +msgstr "" + diff --git a/locale/sr_Latn/LC_MESSAGES/django.po b/locale/sr_Latn/LC_MESSAGES/django.po new file mode 100644 index 0000000..ec6b723 --- /dev/null +++ b/locale/sr_Latn/LC_MESSAGES/django.po @@ -0,0 +1,4553 @@ +msgid "" +msgstr "" +"Project-Id-Version: dmoj\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-11-11 21:54+0000\n" +"PO-Revision-Date: 2019-11-11 22:06\n" +"Last-Translator: Icyene\n" +"Language-Team: Serbian (Latin)\n" +"Language: sr_CS\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: crowdin.com\n" +"X-Crowdin-Project: dmoj\n" +"X-Crowdin-Language: sr-CS\n" +"X-Crowdin-File: django.po\n" + +#: dmoj/settings.py:337 +msgid "German" +msgstr "" + +#: dmoj/settings.py:338 +msgid "English" +msgstr "" + +#: dmoj/settings.py:339 +msgid "Spanish" +msgstr "" + +#: dmoj/settings.py:340 +msgid "French" +msgstr "" + +#: dmoj/settings.py:341 +msgid "Croatian" +msgstr "" + +#: dmoj/settings.py:342 +msgid "Hungarian" +msgstr "" + +#: dmoj/settings.py:343 +msgid "Japanese" +msgstr "" + +#: dmoj/settings.py:344 +msgid "Korean" +msgstr "" + +#: dmoj/settings.py:345 +msgid "Brazilian Portuguese" +msgstr "" + +#: dmoj/settings.py:346 +msgid "Romanian" +msgstr "" + +#: dmoj/settings.py:347 +msgid "Russian" +msgstr "" + +#: dmoj/settings.py:348 +msgid "Serbian (Latin)" +msgstr "" + +#: dmoj/settings.py:349 +msgid "Turkish" +msgstr "" + +#: dmoj/settings.py:350 +msgid "Vietnamese" +msgstr "" + +#: dmoj/settings.py:351 +msgid "Simplified Chinese" +msgstr "" + +#: dmoj/urls.py:54 +msgid "Login" +msgstr "" + +#: dmoj/urls.py:102 templates/base.html:190 +msgid "Home" +msgstr "" + +#: judge/admin/comments.py:40 +#, python-format +msgid "%d comment successfully hidden." +msgid_plural "%d comments successfully hidden." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: judge/admin/comments.py:43 +msgid "Hide comments" +msgstr "" + +#: judge/admin/comments.py:47 +#, python-format +msgid "%d comment successfully unhidden." +msgid_plural "%d comments successfully unhidden." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: judge/admin/comments.py:50 +msgid "Unhide comments" +msgstr "" + +#: judge/admin/comments.py:58 +msgid "Associated page" +msgstr "" + +#: judge/admin/contest.py:29 +msgid "Included contests" +msgstr "" + +#: judge/admin/contest.py:65 templates/contest/contest.html:83 +#: templates/contest/moss.html:43 templates/problem/list.html:206 +#: templates/problem/list.html:221 templates/user/user-problems.html:56 +#: templates/user/user-problems.html:98 +msgid "Problem" +msgstr "" + +#: judge/admin/contest.py:113 +msgid "Settings" +msgstr "" + +#: judge/admin/contest.py:115 +msgid "Scheduling" +msgstr "" + +#: judge/admin/contest.py:116 +msgid "Details" +msgstr "" + +#: judge/admin/contest.py:117 +msgid "Format" +msgstr "" + +#: judge/admin/contest.py:118 templates/contest/ranking-table.html:5 +msgid "Rating" +msgstr "" + +#: judge/admin/contest.py:119 +msgid "Access" +msgstr "" + +#: judge/admin/contest.py:121 judge/admin/problem.py:131 +msgid "Justice" +msgstr "" + +#: judge/admin/contest.py:159 +#, python-format +msgid "%d contest successfully marked as visible." +msgid_plural "%d contests successfully marked as visible." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: judge/admin/contest.py:162 +msgid "Mark contests as visible" +msgstr "" + +#: judge/admin/contest.py:166 +#, python-format +msgid "%d contest successfully marked as hidden." +msgid_plural "%d contests successfully marked as hidden." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: judge/admin/contest.py:169 +msgid "Mark contests as hidden" +msgstr "" + +#: judge/admin/contest.py:180 judge/admin/submission.py:149 +#: judge/admin/submission.py:171 +msgid "You do not have the permission to rejudge submissions." +msgstr "" + +#: judge/admin/contest.py:187 judge/admin/submission.py:155 +msgid "You do not have the permission to rejudge THAT many submissions." +msgstr "" + +#: judge/admin/contest.py:194 judge/admin/submission.py:164 +#, 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] "" + +#: judge/admin/contest.py:265 +#, python-format +msgid "%d participation recalculated." +msgid_plural "%d participations recalculated." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: judge/admin/contest.py:268 +msgid "Recalculate results" +msgstr "" + +#: judge/admin/contest.py:272 judge/admin/organization.py:65 +msgid "username" +msgstr "" + +#: judge/admin/contest.py:277 templates/base.html:258 +msgid "virtual" +msgstr "" + +#: judge/admin/interface.py:28 judge/models/interface.py:46 +msgid "link path" +msgstr "" + +#: judge/admin/interface.py:62 +msgid "Content" +msgstr "" + +#: judge/admin/interface.py:63 +msgid "Summary" +msgstr "" + +#: judge/admin/interface.py:107 judge/models/contest.py:251 +#: judge/models/contest.py:355 judge/models/profile.py:189 +msgid "user" +msgstr "" + +#: judge/admin/interface.py:148 +msgid "object" +msgstr "" + +#: judge/admin/organization.py:34 judge/admin/problem.py:171 +#: judge/admin/profile.py:78 +msgid "View on site" +msgstr "" + +#: judge/admin/problem.py:28 +msgid "Describe the changes you made (optional)" +msgstr "" + +#: judge/admin/problem.py:126 +msgid "Social Media" +msgstr "" + +#: judge/admin/problem.py:127 +msgid "Taxonomy" +msgstr "" + +#: judge/admin/problem.py:128 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:58 +msgid "Points" +msgstr "" + +#: judge/admin/problem.py:129 +msgid "Limits" +msgstr "" + +#: judge/admin/problem.py:130 judge/admin/submission.py:232 +#: templates/stats/base.html:14 templates/submission/list.html:328 +msgid "Language" +msgstr "" + +#: judge/admin/problem.py:132 +msgid "History" +msgstr "" + +#: judge/admin/problem.py:168 +msgid "Authors" +msgstr "" + +#: judge/admin/problem.py:183 +#, python-format +msgid "%d problem successfully marked as public." +msgid_plural "%d problems successfully marked as public." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: judge/admin/problem.py:187 +msgid "Mark problems as public" +msgstr "" + +#: judge/admin/problem.py:193 +#, python-format +msgid "%d problem successfully marked as private." +msgid_plural "%d problems successfully marked as private." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: judge/admin/problem.py:197 +msgid "Mark problems as private" +msgstr "" + +#: judge/admin/profile.py:32 +msgid "timezone" +msgstr "" + +#: judge/admin/profile.py:84 judge/admin/submission.py:211 +#: templates/organization/requests/log.html:9 +#: templates/organization/requests/pending.html:12 +#: templates/ticket/list.html:263 +msgid "User" +msgstr "" + +#: judge/admin/profile.py:89 templates/registration/registration_form.html:145 +msgid "Email" +msgstr "" + +#: judge/admin/profile.py:94 judge/views/register.py:29 +#: templates/registration/registration_form.html:173 +#: templates/user/edit-profile.html:99 +msgid "Timezone" +msgstr "" + +#: judge/admin/profile.py:99 +msgid "date joined" +msgstr "" + +#: judge/admin/profile.py:106 +#, python-format +msgid "%d user have scores recalculated." +msgid_plural "%d users have scores recalculated." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: judge/admin/profile.py:109 +msgid "Recalculate scores" +msgstr "" + +#: judge/admin/runtime.py:19 +msgid "Disallowed problems" +msgstr "" + +#: judge/admin/runtime.py:22 +msgid "These problems are NOT allowed to be submitted in this language" +msgstr "" + +#: judge/admin/runtime.py:83 +msgid "Description" +msgstr "" + +#: judge/admin/runtime.py:84 +msgid "Information" +msgstr "" + +#: judge/admin/runtime.py:85 +msgid "Capabilities" +msgstr "" + +#: judge/admin/submission.py:23 judge/admin/submission.py:42 +#: judge/admin/submission.py:221 +msgid "None" +msgstr "" + +#: judge/admin/submission.py:23 +msgid "Not done" +msgstr "" + +#: judge/admin/submission.py:23 +msgid "Exceptional" +msgstr "" + +#: judge/admin/submission.py:42 +msgid "Unaccepted" +msgstr "" + +#: judge/admin/submission.py:89 +#, python-format +msgctxt "contest problem" +msgid "%(problem)s in %(contest)s" +msgstr "" + +#: judge/admin/submission.py:167 +msgid "Rejudge the selected submissions" +msgstr "" + +#: judge/admin/submission.py:193 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] "" +msgstr[2] "" + +#: judge/admin/submission.py:196 +msgid "Rescore the selected submissions" +msgstr "" + +#: judge/admin/submission.py:200 +msgid "Problem code" +msgstr "" + +#: judge/admin/submission.py:205 +msgid "Problem name" +msgstr "" + +#: judge/admin/submission.py:215 templates/organization/requests/log.html:10 +#: templates/organization/requests/pending.html:13 +msgid "Time" +msgstr "" + +#: judge/admin/submission.py:223 +#, python-format +msgid "%d KB" +msgstr "" + +#: judge/admin/submission.py:225 +#, python-format +msgid "%.2f MB" +msgstr "" + +#: judge/admin/submission.py:227 +msgid "Memory" +msgstr "" + +#: judge/admin/taxon.py:11 judge/admin/taxon.py:34 +msgid "Included problems" +msgstr "" + +#: judge/admin/taxon.py:14 +msgid "These problems are included in this group of problems" +msgstr "" + +#: judge/admin/taxon.py:37 +msgid "These problems are included in this type of problems" +msgstr "" + +#: judge/apps.py:8 +msgid "Online Judge" +msgstr "" + +#: judge/comments.py:41 +msgid "Comment body" +msgstr "" + +#: judge/comments.py:47 judge/views/ticket.py:46 +msgid "Your part is silent, little toad." +msgstr "" + +#: judge/comments.py:50 templates/comments/list.html:131 +msgid "You need to have solved at least one problem before your voice can be heard." +msgstr "" + +#: judge/comments.py:92 +msgid "Posted comment" +msgstr "" + +#: judge/contest_format/atcoder.py:19 +msgid "AtCoder" +msgstr "" + +#: judge/contest_format/default.py:18 +msgid "Default" +msgstr "" + +#: judge/contest_format/ecoo.py:19 +msgid "ECOO" +msgstr "" + +#: judge/contest_format/ioi.py:19 +msgid "IOI" +msgstr "" + +#: judge/forms.py:27 +msgid "Subscribe to contest updates" +msgstr "" + +#: judge/forms.py:28 +msgid "Enable experimental features" +msgstr "" + +#: judge/forms.py:57 judge/views/organization.py:127 +#, python-brace-format +msgid "You may not be part of more than {count} public organizations." +msgstr "" + +#: judge/forms.py:107 judge/views/register.py:26 +#: templates/registration/registration_form.html:139 +#: templates/user/base-users-table.html:5 +msgid "Username" +msgstr "" + +#: judge/forms.py:108 templates/registration/registration_form.html:151 +#: templates/registration/registration_form.html:165 +msgid "Password" +msgstr "" + +#: judge/forms.py:130 +msgid "Two Factor Authentication tokens must be 6 decimal digits." +msgstr "" + +#: judge/forms.py:139 templates/registration/totp_auth.html:32 +msgid "Invalid Two Factor Authentication token." +msgstr "" + +#: judge/forms.py:143 judge/models/problem.py:97 +msgid "Problem code must be ^[a-z0-9]+$" +msgstr "" + +#: judge/forms.py:148 +msgid "Problem with code already exists." +msgstr "" + +#: judge/forms.py:153 judge/models/contest.py:51 +msgid "Contest id must be ^[a-z0-9]+$" +msgstr "" + +#: judge/forms.py:158 +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:59 +msgid "Leave as LaTeX" +msgstr "" + +#: judge/models/choices.py:60 +msgid "SVG with PNG fallback" +msgstr "" + +#: judge/models/choices.py:61 +msgid "MathML only" +msgstr "" + +#: judge/models/choices.py:62 +msgid "MathJax with SVG/PNG fallback" +msgstr "" + +#: judge/models/choices.py:63 +msgid "Detect best quality" +msgstr "" + +#: judge/models/comment.py:25 +msgid "Page code must be ^[pcs]:[a-z0-9]+$|^b:\\d+$" +msgstr "" + +#: judge/models/comment.py:41 +msgid "commenter" +msgstr "" + +#: judge/models/comment.py:42 +msgid "posted time" +msgstr "" + +#: judge/models/comment.py:43 judge/models/comment.py:176 +msgid "associated page" +msgstr "" + +#: judge/models/comment.py:45 +msgid "votes" +msgstr "" + +#: judge/models/comment.py:46 +msgid "body of comment" +msgstr "" + +#: judge/models/comment.py:47 +msgid "hide the comment" +msgstr "" + +#: judge/models/comment.py:48 +msgid "parent" +msgstr "" + +#: judge/models/comment.py:53 +msgid "comment" +msgstr "" + +#: judge/models/comment.py:54 +msgid "comments" +msgstr "" + +#: judge/models/comment.py:136 judge/models/problem.py:406 +#, python-format +msgid "Editorial for %s" +msgstr "" + +#: judge/models/comment.py:171 +msgid "comment vote" +msgstr "" + +#: judge/models/comment.py:172 +msgid "comment votes" +msgstr "" + +#: judge/models/comment.py:181 +msgid "Override comment lock" +msgstr "" + +#: judge/models/contest.py:21 +msgid "Invalid colour." +msgstr "" + +#: judge/models/contest.py:23 +msgid "tag name" +msgstr "" + +#: judge/models/contest.py:24 +msgid "Lowercase letters and hyphens only." +msgstr "" + +#: judge/models/contest.py:25 +msgid "tag colour" +msgstr "" + +#: judge/models/contest.py:26 +msgid "tag description" +msgstr "" + +#: judge/models/contest.py:45 +msgid "contest tag" +msgstr "" + +#: judge/models/contest.py:46 judge/models/contest.py:100 +msgid "contest tags" +msgstr "" + +#: judge/models/contest.py:50 +msgid "contest id" +msgstr "" + +#: judge/models/contest.py:52 +msgid "contest name" +msgstr "" + +#: judge/models/contest.py:53 +msgid "These people will be able to edit the contest." +msgstr "" + +#: judge/models/contest.py:55 judge/models/runtime.py:124 +#: src/dmoj-wpadmin/test_project/apps/books/admin.py:20 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:27 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:27 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:27 +msgid "description" +msgstr "" + +#: judge/models/contest.py:56 judge/models/problem.py:353 +#: judge/models/runtime.py:126 +msgid "problems" +msgstr "" + +#: judge/models/contest.py:57 judge/models/contest.py:252 +msgid "start time" +msgstr "" + +#: judge/models/contest.py:58 +msgid "end time" +msgstr "" + +#: judge/models/contest.py:59 judge/models/problem.py:118 +#: judge/models/problem.py:377 +msgid "time limit" +msgstr "" + +#: judge/models/contest.py:60 judge/models/problem.py:136 +msgid "publicly visible" +msgstr "" + +#: judge/models/contest.py:61 +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:64 +msgid "contest rated" +msgstr "" + +#: judge/models/contest.py:64 +msgid "Whether this contest can be rated." +msgstr "" + +#: judge/models/contest.py:66 +msgid "hide scoreboard" +msgstr "" + +#: judge/models/contest.py:67 +msgid "Whether the scoreboard should remain hidden for the duration of the contest." +msgstr "" + +#: judge/models/contest.py:70 +msgid "no comments" +msgstr "" + +#: judge/models/contest.py:71 +msgid "Use clarification system instead of comments." +msgstr "" + +#: judge/models/contest.py:73 +msgid "Rating floor for contest" +msgstr "" + +#: judge/models/contest.py:75 +msgid "Rating ceiling for contest" +msgstr "" + +#: judge/models/contest.py:77 +msgid "rate all" +msgstr "" + +#: judge/models/contest.py:77 +msgid "Rate all users who joined." +msgstr "" + +#: judge/models/contest.py:78 +msgid "exclude from ratings" +msgstr "" + +#: judge/models/contest.py:80 +msgid "private to specific users" +msgstr "" + +#: judge/models/contest.py:81 +msgid "private contestants" +msgstr "" + +#: judge/models/contest.py:82 +msgid "If private, only these users may see the contest" +msgstr "" + +#: judge/models/contest.py:84 +msgid "hide problem tags" +msgstr "" + +#: judge/models/contest.py:85 +msgid "Whether problem tags should be hidden by default." +msgstr "" + +#: judge/models/contest.py:87 +msgid "run pretests only" +msgstr "" + +#: judge/models/contest.py:88 +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:92 judge/models/problem.py:157 +msgid "private to organizations" +msgstr "" + +#: judge/models/contest.py:93 judge/models/problem.py:155 +#: judge/models/profile.py:76 +msgid "organizations" +msgstr "" + +#: judge/models/contest.py:94 +msgid "If private, only these organizations may see the contest" +msgstr "" + +#: judge/models/contest.py:95 judge/models/problem.py:145 +msgid "OpenGraph image" +msgstr "" + +#: judge/models/contest.py:96 judge/models/profile.py:47 +msgid "Logo override image" +msgstr "" + +#: judge/models/contest.py:98 +msgid "This image will replace the default site logo for users inside the contest." +msgstr "" + +#: judge/models/contest.py:101 +msgid "the amount of live participants" +msgstr "" + +#: judge/models/contest.py:102 +msgid "contest summary" +msgstr "" + +#: judge/models/contest.py:103 judge/models/problem.py:147 +msgid "Plain-text, shown in meta description tag, e.g. for social media." +msgstr "" + +#: judge/models/contest.py:104 judge/models/profile.py:46 +msgid "access code" +msgstr "" + +#: judge/models/contest.py:105 +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:107 judge/models/problem.py:141 +msgid "personae non gratae" +msgstr "" + +#: judge/models/contest.py:108 +msgid "Bans the selected users from joining this contest." +msgstr "" + +#: judge/models/contest.py:109 +msgid "contest format" +msgstr "" + +#: judge/models/contest.py:110 +msgid "The contest format module to use." +msgstr "" + +#: judge/models/contest.py:111 +msgid "contest format configuration" +msgstr "" + +#: judge/models/contest.py:112 +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:233 +msgid "See private contests" +msgstr "" + +#: judge/models/contest.py:234 +msgid "Edit own contests" +msgstr "" + +#: judge/models/contest.py:235 +msgid "Edit all contests" +msgstr "" + +#: judge/models/contest.py:236 +msgid "Clone contest" +msgstr "" + +#: judge/models/contest.py:237 templates/contest/moss.html:74 +msgid "MOSS contest" +msgstr "" + +#: judge/models/contest.py:238 +msgid "Rate contests" +msgstr "" + +#: judge/models/contest.py:239 +msgid "Contest access codes" +msgstr "" + +#: judge/models/contest.py:240 +msgid "Create private contests" +msgstr "" + +#: judge/models/contest.py:242 judge/models/contest.py:320 +#: judge/models/contest.py:356 judge/models/contest.py:378 +#: judge/models/submission.py:83 +msgid "contest" +msgstr "" + +#: judge/models/contest.py:243 +msgid "contests" +msgstr "" + +#: judge/models/contest.py:250 +msgid "associated contest" +msgstr "" + +#: judge/models/contest.py:253 +msgid "score" +msgstr "" + +#: judge/models/contest.py:254 +msgid "cumulative time" +msgstr "" + +#: judge/models/contest.py:255 +msgid "virtual participation id" +msgstr "" + +#: judge/models/contest.py:256 +msgid "0 means non-virtual, otherwise the n-th virtual participation" +msgstr "" + +#: judge/models/contest.py:257 +msgid "contest format specific data" +msgstr "" + +#: judge/models/contest.py:306 +#, python-format +msgid "%s spectating in %s" +msgstr "" + +#: judge/models/contest.py:308 +#, python-format +msgid "%s in %s, v%d" +msgstr "" + +#: judge/models/contest.py:309 +#, python-format +msgid "%s in %s" +msgstr "" + +#: judge/models/contest.py:312 +msgid "contest participation" +msgstr "" + +#: judge/models/contest.py:313 +msgid "contest participations" +msgstr "" + +#: judge/models/contest.py:319 judge/models/contest.py:340 +#: judge/models/contest.py:379 judge/models/problem.py:352 +#: judge/models/problem.py:357 judge/models/problem.py:375 +#: judge/models/problem_data.py:35 +msgid "problem" +msgstr "" + +#: judge/models/contest.py:321 judge/models/contest.py:344 +#: judge/models/problem.py:129 +msgid "points" +msgstr "" + +#: judge/models/contest.py:322 +msgid "partial" +msgstr "" + +#: judge/models/contest.py:323 judge/models/contest.py:345 +msgid "is pretested" +msgstr "" + +#: judge/models/contest.py:324 judge/models/interface.py:43 +msgid "order" +msgstr "" + +#: judge/models/contest.py:325 +msgid "output prefix length override" +msgstr "" + +#: judge/models/contest.py:326 +msgid "Maximum number of submissions for this problem, or 0 for no limit." +msgstr "" + +#: judge/models/contest.py:328 +msgid "Why include a problem you can't submit to?" +msgstr "" + +#: judge/models/contest.py:333 +msgid "contest problem" +msgstr "" + +#: judge/models/contest.py:334 +msgid "contest problems" +msgstr "" + +#: judge/models/contest.py:338 judge/models/submission.py:181 +msgid "submission" +msgstr "" + +#: judge/models/contest.py:342 judge/models/contest.py:357 +msgid "participation" +msgstr "" + +#: judge/models/contest.py:346 +msgid "Whether this submission was ran only on pretests." +msgstr "" + +#: judge/models/contest.py:350 +msgid "contest submission" +msgstr "" + +#: judge/models/contest.py:351 +msgid "contest submissions" +msgstr "" + +#: judge/models/contest.py:359 +msgid "rank" +msgstr "" + +#: judge/models/contest.py:360 +msgid "rating" +msgstr "" + +#: judge/models/contest.py:361 +msgid "volatility" +msgstr "" + +#: judge/models/contest.py:362 +msgid "last rated" +msgstr "" + +#: judge/models/contest.py:366 +msgid "contest rating" +msgstr "" + +#: judge/models/contest.py:367 +msgid "contest ratings" +msgstr "" + +#: judge/models/contest.py:386 +msgid "contest moss result" +msgstr "" + +#: judge/models/contest.py:387 +msgid "contest moss results" +msgstr "" + +#: judge/models/interface.py:24 +msgid "configuration item" +msgstr "" + +#: judge/models/interface.py:25 +msgid "miscellaneous configuration" +msgstr "" + +#: judge/models/interface.py:37 +msgid "navigation item" +msgstr "" + +#: judge/models/interface.py:38 +msgid "navigation bar" +msgstr "" + +#: judge/models/interface.py:44 +msgid "identifier" +msgstr "" + +#: judge/models/interface.py:45 +msgid "label" +msgstr "" + +#: judge/models/interface.py:47 +msgid "highlight regex" +msgstr "" + +#: judge/models/interface.py:48 +msgid "parent item" +msgstr "" + +#: judge/models/interface.py:66 +msgid "post title" +msgstr "" + +#: judge/models/interface.py:67 judge/models/problem.py:395 +msgid "authors" +msgstr "" + +#: judge/models/interface.py:68 +msgid "slug" +msgstr "" + +#: judge/models/interface.py:69 judge/models/problem.py:393 +msgid "public visibility" +msgstr "" + +#: judge/models/interface.py:70 +msgid "sticky" +msgstr "" + +#: judge/models/interface.py:71 +msgid "publish after" +msgstr "" + +#: judge/models/interface.py:72 +msgid "post content" +msgstr "" + +#: judge/models/interface.py:73 +msgid "post summary" +msgstr "" + +#: judge/models/interface.py:74 +msgid "openGraph image" +msgstr "" + +#: judge/models/interface.py:91 +msgid "Edit all posts" +msgstr "" + +#: judge/models/interface.py:93 +msgid "blog post" +msgstr "" + +#: judge/models/interface.py:94 +msgid "blog posts" +msgstr "" + +#: judge/models/message.py:11 +msgid "message title" +msgstr "" + +#: judge/models/message.py:12 judge/models/ticket.py:29 +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:26 +msgid "problem category ID" +msgstr "" + +#: judge/models/problem.py:27 +msgid "problem category name" +msgstr "" + +#: judge/models/problem.py:34 +msgid "problem type" +msgstr "" + +#: judge/models/problem.py:35 judge/models/problem.py:113 +msgid "problem types" +msgstr "" + +#: judge/models/problem.py:39 +msgid "problem group ID" +msgstr "" + +#: judge/models/problem.py:40 +msgid "problem group name" +msgstr "" + +#: judge/models/problem.py:47 judge/models/problem.py:116 +msgid "problem group" +msgstr "" + +#: judge/models/problem.py:48 +msgid "problem groups" +msgstr "" + +#: judge/models/problem.py:52 +msgid "key" +msgstr "" + +#: judge/models/problem.py:54 +msgid "link" +msgstr "" + +#: judge/models/problem.py:55 +msgid "full name" +msgstr "" + +#: judge/models/problem.py:56 judge/models/profile.py:32 +#: judge/models/runtime.py:23 +msgid "short name" +msgstr "" + +#: judge/models/problem.py:57 +msgid "Displayed on pages under this license" +msgstr "" + +#: judge/models/problem.py:58 +msgid "icon" +msgstr "" + +#: judge/models/problem.py:58 +msgid "URL to the icon" +msgstr "" + +#: judge/models/problem.py:59 +msgid "license text" +msgstr "" + +#: judge/models/problem.py:68 +msgid "license" +msgstr "" + +#: judge/models/problem.py:69 +msgid "licenses" +msgstr "" + +#: judge/models/problem.py:96 +msgid "problem code" +msgstr "" + +#: judge/models/problem.py:98 +msgid "A short, unique code for the problem, used in the url after /problem/" +msgstr "" + +#: judge/models/problem.py:100 +msgid "problem name" +msgstr "" + +#: judge/models/problem.py:101 +msgid "The full name of the problem, as shown in the problem list." +msgstr "" + +#: judge/models/problem.py:103 +msgid "problem body" +msgstr "" + +#: judge/models/problem.py:104 +msgid "creators" +msgstr "" + +#: judge/models/problem.py:105 +msgid "These users will be able to edit the problem, and be listed as authors." +msgstr "" + +#: judge/models/problem.py:107 +msgid "curators" +msgstr "" + +#: judge/models/problem.py:108 +msgid "These users will be able to edit the problem, but not be listed as authors." +msgstr "" + +#: judge/models/problem.py:110 +msgid "testers" +msgstr "" + +#: judge/models/problem.py:112 +msgid "These users will be able to view the private problem, but not edit it." +msgstr "" + +#: judge/models/problem.py:114 +msgid "The type of problem, as shown on the problem's page." +msgstr "" + +#: judge/models/problem.py:117 +msgid "The group of problem, shown under Category in the problem list." +msgstr "" + +#: judge/models/problem.py:119 +msgid "The time limit for this problem, in seconds. Fractional seconds (e.g. 1.5) are supported." +msgstr "" + +#: judge/models/problem.py:123 judge/models/problem.py:380 +msgid "memory limit" +msgstr "" + +#: judge/models/problem.py:124 +msgid "The memory limit for this problem, in kilobytes (e.g. 64mb = 65536 kilobytes)." +msgstr "" + +#: judge/models/problem.py:130 +msgid "Points awarded for problem completion. Points are displayed with a 'p' suffix if partial." +msgstr "" + +#: judge/models/problem.py:133 +msgid "allows partial points" +msgstr "" + +#: judge/models/problem.py:134 +msgid "allowed languages" +msgstr "" + +#: judge/models/problem.py:135 +msgid "List of allowed submission languages." +msgstr "" + +#: judge/models/problem.py:137 +msgid "manually managed" +msgstr "" + +#: judge/models/problem.py:138 +msgid "Whether judges should be allowed to manage data or not." +msgstr "" + +#: judge/models/problem.py:139 +msgid "date of publishing" +msgstr "" + +#: judge/models/problem.py:140 +msgid "Doesn't have magic ability to auto-publish due to backward compatibility" +msgstr "" + +#: judge/models/problem.py:142 +msgid "Bans the selected users from submitting to this problem." +msgstr "" + +#: judge/models/problem.py:144 +msgid "The license under which this problem is published." +msgstr "" + +#: judge/models/problem.py:146 +msgid "problem summary" +msgstr "" + +#: judge/models/problem.py:148 +msgid "number of users" +msgstr "" + +#: judge/models/problem.py:149 +msgid "The number of users who solved the problem." +msgstr "" + +#: judge/models/problem.py:150 +msgid "solve rate" +msgstr "" + +#: judge/models/problem.py:156 +msgid "If private, only these organizations may see the problem." +msgstr "" + +#: judge/models/problem.py:358 judge/models/problem.py:376 +#: judge/models/runtime.py:99 +msgid "language" +msgstr "" + +#: judge/models/problem.py:359 +msgid "translated name" +msgstr "" + +#: judge/models/problem.py:360 +msgid "translated description" +msgstr "" + +#: judge/models/problem.py:364 +msgid "problem translation" +msgstr "" + +#: judge/models/problem.py:365 +msgid "problem translations" +msgstr "" + +#: judge/models/problem.py:369 +msgid "clarified problem" +msgstr "" + +#: judge/models/problem.py:370 +msgid "clarification body" +msgstr "" + +#: judge/models/problem.py:371 +msgid "clarification timestamp" +msgstr "" + +#: judge/models/problem.py:386 +msgid "language-specific resource limit" +msgstr "" + +#: judge/models/problem.py:387 +msgid "language-specific resource limits" +msgstr "" + +#: judge/models/problem.py:391 +msgid "associated problem" +msgstr "" + +#: judge/models/problem.py:394 +msgid "publish date" +msgstr "" + +#: judge/models/problem.py:396 +msgid "editorial content" +msgstr "" + +#: judge/models/problem.py:412 +msgid "solution" +msgstr "" + +#: judge/models/problem.py:413 +msgid "solutions" +msgstr "" + +#: judge/models/problem_data.py:23 +msgid "Standard" +msgstr "" + +#: judge/models/problem_data.py:24 +msgid "Floats" +msgstr "" + +#: judge/models/problem_data.py:25 +msgid "Floats (absolute)" +msgstr "" + +#: judge/models/problem_data.py:26 +msgid "Floats (relative)" +msgstr "" + +#: judge/models/problem_data.py:27 +msgid "Non-trailing spaces" +msgstr "" + +#: judge/models/problem_data.py:28 +msgid "Unordered" +msgstr "" + +#: judge/models/problem_data.py:29 +msgid "Byte identical" +msgstr "" + +#: 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:39 +msgid "generator file" +msgstr "" + +#: judge/models/problem_data.py:41 judge/models/problem_data.py:90 +msgid "output prefix length" +msgstr "" + +#: judge/models/problem_data.py:42 judge/models/problem_data.py:91 +msgid "output limit length" +msgstr "" + +#: judge/models/problem_data.py:43 +msgid "init.yml generation feedback" +msgstr "" + +#: judge/models/problem_data.py:44 judge/models/problem_data.py:92 +msgid "checker" +msgstr "" + +#: judge/models/problem_data.py:45 judge/models/problem_data.py:93 +msgid "checker arguments" +msgstr "" + +#: 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:77 +msgid "problem data set" +msgstr "" + +#: judge/models/problem_data.py:79 +msgid "case position" +msgstr "" + +#: judge/models/problem_data.py:80 +msgid "case type" +msgstr "" + +#: judge/models/problem_data.py:81 +msgid "Normal case" +msgstr "" + +#: judge/models/problem_data.py:82 +msgid "Batch start" +msgstr "" + +#: judge/models/problem_data.py:83 +msgid "Batch end" +msgstr "" + +#: judge/models/problem_data.py:85 +msgid "input file name" +msgstr "" + +#: judge/models/problem_data.py:86 +msgid "output file name" +msgstr "" + +#: judge/models/problem_data.py:87 +msgid "generator arguments" +msgstr "" + +#: judge/models/problem_data.py:88 +msgid "point value" +msgstr "" + +#: judge/models/problem_data.py:89 +msgid "case is pretest?" +msgstr "" + +#: judge/models/profile.py:29 +msgid "organization title" +msgstr "" + +#: judge/models/profile.py:30 +msgid "organization slug" +msgstr "" + +#: judge/models/profile.py:31 +msgid "Organization name shown in URL" +msgstr "" + +#: judge/models/profile.py:33 +msgid "Displayed beside user name during contests" +msgstr "" + +#: judge/models/profile.py:34 +msgid "organization description" +msgstr "" + +#: judge/models/profile.py:35 +msgid "registrant" +msgstr "" + +#: judge/models/profile.py:36 +msgid "User who registered this organization" +msgstr "" + +#: judge/models/profile.py:37 +msgid "administrators" +msgstr "" + +#: judge/models/profile.py:38 +msgid "Those who can edit this organization" +msgstr "" + +#: judge/models/profile.py:39 +msgid "creation date" +msgstr "" + +#: judge/models/profile.py:40 +msgid "is open organization?" +msgstr "" + +#: judge/models/profile.py:41 +msgid "Allow joining organization" +msgstr "" + +#: judge/models/profile.py:42 +msgid "maximum size" +msgstr "" + +#: judge/models/profile.py:43 +msgid "Maximum amount of users in this organization, only applicable to private organizations" +msgstr "" + +#: judge/models/profile.py:45 +msgid "Student access code" +msgstr "" + +#: judge/models/profile.py:49 +msgid "This image will replace the default site logo for users viewing the organization." +msgstr "" + +#: judge/models/profile.py:75 judge/models/profile.py:91 +#: judge/models/profile.py:190 +msgid "organization" +msgstr "" + +#: judge/models/profile.py:80 +msgid "user associated" +msgstr "" + +#: judge/models/profile.py:81 +msgid "self-description" +msgstr "" + +#: judge/models/profile.py:82 +msgid "location" +msgstr "" + +#: judge/models/profile.py:84 +msgid "preferred language" +msgstr "" + +#: judge/models/profile.py:89 +msgid "last access time" +msgstr "" + +#: judge/models/profile.py:90 +msgid "last IP" +msgstr "" + +#: judge/models/profile.py:93 +msgid "display rank" +msgstr "" + +#: judge/models/profile.py:95 +msgid "comment mute" +msgstr "" + +#: judge/models/profile.py:95 +msgid "Some users are at their best when silent." +msgstr "" + +#: judge/models/profile.py:97 +msgid "unlisted user" +msgstr "" + +#: judge/models/profile.py:97 +msgid "User will not be ranked." +msgstr "" + +#: judge/models/profile.py:100 +msgid "user script" +msgstr "" + +#: judge/models/profile.py:101 +msgid "User-defined JavaScript for site customization." +msgstr "" + +#: judge/models/profile.py:102 +msgid "current contest" +msgstr "" + +#: judge/models/profile.py:104 +msgid "math engine" +msgstr "" + +#: judge/models/profile.py:106 +msgid "the rendering engine used to render math" +msgstr "" + +#: judge/models/profile.py:107 +msgid "2FA enabled" +msgstr "" + +#: judge/models/profile.py:108 +msgid "check to enable TOTP-based two factor authentication" +msgstr "" + +#: judge/models/profile.py:109 +msgid "TOTP key" +msgstr "" + +#: judge/models/profile.py:110 +msgid "32 character base32-encoded key for TOTP" +msgstr "" + +#: judge/models/profile.py:112 +msgid "TOTP key must be empty or base32" +msgstr "" + +#: judge/models/profile.py:113 +msgid "internal notes" +msgstr "" + +#: judge/models/profile.py:114 +msgid "Notes for administrators regarding this user." +msgstr "" + +#: judge/models/profile.py:184 +msgid "user profile" +msgstr "" + +#: judge/models/profile.py:185 +msgid "user profiles" +msgstr "" + +#: judge/models/profile.py:192 +msgid "request time" +msgstr "" + +#: judge/models/profile.py:193 +msgid "state" +msgstr "" + +#: judge/models/profile.py:198 +msgid "reason" +msgstr "" + +#: judge/models/profile.py:201 +msgid "organization join request" +msgstr "" + +#: judge/models/profile.py:202 +msgid "organization join requests" +msgstr "" + +#: judge/models/runtime.py:18 +msgid "short identifier" +msgstr "" + +#: judge/models/runtime.py:19 +msgid "The identifier for this language; the same as its executor id for judges." +msgstr "" + +#: judge/models/runtime.py:21 +msgid "long name" +msgstr "" + +#: judge/models/runtime.py:22 +msgid "Longer name for the language, e.g. \"Python 2\" or \"C++11\"." +msgstr "" + +#: judge/models/runtime.py:24 +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:28 +msgid "common name" +msgstr "" + +#: judge/models/runtime.py:29 +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:31 +msgid "ace mode name" +msgstr "" + +#: judge/models/runtime.py:32 +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:34 +msgid "pygments name" +msgstr "" + +#: judge/models/runtime.py:35 +msgid "Language ID for Pygments highlighting in source windows." +msgstr "" + +#: judge/models/runtime.py:36 +msgid "code template" +msgstr "" + +#: judge/models/runtime.py:37 +msgid "Code template to display in submission editor." +msgstr "" + +#: judge/models/runtime.py:38 +msgid "runtime info override" +msgstr "" + +#: judge/models/runtime.py:39 +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:41 +msgid "language description" +msgstr "" + +#: judge/models/runtime.py:42 +msgid "Use field this to inform users of quirks with your environment, additional restrictions, etc." +msgstr "" + +#: judge/models/runtime.py:44 +msgid "extension" +msgstr "" + +#: judge/models/runtime.py:45 +msgid "The extension of source files, e.g., \"py\" or \"cpp\"." +msgstr "" + +#: judge/models/runtime.py:100 +msgid "languages" +msgstr "" + +#: judge/models/runtime.py:104 +msgid "language to which this runtime belongs" +msgstr "" + +#: judge/models/runtime.py:105 +msgid "judge on which this runtime exists" +msgstr "" + +#: judge/models/runtime.py:106 +msgid "runtime name" +msgstr "" + +#: judge/models/runtime.py:107 +msgid "runtime version" +msgstr "" + +#: judge/models/runtime.py:108 +msgid "order in which to display this runtime" +msgstr "" + +#: judge/models/runtime.py:112 +msgid "Server name, hostname-style" +msgstr "" + +#: judge/models/runtime.py:113 +msgid "time of creation" +msgstr "" + +#: judge/models/runtime.py:114 +msgid "A key to authenticated this judge" +msgstr "" + +#: judge/models/runtime.py:115 +msgid "authentication key" +msgstr "" + +#: judge/models/runtime.py:116 +msgid "block judge" +msgstr "" + +#: judge/models/runtime.py:117 +msgid "Whether this judge should be blocked from connecting, even if its key is correct." +msgstr "" + +#: judge/models/runtime.py:119 +msgid "judge online status" +msgstr "" + +#: judge/models/runtime.py:120 +msgid "judge start time" +msgstr "" + +#: judge/models/runtime.py:121 +msgid "response time" +msgstr "" + +#: judge/models/runtime.py:122 +msgid "system load" +msgstr "" + +#: judge/models/runtime.py:123 +msgid "Load for the last minute, divided by processors to be fair." +msgstr "" + +#: judge/models/runtime.py:127 judge/models/runtime.py:167 +msgid "judges" +msgstr "" + +#: judge/models/runtime.py:166 +msgid "judge" +msgstr "" + +#: judge/models/submission.py:20 judge/models/submission.py:47 +#: judge/utils/problems.py:86 +msgid "Accepted" +msgstr "" + +#: judge/models/submission.py:21 judge/models/submission.py:48 +msgid "Wrong Answer" +msgstr "" + +#: judge/models/submission.py:22 judge/models/submission.py:50 +msgid "Time Limit Exceeded" +msgstr "" + +#: judge/models/submission.py:23 judge/models/submission.py:51 +msgid "Memory Limit Exceeded" +msgstr "" + +#: judge/models/submission.py:24 judge/models/submission.py:52 +msgid "Output Limit Exceeded" +msgstr "" + +#: judge/models/submission.py:25 judge/models/submission.py:53 +msgid "Invalid Return" +msgstr "" + +#: judge/models/submission.py:26 judge/models/submission.py:54 +msgid "Runtime Error" +msgstr "" + +#: judge/models/submission.py:27 judge/models/submission.py:41 +#: judge/models/submission.py:55 judge/utils/problems.py:88 +msgid "Compile Error" +msgstr "" + +#: judge/models/submission.py:28 judge/models/submission.py:40 +msgid "Internal Error" +msgstr "" + +#: judge/models/submission.py:29 +msgid "Short circuit" +msgstr "" + +#: judge/models/submission.py:30 judge/models/submission.py:42 +#: judge/models/submission.py:61 +msgid "Aborted" +msgstr "" + +#: judge/models/submission.py:36 judge/models/submission.py:57 +msgid "Queued" +msgstr "" + +#: judge/models/submission.py:37 judge/models/submission.py:58 +msgid "Processing" +msgstr "" + +#: judge/models/submission.py:38 judge/models/submission.py:59 +msgid "Grading" +msgstr "" + +#: judge/models/submission.py:39 judge/models/submission.py:60 +msgid "Completed" +msgstr "" + +#: judge/models/submission.py:56 +msgid "Internal Error (judging server error)" +msgstr "" + +#: judge/models/submission.py:66 +msgid "submission time" +msgstr "" + +#: judge/models/submission.py:67 judge/models/submission.py:201 +msgid "execution time" +msgstr "" + +#: judge/models/submission.py:68 judge/models/submission.py:202 +msgid "memory usage" +msgstr "" + +#: judge/models/submission.py:69 judge/models/submission.py:203 +msgid "points granted" +msgstr "" + +#: judge/models/submission.py:70 +msgid "submission language" +msgstr "" + +#: judge/models/submission.py:71 +msgid "status" +msgstr "" + +#: judge/models/submission.py:72 +msgid "result" +msgstr "" + +#: judge/models/submission.py:74 +msgid "compile errors" +msgstr "" + +#: judge/models/submission.py:76 +msgid "batched cases" +msgstr "" + +#: judge/models/submission.py:77 +msgid "test case points" +msgstr "" + +#: judge/models/submission.py:78 +msgid "test case total points" +msgstr "" + +#: judge/models/submission.py:79 +msgid "judged on" +msgstr "" + +#: judge/models/submission.py:81 +msgid "was rejudged by admin" +msgstr "" + +#: judge/models/submission.py:82 +msgid "was ran on pretests only" +msgstr "" + +#: judge/models/submission.py:182 templates/contest/moss.html:58 +msgid "submissions" +msgstr "" + +#: judge/models/submission.py:186 judge/models/submission.py:197 +msgid "associated submission" +msgstr "" + +#: judge/models/submission.py:188 +msgid "source code" +msgstr "" + +#: judge/models/submission.py:199 +msgid "test case ID" +msgstr "" + +#: judge/models/submission.py:200 +msgid "status flag" +msgstr "" + +#: judge/models/submission.py:204 +msgid "points possible" +msgstr "" + +#: judge/models/submission.py:205 +msgid "batch number" +msgstr "" + +#: judge/models/submission.py:206 +msgid "judging feedback" +msgstr "" + +#: judge/models/submission.py:207 +msgid "extended judging feedback" +msgstr "" + +#: judge/models/submission.py:208 +msgid "program output" +msgstr "" + +#: judge/models/submission.py:216 +msgid "submission test case" +msgstr "" + +#: judge/models/submission.py:217 +msgid "submission test cases" +msgstr "" + +#: judge/models/ticket.py:10 +msgid "ticket title" +msgstr "" + +#: judge/models/ticket.py:11 +msgid "ticket creator" +msgstr "" + +#: judge/models/ticket.py:13 +msgid "creation time" +msgstr "" + +#: judge/models/ticket.py:14 +msgid "assignees" +msgstr "" + +#: judge/models/ticket.py:15 +msgid "quick notes" +msgstr "" + +#: judge/models/ticket.py:16 +msgid "Staff notes for this issue to aid in processing." +msgstr "" + +#: judge/models/ticket.py:17 +msgid "linked item type" +msgstr "" + +#: judge/models/ticket.py:19 +msgid "linked item ID" +msgstr "" + +#: judge/models/ticket.py:21 +msgid "is ticket open?" +msgstr "" + +#: judge/models/ticket.py:25 +msgid "ticket" +msgstr "" + +#: judge/models/ticket.py:27 +msgid "poster" +msgstr "" + +#: judge/models/ticket.py:30 +msgid "message time" +msgstr "" + +#: judge/pdf_problems.py:134 judge/pdf_problems.py:186 +#: judge/pdf_problems.py:246 +msgid "Page [page] of [topage]" +msgstr "" + +#: judge/tasks/moss.py:25 +msgid "Running MOSS" +msgstr "" + +#: judge/tasks/submission.py:43 +msgid "Modifying submissions" +msgstr "" + +#: judge/tasks/submission.py:56 +msgid "Recalculating user points" +msgstr "" + +#: judge/utils/problem_data.py:63 +msgid "Empty batches not allowed." +msgstr "" + +#: 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 +#, python-format +msgid "Input file for case %d does not exist: %s" +msgstr "" + +#: 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 +#, python-format +msgid "Batch start case #%d requires points." +msgstr "" + +#: 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 +msgid "How did you corrupt the zip path?" +msgstr "" + +#: judge/utils/problem_data.py:160 +msgid "How did you corrupt the generator path?" +msgstr "" + +#: judge/utils/problems.py:76 +msgid "Can't pass both queryset and keyword filters" +msgstr "" + +#: judge/utils/problems.py:87 +msgid "Wrong" +msgstr "" + +#: judge/utils/problems.py:89 +msgid "Timeout" +msgstr "" + +#: judge/utils/problems.py:90 +msgid "Error" +msgstr "" + +#: 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/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] "" +msgstr[2] "" + +#: 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] "" +msgstr[2] "" + +#: judge/utils/timedelta.py:61 +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: judge/utils/timedelta.py:63 +msgctxt "hours and minutes" +msgid "%h:%m" +msgstr "" + +#: judge/views/blog.py:38 +#, python-format +msgid "Page %d of Posts" +msgstr "" + +#: judge/views/comment.py:27 +msgid "Messing around, are we?" +msgstr "" + +#: judge/views/comment.py:36 +msgid "You must solve at least one problem before you can vote." +msgstr "" + +#: judge/views/comment.py:63 +msgid "You already voted." +msgstr "" + +#: judge/views/comment.py:120 judge/views/organization.py:299 +msgid "Edited from site" +msgstr "" + +#: judge/views/comment.py:141 +msgid "Editing comment" +msgstr "" + +#: judge/views/contests.py:49 judge/views/contests.py:211 +#: judge/views/contests.py:214 judge/views/contests.py:385 +msgid "No such contest" +msgstr "" + +#: judge/views/contests.py:50 judge/views/contests.py:212 +#, python-format +msgid "Could not find a contest with the key \"%s\"." +msgstr "" + +#: judge/views/contests.py:75 +msgid "Contests" +msgstr "" + +#: judge/views/contests.py:215 +msgid "Could not find such contest." +msgstr "" + +#: judge/views/contests.py:218 +#, python-format +msgid "Access to contest \"%s\" denied" +msgstr "" + +#: judge/views/contests.py:242 +msgid "Clone Contest" +msgstr "" + +#: judge/views/contests.py:305 +msgid "Contest not ongoing" +msgstr "" + +#: judge/views/contests.py:306 +#, python-format +msgid "\"%s\" is not currently ongoing." +msgstr "" + +#: judge/views/contests.py:310 +msgid "Already in contest" +msgstr "" + +#: judge/views/contests.py:311 +#, python-format +msgid "You are already in a contest: \"%s\"." +msgstr "" + +#: judge/views/contests.py:314 +msgid "Banned from joining" +msgstr "" + +#: judge/views/contests.py:315 +msgid "You have been declared persona non grata for this contest. You are permanently barred from joining this contest." +msgstr "" + +#: judge/views/contests.py:375 +#, python-format +msgid "Enter access code for \"%s\"" +msgstr "" + +#: judge/views/contests.py:386 +#, python-format +msgid "You are not in contest \"%s\"." +msgstr "" + +#: judge/views/contests.py:405 +msgid "ContestCalendar requires integer year and month" +msgstr "" + +#: judge/views/contests.py:445 +#, python-format +msgid "Contests in %(month)s" +msgstr "" + +#: judge/views/contests.py:445 +msgid "F Y" +msgstr "" + +#: judge/views/contests.py:531 +msgid "???" +msgstr "" + +#: judge/views/contests.py:594 +#, python-format +msgid "%s Rankings" +msgstr "" + +#: judge/views/contests.py:610 +#, python-format +msgid "Your participation in %s" +msgstr "" + +#: judge/views/contests.py:611 +#, python-format +msgid "%s's participation in %s" +msgstr "" + +#: judge/views/contests.py:615 +msgid "Live" +msgstr "" + +#: judge/views/contests.py:627 templates/contest/contest-tabs.html:13 +msgid "Participation" +msgstr "" + +#: judge/views/contests.py:654 +#, python-format +msgid "%s MOSS Results" +msgstr "" + +#: judge/views/contests.py:681 +#, python-format +msgid "Running MOSS for %s..." +msgstr "" + +#: judge/views/contests.py:704 +#, python-format +msgid "Contest tag: %s" +msgstr "" + +#: judge/views/error.py:14 +msgid "404 error" +msgstr "" + +#: judge/views/error.py:15 +#, python-format +msgid "Could not find page \"%s\"" +msgstr "" + +#: judge/views/error.py:22 +#, python-format +msgid "no permission for %s" +msgstr "" + +#: 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 +msgid "Runtimes" +msgstr "" + +#: judge/views/organization.py:44 judge/views/organization.py:47 +msgid "No such organization" +msgstr "" + +#: judge/views/organization.py:45 +#, python-format +msgid "Could not find an organization with the key \"%s\"." +msgstr "" + +#: judge/views/organization.py:48 +msgid "Could not find such organization." +msgstr "" + +#: judge/views/organization.py:72 judge/views/register.py:34 +#: templates/organization/list.html:15 templates/user/user-list-tabs.html:5 +msgid "Organizations" +msgstr "" + +#: judge/views/organization.py:93 +#, python-format +msgid "%s Members" +msgstr "" + +#: judge/views/organization.py:118 judge/views/organization.py:121 +#: judge/views/organization.py:126 +msgid "Joining organization" +msgstr "" + +#: judge/views/organization.py:118 +msgid "You are already in the organization." +msgstr "" + +#: judge/views/organization.py:121 +msgid "This organization is not open." +msgstr "" + +#: judge/views/organization.py:138 +msgid "Leaving organization" +msgstr "" + +#: judge/views/organization.py:138 +#, python-format +msgid "You are not in \"%s\"." +msgstr "" + +#: judge/views/organization.py:162 +#, python-format +msgid "Request to join %s" +msgstr "" + +#: judge/views/organization.py:180 +msgid "Join request detail" +msgstr "" + +#: judge/views/organization.py:209 +#, python-format +msgid "Managing join requests for %s" +msgstr "" + +#: judge/views/organization.py:240 +#, python-format +msgid "Your organization can only receive %d more members. You cannot approve %d users." +msgstr "" + +#: judge/views/organization.py:252 +#, python-format +msgid "Approved %d user." +msgid_plural "Approved %d users." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: judge/views/organization.py:253 +#, python-format +msgid "Rejected %d user." +msgid_plural "Rejected %d users." +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: judge/views/organization.py:283 +#, python-format +msgid "Editing %s" +msgstr "" + +#: judge/views/organization.py:307 judge/views/organization.py:315 +msgid "Can't edit organization" +msgstr "" + +#: judge/views/organization.py:308 +msgid "You are not allowed to edit this organization." +msgstr "" + +#: judge/views/organization.py:316 +msgid "You are not allowed to kick people from this organization." +msgstr "" + +#: judge/views/organization.py:321 judge/views/organization.py:325 +msgid "Can't kick user" +msgstr "" + +#: judge/views/organization.py:322 +msgid "The user you are trying to kick does not exist!" +msgstr "" + +#: judge/views/organization.py:326 +#, python-format +msgid "The user you are trying to kick is not in organization: %s." +msgstr "" + +#: judge/views/problem.py:68 +msgid "No such problem" +msgstr "" + +#: judge/views/problem.py:69 +#, python-format +msgid "Could not find a problem with the code \"%s\"." +msgstr "" + +#: judge/views/problem.py:111 +#, python-brace-format +msgid "Editorial for {0}" +msgstr "" + +#: judge/views/problem.py:114 +#, python-brace-format +msgid "Editorial for {0}" +msgstr "" + +#: judge/views/problem.py:285 templates/contest/contest.html:79 +#: templates/user/user-tabs.html:5 templates/user/users-table.html:23 +msgid "Problems" +msgstr "" + +#: judge/views/problem.py:546 +msgid "Banned from submitting" +msgstr "" + +#: judge/views/problem.py:547 +msgid "You have been declared persona non grata for this problem. You are permanently barred from submitting this problem." +msgstr "" + +#: judge/views/problem.py:560 +msgid "Too many submissions" +msgstr "" + +#: judge/views/problem.py:561 +msgid "You have exceeded the submission limit for this problem." +msgstr "" + +#: judge/views/problem.py:627 judge/views/problem.py:630 +#, python-format +msgid "Submit to %(problem)s" +msgstr "" + +#: judge/views/problem.py:646 +msgid "Clone Problem" +msgstr "" + +#: judge/views/problem_data.py:37 +msgid "Checker arguments must be a JSON object" +msgstr "" + +#: judge/views/problem_data.py:39 +msgid "Checker arguments is invalid JSON" +msgstr "" + +#: judge/views/problem_data.py:46 +msgid "Your zip file is invalid!" +msgstr "" + +#: judge/views/problem_data.py:104 +#, python-brace-format +msgid "Comparing submissions for {0}" +msgstr "" + +#: judge/views/problem_data.py:107 +#, python-brace-format +msgid "Comparing submissions for {0}" +msgstr "" + +#: judge/views/problem_data.py:142 +#, python-brace-format +msgid "Editing data for {0}" +msgstr "" + +#: judge/views/problem_data.py:145 +#, python-format +msgid "Editing data for %s" +msgstr "" + +#: judge/views/problem_data.py:237 judge/views/problem_data.py:238 +#, python-format +msgid "Generated init.yml for %s" +msgstr "" + +#: 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] "" +msgstr[2] "" + +#: judge/views/ranked_submission.py:58 +#, python-format +msgid "Best solutions for %s" +msgstr "" + +#: judge/views/ranked_submission.py:61 +#, python-brace-format +msgid "Best solutions for {0}" +msgstr "" + +#: judge/views/ranked_submission.py:71 +#, python-format +msgid "Best solutions for %(problem)s in %(contest)s" +msgstr "" + +#: judge/views/ranked_submission.py:74 +#, python-format +msgid "Best solutions for problem %(number)s in %(contest)s" +msgstr "" + +#: judge/views/ranked_submission.py:80 +#, python-brace-format +msgid "Best solutions for {0} in {2}" +msgstr "" + +#: judge/views/ranked_submission.py:83 +#, python-brace-format +msgid "Best solutions for problem {0} in {1}" +msgstr "" + +#: judge/views/register.py:27 +msgid "A username must contain letters, numbers, or underscores" +msgstr "" + +#: judge/views/register.py:31 templates/user/edit-profile.html:103 +msgid "Preferred language" +msgstr "" + +#: judge/views/register.py:38 +msgid "Subscribe to newsletter?" +msgstr "" + +#: judge/views/register.py:45 +#, python-format +msgid "The email address \"%s\" is already taken. Only one registration is allowed per address." +msgstr "" + +#: judge/views/register.py:51 +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 +msgid "Registration" +msgstr "" + +#: judge/views/register.py:106 +msgid "Authentication failure" +msgstr "" + +#: judge/views/stats.py:105 +msgid "Language statistics" +msgstr "" + +#: judge/views/status.py:24 templates/submission/list.html:319 +msgid "Status" +msgstr "" + +#: judge/views/status.py:108 +msgid "Version matrix" +msgstr "" + +#: judge/views/submission.py:59 judge/views/submission.py:66 +#, python-format +msgid "Submission of %(problem)s by %(user)s" +msgstr "" + +#: judge/views/submission.py:161 judge/views/submission.py:162 +#: templates/problem/problem.html:127 +msgid "All submissions" +msgstr "" + +#: judge/views/submission.py:303 +msgid "All my submissions" +msgstr "" + +#: judge/views/submission.py:304 +#, python-format +msgid "All submissions by %s" +msgstr "" + +#: judge/views/submission.py:335 +#, python-format +msgid "All submissions for %s" +msgstr "" + +#: judge/views/submission.py:354 +msgid "Must pass a problem" +msgstr "" + +#: judge/views/submission.py:397 +#, python-format +msgid "My submissions for %(problem)s" +msgstr "" + +#: judge/views/submission.py:398 +#, python-format +msgid "%(user)s's submissions for %(problem)s" +msgstr "" + +#: judge/views/submission.py:495 +msgid "Must pass a contest" +msgstr "" + +#: judge/views/submission.py:514 +#, python-brace-format +msgid "{0}'s submissions for {2} in {4}" +msgstr "" + +#: judge/views/submission.py:519 +#, 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 "" + +#: judge/views/ticket.py:40 +msgid "Issue description" +msgstr "" + +#: judge/views/ticket.py:85 judge/views/ticket.py:88 +#, python-format +msgid "New ticket for %s" +msgstr "" + +#: judge/views/ticket.py:139 +#, python-format +msgid "%(title)s - Ticket %(id)d" +msgstr "" + +#: judge/views/ticket.py:248 +#, python-format +msgid "Tickets - Page %(number)d of %(total)d" +msgstr "" + +#: judge/views/ticket.py:297 +#, python-format +msgid "New Ticket: %s" +msgstr "" + +#: judge/views/ticket.py:298 +#, python-format +msgid "#%(id)d, assigned to: %(users)s" +msgstr "" + +#: judge/views/ticket.py:300 +msgid ", " +msgstr "" + +#: judge/views/ticket.py:300 +msgid "no one" +msgstr "" + +#: judge/views/totp.py:42 templates/registration/totp_enable.html:86 +msgid "Enable Two Factor Authentication" +msgstr "" + +#: judge/views/totp.py:89 templates/registration/totp_disable.html:48 +msgid "Disable Two Factor Authentication" +msgstr "" + +#: judge/views/totp.py:103 +msgid "Perform Two Factor Authentication" +msgstr "" + +#: judge/views/user.py:68 +msgid "No such user" +msgstr "" + +#: judge/views/user.py:68 +#, python-format +msgid "No user handle \"%s\"." +msgstr "" + +#: judge/views/user.py:72 +msgid "My account" +msgstr "" + +#: judge/views/user.py:73 +#, python-format +msgid "User %s" +msgstr "" + +#: judge/views/user.py:136 +msgid "M j, Y, G:i" +msgstr "" + +#: judge/views/user.py:221 +msgid "Updated on site" +msgstr "" + +#: judge/views/user.py:253 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:10 +msgid "Edit profile" +msgstr "" + +#: judge/views/user.py:262 templates/user/user-list-tabs.html:4 +msgid "Leaderboard" +msgstr "" + +#: judge/views/widgets.py:48 judge/views/widgets.py:58 +#, python-format +msgid "Invalid upstream data: %s" +msgstr "" + +#: judge/views/widgets.py:68 +msgid "Bad latitude or longitude" +msgstr "" + +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:13 +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:27 +msgid "Photo" +msgstr "" + +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:14 +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:28 +msgid "Photos" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:9 +msgid "first name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:10 +msgid "last name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:11 +msgid "biography" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/admin.py:24 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:30 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:30 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:30 +msgid "owner" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:12 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:12 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:12 +msgid "name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:19 +msgid "Category of Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:20 +msgid "Categories of Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:26 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:26 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:26 +msgid "title" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:28 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:28 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:28 +msgid "category" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:29 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:29 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:29 +msgid "author" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:31 +msgid "publication date" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:37 +msgid "Book" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:38 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:136 +msgid "Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:19 +msgid "Category of CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:20 +msgid "Categories of CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:36 +msgid "CD" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:37 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:141 +msgid "CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:19 +msgid "Category of DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:20 +msgid "Categories of DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:36 +msgid "DVD" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:37 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:146 +msgid "DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/templates/admin/base_site.html:7 +msgid "Django administration" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/forms.py:12 +#, python-format +msgid "Please enter the correct %(username)s and password for an admin account. Note that both fields may be case-sensitive." +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/forms.py:32 +#, python-format +msgid "Please enter the correct %(username)s and password for an user account. Note that both fields may be case-sensitive." +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:27 +msgid "Site" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:38 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:41 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:130 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:133 +msgid "Dashboard" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:48 +msgid "Applications" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:53 +msgid "Administration" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:64 +msgid "Color theme" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:66 +msgid "Change color theme" +msgstr "" + +#: 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 +msgid "Rate all ratable contests" +msgstr "" + +#: 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 +msgid "Rejudge" +msgstr "" + +#: templates/base.html:214 +#, python-format +msgid "Hello, %(username)s." +msgstr "" + +#: templates/base.html:220 templates/comments/list.html:89 +#: templates/contest/contest-list-tabs.html:24 +#: templates/problem/problem-list-tabs.html:6 +#: templates/submission/info-base.html:12 +#: templates/submission/submission-list-tabs.html:15 +msgid "Admin" +msgstr "" + +#: templates/base.html:229 +msgid "Log out" +msgstr "" + +#: templates/base.html:238 +#: templates/registration/password_reset_complete.html:4 +msgid "Log in" +msgstr "" + +#: templates/base.html:239 templates/registration/registration_form.html:177 +msgid "or" +msgstr "" + +#: templates/base.html:240 +msgid "Sign up" +msgstr "" + +#: templates/base.html:252 +msgid "spectating" +msgstr "" + +#: 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:20 +#: 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 +msgid "Edit" +msgstr "" + +#: templates/blog/content.html:27 +#, python-format +msgid "\n" +" posted on %(time)s\n" +" " +msgstr "" + +#: templates/blog/dashboard.html:21 +#, python-format +msgid "\n" +" on %(time)s\n" +" " +msgstr "" + +#: templates/blog/list.html:85 +msgid "Blog" +msgstr "" + +#: templates/blog/list.html:87 +msgid "Events" +msgstr "" + +#: templates/blog/list.html:92 +msgid "News" +msgstr "" + +#: templates/blog/list.html:106 +#, python-brace-format +msgid "posted on {time}" +msgstr "" + +#: templates/blog/list.html:130 templates/problem/problem.html:310 +msgid "Clarifications" +msgstr "" + +#: templates/blog/list.html:146 templates/problem/problem.html:321 +msgid "No clarifications have been made at this time." +msgstr "" + +#: templates/blog/list.html:154 +msgid "Ongoing contests" +msgstr "" + +#: templates/blog/list.html:172 +msgid "Upcoming contests" +msgstr "" + +#: templates/blog/list.html:189 +msgid "Comment stream" +msgstr "" + +#: templates/blog/list.html:208 +msgid "New problems" +msgstr "" + +#: templates/blog/list.html:225 +msgid "My open tickets" +msgstr "" + +#: templates/blog/list.html:246 +msgid "New tickets" +msgstr "" + +#: templates/comments/list.html:2 +msgid "Comments" +msgstr "" + +#: templates/comments/list.html:18 templates/comments/list.html:27 +msgid "Please login to vote" +msgstr "" + +#: templates/comments/list.html:40 +#, python-brace-format +msgid "commented on {time}" +msgstr "" + +#: templates/comments/list.html:49 +#, python-format +msgid "edit %(edits)s" +msgstr "" + +#: templates/comments/list.html:51 templates/comments/media-js.html:77 +msgid "edited" +msgstr "" + +#: templates/comments/list.html:60 +msgid "Link" +msgstr "" + +#: templates/comments/list.html:73 templates/comments/list.html:80 +msgid "Reply" +msgstr "" + +#: templates/comments/list.html:86 +msgid "Hide" +msgstr "" + +#: templates/comments/list.html:101 +#, 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:120 +msgid "There are no comments at the moment." +msgstr "" + +#: templates/comments/list.html:126 +msgid "New comment" +msgstr "" + +#: templates/comments/list.html:140 +msgid "Invalid comment body." +msgstr "" + +#: templates/comments/list.html:148 +msgid "Post!" +msgstr "" + +#: templates/comments/list.html:156 +msgid "Comments are disabled on this page." +msgstr "" + +#: templates/comments/media-js.html:72 +#, python-brace-format +msgid "edit {edits}" +msgstr "" + +#: templates/comments/media-js.html:75 +msgid "original" +msgstr "" + +#: templates/contest/access_code.html:26 +msgid "Invalid access code." +msgstr "" + +#: templates/contest/access_code.html:29 +msgid "Please enter your access code:" +msgstr "" + +#: templates/contest/access_code.html:32 +msgid "Join Contest" +msgstr "" + +#: templates/contest/calendar.html:12 +msgid "Sunday" +msgstr "" + +#: templates/contest/calendar.html:13 +msgid "Monday" +msgstr "" + +#: templates/contest/calendar.html:14 +msgid "Tuesday" +msgstr "" + +#: templates/contest/calendar.html:15 +msgid "Wednesday" +msgstr "" + +#: templates/contest/calendar.html:16 +msgid "Thursday" +msgstr "" + +#: templates/contest/calendar.html:17 +msgid "Friday" +msgstr "" + +#: templates/contest/calendar.html:18 +msgid "Saturday" +msgstr "" + +#: 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 +msgid "Today" +msgstr "" + +#: templates/contest/contest-list-tabs.html:13 +msgid "Next" +msgstr "" + +#: templates/contest/contest-list-tabs.html:21 +#: templates/problem/problem-list-tabs.html:5 +msgid "List" +msgstr "" + +#: templates/contest/contest-list-tabs.html:22 +msgid "Calendar" +msgstr "" + +#: templates/contest/contest-tabs.html:4 +msgid "Info" +msgstr "" + +#: templates/contest/contest-tabs.html:8 +msgid "Rankings" +msgstr "" + +#: templates/contest/contest-tabs.html:10 +msgid "Hidden Rankings" +msgstr "" + +#: templates/contest/contest-tabs.html:18 +msgid "MOSS" +msgstr "" + +#: templates/contest/contest-tabs.html:23 +msgid "Clone" +msgstr "" + +#: templates/contest/contest-tabs.html:34 +#: templates/contest/contest-tabs.html:54 +msgid "Leave contest" +msgstr "" + +#: templates/contest/contest-tabs.html:41 templates/contest/list.html:293 +msgid "Virtual join" +msgstr "" + +#: templates/contest/contest-tabs.html:52 +msgid "Stop spectating" +msgstr "" + +#: templates/contest/contest-tabs.html:61 +msgid "Spectate contest" +msgstr "" + +#: templates/contest/contest-tabs.html:67 +#: templates/contest/contest-tabs.html:73 +msgid "Join contest" +msgstr "" + +#: templates/contest/contest-tabs.html:82 +msgid "Login to participate" +msgstr "" + +#: templates/contest/contest.html:37 +msgid "Participating virtually." +msgstr "" + +#: templates/contest/contest.html:43 +msgid "Contest is over." +msgstr "" + +#: templates/contest/contest.html:59 templates/contest/contest.html:63 +msgid "F j, Y, G:i T" +msgstr "" + +#: 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 +#, python-format +msgid "%(length)s long starting on %(start_time)s" +msgstr "" + +#: templates/contest/contest.html:85 +msgid "AC Rate" +msgstr "" + +#: templates/contest/contest.html:86 templates/contest/list.html:153 +#: templates/contest/list.html:195 templates/contest/list.html:271 +#: templates/problem/list.html:212 templates/problem/list.html:238 +msgid "Users" +msgstr "" + +#: templates/contest/contest.html:111 +msgid "Editorial" +msgstr "" + +#: templates/contest/list.html:31 templates/contest/media-js.html:9 +msgid "Are you sure you want to join?" +msgstr "" + +#: 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:65 +msgid "hidden" +msgstr "" + +#: templates/contest/list.html:70 +msgid "private" +msgstr "" + +#: templates/contest/list.html:84 +msgid "rated" +msgstr "" + +#: templates/contest/list.html:132 +msgid "Spectate" +msgstr "" + +#: templates/contest/list.html:138 +msgid "Join" +msgstr "" + +#: templates/contest/list.html:148 +msgid "Active Contests" +msgstr "" + +#: templates/contest/list.html:152 templates/contest/list.html:194 +#: templates/contest/list.html:232 templates/contest/list.html:270 +msgid "Contest" +msgstr "" + +#: templates/contest/list.html:190 +msgid "Ongoing Contests" +msgstr "" + +#: templates/contest/list.html:227 +msgid "Upcoming Contests" +msgstr "" + +#: templates/contest/list.html:255 +msgid "There are no scheduled contests at this time." +msgstr "" + +#: templates/contest/list.html:261 +msgid "Past Contests" +msgstr "" + +#: templates/contest/media-js.html:4 +msgid "Are you sure you want to leave?" +msgstr "" + +#: 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 +msgid "Joining a contest starts your timer, after which it becomes unstoppable." +msgstr "" + +#: 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:7 +msgid "Organization" +msgstr "" + +#: templates/contest/ranking-table.html:27 +#, python-brace-format +msgid "Started on {time}" +msgstr "" + +#: templates/contest/ranking-table.html:30 +msgid "Participation ended." +msgstr "" + +#: templates/contest/ranking.html:232 +msgid "View user participation" +msgstr "" + +#: templates/contest/ranking.html:236 +msgid "Show organizations" +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 +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 +msgid "activate" +msgstr "" + +#: 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 +msgid "Newsletter unsubscribe" +msgstr "" + +#: 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 +msgid "Do you want to unsubscribe from this newsletter?" +msgstr "" + +#: 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 +msgid "Newsletter update" +msgstr "" + +#: 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 +msgid "Update subscription" +msgstr "" + +#: templates/newsletter/subscription_update_activated.html:8 +msgid "Your subscription has successfully been updated." +msgstr "" + +#: 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:34 +#: templates/ticket/edit-notes.html:4 +msgid "Update" +msgstr "" + +#: 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:29 +msgid "Join organization" +msgstr "" + +#: templates/organization/home.html:33 +msgid "Request membership" +msgstr "" + +#: templates/organization/home.html:39 +msgid "Edit organization" +msgstr "" + +#: templates/organization/home.html:43 +msgid "View requests" +msgstr "" + +#: templates/organization/home.html:50 +msgid "Admin organization" +msgstr "" + +#: templates/organization/home.html:55 +msgid "View members" +msgstr "" + +#: templates/organization/list.html:23 templates/status/language-list.html:34 +msgid "Name" +msgstr "" + +#: templates/organization/list.html:24 +msgid "Members" +msgstr "" + +#: templates/organization/new.html:10 templates/ticket/new.html:38 +msgid "Create" +msgstr "" + +#: templates/organization/requests/detail.html:13 +msgid "User:" +msgstr "" + +#: templates/organization/requests/detail.html:17 +msgid "Organization:" +msgstr "" + +#: templates/organization/requests/detail.html:25 +msgid "Time:" +msgstr "" + +#: templates/organization/requests/detail.html:29 +msgid "Reason:" +msgstr "" + +#: 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:15 +msgid "Reason" +msgstr "" + +#: 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:17 +#: templates/problem/data.html:401 +msgid "Delete?" +msgstr "" + +#: templates/organization/requests/request.html:18 +msgid "Your reason for joining:" +msgstr "" + +#: templates/organization/requests/request.html:20 +msgid "Request" +msgstr "" + +#: templates/organization/requests/tabs.html:4 +msgid "Pending" +msgstr "" + +#: templates/organization/requests/tabs.html:7 +msgid "Log" +msgstr "" + +#: templates/organization/requests/tabs.html:10 +msgid "Approved" +msgstr "" + +#: templates/organization/requests/tabs.html:13 +msgid "Rejected" +msgstr "" + +#: templates/organization/users-table.html:15 +msgid "Kick" +msgstr "" + +#: templates/problem/clone.html:37 +msgid "Enter a new code for the cloned problem:" +msgstr "" + +#: templates/problem/data.html:353 +msgid "View YAML" +msgstr "" + +#: templates/problem/data.html:369 +msgid "Show columns:" +msgstr "" + +#: templates/problem/data.html:372 templates/problem/data.html:396 +msgid "Output prefix" +msgstr "" + +#: templates/problem/data.html:376 templates/problem/data.html:397 +msgid "Output limit" +msgstr "" + +#: templates/problem/data.html:380 templates/problem/data.html:398 +msgid "Checker" +msgstr "" + +#: templates/problem/data.html:384 templates/problem/data.html:399 +msgid "Generator args" +msgstr "" + +#: templates/problem/data.html:391 +msgid "Type" +msgstr "" + +#: templates/problem/data.html:392 +msgid "Input file" +msgstr "" + +#: templates/problem/data.html:393 +msgid "Output file" +msgstr "" + +#: templates/problem/data.html:395 +msgid "Pretest?" +msgstr "" + +#: templates/problem/data.html:447 templates/problem/submit.html:252 +msgid "Submit!" +msgstr "" + +#: templates/problem/data.html:448 +msgid "Add new case" +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 editorialist.

Submitting an official solution before solving the problem yourself is a bannable offence." +msgstr "" + +#: templates/problem/list.html:62 +msgid "Filter by type..." +msgstr "" + +#: templates/problem/list.html:185 +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:57 +msgid "Category" +msgstr "" + +#: templates/problem/list.html:209 templates/problem/list.html:228 +msgid "Types" +msgstr "" + +#: templates/problem/list.html:235 +#, python-format +msgid "AC %%" +msgstr "" + +#: 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:142 +msgid "Filter by result:" +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:101 templates/problem/problem.html:111 +#: templates/problem/problem.html:116 +msgid "Submit solution" +msgstr "" + +#: templates/problem/problem.html:104 +#, python-format +msgid "%(counter)s submission left" +msgid_plural "%(counter)s submissions left" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: templates/problem/problem.html:112 +msgid "0 submissions left" +msgstr "" + +#: templates/problem/problem.html:124 +msgid "My submissions" +msgstr "" + +#: templates/problem/problem.html:128 +msgid "Best submissions" +msgstr "" + +#: templates/problem/problem.html:132 +msgid "Read editorial" +msgstr "" + +#: templates/problem/problem.html:137 +msgid "Manage tickets" +msgstr "" + +#: templates/problem/problem.html:141 +msgid "Edit problem" +msgstr "" + +#: templates/problem/problem.html:143 +msgid "Edit test data" +msgstr "" + +#: templates/problem/problem.html:148 +msgid "My tickets" +msgstr "" + +#: templates/problem/problem.html:156 +msgid "Manage submissions" +msgstr "" + +#: templates/problem/problem.html:162 +msgid "Clone problem" +msgstr "" + +#: templates/problem/problem.html:169 +msgid "Points:" +msgstr "" + +#: templates/problem/problem.html:172 templates/problem/problem.html:174 +msgid "(partial)" +msgstr "" + +#: templates/problem/problem.html:179 +msgid "Time limit:" +msgstr "" + +#: templates/problem/problem.html:191 +msgid "Memory limit:" +msgstr "" + +#: templates/problem/problem.html:210 +msgid "Author:" +msgid_plural "Authors:" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: templates/problem/problem.html:225 +msgid "Problem type" +msgid_plural "Problem types" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: templates/problem/problem.html:238 +msgid "Allowed languages" +msgstr "" + +#: templates/problem/problem.html:246 +#, python-format +msgid "No %(lang)s judge online" +msgstr "" + +#: templates/problem/problem.html:257 +msgid "Judge:" +msgid_plural "Judges:" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: templates/problem/problem.html:274 +msgid "none available" +msgstr "" + +#: templates/problem/problem.html:299 +msgid "Request clarification" +msgstr "" + +#: templates/problem/problem.html:301 +msgid "Report an issue" +msgstr "" + +#: 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 +msgid "Search problems..." +msgstr "" + +#: templates/problem/search-form.html:14 +msgid "Full text search" +msgstr "" + +#: templates/problem/search-form.html:21 +msgid "Hide solved problems" +msgstr "" + +#: 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 +msgid "All" +msgstr "" + +#: templates/problem/search-form.html:46 +msgid "Problem types" +msgstr "" + +#: templates/problem/search-form.html:57 +msgid "Point range" +msgstr "" + +#: templates/problem/search-form.html:63 templates/submission/list.html:337 +#: templates/ticket/list.html:248 +msgid "Go" +msgstr "" + +#: templates/problem/search-form.html:64 +msgid "Random" +msgstr "" + +#: templates/problem/submit.html:192 +#, python-format +msgid "Warning! Your default language, %(default_language)s, is unavailable for this problem and has been deselected." +msgstr "" + +#: templates/problem/submit.html:203 +#, python-format +msgid "\n" +" You have %(left)s submission left\n" +" " +msgid_plural "\n" +" You have %(left)s submissions left\n" +" " +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: templates/problem/submit.html:212 +msgid "You have 0 submissions left" +msgstr "" + +#: templates/problem/submit.html:250 +msgid "No judge is available for this problem." +msgstr "" + +#: templates/registration/activate.html:3 +#, python-format +msgid "%(key)s is an invalid activation key." +msgstr "" + +#: templates/registration/activation_complete.html:3 +msgid "Your account has been successfully activated." +msgstr "" + +#: templates/registration/login.html:43 +msgid "Invalid username or password." +msgstr "" + +#: templates/registration/login.html:61 +#: templates/registration/totp_auth.html:39 +msgid "Login!" +msgstr "" + +#: templates/registration/login.html:64 +msgid "Forgot your password?" +msgstr "" + +#: templates/registration/login.html:67 +msgid "Or log in with..." +msgstr "" + +#: templates/registration/logout.html:3 +msgid "See you later!" +msgstr "" + +#: templates/registration/password_change_done.html:3 +msgid "Your password was sucessfully changed." +msgstr "" + +#: templates/registration/password_change_form.html:8 +msgid "Change Password" +msgstr "" + +#: templates/registration/password_reset.html:7 +msgid "Send Reset Email" +msgstr "" + +#: 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_confirm.html:9 +msgid "Reset Password" +msgstr "" + +#: 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 +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 +#, 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 +msgid "Please go to the following page and choose a new password:" +msgstr "" + +#: templates/registration/password_reset_email.txt:7 +msgid "Your username, in case you've forgotten:" +msgstr "" + +#: templates/registration/password_reset_email.txt:9 +msgid "Thanks for using our site!" +msgstr "" + +#: templates/registration/password_reset_email.txt:11 +#, python-format +msgid "The %(site_name)s team" +msgstr "" + +#: 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 +msgid "Continue >" +msgstr "" + +#: 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:166 +msgid "(again, for confirmation)" +msgstr "" + +#: templates/registration/registration_form.html:173 +msgid "(select your closest major city)" +msgstr "" + +#: templates/registration/registration_form.html:178 +msgid "pick from map" +msgstr "" + +#: templates/registration/registration_form.html:183 +msgid "Default language" +msgstr "" + +#: templates/registration/registration_form.html:186 +#: templates/user/edit-profile.html:162 +msgid "Affiliated organizations" +msgstr "" + +#: templates/registration/registration_form.html:192 +#: templates/user/edit-profile.html:121 +msgid "Notify me about upcoming contests" +msgstr "" + +#: templates/registration/registration_form.html:206 +msgid "By registering, you agree to our" +msgstr "" + +#: templates/registration/registration_form.html:207 +msgid "Terms & Conditions" +msgstr "" + +#: templates/registration/registration_form.html:210 +msgid "Register!" +msgstr "" + +#: templates/registration/totp_auth.html:36 +#: templates/registration/totp_disable.html:45 +#: templates/registration/totp_enable.html:83 +msgid "Enter the 6-digit code generated by your app:" +msgstr "" + +#: templates/registration/totp_auth.html:41 +#, python-format +msgid "If you lost your authentication device, please contact us at %(email)s." +msgstr "" + +#: templates/registration/totp_disable.html:38 +msgid "To protect your account, you must first authenticate before you can disable Two Factor Authentication." +msgstr "" + +#: templates/registration/totp_enable.html:71 +msgid "Scan this code with your authenticator app:" +msgstr "" + +#: templates/registration/totp_enable.html:72 +msgid "QR code" +msgstr "" + +#: templates/registration/totp_enable.html:73 +msgid "Or enter this code manually:" +msgstr "" + +#: templates/stats/base.html:9 templates/submission/list.html:345 +msgid "Statistics" +msgstr "" + +#: templates/stats/language.html:11 +msgid "Submission Statistics" +msgstr "" + +#: templates/stats/language.html:16 +msgid "Submissions by Language" +msgstr "" + +#: templates/stats/language.html:21 +msgid "AC Submissions by Language" +msgstr "" + +#: templates/stats/language.html:26 +msgid "Language AC Rate" +msgstr "" + +#: templates/status/judge-status-table.html:2 +msgid "Judge" +msgstr "" + +#: templates/status/judge-status-table.html:4 +msgid "Online" +msgstr "" + +#: templates/status/judge-status-table.html:6 +msgid "Uptime" +msgstr "" + +#: templates/status/judge-status-table.html:7 +msgid "Ping" +msgstr "" + +#: 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 +msgid "N/A" +msgstr "" + +#: templates/status/judge-status-table.html:64 +msgid "There are no judges available at this time." +msgstr "" + +#: templates/status/language-list.html:33 templates/ticket/list.html:261 +msgid "ID" +msgstr "" + +#: templates/status/language-list.html:35 +msgid "Runtime Info" +msgstr "" + +#: templates/status/status-tabs.html:4 +msgid "Judges" +msgstr "" + +#: templates/status/status-tabs.html:6 +msgid "Version Matrix" +msgstr "" + +#: templates/submission/internal-error-message.html:8 +msgid "An internal error occurred while grading." +msgstr "" + +#: templates/submission/internal-error-message.html:15 +msgid "Error information" +msgstr "" + +#: templates/submission/list.html:76 +msgid "Filter by status..." +msgstr "" + +#: templates/submission/list.html:82 +msgid "Filter by language..." +msgstr "" + +#: templates/submission/list.html:315 +msgid "Filter submissions" +msgstr "" + +#: templates/submission/list.html:351 +msgid "Total:" +msgstr "" + +#: templates/submission/list.html:361 +msgid "You were disconnected. Refresh to show latest updates." +msgstr "" + +#: templates/submission/row.html:39 +#, python-format +msgid "Case #%(case)s" +msgstr "" + +#: templates/submission/row.html:49 +msgid "view" +msgstr "" + +#: templates/submission/row.html:53 +msgid "rejudge" +msgstr "" + +#: templates/submission/row.html:58 +msgid "admin" +msgstr "" + +#: templates/submission/source.html:25 +msgid "View status" +msgstr "" + +#: templates/submission/source.html:26 +msgid "View raw source" +msgstr "" + +#: templates/submission/source.html:28 templates/submission/status.html:61 +msgid "Resubmit" +msgstr "" + +#: 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 +msgid "Your submission is being processed..." +msgstr "" + +#: templates/submission/status-testcases.html:14 +msgid "Compilation Error" +msgstr "" + +#: templates/submission/status-testcases.html:18 +msgid "Compilation Warnings" +msgstr "" + +#: templates/submission/status-testcases.html:23 +msgid "Pretest Execution Results" +msgstr "" + +#: templates/submission/status-testcases.html:25 +msgid "Execution Results" +msgstr "" + +#: templates/submission/status-testcases.html:31 +msgid "Batch " +msgstr "" + +#: templates/submission/status-testcases.html:43 +msgid "Case" +msgstr "" + +#: templates/submission/status-testcases.html:45 +msgid "Pretest" +msgstr "" + +#: templates/submission/status-testcases.html:47 +msgid "Test case" +msgstr "" + +#: templates/submission/status-testcases.html:79 +msgid "Your output (clipped)" +msgstr "" + +#: templates/submission/status-testcases.html:90 +msgid "Judge feedback" +msgstr "" + +#: templates/submission/status-testcases.html:106 +msgid "Resources:" +msgstr "" + +#: templates/submission/status-testcases.html:115 +msgid "Final pretest score:" +msgstr "" + +#: templates/submission/status-testcases.html:117 +msgid "Final score:" +msgstr "" + +#: templates/submission/status-testcases.html:131 +msgid "Passing pretests does not guarantee a full score on system tests." +msgstr "" + +#: templates/submission/status-testcases.html:134 +msgid "Submission aborted!" +msgstr "" + +#: templates/submission/status.html:59 +msgid "View source" +msgstr "" + +#: templates/submission/status.html:88 +msgid "Abort" +msgstr "" + +#: templates/submission/submission-list-tabs.html:6 +msgid "Mine" +msgstr "" + +#: templates/submission/submission-list-tabs.html:9 +msgid "Best" +msgstr "" + +#: templates/submission/submission-list-tabs.html:12 +#, python-format +msgid "%(user)s's" +msgstr "" + +#: templates/ticket/list.html:135 templates/ticket/ticket.html:257 +msgid "Reopened: " +msgstr "" + +#: templates/ticket/list.html:138 templates/ticket/ticket.html:258 +msgid "Closed: " +msgstr "" + +#: templates/ticket/list.html:221 +msgid "Use desktop notification" +msgstr "" + +#: templates/ticket/list.html:227 +msgid "Show my tickets only" +msgstr "" + +#: templates/ticket/list.html:231 +msgid "Filing user" +msgstr "" + +#: templates/ticket/list.html:240 +msgid "Assignee" +msgstr "" + +#: templates/ticket/list.html:262 +msgid "Title" +msgstr "" + +#: templates/ticket/list.html:264 templates/ticket/ticket.html:304 +msgid "Assignees" +msgstr "" + +#: templates/ticket/new_problem.html:7 +msgid "Thanks for opening a ticket!" +msgstr "" + +#: 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 +msgid "Associated object" +msgstr "" + +#: templates/ticket/ticket.html:309 +msgid "No one is assigned." +msgstr "" + +#: templates/ticket/ticket.html:315 +msgid "Close ticket" +msgstr "" + +#: templates/ticket/ticket.html:317 +msgid "Reopen ticket" +msgstr "" + +#: templates/ticket/ticket.html:321 +msgid "Assignee notes" +msgstr "" + +#: templates/ticket/ticket.html:328 templates/widgets/select_all.html:4 +msgid "Nothing here." +msgstr "" + +#: templates/ticket/ticket.html:378 +msgid "Post" +msgstr "" + +#: templates/user/base-users-table.html:3 +msgid "Rank" +msgstr "" + +#: templates/user/base-users.html:14 templates/user/base-users.html:69 +msgid "Search by handle..." +msgstr "" + +#: templates/user/edit-profile.html:90 +msgid "Self-description" +msgstr "" + +#: templates/user/edit-profile.html:98 +msgid "Select your closest major city" +msgstr "" + +#: templates/user/edit-profile.html:107 +msgid "Editor theme" +msgstr "" + +#: templates/user/edit-profile.html:112 +msgid "Math engine" +msgstr "" + +#: templates/user/edit-profile.html:136 templates/user/edit-profile.html:137 +msgid "Change your avatar" +msgstr "" + +#: templates/user/edit-profile.html:143 +msgid "Change your password" +msgstr "" + +#: templates/user/edit-profile.html:150 +msgid "Two Factor Authentication is enabled." +msgstr "" + +#: templates/user/edit-profile.html:153 +msgid "Two Factor Authentication is disabled." +msgstr "" + +#: templates/user/edit-profile.html:170 +msgid "User-script" +msgstr "" + +#: templates/user/edit-profile.html:174 +msgid "Update profile" +msgstr "" + +#: templates/user/pp-row.html:22 +#, python-format +msgid "\n" +" weighted %(weight)s%%\n" +" " +msgstr "" + +#: templates/user/pp-row.html:27 +#, python-format +msgid "%(pp).1fpp" +msgstr "" + +#: templates/user/pp-row.html:29 +#, python-format +msgid "%(pp).0fpp" +msgstr "" + +#: templates/user/user-about.html:14 +msgid "From" +msgstr "" + +#: 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:40 +msgid "You have not shared any information." +msgstr "" + +#: templates/user/user-about.html:42 +msgid "This user has not shared any information." +msgstr "" + +#: templates/user/user-base.html:42 +#, python-format +msgid "%(counter)s problem solved" +msgid_plural "%(counter)s problems solved" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: templates/user/user-base.html:50 +msgid "Rank by points:" +msgstr "" + +#: templates/user/user-base.html:53 +msgid "Total points:" +msgstr "" + +#: templates/user/user-base.html:68 +msgid "Rank by rating:" +msgstr "" + +#: templates/user/user-base.html:70 +msgid "Rating:" +msgstr "" + +#: templates/user/user-base.html:71 +msgid "Volatility:" +msgstr "" + +#: templates/user/user-base.html:72 +msgid "Min. rating:" +msgstr "" + +#: templates/user/user-base.html:73 +msgid "Max rating:" +msgstr "" + +#: templates/user/user-problems.html:35 +msgid "Points Breakdown" +msgstr "" + +#: templates/user/user-problems.html:41 +msgid "Load more..." +msgstr "" + +#: templates/user/user-problems.html:45 +msgid "This user has not yet solved any problems." +msgstr "" + +#: templates/user/user-problems.html:51 +msgid "Authored Problems" +msgstr "" + +#: templates/user/user-problems.html:83 +msgid "Hide problems I've solved" +msgstr "" + +#: templates/user/user-problems.html:93 +#, python-format +msgid "%(points).1f points" +msgstr "" + +#: templates/user/user-problems.html:99 +msgid "Score" +msgstr "" + +#: templates/user/user-problems.html:110 +#, python-format +msgid "%(points)s / %(total)s" +msgstr "" + +#: templates/user/user-tabs.html:7 +msgid "Impersonate" +msgstr "" + +#: templates/user/user-tabs.html:13 +msgid "Admin User" +msgstr "" + +#: templates/user/user-tabs.html:16 +msgid "Admin Profile" +msgstr "" + +#: templates/widgets/select_all.html:8 +msgid "Check all" +msgstr "" + diff --git a/locale/sr_Latn/LC_MESSAGES/djangojs.po b/locale/sr_Latn/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..4ce08be --- /dev/null +++ b/locale/sr_Latn/LC_MESSAGES/djangojs.po @@ -0,0 +1,31 @@ +msgid "" +msgstr "" +"Project-Id-Version: dmoj\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-10-01 23:12+0000\n" +"PO-Revision-Date: 2019-11-11 22:06\n" +"Last-Translator: Icyene\n" +"Language-Team: Serbian (Latin)\n" +"Language: sr_CS\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: crowdin.com\n" +"X-Crowdin-Project: dmoj\n" +"X-Crowdin-Language: sr-CS\n" +"X-Crowdin-File: djangojs.po\n" + +#: 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] "" +msgstr[2] "" + +#: resources/common.js:210 +msgctxt "time format without day" +msgid "%h:%m:%s" +msgstr "" + diff --git a/locale/tr/LC_MESSAGES/django.po b/locale/tr/LC_MESSAGES/django.po new file mode 100644 index 0000000..a2dd903 --- /dev/null +++ b/locale/tr/LC_MESSAGES/django.po @@ -0,0 +1,4536 @@ +msgid "" +msgstr "" +"Project-Id-Version: dmoj\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-11-11 21:54+0000\n" +"PO-Revision-Date: 2019-11-11 22:06\n" +"Last-Translator: Icyene\n" +"Language-Team: Turkish\n" +"Language: tr_TR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: crowdin.com\n" +"X-Crowdin-Project: dmoj\n" +"X-Crowdin-Language: tr\n" +"X-Crowdin-File: django.po\n" + +#: dmoj/settings.py:337 +msgid "German" +msgstr "" + +#: dmoj/settings.py:338 +msgid "English" +msgstr "" + +#: dmoj/settings.py:339 +msgid "Spanish" +msgstr "" + +#: dmoj/settings.py:340 +msgid "French" +msgstr "" + +#: dmoj/settings.py:341 +msgid "Croatian" +msgstr "" + +#: dmoj/settings.py:342 +msgid "Hungarian" +msgstr "" + +#: dmoj/settings.py:343 +msgid "Japanese" +msgstr "" + +#: dmoj/settings.py:344 +msgid "Korean" +msgstr "" + +#: dmoj/settings.py:345 +msgid "Brazilian Portuguese" +msgstr "" + +#: dmoj/settings.py:346 +msgid "Romanian" +msgstr "" + +#: dmoj/settings.py:347 +msgid "Russian" +msgstr "" + +#: dmoj/settings.py:348 +msgid "Serbian (Latin)" +msgstr "" + +#: dmoj/settings.py:349 +msgid "Turkish" +msgstr "" + +#: dmoj/settings.py:350 +msgid "Vietnamese" +msgstr "" + +#: dmoj/settings.py:351 +msgid "Simplified Chinese" +msgstr "" + +#: dmoj/urls.py:54 +msgid "Login" +msgstr "Giriş" + +#: dmoj/urls.py:102 templates/base.html:190 +msgid "Home" +msgstr "Ana sayfa" + +#: judge/admin/comments.py:40 +#, python-format +msgid "%d comment successfully hidden." +msgid_plural "%d comments successfully hidden." +msgstr[0] "%d yorum gizlendi." +msgstr[1] "%d yorum gizlendi." + +#: judge/admin/comments.py:43 +msgid "Hide comments" +msgstr "Yorumları gizle" + +#: judge/admin/comments.py:47 +#, python-format +msgid "%d comment successfully unhidden." +msgid_plural "%d comments successfully unhidden." +msgstr[0] "%d yorum gösterildi." +msgstr[1] "%d yorum gösterildi." + +#: judge/admin/comments.py:50 +msgid "Unhide comments" +msgstr "Yorumları göster" + +#: judge/admin/comments.py:58 +msgid "Associated page" +msgstr "İlişkili sayfa" + +#: judge/admin/contest.py:29 +msgid "Included contests" +msgstr "Yarışmalar" + +#: judge/admin/contest.py:65 templates/contest/contest.html:83 +#: templates/contest/moss.html:43 templates/problem/list.html:206 +#: templates/problem/list.html:221 templates/user/user-problems.html:56 +#: templates/user/user-problems.html:98 +msgid "Problem" +msgstr "" + +#: judge/admin/contest.py:113 +msgid "Settings" +msgstr "" + +#: judge/admin/contest.py:115 +msgid "Scheduling" +msgstr "Planlama" + +#: judge/admin/contest.py:116 +msgid "Details" +msgstr "Ayrıntılar" + +#: judge/admin/contest.py:117 +msgid "Format" +msgstr "" + +#: judge/admin/contest.py:118 templates/contest/ranking-table.html:5 +msgid "Rating" +msgstr "Derecelendirme" + +#: judge/admin/contest.py:119 +msgid "Access" +msgstr "" + +#: judge/admin/contest.py:121 judge/admin/problem.py:131 +msgid "Justice" +msgstr "Demir yumruk" + +#: judge/admin/contest.py:159 +#, 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:162 +msgid "Mark contests as visible" +msgstr "" + +#: judge/admin/contest.py:166 +#, 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:169 +msgid "Mark contests as hidden" +msgstr "" + +#: judge/admin/contest.py:180 judge/admin/submission.py:149 +#: judge/admin/submission.py:171 +msgid "You do not have the permission to rejudge submissions." +msgstr "Çözümleri yeniden değerlendirme yetkin yok." + +#: judge/admin/contest.py:187 judge/admin/submission.py:155 +msgid "You do not have the permission to rejudge THAT many submissions." +msgstr "Bu miktarda çözümü yeniden değerlendirme yetkin yok." + +#: judge/admin/contest.py:194 judge/admin/submission.py:164 +#, 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:265 +#, python-format +msgid "%d participation recalculated." +msgid_plural "%d participations recalculated." +msgstr[0] "" +msgstr[1] "" + +#: judge/admin/contest.py:268 +msgid "Recalculate results" +msgstr "" + +#: judge/admin/contest.py:272 judge/admin/organization.py:65 +msgid "username" +msgstr "kullanıcı adı" + +#: judge/admin/contest.py:277 templates/base.html:258 +msgid "virtual" +msgstr "sanal" + +#: judge/admin/interface.py:28 judge/models/interface.py:46 +msgid "link path" +msgstr "link ucu" + +#: judge/admin/interface.py:62 +msgid "Content" +msgstr "İçerik" + +#: judge/admin/interface.py:63 +msgid "Summary" +msgstr "Özet" + +#: judge/admin/interface.py:107 judge/models/contest.py:251 +#: judge/models/contest.py:355 judge/models/profile.py:189 +msgid "user" +msgstr "kullanıcı" + +#: judge/admin/interface.py:148 +msgid "object" +msgstr "" + +#: judge/admin/organization.py:34 judge/admin/problem.py:171 +#: judge/admin/profile.py:78 +msgid "View on site" +msgstr "Sitede görüntüle" + +#: judge/admin/problem.py:28 +msgid "Describe the changes you made (optional)" +msgstr "Yaptığın değişiklikleri özetle (isteğe bağlı)" + +#: judge/admin/problem.py:126 +msgid "Social Media" +msgstr "Sosyal Medya" + +#: judge/admin/problem.py:127 +msgid "Taxonomy" +msgstr "Tasnif" + +#: judge/admin/problem.py:128 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:58 +msgid "Points" +msgstr "Puanlar" + +#: judge/admin/problem.py:129 +msgid "Limits" +msgstr "Sınırlar" + +#: judge/admin/problem.py:130 judge/admin/submission.py:232 +#: templates/stats/base.html:14 templates/submission/list.html:328 +msgid "Language" +msgstr "Dil" + +#: judge/admin/problem.py:132 +msgid "History" +msgstr "Geçmiş" + +#: judge/admin/problem.py:168 +msgid "Authors" +msgstr "Yazarlar" + +#: judge/admin/problem.py:183 +#, 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:187 +msgid "Mark problems as public" +msgstr "Problemleri herkese aç" + +#: judge/admin/problem.py:193 +#, 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:197 +msgid "Mark problems as private" +msgstr "Problemleri gizle" + +#: judge/admin/profile.py:32 +msgid "timezone" +msgstr "saat dilimi" + +#: judge/admin/profile.py:84 judge/admin/submission.py:211 +#: templates/organization/requests/log.html:9 +#: templates/organization/requests/pending.html:12 +#: templates/ticket/list.html:263 +msgid "User" +msgstr "Kullanıcı" + +#: judge/admin/profile.py:89 templates/registration/registration_form.html:145 +msgid "Email" +msgstr "E-posta" + +#: judge/admin/profile.py:94 judge/views/register.py:29 +#: templates/registration/registration_form.html:173 +#: templates/user/edit-profile.html:99 +msgid "Timezone" +msgstr "Saat dilimi" + +#: judge/admin/profile.py:99 +msgid "date joined" +msgstr "kayıt tarihi" + +#: judge/admin/profile.py:106 +#, 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:109 +msgid "Recalculate scores" +msgstr "Puanları yeniden hesapla" + +#: judge/admin/runtime.py:19 +msgid "Disallowed problems" +msgstr "Yasaklı problemler" + +#: judge/admin/runtime.py:22 +msgid "These problems are NOT allowed to be submitted in this language" +msgstr "Bu problemler için bu dilde çözüm gönderilemez" + +#: judge/admin/runtime.py:83 +msgid "Description" +msgstr "Tanım" + +#: judge/admin/runtime.py:84 +msgid "Information" +msgstr "Bilgi" + +#: judge/admin/runtime.py:85 +msgid "Capabilities" +msgstr "Desteklenenler" + +#: judge/admin/submission.py:23 judge/admin/submission.py:42 +#: judge/admin/submission.py:221 +msgid "None" +msgstr "Hiç" + +#: judge/admin/submission.py:23 +msgid "Not done" +msgstr "Bitmemiş" + +#: judge/admin/submission.py:23 +msgid "Exceptional" +msgstr "Sıra dışı" + +#: judge/admin/submission.py:42 +msgid "Unaccepted" +msgstr "Kabul edilmemiş" + +#: judge/admin/submission.py:89 +#, python-format +msgctxt "contest problem" +msgid "%(problem)s in %(contest)s" +msgstr "%(problem)s - %(contest)s" + +#: judge/admin/submission.py:167 +msgid "Rejudge the selected submissions" +msgstr "Seçili çözümleri yeniden değerlendir" + +#: judge/admin/submission.py:193 judge/views/problem_manage.py:128 +#, python-format +msgid "%d submission were successfully rescored." +msgid_plural "%d submissions were successfully rescored." +msgstr[0] "%d çözüm yeniden puanlandı." +msgstr[1] "%d çözüm yeniden puanlandı." + +#: judge/admin/submission.py:196 +msgid "Rescore the selected submissions" +msgstr "Seçili çözümleri yeniden puanla" + +#: judge/admin/submission.py:200 +msgid "Problem code" +msgstr "Problem anahtarı" + +#: judge/admin/submission.py:205 +msgid "Problem name" +msgstr "Problem adı" + +#: judge/admin/submission.py:215 templates/organization/requests/log.html:10 +#: templates/organization/requests/pending.html:13 +msgid "Time" +msgstr "Zaman" + +#: judge/admin/submission.py:223 +#, python-format +msgid "%d KB" +msgstr "%d KB" + +#: judge/admin/submission.py:225 +#, python-format +msgid "%.2f MB" +msgstr "%.2f MB" + +#: judge/admin/submission.py:227 +msgid "Memory" +msgstr "Bellek" + +#: judge/admin/taxon.py:11 judge/admin/taxon.py:34 +msgid "Included problems" +msgstr "Problemler" + +#: judge/admin/taxon.py:14 +msgid "These problems are included in this group of problems" +msgstr "Bu problemler bu problem grubunun içindedir" + +#: judge/admin/taxon.py:37 +msgid "These problems are included in this type of problems" +msgstr "Bu problemler bu problem tipinin içindedir" + +#: judge/apps.py:8 +msgid "Online Judge" +msgstr "Online Değerlendirme Sistemi" + +#: judge/comments.py:41 +msgid "Comment body" +msgstr "Yorum" + +#: judge/comments.py:47 judge/views/ticket.py:46 +msgid "Your part is silent, little toad." +msgstr "Senin rolün sessiz, küçük kurbağa." + +#: judge/comments.py:50 templates/comments/list.html:131 +msgid "You need to have solved at least one problem before your voice can be heard." +msgstr "Sesini duyurabilmen için bir problem çözmüş olman gerekiyor." + +#: judge/comments.py:92 +msgid "Posted comment" +msgstr "Gönderilmiş yorum" + +#: judge/contest_format/atcoder.py:19 +msgid "AtCoder" +msgstr "" + +#: judge/contest_format/default.py:18 +msgid "Default" +msgstr "" + +#: judge/contest_format/ecoo.py:19 +msgid "ECOO" +msgstr "" + +#: judge/contest_format/ioi.py:19 +msgid "IOI" +msgstr "" + +#: judge/forms.py:27 +msgid "Subscribe to contest updates" +msgstr "Yarışma güncellemelerine abone ol" + +#: judge/forms.py:28 +msgid "Enable experimental features" +msgstr "Deneysel özellikleri aç" + +#: judge/forms.py:57 judge/views/organization.py:127 +#, 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:107 judge/views/register.py:26 +#: templates/registration/registration_form.html:139 +#: templates/user/base-users-table.html:5 +msgid "Username" +msgstr "Kullanıcı Adı" + +#: judge/forms.py:108 templates/registration/registration_form.html:151 +#: templates/registration/registration_form.html:165 +msgid "Password" +msgstr "Şifre" + +#: judge/forms.py:130 +msgid "Two Factor Authentication tokens must be 6 decimal digits." +msgstr "" + +#: judge/forms.py:139 templates/registration/totp_auth.html:32 +msgid "Invalid Two Factor Authentication token." +msgstr "" + +#: judge/forms.py:143 judge/models/problem.py:97 +msgid "Problem code must be ^[a-z0-9]+$" +msgstr "Problem kodu ^[a-z0-9]+$ olmalıdır" + +#: judge/forms.py:148 +msgid "Problem with code already exists." +msgstr "" + +#: judge/forms.py:153 judge/models/contest.py:51 +msgid "Contest id must be ^[a-z0-9]+$" +msgstr "Yarışma ID'si ^[a-z0-9]+$ olmalıdır" + +#: judge/forms.py:158 +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 "j M Y, H:i" + +#: judge/jinja2/datetime.py:26 +#, python-brace-format +msgid "{time}" +msgstr "" + +#: judge/jinja2/datetime.py:26 +#, python-brace-format +msgid "on {time}" +msgstr "{time} tarihinde" + +#: judge/models/choices.py:59 +msgid "Leave as LaTeX" +msgstr "LaTeX olarak bırak" + +#: judge/models/choices.py:60 +msgid "SVG with PNG fallback" +msgstr "SVG, fallback olarak PNG" + +#: judge/models/choices.py:61 +msgid "MathML only" +msgstr "Yalnızca MathML" + +#: judge/models/choices.py:62 +msgid "MathJax with SVG/PNG fallback" +msgstr "MathJax, fallback olarak SVG/PNG" + +#: judge/models/choices.py:63 +msgid "Detect best quality" +msgstr "En iyi kaliteyi tespit et" + +#: judge/models/comment.py:25 +msgid "Page code must be ^[pcs]:[a-z0-9]+$|^b:\\d+$" +msgstr "" + +#: judge/models/comment.py:41 +msgid "commenter" +msgstr "yorum yazan" + +#: judge/models/comment.py:42 +msgid "posted time" +msgstr "gönderi zamanı" + +#: judge/models/comment.py:43 judge/models/comment.py:176 +msgid "associated page" +msgstr "" + +#: judge/models/comment.py:45 +msgid "votes" +msgstr "oy" + +#: judge/models/comment.py:46 +msgid "body of comment" +msgstr "yorum metni" + +#: judge/models/comment.py:47 +msgid "hide the comment" +msgstr "yorumu gizle" + +#: judge/models/comment.py:48 +msgid "parent" +msgstr "üst yorum" + +#: judge/models/comment.py:53 +msgid "comment" +msgstr "yorum" + +#: judge/models/comment.py:54 +msgid "comments" +msgstr "yorumlar" + +#: judge/models/comment.py:136 judge/models/problem.py:406 +#, python-format +msgid "Editorial for %s" +msgstr "%s problemi için editorial" + +#: judge/models/comment.py:171 +msgid "comment vote" +msgstr "yorum oyu" + +#: judge/models/comment.py:172 +msgid "comment votes" +msgstr "yorum oyları" + +#: judge/models/comment.py:181 +msgid "Override comment lock" +msgstr "" + +#: judge/models/contest.py:21 +msgid "Invalid colour." +msgstr "Geçersiz renk." + +#: judge/models/contest.py:23 +msgid "tag name" +msgstr "etiket adı" + +#: judge/models/contest.py:24 +msgid "Lowercase letters and hyphens only." +msgstr "Yalnızca küçük harfler ve tire kullanılabilir." + +#: judge/models/contest.py:25 +msgid "tag colour" +msgstr "etiket rengi" + +#: judge/models/contest.py:26 +msgid "tag description" +msgstr "etiket tanımı" + +#: judge/models/contest.py:45 +msgid "contest tag" +msgstr "yarışma etiketi" + +#: judge/models/contest.py:46 judge/models/contest.py:100 +msgid "contest tags" +msgstr "yarışma etiketleri" + +#: judge/models/contest.py:50 +msgid "contest id" +msgstr "yarışma ID'si" + +#: judge/models/contest.py:52 +msgid "contest name" +msgstr "yarışma adı" + +#: judge/models/contest.py:53 +msgid "These people will be able to edit the contest." +msgstr "Bu kişiler yarışmayı düzenleyebilecekler." + +#: judge/models/contest.py:55 judge/models/runtime.py:124 +#: src/dmoj-wpadmin/test_project/apps/books/admin.py:20 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:27 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:27 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:27 +msgid "description" +msgstr "Tanım" + +#: judge/models/contest.py:56 judge/models/problem.py:353 +#: judge/models/runtime.py:126 +msgid "problems" +msgstr "problemler" + +#: judge/models/contest.py:57 judge/models/contest.py:252 +msgid "start time" +msgstr "başlangıç" + +#: judge/models/contest.py:58 +msgid "end time" +msgstr "bitiş" + +#: judge/models/contest.py:59 judge/models/problem.py:118 +#: judge/models/problem.py:377 +msgid "time limit" +msgstr "zaman sınırı" + +#: judge/models/contest.py:60 judge/models/problem.py:136 +msgid "publicly visible" +msgstr "herkese açık" + +#: judge/models/contest.py:61 +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:64 +msgid "contest rated" +msgstr "dereceli yarışma" + +#: judge/models/contest.py:64 +msgid "Whether this contest can be rated." +msgstr "Bu yarışma derecelendirilebilir mi?" + +#: judge/models/contest.py:66 +msgid "hide scoreboard" +msgstr "puan tablosunu gizle" + +#: judge/models/contest.py:67 +msgid "Whether the scoreboard should remain hidden for the duration of the contest." +msgstr "Puan tablosu yarışma boyunca gizli kalmalı mı?" + +#: judge/models/contest.py:70 +msgid "no comments" +msgstr "yorum yok" + +#: judge/models/contest.py:71 +msgid "Use clarification system instead of comments." +msgstr "Yorumlar yerine açıklama sistemini kullanın." + +#: judge/models/contest.py:73 +msgid "Rating floor for contest" +msgstr "" + +#: judge/models/contest.py:75 +msgid "Rating ceiling for contest" +msgstr "" + +#: judge/models/contest.py:77 +msgid "rate all" +msgstr "herkesi derecelendir" + +#: judge/models/contest.py:77 +msgid "Rate all users who joined." +msgstr "Katılan tüm kullanıcıları derecelendir" + +#: judge/models/contest.py:78 +msgid "exclude from ratings" +msgstr "derecelendirme dışı kullanıcılar" + +#: judge/models/contest.py:80 +msgid "private to specific users" +msgstr "" + +#: judge/models/contest.py:81 +msgid "private contestants" +msgstr "" + +#: judge/models/contest.py:82 +msgid "If private, only these users may see the contest" +msgstr "" + +#: judge/models/contest.py:84 +msgid "hide problem tags" +msgstr "problem etiketlerini gizle" + +#: judge/models/contest.py:85 +msgid "Whether problem tags should be hidden by default." +msgstr "Problem etiketleri varsayılan olarak gizli olmalı mı?" + +#: judge/models/contest.py:87 +msgid "run pretests only" +msgstr "yalnızca ön testleri çalıştır" + +#: judge/models/contest.py:88 +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:92 judge/models/problem.py:157 +msgid "private to organizations" +msgstr "organizasyonlara özel" + +#: judge/models/contest.py:93 judge/models/problem.py:155 +#: judge/models/profile.py:76 +msgid "organizations" +msgstr "organizasyonlar" + +#: judge/models/contest.py:94 +msgid "If private, only these organizations may see the contest" +msgstr "Özel ise, sadece bu organizasyonlar yarışmayı görebilirler" + +#: judge/models/contest.py:95 judge/models/problem.py:145 +msgid "OpenGraph image" +msgstr "OpenGraph resmi" + +#: judge/models/contest.py:96 judge/models/profile.py:47 +msgid "Logo override image" +msgstr "" + +#: judge/models/contest.py:98 +msgid "This image will replace the default site logo for users inside the contest." +msgstr "" + +#: judge/models/contest.py:101 +msgid "the amount of live participants" +msgstr "anlık katılımcı sayısı" + +#: judge/models/contest.py:102 +msgid "contest summary" +msgstr "yarışma özeti" + +#: judge/models/contest.py:103 judge/models/problem.py:147 +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:104 judge/models/profile.py:46 +msgid "access code" +msgstr "erişim kodu" + +#: judge/models/contest.py:105 +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:107 judge/models/problem.py:141 +msgid "personae non gratae" +msgstr "istenmeyen kişiler" + +#: judge/models/contest.py:108 +msgid "Bans the selected users from joining this contest." +msgstr "" + +#: judge/models/contest.py:109 +msgid "contest format" +msgstr "" + +#: judge/models/contest.py:110 +msgid "The contest format module to use." +msgstr "" + +#: judge/models/contest.py:111 +msgid "contest format configuration" +msgstr "" + +#: judge/models/contest.py:112 +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:233 +msgid "See private contests" +msgstr "Özel yarışmaları gör" + +#: judge/models/contest.py:234 +msgid "Edit own contests" +msgstr "Kendi yarışmalarını düzenle" + +#: judge/models/contest.py:235 +msgid "Edit all contests" +msgstr "Tüm yarışmaları düzenle" + +#: judge/models/contest.py:236 +msgid "Clone contest" +msgstr "" + +#: judge/models/contest.py:237 templates/contest/moss.html:74 +msgid "MOSS contest" +msgstr "" + +#: judge/models/contest.py:238 +msgid "Rate contests" +msgstr "Yarışmaları derecelendir" + +#: judge/models/contest.py:239 +msgid "Contest access codes" +msgstr "Yarışma erişim kodları" + +#: judge/models/contest.py:240 +msgid "Create private contests" +msgstr "" + +#: judge/models/contest.py:242 judge/models/contest.py:320 +#: judge/models/contest.py:356 judge/models/contest.py:378 +#: judge/models/submission.py:83 +msgid "contest" +msgstr "yarışma" + +#: judge/models/contest.py:243 +msgid "contests" +msgstr "yarışmalar" + +#: judge/models/contest.py:250 +msgid "associated contest" +msgstr "ilişkili yarışma" + +#: judge/models/contest.py:253 +msgid "score" +msgstr "puan" + +#: judge/models/contest.py:254 +msgid "cumulative time" +msgstr "kümülatif süre" + +#: judge/models/contest.py:255 +msgid "virtual participation id" +msgstr "sanal katılım ID'si" + +#: judge/models/contest.py:256 +msgid "0 means non-virtual, otherwise the n-th virtual participation" +msgstr "0 sanal olmayan katılım, diğer sayılar n'inci sanal katılım" + +#: judge/models/contest.py:257 +msgid "contest format specific data" +msgstr "" + +#: judge/models/contest.py:306 +#, python-format +msgid "%s spectating in %s" +msgstr "%s, \"%s\" yarışmasında gözlemci" + +#: judge/models/contest.py:308 +#, python-format +msgid "%s in %s, v%d" +msgstr "%s, \"%s\" yarışmasında, sanal: %d" + +#: judge/models/contest.py:309 +#, python-format +msgid "%s in %s" +msgstr "%s, \"%s\" yarışmasında" + +#: judge/models/contest.py:312 +msgid "contest participation" +msgstr "yarışma katılımı" + +#: judge/models/contest.py:313 +msgid "contest participations" +msgstr "yarışma katılımı" + +#: judge/models/contest.py:319 judge/models/contest.py:340 +#: judge/models/contest.py:379 judge/models/problem.py:352 +#: judge/models/problem.py:357 judge/models/problem.py:375 +#: judge/models/problem_data.py:35 +msgid "problem" +msgstr "" + +#: judge/models/contest.py:321 judge/models/contest.py:344 +#: judge/models/problem.py:129 +msgid "points" +msgstr "puan" + +#: judge/models/contest.py:322 +msgid "partial" +msgstr "kısmi" + +#: judge/models/contest.py:323 judge/models/contest.py:345 +msgid "is pretested" +msgstr "ön testli" + +#: judge/models/contest.py:324 judge/models/interface.py:43 +msgid "order" +msgstr "sıra" + +#: judge/models/contest.py:325 +msgid "output prefix length override" +msgstr "" + +#: judge/models/contest.py:326 +msgid "Maximum number of submissions for this problem, or 0 for no limit." +msgstr "Bu probleme gönderilebilen maksimum çözüm sayısı. 0 sınırsız demektir." + +#: judge/models/contest.py:328 +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:333 +msgid "contest problem" +msgstr "yarışma problemi" + +#: judge/models/contest.py:334 +msgid "contest problems" +msgstr "yarışma problemleri" + +#: judge/models/contest.py:338 judge/models/submission.py:181 +msgid "submission" +msgstr "çözüm" + +#: judge/models/contest.py:342 judge/models/contest.py:357 +msgid "participation" +msgstr "katılım" + +#: judge/models/contest.py:346 +msgid "Whether this submission was ran only on pretests." +msgstr "Bu çözüm yalnızca pretest'lerde mi çalıştı?" + +#: judge/models/contest.py:350 +msgid "contest submission" +msgstr "yarışma çözümü" + +#: judge/models/contest.py:351 +msgid "contest submissions" +msgstr "yarışma çözümleri" + +#: judge/models/contest.py:359 +msgid "rank" +msgstr "sıralama" + +#: judge/models/contest.py:360 +msgid "rating" +msgstr "derece" + +#: judge/models/contest.py:361 +msgid "volatility" +msgstr "değişkenlik" + +#: judge/models/contest.py:362 +msgid "last rated" +msgstr "son derecelendirme" + +#: judge/models/contest.py:366 +msgid "contest rating" +msgstr "yarışma derecesi" + +#: judge/models/contest.py:367 +msgid "contest ratings" +msgstr "yarışma derecesi" + +#: judge/models/contest.py:386 +msgid "contest moss result" +msgstr "" + +#: judge/models/contest.py:387 +msgid "contest moss results" +msgstr "" + +#: judge/models/interface.py:24 +msgid "configuration item" +msgstr "ayar öğesi" + +#: judge/models/interface.py:25 +msgid "miscellaneous configuration" +msgstr "çeşitli ayarlar" + +#: judge/models/interface.py:37 +msgid "navigation item" +msgstr "navigasyon öğesi" + +#: judge/models/interface.py:38 +msgid "navigation bar" +msgstr "navigasyon çubuğu" + +#: judge/models/interface.py:44 +msgid "identifier" +msgstr "tanımlayıcı" + +#: judge/models/interface.py:45 +msgid "label" +msgstr "etiket" + +#: judge/models/interface.py:47 +msgid "highlight regex" +msgstr "vurgu regex'i" + +#: judge/models/interface.py:48 +msgid "parent item" +msgstr "üst nesne" + +#: judge/models/interface.py:66 +msgid "post title" +msgstr "gönderi başlığı" + +#: judge/models/interface.py:67 judge/models/problem.py:395 +msgid "authors" +msgstr "yazarlar" + +#: judge/models/interface.py:68 +msgid "slug" +msgstr "" + +#: judge/models/interface.py:69 judge/models/problem.py:393 +msgid "public visibility" +msgstr "halka açık mı?" + +#: judge/models/interface.py:70 +msgid "sticky" +msgstr "yapışkan" + +#: judge/models/interface.py:71 +msgid "publish after" +msgstr "bu tarihten sonra yayınla" + +#: judge/models/interface.py:72 +msgid "post content" +msgstr "gönderi içeriği" + +#: judge/models/interface.py:73 +msgid "post summary" +msgstr "gönderi özeti" + +#: judge/models/interface.py:74 +msgid "openGraph image" +msgstr "openGraph resmi" + +#: judge/models/interface.py:91 +msgid "Edit all posts" +msgstr "Tüm gönderileri düzenle" + +#: judge/models/interface.py:93 +msgid "blog post" +msgstr "blog gönderisi" + +#: judge/models/interface.py:94 +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:29 +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:26 +msgid "problem category ID" +msgstr "problem kategori ID'si" + +#: judge/models/problem.py:27 +msgid "problem category name" +msgstr "problem kategorisi adı" + +#: judge/models/problem.py:34 +msgid "problem type" +msgstr "problem tipi" + +#: judge/models/problem.py:35 judge/models/problem.py:113 +msgid "problem types" +msgstr "problem tipleri" + +#: judge/models/problem.py:39 +msgid "problem group ID" +msgstr "problem grup ID'si" + +#: judge/models/problem.py:40 +msgid "problem group name" +msgstr "problem grubu adı" + +#: judge/models/problem.py:47 judge/models/problem.py:116 +msgid "problem group" +msgstr "problem grubu" + +#: judge/models/problem.py:48 +msgid "problem groups" +msgstr "problem grupları" + +#: judge/models/problem.py:52 +msgid "key" +msgstr "anahtar" + +#: judge/models/problem.py:54 +msgid "link" +msgstr "" + +#: judge/models/problem.py:55 +msgid "full name" +msgstr "Tam ad" + +#: judge/models/problem.py:56 judge/models/profile.py:32 +#: judge/models/runtime.py:23 +msgid "short name" +msgstr "Kısa ad" + +#: judge/models/problem.py:57 +msgid "Displayed on pages under this license" +msgstr "Bu lisans altındaki sayfalarda gösterilir" + +#: judge/models/problem.py:58 +msgid "icon" +msgstr "ikon" + +#: judge/models/problem.py:58 +msgid "URL to the icon" +msgstr "ikon URL'si" + +#: judge/models/problem.py:59 +msgid "license text" +msgstr "lisans metni" + +#: judge/models/problem.py:68 +msgid "license" +msgstr "lisans" + +#: judge/models/problem.py:69 +msgid "licenses" +msgstr "lisans" + +#: judge/models/problem.py:96 +msgid "problem code" +msgstr "problem kodu" + +#: judge/models/problem.py:98 +msgid "A short, unique code for the problem, used in the url after /problem/" +msgstr "" + +#: judge/models/problem.py:100 +msgid "problem name" +msgstr "problem adı" + +#: judge/models/problem.py:101 +msgid "The full name of the problem, as shown in the problem list." +msgstr "" + +#: judge/models/problem.py:103 +msgid "problem body" +msgstr "problem içeriği" + +#: judge/models/problem.py:104 +msgid "creators" +msgstr "yaratıcılar" + +#: judge/models/problem.py:105 +msgid "These users will be able to edit the problem, and be listed as authors." +msgstr "" + +#: judge/models/problem.py:107 +msgid "curators" +msgstr "küratörler" + +#: judge/models/problem.py:108 +msgid "These users will be able to edit the problem, but not be listed as authors." +msgstr "" + +#: judge/models/problem.py:110 +msgid "testers" +msgstr "testçiler" + +#: judge/models/problem.py:112 +msgid "These users will be able to view the private problem, but not edit it." +msgstr "" + +#: judge/models/problem.py:114 +msgid "The type of problem, as shown on the problem's page." +msgstr "" + +#: judge/models/problem.py:117 +msgid "The group of problem, shown under Category in the problem list." +msgstr "" + +#: judge/models/problem.py:119 +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:123 judge/models/problem.py:380 +msgid "memory limit" +msgstr "bellek sınırı" + +#: judge/models/problem.py:124 +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:130 +msgid "Points awarded for problem completion. Points are displayed with a 'p' suffix if partial." +msgstr "" + +#: judge/models/problem.py:133 +msgid "allows partial points" +msgstr "kısmi puanlama yapılabilir" + +#: judge/models/problem.py:134 +msgid "allowed languages" +msgstr "izin verilen diller" + +#: judge/models/problem.py:135 +msgid "List of allowed submission languages." +msgstr "" + +#: judge/models/problem.py:137 +msgid "manually managed" +msgstr "elle yönetilir" + +#: judge/models/problem.py:138 +msgid "Whether judges should be allowed to manage data or not." +msgstr "" + +#: judge/models/problem.py:139 +msgid "date of publishing" +msgstr "yayınlama tarihi" + +#: judge/models/problem.py:140 +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:142 +msgid "Bans the selected users from submitting to this problem." +msgstr "" + +#: judge/models/problem.py:144 +msgid "The license under which this problem is published." +msgstr "" + +#: judge/models/problem.py:146 +msgid "problem summary" +msgstr "problem özeti" + +#: judge/models/problem.py:148 +msgid "number of users" +msgstr "" + +#: judge/models/problem.py:149 +msgid "The number of users who solved the problem." +msgstr "" + +#: judge/models/problem.py:150 +msgid "solve rate" +msgstr "" + +#: judge/models/problem.py:156 +msgid "If private, only these organizations may see the problem." +msgstr "" + +#: judge/models/problem.py:358 judge/models/problem.py:376 +#: judge/models/runtime.py:99 +msgid "language" +msgstr "dil" + +#: judge/models/problem.py:359 +msgid "translated name" +msgstr "çevrilmiş ad" + +#: judge/models/problem.py:360 +msgid "translated description" +msgstr "çevrilmiş tanım" + +#: judge/models/problem.py:364 +msgid "problem translation" +msgstr "problem çevirisi" + +#: judge/models/problem.py:365 +msgid "problem translations" +msgstr "problem çevirisi" + +#: judge/models/problem.py:369 +msgid "clarified problem" +msgstr "açıklık getirilmiş problem" + +#: judge/models/problem.py:370 +msgid "clarification body" +msgstr "açıklama içeriği" + +#: judge/models/problem.py:371 +msgid "clarification timestamp" +msgstr "açıklama zaman damgası(timestamp)" + +#: judge/models/problem.py:386 +msgid "language-specific resource limit" +msgstr "Dile özel kaynak sınırı" + +#: judge/models/problem.py:387 +msgid "language-specific resource limits" +msgstr "Dile özel kaynak sınırları" + +#: judge/models/problem.py:391 +msgid "associated problem" +msgstr "ilgili problem" + +#: judge/models/problem.py:394 +msgid "publish date" +msgstr "yayın tarihi" + +#: judge/models/problem.py:396 +msgid "editorial content" +msgstr "problem analizi içeriği" + +#: judge/models/problem.py:412 +msgid "solution" +msgstr "çözüm" + +#: judge/models/problem.py:413 +msgid "solutions" +msgstr "çözümler" + +#: judge/models/problem_data.py:23 +msgid "Standard" +msgstr "Standart" + +#: judge/models/problem_data.py:24 +msgid "Floats" +msgstr "" + +#: judge/models/problem_data.py:25 +msgid "Floats (absolute)" +msgstr "" + +#: judge/models/problem_data.py:26 +msgid "Floats (relative)" +msgstr "" + +#: judge/models/problem_data.py:27 +msgid "Non-trailing spaces" +msgstr "" + +#: judge/models/problem_data.py:28 +msgid "Unordered" +msgstr "" + +#: judge/models/problem_data.py:29 +msgid "Byte identical" +msgstr "" + +#: judge/models/problem_data.py:30 +msgid "Line-by-line" +msgstr "" + +#: judge/models/problem_data.py:37 +msgid "data zip file" +msgstr "data zip dosyası" + +#: judge/models/problem_data.py:39 +msgid "generator file" +msgstr "generator dosyası" + +#: judge/models/problem_data.py:41 judge/models/problem_data.py:90 +msgid "output prefix length" +msgstr "çıktı öneki uzunluğu" + +#: judge/models/problem_data.py:42 judge/models/problem_data.py:91 +msgid "output limit length" +msgstr "çıktı sınır uzunluğu" + +#: judge/models/problem_data.py:43 +msgid "init.yml generation feedback" +msgstr "init.yml oluşturma mesajı" + +#: judge/models/problem_data.py:44 judge/models/problem_data.py:92 +msgid "checker" +msgstr "" + +#: judge/models/problem_data.py:45 judge/models/problem_data.py:93 +msgid "checker arguments" +msgstr "checker değişkenleri" + +#: judge/models/problem_data.py:46 judge/models/problem_data.py:94 +msgid "checker arguments as a JSON object" +msgstr "checker değişkenleri, JSON nesnesi olarak" + +#: judge/models/problem_data.py:77 +msgid "problem data set" +msgstr "" + +#: judge/models/problem_data.py:79 +msgid "case position" +msgstr "test konumu" + +#: judge/models/problem_data.py:80 +msgid "case type" +msgstr "test tipi" + +#: judge/models/problem_data.py:81 +msgid "Normal case" +msgstr "Normal test" + +#: judge/models/problem_data.py:82 +msgid "Batch start" +msgstr "Küme başlangıcı" + +#: judge/models/problem_data.py:83 +msgid "Batch end" +msgstr "küme sonu" + +#: judge/models/problem_data.py:85 +msgid "input file name" +msgstr "girdi dosya adı" + +#: judge/models/problem_data.py:86 +msgid "output file name" +msgstr "çıktı dosya adı" + +#: judge/models/problem_data.py:87 +msgid "generator arguments" +msgstr "generator değişkenleri" + +#: judge/models/problem_data.py:88 +msgid "point value" +msgstr "puan değeri" + +#: judge/models/problem_data.py:89 +msgid "case is pretest?" +msgstr "ön test mi?" + +#: judge/models/profile.py:29 +msgid "organization title" +msgstr "organizasyon başlığı" + +#: judge/models/profile.py:30 +msgid "organization slug" +msgstr "" + +#: judge/models/profile.py:31 +msgid "Organization name shown in URL" +msgstr "" + +#: judge/models/profile.py:33 +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:34 +msgid "organization description" +msgstr "organizasyon tanımı" + +#: judge/models/profile.py:35 +msgid "registrant" +msgstr "Oluşturan" + +#: judge/models/profile.py:36 +msgid "User who registered this organization" +msgstr "Bu organizasyonu oluşturan kullanıcı" + +#: judge/models/profile.py:37 +msgid "administrators" +msgstr "Adminler" + +#: judge/models/profile.py:38 +msgid "Those who can edit this organization" +msgstr "Bu organizasyonu düzenleme yetkisi olanlar " + +#: judge/models/profile.py:39 +msgid "creation date" +msgstr "Oluşturulma tarihi" + +#: judge/models/profile.py:40 +msgid "is open organization?" +msgstr "Açık organizasyon mu?" + +#: judge/models/profile.py:41 +msgid "Allow joining organization" +msgstr "Organizasyona katılmaya izin ver" + +#: judge/models/profile.py:42 +msgid "maximum size" +msgstr "maksimum boyut" + +#: judge/models/profile.py:43 +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:45 +msgid "Student access code" +msgstr "Öğrenci erişim kodu" + +#: judge/models/profile.py:49 +msgid "This image will replace the default site logo for users viewing the organization." +msgstr "" + +#: judge/models/profile.py:75 judge/models/profile.py:91 +#: judge/models/profile.py:190 +msgid "organization" +msgstr "Organizasyon" + +#: judge/models/profile.py:80 +msgid "user associated" +msgstr "ilişkili kullanıcı" + +#: judge/models/profile.py:81 +msgid "self-description" +msgstr "hakkında" + +#: judge/models/profile.py:82 +msgid "location" +msgstr "konum" + +#: judge/models/profile.py:84 +msgid "preferred language" +msgstr "tercih edilen dil" + +#: judge/models/profile.py:89 +msgid "last access time" +msgstr "son erişim" + +#: judge/models/profile.py:90 +msgid "last IP" +msgstr "son IP" + +#: judge/models/profile.py:93 +msgid "display rank" +msgstr "görünen derece" + +#: judge/models/profile.py:95 +msgid "comment mute" +msgstr "yorum engeli" + +#: judge/models/profile.py:95 +msgid "Some users are at their best when silent." +msgstr "Bazı kullanıcıların sessiz kalması daha iyidir." + +#: judge/models/profile.py:97 +msgid "unlisted user" +msgstr "" + +#: judge/models/profile.py:97 +msgid "User will not be ranked." +msgstr "" + +#: judge/models/profile.py:100 +msgid "user script" +msgstr "userscript" + +#: judge/models/profile.py:101 +msgid "User-defined JavaScript for site customization." +msgstr "Site düzenlemesi için kullanıcı tanımlı JavaScript" + +#: judge/models/profile.py:102 +msgid "current contest" +msgstr "şu anki yarışma" + +#: judge/models/profile.py:104 +msgid "math engine" +msgstr "matematik motoru" + +#: judge/models/profile.py:106 +msgid "the rendering engine used to render math" +msgstr "matematiksel ifadeleri gösteren program" + +#: judge/models/profile.py:107 +msgid "2FA enabled" +msgstr "" + +#: judge/models/profile.py:108 +msgid "check to enable TOTP-based two factor authentication" +msgstr "" + +#: judge/models/profile.py:109 +msgid "TOTP key" +msgstr "" + +#: judge/models/profile.py:110 +msgid "32 character base32-encoded key for TOTP" +msgstr "" + +#: judge/models/profile.py:112 +msgid "TOTP key must be empty or base32" +msgstr "" + +#: judge/models/profile.py:113 +msgid "internal notes" +msgstr "" + +#: judge/models/profile.py:114 +msgid "Notes for administrators regarding this user." +msgstr "" + +#: judge/models/profile.py:184 +msgid "user profile" +msgstr "Kullanıcı Profili" + +#: judge/models/profile.py:185 +msgid "user profiles" +msgstr "Kullanıcı Profilleri" + +#: judge/models/profile.py:192 +msgid "request time" +msgstr "istek zamanı" + +#: judge/models/profile.py:193 +msgid "state" +msgstr "durum" + +#: judge/models/profile.py:198 +msgid "reason" +msgstr "sebep" + +#: judge/models/profile.py:201 +msgid "organization join request" +msgstr "organizasyona katılma isteği" + +#: judge/models/profile.py:202 +msgid "organization join requests" +msgstr "organizasyona katılma istekleri" + +#: judge/models/runtime.py:18 +msgid "short identifier" +msgstr "anahtar" + +#: judge/models/runtime.py:19 +msgid "The identifier for this language; the same as its executor id for judges." +msgstr "Bu dilin tanımlayıcısı, judge'lar için executor ID'si ile aynıdır." + +#: judge/models/runtime.py:21 +msgid "long name" +msgstr "uzun ad" + +#: judge/models/runtime.py:22 +msgid "Longer name for the language, e.g. \"Python 2\" or \"C++11\"." +msgstr "Dilin uzun adı, \"Python 2\" ya da \"C++11\" gibi." + +#: judge/models/runtime.py:24 +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 "Herkese açık gösterim için daha okunabilir, ancak kısa ad.(örn. \"PY2\" ya da \"C++11\") Boş bırakılırsa kısa ad gösterilecektir." + +#: judge/models/runtime.py:28 +msgid "common name" +msgstr "genel ad" + +#: judge/models/runtime.py:29 +msgid "Common name for the language. For example, the common name for C++03, C++11, and C++14 would be \"C++\"" +msgstr "Dilin genel adı. Örneğin C++03, C++11 ve C++14'ün genel adı \"C++\" olmalıdır." + +#: judge/models/runtime.py:31 +msgid "ace mode name" +msgstr "ace mode adı" + +#: judge/models/runtime.py:32 +msgid "Language ID for Ace.js editor highlighting, appended to \"mode-\" to determine the Ace JavaScript file to use, e.g., \"python\"." +msgstr "Ace.js editör vurgulaması için dil ID'si. örn. \"python\"" + +#: judge/models/runtime.py:34 +msgid "pygments name" +msgstr "pygments adı" + +#: judge/models/runtime.py:35 +msgid "Language ID for Pygments highlighting in source windows." +msgstr "Pygments vurgulaması için dil ID'si." + +#: judge/models/runtime.py:36 +msgid "code template" +msgstr "kod örneği" + +#: judge/models/runtime.py:37 +msgid "Code template to display in submission editor." +msgstr "Çözüm editöründe gösterilecek örnek kod." + +#: judge/models/runtime.py:38 +msgid "runtime info override" +msgstr "çalıştırıcı komutu" + +#: judge/models/runtime.py:39 +msgid "Do not set this unless you know what you're doing! It will override the usually more specific, judge-provided runtime info!" +msgstr "Ne yaptığını bilmiyorsan bunu değiştirme! Judge tarafından verilen komutun yerine geçecektir." + +#: judge/models/runtime.py:41 +msgid "language description" +msgstr "dil açıklaması" + +#: judge/models/runtime.py:42 +msgid "Use field this to inform users of quirks with your environment, additional restrictions, etc." +msgstr "Bu alanı kullanıcıları çalışma ortamının farklılıkları hakkında bilgilendirmek için kullan. (örn. v8dmoj'daki print fonksiyonu)" + +#: judge/models/runtime.py:44 +msgid "extension" +msgstr "uzantı" + +#: judge/models/runtime.py:45 +msgid "The extension of source files, e.g., \"py\" or \"cpp\"." +msgstr "Kaynak kodlarının uzantıları, \"py\", \"cpp\" vb." + +#: judge/models/runtime.py:100 +msgid "languages" +msgstr "diller" + +#: judge/models/runtime.py:104 +msgid "language to which this runtime belongs" +msgstr "bu dil sürümünün ait olduğu dil" + +#: judge/models/runtime.py:105 +msgid "judge on which this runtime exists" +msgstr "bu dil sürümünün bulunduğu judge" + +#: judge/models/runtime.py:106 +msgid "runtime name" +msgstr "dil sürümü" + +#: judge/models/runtime.py:107 +msgid "runtime version" +msgstr "dil sürümü versiyonu" + +#: judge/models/runtime.py:108 +msgid "order in which to display this runtime" +msgstr "dil sürümünün gösterim sırası" + +#: judge/models/runtime.py:112 +msgid "Server name, hostname-style" +msgstr "Server adı, hostname şeklinde" + +#: judge/models/runtime.py:113 +msgid "time of creation" +msgstr "oluşturulma zamanı" + +#: judge/models/runtime.py:114 +msgid "A key to authenticated this judge" +msgstr "Bu judge'ın kimliğini doğrulamak için bir anahtar" + +#: judge/models/runtime.py:115 +msgid "authentication key" +msgstr "kimlik doğrulama anahtarı" + +#: judge/models/runtime.py:116 +msgid "block judge" +msgstr "" + +#: judge/models/runtime.py:117 +msgid "Whether this judge should be blocked from connecting, even if its key is correct." +msgstr "" + +#: judge/models/runtime.py:119 +msgid "judge online status" +msgstr "judge'ın çevrimiçi durumu" + +#: judge/models/runtime.py:120 +msgid "judge start time" +msgstr "başlangıç" + +#: judge/models/runtime.py:121 +msgid "response time" +msgstr "yanıt süresi" + +#: judge/models/runtime.py:122 +msgid "system load" +msgstr "sistem yükü" + +#: judge/models/runtime.py:123 +msgid "Load for the last minute, divided by processors to be fair." +msgstr "Son bir dakikadaki sistem yükü. Adil olması için işlemci sayısına bölünür." + +#: judge/models/runtime.py:127 judge/models/runtime.py:167 +msgid "judges" +msgstr "judge'lar" + +#: judge/models/runtime.py:166 +msgid "judge" +msgstr "" + +#: judge/models/submission.py:20 judge/models/submission.py:47 +#: judge/utils/problems.py:86 +msgid "Accepted" +msgstr "Kabul edildi" + +#: judge/models/submission.py:21 judge/models/submission.py:48 +msgid "Wrong Answer" +msgstr "Yanlış cevap" + +#: judge/models/submission.py:22 judge/models/submission.py:50 +msgid "Time Limit Exceeded" +msgstr "Zaman Sınırı Aşıldı" + +#: judge/models/submission.py:23 judge/models/submission.py:51 +msgid "Memory Limit Exceeded" +msgstr "Bellek Sınırı Aşıldı" + +#: judge/models/submission.py:24 judge/models/submission.py:52 +msgid "Output Limit Exceeded" +msgstr "Çıktı Limiti Aşıldı" + +#: judge/models/submission.py:25 judge/models/submission.py:53 +msgid "Invalid Return" +msgstr "Geçersiz Dönüş Kodu" + +#: judge/models/submission.py:26 judge/models/submission.py:54 +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:88 +msgid "Compile Error" +msgstr "Derleme Hatası" + +#: judge/models/submission.py:28 judge/models/submission.py:40 +msgid "Internal Error" +msgstr "İç Hata" + +#: judge/models/submission.py:29 +msgid "Short circuit" +msgstr "Kısa devre" + +#: judge/models/submission.py:30 judge/models/submission.py:42 +#: judge/models/submission.py:61 +msgid "Aborted" +msgstr "İptal edildi" + +#: judge/models/submission.py:36 judge/models/submission.py:57 +msgid "Queued" +msgstr "Sıraya Alındı" + +#: judge/models/submission.py:37 judge/models/submission.py:58 +msgid "Processing" +msgstr "İşleniyor" + +#: judge/models/submission.py:38 judge/models/submission.py:59 +msgid "Grading" +msgstr "Puanlanıyor" + +#: judge/models/submission.py:39 judge/models/submission.py:60 +msgid "Completed" +msgstr "Tamamlandı" + +#: judge/models/submission.py:56 +msgid "Internal Error (judging server error)" +msgstr "İç Hata (judge sunucusu hatası)" + +#: judge/models/submission.py:66 +msgid "submission time" +msgstr "çözüm süresi" + +#: judge/models/submission.py:67 judge/models/submission.py:201 +msgid "execution time" +msgstr "çalışma süresi" + +#: judge/models/submission.py:68 judge/models/submission.py:202 +msgid "memory usage" +msgstr "bellek kullanımı" + +#: judge/models/submission.py:69 judge/models/submission.py:203 +msgid "points granted" +msgstr "verilen puan" + +#: judge/models/submission.py:70 +msgid "submission language" +msgstr "çözüm dili" + +#: judge/models/submission.py:71 +msgid "status" +msgstr "statü" + +#: judge/models/submission.py:72 +msgid "result" +msgstr "sonuç" + +#: judge/models/submission.py:74 +msgid "compile errors" +msgstr "derleme hataları" + +#: judge/models/submission.py:76 +msgid "batched cases" +msgstr "kümelenmiş testler" + +#: judge/models/submission.py:77 +msgid "test case points" +msgstr "test puanı" + +#: judge/models/submission.py:78 +msgid "test case total points" +msgstr "toplam test puanı" + +#: judge/models/submission.py:79 +msgid "judged on" +msgstr "değerlendirildiği sunucu" + +#: judge/models/submission.py:81 +msgid "was rejudged by admin" +msgstr "admin tarafından yeniden değerlendirildi" + +#: judge/models/submission.py:82 +msgid "was ran on pretests only" +msgstr "sadece ön testlerde çalıştı" + +#: judge/models/submission.py:182 templates/contest/moss.html:58 +msgid "submissions" +msgstr "çözümler" + +#: judge/models/submission.py:186 judge/models/submission.py:197 +msgid "associated submission" +msgstr "ilişkili çözüm gönderisi" + +#: judge/models/submission.py:188 +msgid "source code" +msgstr "kaynak kodu" + +#: judge/models/submission.py:199 +msgid "test case ID" +msgstr "test ID" + +#: judge/models/submission.py:200 +msgid "status flag" +msgstr "durum kodu" + +#: judge/models/submission.py:204 +msgid "points possible" +msgstr "alınabilecek puan" + +#: judge/models/submission.py:205 +msgid "batch number" +msgstr "küme #" + +#: judge/models/submission.py:206 +msgid "judging feedback" +msgstr "" + +#: judge/models/submission.py:207 +msgid "extended judging feedback" +msgstr "" + +#: judge/models/submission.py:208 +msgid "program output" +msgstr "program çıktısı" + +#: judge/models/submission.py:216 +msgid "submission test case" +msgstr "çözüm testi" + +#: judge/models/submission.py:217 +msgid "submission test cases" +msgstr "çözüm testleri" + +#: judge/models/ticket.py:10 +msgid "ticket title" +msgstr "bilet başlığı" + +#: judge/models/ticket.py:11 +msgid "ticket creator" +msgstr "bileti oluşturan" + +#: judge/models/ticket.py:13 +msgid "creation time" +msgstr "oluşturulma zamanı" + +#: judge/models/ticket.py:14 +msgid "assignees" +msgstr "sorumlular" + +#: judge/models/ticket.py:15 +msgid "quick notes" +msgstr "hızlı notlar" + +#: judge/models/ticket.py:16 +msgid "Staff notes for this issue to aid in processing." +msgstr "İşlemde yardımcı olacak notlar." + +#: judge/models/ticket.py:17 +msgid "linked item type" +msgstr "bağlı öğe tipi" + +#: judge/models/ticket.py:19 +msgid "linked item ID" +msgstr "bağlı nesne ID'si" + +#: judge/models/ticket.py:21 +msgid "is ticket open?" +msgstr "bilet açık mı?" + +#: judge/models/ticket.py:25 +msgid "ticket" +msgstr "bilet" + +#: judge/models/ticket.py:27 +msgid "poster" +msgstr "gönderen" + +#: judge/models/ticket.py:30 +msgid "message time" +msgstr "mesaj zamanı" + +#: judge/pdf_problems.py:134 judge/pdf_problems.py:186 +#: judge/pdf_problems.py:246 +msgid "Page [page] of [topage]" +msgstr "[page]/[topage]" + +#: judge/tasks/moss.py:25 +msgid "Running MOSS" +msgstr "" + +#: judge/tasks/submission.py:43 +msgid "Modifying submissions" +msgstr "" + +#: judge/tasks/submission.py:56 +msgid "Recalculating user points" +msgstr "" + +#: judge/utils/problem_data.py:63 +msgid "Empty batches not allowed." +msgstr "Kümeler boş olamaz." + +#: judge/utils/problem_data.py:82 +#, python-format +msgid "Points must be defined for non-batch case #%d." +msgstr "Küme olmayan test #%d için puan tanımlanmalıdır." + +#: judge/utils/problem_data.py:87 +#, python-format +msgid "Input file for case %d does not exist: %s" +msgstr "Test #%d için girdi dosyası yok: %s" + +#: judge/utils/problem_data.py:90 +#, python-format +msgid "Output file for case %d does not exist: %s" +msgstr "Test #%d için çıktı dosyası yok: %s" + +#: judge/utils/problem_data.py:115 +#, python-format +msgid "Batch start case #%d requires points." +msgstr "Küme başlangıç testi #%d puan değerine sahip olmalıdır." + +#: judge/utils/problem_data.py:136 +#, python-format +msgid "Attempt to end batch outside of one in case #%d" +msgstr "Test #%d bir kümenin içinde değil, ancak küme bitişini işaret ediyor." + +#: judge/utils/problem_data.py:154 +msgid "How did you corrupt the zip path?" +msgstr "Zip yolunu bozmayı nasıl becerdin?" + +#: judge/utils/problem_data.py:160 +msgid "How did you corrupt the generator path?" +msgstr "Generator yolunu bozmayı nasıl becerdin?" + +#: judge/utils/problems.py:76 +msgid "Can't pass both queryset and keyword filters" +msgstr "Queryset ve keyword filtreleri aynı anda verilemez." + +#: judge/utils/problems.py:87 +msgid "Wrong" +msgstr "" + +#: judge/utils/problems.py:89 +msgid "Timeout" +msgstr "" + +#: judge/utils/problems.py:90 +msgid "Error" +msgstr "" + +#: 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/timedelta.py:49 +msgctxt "time format with day" +msgid "%d day %h:%m:%s" +msgid_plural "%d days %h:%m:%s" +msgstr[0] "%d gün, %h:%m:%s" +msgstr[1] "%d gün, %h:%m:%s" + +#: judge/utils/timedelta.py:53 +msgctxt "time format without day" +msgid "%h:%m:%s" +msgstr "%h:%m:%s" + +#: 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] "%d gün, %h:%m" +msgstr[1] "%d gün, %h:%m" + +#: judge/utils/timedelta.py:61 +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d gün" +msgstr[1] "%d gün" + +#: judge/utils/timedelta.py:63 +msgctxt "hours and minutes" +msgid "%h:%m" +msgstr "%h:%m" + +#: judge/views/blog.py:38 +#, python-format +msgid "Page %d of Posts" +msgstr "Sayfa %d" + +#: judge/views/comment.py:27 +msgid "Messing around, are we?" +msgstr "Ooo, bakıyorum da etrafı karıştırıyoruz." + +#: judge/views/comment.py:36 +msgid "You must solve at least one problem before you can vote." +msgstr "" + +#: judge/views/comment.py:63 +msgid "You already voted." +msgstr "Zaten oy verdin." + +#: judge/views/comment.py:120 judge/views/organization.py:299 +msgid "Edited from site" +msgstr "Site aracılığıyla düzenlendi" + +#: judge/views/comment.py:141 +msgid "Editing comment" +msgstr "Yorum düzenleniyor" + +#: judge/views/contests.py:49 judge/views/contests.py:211 +#: judge/views/contests.py:214 judge/views/contests.py:385 +msgid "No such contest" +msgstr "Böyle bir yarışma yok :(" + +#: judge/views/contests.py:50 judge/views/contests.py:212 +#, python-format +msgid "Could not find a contest with the key \"%s\"." +msgstr "\"%s\" anahtarıyla bir yarışma bulunamadı." + +#: judge/views/contests.py:75 +msgid "Contests" +msgstr "Yarışmalar" + +#: judge/views/contests.py:215 +msgid "Could not find such contest." +msgstr "Yarışma bulunamadı." + +#: judge/views/contests.py:218 +#, python-format +msgid "Access to contest \"%s\" denied" +msgstr "\"%s\" yarışmasına erişimin yok " + +#: judge/views/contests.py:242 +msgid "Clone Contest" +msgstr "" + +#: judge/views/contests.py:305 +msgid "Contest not ongoing" +msgstr "Yarışma devam etmiyor" + +#: judge/views/contests.py:306 +#, python-format +msgid "\"%s\" is not currently ongoing." +msgstr "\"%s\" şu anda devam etmiyor." + +#: judge/views/contests.py:310 +msgid "Already in contest" +msgstr "Zaten yarışmadasın" + +#: judge/views/contests.py:311 +#, python-format +msgid "You are already in a contest: \"%s\"." +msgstr "Zaten bir yarışmadasın: \"%s\"." + +#: judge/views/contests.py:314 +msgid "Banned from joining" +msgstr "" + +#: judge/views/contests.py:315 +msgid "You have been declared persona non grata for this contest. You are permanently barred from joining this contest." +msgstr "" + +#: judge/views/contests.py:375 +#, python-format +msgid "Enter access code for \"%s\"" +msgstr "“%s” için erişim kodunu gir" + +#: judge/views/contests.py:386 +#, python-format +msgid "You are not in contest \"%s\"." +msgstr "\"%s\" yarışmasında değilsin." + +#: judge/views/contests.py:405 +msgid "ContestCalendar requires integer year and month" +msgstr "" + +#: judge/views/contests.py:445 +#, python-format +msgid "Contests in %(month)s" +msgstr "%(month)s ayındaki yarışmalar" + +#: judge/views/contests.py:445 +msgid "F Y" +msgstr "" + +#: judge/views/contests.py:531 +msgid "???" +msgstr "???" + +#: judge/views/contests.py:594 +#, python-format +msgid "%s Rankings" +msgstr "%s - Sıralama" + +#: judge/views/contests.py:610 +#, python-format +msgid "Your participation in %s" +msgstr "\"%s\" yarışmasına katılımın" + +#: judge/views/contests.py:611 +#, 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:615 +msgid "Live" +msgstr "Canlı" + +#: judge/views/contests.py:627 templates/contest/contest-tabs.html:13 +msgid "Participation" +msgstr "Katılım" + +#: judge/views/contests.py:654 +#, python-format +msgid "%s MOSS Results" +msgstr "" + +#: judge/views/contests.py:681 +#, python-format +msgid "Running MOSS for %s..." +msgstr "" + +#: judge/views/contests.py:704 +#, python-format +msgid "Contest tag: %s" +msgstr "Yarışma etiketi: %s" + +#: judge/views/error.py:14 +msgid "404 error" +msgstr "404 Hatası" + +#: judge/views/error.py:15 +#, python-format +msgid "Could not find page \"%s\"" +msgstr "\"%s\" sayfası bulunamadı" + +#: judge/views/error.py:22 +#, python-format +msgid "no permission for %s" +msgstr "%s için erişim izni yok" + +#: judge/views/error.py:30 +#, python-format +msgid "corrupt page %s" +msgstr "bozuk sayfa \"%s\"" + +#: judge/views/language.py:12 templates/status/judge-status-table.html:9 +#: templates/status/status-tabs.html:5 +msgid "Runtimes" +msgstr "Dil sürümleri" + +#: judge/views/organization.py:44 judge/views/organization.py:47 +msgid "No such organization" +msgstr "Böyle bir organizasyon yok :(" + +#: judge/views/organization.py:45 +#, 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 +msgid "Could not find such organization." +msgstr "Böyle bir organizasyon bulunamadı." + +#: judge/views/organization.py:72 judge/views/register.py:34 +#: templates/organization/list.html:15 templates/user/user-list-tabs.html:5 +msgid "Organizations" +msgstr "Organizasyonlar" + +#: judge/views/organization.py:93 +#, python-format +msgid "%s Members" +msgstr "%s üye" + +#: judge/views/organization.py:118 judge/views/organization.py:121 +#: judge/views/organization.py:126 +msgid "Joining organization" +msgstr "Organizasyona katılım" + +#: judge/views/organization.py:118 +msgid "You are already in the organization." +msgstr "Bu organizasyonda zaten varsın." + +#: judge/views/organization.py:121 +msgid "This organization is not open." +msgstr "Bu organizasyon açık değil." + +#: judge/views/organization.py:138 +msgid "Leaving organization" +msgstr "Organizasyondan çık" + +#: judge/views/organization.py:138 +#, python-format +msgid "You are not in \"%s\"." +msgstr "\"%s\" içinde değilsin." + +#: judge/views/organization.py:162 +#, python-format +msgid "Request to join %s" +msgstr "%s'ye katılma isteği" + +#: judge/views/organization.py:180 +msgid "Join request detail" +msgstr "Katılma isteği detayı" + +#: judge/views/organization.py:209 +#, python-format +msgid "Managing join requests for %s" +msgstr "%s - Katılım isteklerini yönet" + +#: judge/views/organization.py:240 +#, 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:252 +#, 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:253 +#, 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:283 +#, python-format +msgid "Editing %s" +msgstr "%s düzenleniyor" + +#: judge/views/organization.py:307 judge/views/organization.py:315 +msgid "Can't edit organization" +msgstr "Bu organizasyon düzenlenemiyor" + +#: judge/views/organization.py:308 +msgid "You are not allowed to edit this organization." +msgstr "Bu organizasyonu düzenleme yetkisine sahip değilsin." + +#: judge/views/organization.py:316 +msgid "You are not allowed to kick people from this organization." +msgstr "Üyeleri bu organizasyondan atma yetkisine sahip değilsin." + +#: judge/views/organization.py:321 judge/views/organization.py:325 +msgid "Can't kick user" +msgstr "Bu üyeyi atamazsın." + +#: judge/views/organization.py:322 +msgid "The user you are trying to kick does not exist!" +msgstr "Atmaya çalıştığın üye bulunamıyor!" + +#: judge/views/organization.py:326 +#, 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:68 +msgid "No such problem" +msgstr "Böyle bir problem yok :(" + +#: 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:111 +#, python-brace-format +msgid "Editorial for {0}" +msgstr " {0} - Problem analizi" + +#: judge/views/problem.py:114 +#, python-brace-format +msgid "Editorial for {0}" +msgstr "{0} için problem analizi" + +#: judge/views/problem.py:285 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:546 +msgid "Banned from submitting" +msgstr "Çözüm gönderme engellendi" + +#: judge/views/problem.py:547 +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:560 +msgid "Too many submissions" +msgstr "Çok fazla çözüm gönderisi" + +#: judge/views/problem.py:561 +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:627 judge/views/problem.py:630 +#, python-format +msgid "Submit to %(problem)s" +msgstr "Çözüm gönder -%(problem)s" + +#: judge/views/problem.py:646 +msgid "Clone Problem" +msgstr "" + +#: judge/views/problem_data.py:37 +msgid "Checker arguments must be a JSON object" +msgstr "Checker değişkenleri JSON nesnesi olarak verilmelidir." + +#: judge/views/problem_data.py:39 +msgid "Checker arguments is invalid JSON" +msgstr "Checker değişkeni olarak geçersiz JSON verdin." + +#: judge/views/problem_data.py:46 +msgid "Your zip file is invalid!" +msgstr "Zip dosyan geçersiz!" + +#: judge/views/problem_data.py:104 +#, python-brace-format +msgid "Comparing submissions for {0}" +msgstr "Çözümleri karşılaştır - {0}" + +#: judge/views/problem_data.py:107 +#, python-brace-format +msgid "Comparing submissions for {0}" +msgstr "{0} için çözümleri karşılaştır" + +#: judge/views/problem_data.py:142 +#, python-brace-format +msgid "Editing data for {0}" +msgstr "Verileri düzenle - {0}" + +#: judge/views/problem_data.py:145 +#, python-format +msgid "Editing data for %s" +msgstr "%s için verileri düzenle" + +#: judge/views/problem_data.py:237 judge/views/problem_data.py:238 +#, python-format +msgid "Generated init.yml for %s" +msgstr "%s için init.yml oluşturuldu" + +#: 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:58 +#, python-format +msgid "Best solutions for %s" +msgstr "%s için en iyi çözümler" + +#: judge/views/ranked_submission.py:61 +#, python-brace-format +msgid "Best solutions for {0}" +msgstr "{0} için en iyi çözümler" + +#: judge/views/ranked_submission.py:71 +#, 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:74 +#, 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:80 +#, python-brace-format +msgid "Best solutions for {0} in {2}" +msgstr "{0} için en iyi çözümler - {2}" + +#: judge/views/ranked_submission.py:83 +#, 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 +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 templates/user/edit-profile.html:103 +msgid "Preferred language" +msgstr "Tercih edilen dil" + +#: judge/views/register.py:38 +msgid "Subscribe to newsletter?" +msgstr "Haber bültenine abone ol" + +#: judge/views/register.py:45 +#, 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 +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 +msgid "Registration" +msgstr "Kayıt" + +#: judge/views/register.py:106 +msgid "Authentication failure" +msgstr "Kimlik doğrulama hatası" + +#: judge/views/stats.py:105 +msgid "Language statistics" +msgstr "Dil istatistikleri" + +#: judge/views/status.py:24 templates/submission/list.html:319 +msgid "Status" +msgstr "Durum" + +#: judge/views/status.py:108 +msgid "Version matrix" +msgstr "Sürüm matrisi" + +#: judge/views/submission.py:59 judge/views/submission.py:66 +#, 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:161 judge/views/submission.py:162 +#: templates/problem/problem.html:127 +msgid "All submissions" +msgstr "Tüm çözümler" + +#: judge/views/submission.py:303 +msgid "All my submissions" +msgstr "Tüm çözümlerim" + +#: judge/views/submission.py:304 +#, python-format +msgid "All submissions by %s" +msgstr "%s'nin tüm çözümleri" + +#: judge/views/submission.py:335 +#, python-format +msgid "All submissions for %s" +msgstr "%s için tüm çözümler" + +#: judge/views/submission.py:354 +msgid "Must pass a problem" +msgstr "Bir problem tanımlanmalı" + +#: judge/views/submission.py:397 +#, python-format +msgid "My submissions for %(problem)s" +msgstr "%(problem)s için çözümlerim" + +#: judge/views/submission.py:398 +#, 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:495 +msgid "Must pass a contest" +msgstr "Bir yarışma tanımlanmalı" + +#: judge/views/submission.py:514 +#, 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:519 +#, 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}" + +#: judge/views/ticket.py:33 judge/views/ticket.py:39 +msgid "Ticket title" +msgstr "Bilet başlığı" + +#: judge/views/ticket.py:40 +msgid "Issue description" +msgstr "Sorun açıklaması" + +#: judge/views/ticket.py:85 judge/views/ticket.py:88 +#, python-format +msgid "New ticket for %s" +msgstr "%s için yeni bilet" + +#: judge/views/ticket.py:139 +#, python-format +msgid "%(title)s - Ticket %(id)d" +msgstr "%(title)s - Bilet %(id)d" + +#: judge/views/ticket.py:248 +#, python-format +msgid "Tickets - Page %(number)d of %(total)d" +msgstr "Biletler - Sayfa %(number)d/%(total)d" + +#: judge/views/ticket.py:297 +#, python-format +msgid "New Ticket: %s" +msgstr "Yeni Bilet: %s" + +#: judge/views/ticket.py:298 +#, python-format +msgid "#%(id)d, assigned to: %(users)s" +msgstr "#%(id)d, sorumlular: %(users)s" + +#: judge/views/ticket.py:300 +msgid ", " +msgstr "," + +#: judge/views/ticket.py:300 +msgid "no one" +msgstr "kimse" + +#: judge/views/totp.py:42 templates/registration/totp_enable.html:86 +msgid "Enable Two Factor Authentication" +msgstr "" + +#: judge/views/totp.py:89 templates/registration/totp_disable.html:48 +msgid "Disable Two Factor Authentication" +msgstr "" + +#: judge/views/totp.py:103 +msgid "Perform Two Factor Authentication" +msgstr "" + +#: judge/views/user.py:68 +msgid "No such user" +msgstr "Böyle bir kullanıcı yok" + +#: judge/views/user.py:68 +#, python-format +msgid "No user handle \"%s\"." +msgstr "\"%s\" adında bir kullanıcı yok." + +#: judge/views/user.py:72 +msgid "My account" +msgstr "Hesabım" + +#: judge/views/user.py:73 +#, python-format +msgid "User %s" +msgstr "Kullanıcı %s" + +#: judge/views/user.py:136 +msgid "M j, Y, G:i" +msgstr "j M Y, G:i" + +#: judge/views/user.py:221 +msgid "Updated on site" +msgstr "Sitede güncellendi" + +#: judge/views/user.py:253 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:10 +msgid "Edit profile" +msgstr "Profili düzenle" + +#: judge/views/user.py:262 templates/user/user-list-tabs.html:4 +msgid "Leaderboard" +msgstr "Sıralama" + +#: judge/views/widgets.py:48 judge/views/widgets.py:58 +#, python-format +msgid "Invalid upstream data: %s" +msgstr "Gelen veri geçersiz: %s" + +#: judge/views/widgets.py:68 +msgid "Bad latitude or longitude" +msgstr "Hatalı enlem veya boylam" + +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:13 +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:27 +msgid "Photo" +msgstr "" + +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:14 +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:28 +msgid "Photos" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:9 +msgid "first name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:10 +msgid "last name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:11 +msgid "biography" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/admin.py:24 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:30 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:30 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:30 +msgid "owner" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:12 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:12 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:12 +msgid "name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:19 +msgid "Category of Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:20 +msgid "Categories of Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:26 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:26 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:26 +msgid "title" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:28 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:28 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:28 +msgid "category" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:29 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:29 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:29 +msgid "author" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:31 +msgid "publication date" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:37 +msgid "Book" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:38 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:136 +msgid "Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:19 +msgid "Category of CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:20 +msgid "Categories of CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:36 +msgid "CD" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:37 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:141 +msgid "CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:19 +msgid "Category of DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:20 +msgid "Categories of DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:36 +msgid "DVD" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:37 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:146 +msgid "DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/templates/admin/base_site.html:7 +msgid "Django administration" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/forms.py:12 +#, python-format +msgid "Please enter the correct %(username)s and password for an admin account. Note that both fields may be case-sensitive." +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/forms.py:32 +#, python-format +msgid "Please enter the correct %(username)s and password for an user account. Note that both fields may be case-sensitive." +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:27 +msgid "Site" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:38 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:41 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:130 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:133 +msgid "Dashboard" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:48 +msgid "Applications" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:53 +msgid "Administration" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:64 +msgid "Color theme" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:66 +msgid "Change color theme" +msgstr "" + +#: 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 "Derecelendir" + +#: templates/admin/judge/contest/change_list.html:9 +msgid "Rate all ratable contests" +msgstr "Tüm yarışmaları derecelendir" + +#: 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 "Gönderileri görüntüle" + +#: templates/admin/judge/profile/change_form.html:14 +#: templates/admin/judge/profile/change_form.html:17 +msgid "Edit user" +msgstr "Kullanıcı düzenle" + +#: 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 +msgid "Rejudge" +msgstr "Yeniden değerlendir" + +#: templates/base.html:214 +#, python-format +msgid "Hello, %(username)s." +msgstr "Merhaba, %(username)s." + +#: templates/base.html:220 templates/comments/list.html:89 +#: templates/contest/contest-list-tabs.html:24 +#: templates/problem/problem-list-tabs.html:6 +#: templates/submission/info-base.html:12 +#: templates/submission/submission-list-tabs.html:15 +msgid "Admin" +msgstr "Yönetici" + +#: templates/base.html:229 +msgid "Log out" +msgstr "Çıkış yap" + +#: templates/base.html:238 +#: templates/registration/password_reset_complete.html:4 +msgid "Log in" +msgstr "Giriş yap" + +#: templates/base.html:239 templates/registration/registration_form.html:177 +msgid "or" +msgstr "ya da" + +#: templates/base.html:240 +msgid "Sign up" +msgstr "" + +#: templates/base.html:252 +msgid "spectating" +msgstr "izleniyor" + +#: templates/base.html:265 +msgid "This site works best with JavaScript enabled." +msgstr "Bu sitenin düzgün görüntülenmesi için JavaScript etkin olmalıdır." + +#: templates/blog/content.html:13 templates/comments/list.html:68 +#: templates/comments/list.html:83 templates/contest/contest-tabs.html:20 +#: 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 +msgid "Edit" +msgstr "Düzenle" + +#: templates/blog/content.html:27 +#, python-format +msgid "\n" +" posted on %(time)s\n" +" " +msgstr "\n" +"%(time)s" + +#: templates/blog/dashboard.html:21 +#, python-format +msgid "\n" +" on %(time)s\n" +" " +msgstr "\n" +"%(time)s" + +#: templates/blog/list.html:85 +msgid "Blog" +msgstr "" + +#: templates/blog/list.html:87 +msgid "Events" +msgstr "Etkinlikler" + +#: templates/blog/list.html:92 +msgid "News" +msgstr "Haberler" + +#: templates/blog/list.html:106 +#, python-brace-format +msgid "posted on {time}" +msgstr "{time}" + +#: templates/blog/list.html:130 templates/problem/problem.html:310 +msgid "Clarifications" +msgstr "Açıklamalar" + +#: templates/blog/list.html:146 templates/problem/problem.html:321 +msgid "No clarifications have been made at this time." +msgstr "Henüz bir açıklama yapılmadı." + +#: templates/blog/list.html:154 +msgid "Ongoing contests" +msgstr "Devam eden yarışmalar" + +#: templates/blog/list.html:172 +msgid "Upcoming contests" +msgstr "Gelecek yarışmalar" + +#: templates/blog/list.html:189 +msgid "Comment stream" +msgstr "Son yorumlar" + +#: templates/blog/list.html:208 +msgid "New problems" +msgstr "Yeni problemler" + +#: templates/blog/list.html:225 +msgid "My open tickets" +msgstr "Açık biletlerim" + +#: templates/blog/list.html:246 +msgid "New tickets" +msgstr "Yeni biletler" + +#: templates/comments/list.html:2 +msgid "Comments" +msgstr "Yorumlar" + +#: templates/comments/list.html:18 templates/comments/list.html:27 +msgid "Please login to vote" +msgstr "Oylamak için lütfen giriş yap" + +#: templates/comments/list.html:40 +#, python-brace-format +msgid "commented on {time}" +msgstr "{time} " + +#: templates/comments/list.html:49 +#, python-format +msgid "edit %(edits)s" +msgstr "düzenleme %(edits)s" + +#: templates/comments/list.html:51 templates/comments/media-js.html:77 +msgid "edited" +msgstr "düzenlendi" + +#: templates/comments/list.html:60 +msgid "Link" +msgstr "" + +#: templates/comments/list.html:73 templates/comments/list.html:80 +msgid "Reply" +msgstr "Yanıtla" + +#: templates/comments/list.html:86 +msgid "Hide" +msgstr "Gizle" + +#: templates/comments/list.html:101 +#, 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:120 +msgid "There are no comments at the moment." +msgstr "Şu anda hiç yorum yok." + +#: templates/comments/list.html:126 +msgid "New comment" +msgstr "Yeni yorum" + +#: templates/comments/list.html:140 +msgid "Invalid comment body." +msgstr "Yorum metninde hata!" + +#: templates/comments/list.html:148 +msgid "Post!" +msgstr "Yayınla!" + +#: templates/comments/list.html:156 +msgid "Comments are disabled on this page." +msgstr "" + +#: templates/comments/media-js.html:72 +#, python-brace-format +msgid "edit {edits}" +msgstr "düzenleme {edits}" + +#: templates/comments/media-js.html:75 +msgid "original" +msgstr "orijinal" + +#: templates/contest/access_code.html:26 +msgid "Invalid access code." +msgstr "Hatalı erişim kodu!" + +#: templates/contest/access_code.html:29 +msgid "Please enter your access code:" +msgstr "Lütfen erişim kodunu gir:" + +#: templates/contest/access_code.html:32 +msgid "Join Contest" +msgstr "Yarışmaya katıl" + +#: templates/contest/calendar.html:12 +msgid "Sunday" +msgstr "Pazar" + +#: templates/contest/calendar.html:13 +msgid "Monday" +msgstr "Pazartesi" + +#: templates/contest/calendar.html:14 +msgid "Tuesday" +msgstr "Salı" + +#: templates/contest/calendar.html:15 +msgid "Wednesday" +msgstr "Çarşamba " + +#: templates/contest/calendar.html:16 +msgid "Thursday" +msgstr "Perşembe " + +#: templates/contest/calendar.html:17 +msgid "Friday" +msgstr "Cuma" + +#: templates/contest/calendar.html:18 +msgid "Saturday" +msgstr "Cumartesi" + +#: 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 "Önceki" + +#: templates/contest/contest-list-tabs.html:10 +msgid "Today" +msgstr "" + +#: templates/contest/contest-list-tabs.html:13 +msgid "Next" +msgstr "Sonraki" + +#: templates/contest/contest-list-tabs.html:21 +#: templates/problem/problem-list-tabs.html:5 +msgid "List" +msgstr "Liste" + +#: templates/contest/contest-list-tabs.html:22 +msgid "Calendar" +msgstr "Takvim" + +#: templates/contest/contest-tabs.html:4 +msgid "Info" +msgstr "Hakkında" + +#: templates/contest/contest-tabs.html:8 +msgid "Rankings" +msgstr "Sıralamalar" + +#: templates/contest/contest-tabs.html:10 +msgid "Hidden Rankings" +msgstr "Gizli Sıralamalar" + +#: templates/contest/contest-tabs.html:18 +msgid "MOSS" +msgstr "" + +#: templates/contest/contest-tabs.html:23 +msgid "Clone" +msgstr "" + +#: templates/contest/contest-tabs.html:34 +#: templates/contest/contest-tabs.html:54 +msgid "Leave contest" +msgstr "Yarışmadan ayrıl" + +#: templates/contest/contest-tabs.html:41 templates/contest/list.html:293 +msgid "Virtual join" +msgstr "Sanal katılım" + +#: templates/contest/contest-tabs.html:52 +msgid "Stop spectating" +msgstr "İzlemeyi bırak" + +#: templates/contest/contest-tabs.html:61 +msgid "Spectate contest" +msgstr "Yarışmayı izle" + +#: templates/contest/contest-tabs.html:67 +#: templates/contest/contest-tabs.html:73 +msgid "Join contest" +msgstr "Yarışmaya katıl" + +#: templates/contest/contest-tabs.html:82 +msgid "Login to participate" +msgstr "Katılmak için giriş yap" + +#: templates/contest/contest.html:37 +msgid "Participating virtually." +msgstr "Sanal olarak katılınıyor. " + +#: templates/contest/contest.html:43 +msgid "Contest is over." +msgstr "Yarışma sona erdi" + +#: templates/contest/contest.html:59 templates/contest/contest.html:63 +msgid "F j, Y, G:i T" +msgstr "j F Y, G:i T" + +#: templates/contest/contest.html:59 +#, python-format +msgid "%(time_limit)s window between %(start_time)s and %(end_time)s" +msgstr " %(start_time)s ile %(end_time)s arasında, süre sınırı %(time_limit)s" + +#: templates/contest/contest.html:63 +#, python-format +msgid "%(length)s long starting on %(start_time)s" +msgstr "başlangıç %(start_time)s, yarışma süresi %(length)s" + +#: templates/contest/contest.html:85 +msgid "AC Rate" +msgstr "AC Oranı" + +#: templates/contest/contest.html:86 templates/contest/list.html:153 +#: templates/contest/list.html:195 templates/contest/list.html:271 +#: templates/problem/list.html:212 templates/problem/list.html:238 +msgid "Users" +msgstr "Kullanıcılar" + +#: templates/contest/contest.html:111 +msgid "Editorial" +msgstr "Problem analizi" + +#: templates/contest/list.html:31 templates/contest/media-js.html:9 +msgid "Are you sure you want to join?" +msgstr "Katılmak istediğine emin misin?" + +#: templates/contest/list.html:32 +msgid "Joining a contest for the first time starts your timer, after which it becomes unstoppable." +msgstr "Bir yarışmaya ilk defa katılmak süreni başlatır, süren başladıktan sonra durdurulamaz. " + +#: templates/contest/list.html:65 +msgid "hidden" +msgstr "" + +#: templates/contest/list.html:70 +msgid "private" +msgstr "" + +#: templates/contest/list.html:84 +msgid "rated" +msgstr "" + +#: templates/contest/list.html:132 +msgid "Spectate" +msgstr "İzle" + +#: templates/contest/list.html:138 +msgid "Join" +msgstr "Katıl" + +#: templates/contest/list.html:148 +msgid "Active Contests" +msgstr "" + +#: templates/contest/list.html:152 templates/contest/list.html:194 +#: templates/contest/list.html:232 templates/contest/list.html:270 +msgid "Contest" +msgstr "Yarışma" + +#: templates/contest/list.html:190 +msgid "Ongoing Contests" +msgstr "Devam Eden Yarışmalar" + +#: templates/contest/list.html:227 +msgid "Upcoming Contests" +msgstr "Gelecek yarışmalar" + +#: templates/contest/list.html:255 +msgid "There are no scheduled contests at this time." +msgstr "Şu anda planlanmış yarışma bulunmuyor." + +#: templates/contest/list.html:261 +msgid "Past Contests" +msgstr "Eski Yarışmalar" + +#: templates/contest/media-js.html:4 +msgid "Are you sure you want to leave?" +msgstr "Ayrılmak istediğine emin misin?" + +#: templates/contest/media-js.html:5 +msgid "You cannot come back to a virtual participation. You will have to start a new one." +msgstr "Sanal katılıma geri dönemezsin. Yeni bir sanal katılım oluşturmalısın." + +#: templates/contest/media-js.html:10 +msgid "Joining a contest starts your timer, after which it becomes unstoppable." +msgstr "Bir yarışmaya katılmak süreni başlatır, sayaç durdurulamaz." + +#: 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 "Yarışmaya yalnızca şu organizasyonlar erişebilir:" + +#: templates/contest/ranking-table.html:7 +msgid "Organization" +msgstr "Organizasyon" + +#: templates/contest/ranking-table.html:27 +#, python-brace-format +msgid "Started on {time}" +msgstr "Başlangıç: {time}" + +#: templates/contest/ranking-table.html:30 +msgid "Participation ended." +msgstr "Katılım sona erdi." + +#: templates/contest/ranking.html:232 +msgid "View user participation" +msgstr "Kullanıcı katılımını göster" + +#: templates/contest/ranking.html:236 +msgid "Show organizations" +msgstr "Organizasyonları göster" + +#: templates/license.html:12 +msgid "Source:" +msgstr "Kaynak:" + +#: 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 "Haber bülteni" + +#: 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 "aktifleştir" + +#: templates/newsletter/subscription_unsubscribe_activated.html:8 +msgid "You have successfully been unsubscribed." +msgstr "Başarıyla abonelikten çıktın." + +#: 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 "Haber bülteni aboneliğinden çık" + +#: 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 "Abonelikten çıkma isteğin alındı. Abonelikten çıkman için gerekli linki içeren bir e-posta, adresine gönderildi." + +#: templates/newsletter/subscription_unsubscribe_user.html:17 +msgid "Do you want to unsubscribe from this newsletter?" +msgstr "Bu haber bültenine olan aboneliğinden çıkmak istiyor musun?" + +#: templates/newsletter/subscription_unsubscribe_user.html:21 +msgid "Unsubscribe" +msgstr "Abonelikten çık" + +#: 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 "Haber bülteni güncellemesi" + +#: 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 "Teknik bir hata sebebiyle onay e-postanı gönderemedik. E-posta adresin geçersiz olabilir." + +#: templates/newsletter/subscription_update.html:14 +msgid "Update subscription" +msgstr "Aboneliği güncelle" + +#: templates/newsletter/subscription_update_activated.html:8 +msgid "Your subscription has successfully been updated." +msgstr "Aboneliğin başarıyla güncellenmiştir." + +#: 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 "Güncelleme isteğin alındı ve adresine aktivasyon e-postası gönderildi. E-postadaki bağlantıyı izleyerek aboneliğini güncelleyebilirsin." + +#: templates/organization/edit.html:46 +#: templates/organization/requests/pending.html:34 +#: templates/ticket/edit-notes.html:4 +msgid "Update" +msgstr "Güncelle" + +#: 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 "Organizasyondan ayrıl" + +#: templates/organization/home.html:29 +msgid "Join organization" +msgstr "Organizasyona katıl" + +#: templates/organization/home.html:33 +msgid "Request membership" +msgstr "Üyelik talep et" + +#: templates/organization/home.html:39 +msgid "Edit organization" +msgstr "Organizasyonu düzenle" + +#: templates/organization/home.html:43 +msgid "View requests" +msgstr "İstekleri göster" + +#: templates/organization/home.html:50 +msgid "Admin organization" +msgstr "Organizasyonu düzenle" + +#: templates/organization/home.html:55 +msgid "View members" +msgstr "Üyeleri göster" + +#: templates/organization/list.html:23 templates/status/language-list.html:34 +msgid "Name" +msgstr "İsim" + +#: templates/organization/list.html:24 +msgid "Members" +msgstr "Üyeler" + +#: templates/organization/new.html:10 templates/ticket/new.html:38 +msgid "Create" +msgstr "Oluştur" + +#: templates/organization/requests/detail.html:13 +msgid "User:" +msgstr "Kullanıcı:" + +#: templates/organization/requests/detail.html:17 +msgid "Organization:" +msgstr "Organizasyon:" + +#: templates/organization/requests/detail.html:25 +msgid "Time:" +msgstr "Zaman:" + +#: templates/organization/requests/detail.html:29 +msgid "Reason:" +msgstr "Sebep:" + +#: templates/organization/requests/log.html:11 +#: templates/organization/requests/pending.html:14 +msgid "State" +msgstr "Durum" + +#: templates/organization/requests/log.html:12 +#: templates/organization/requests/pending.html:15 +msgid "Reason" +msgstr "Sebep" + +#: templates/organization/requests/log.html:28 +#: templates/organization/requests/pending.html:37 +msgid "There are no requests to approve." +msgstr "Onaylanacak istek yok." + +#: templates/organization/requests/pending.html:17 +#: templates/problem/data.html:401 +msgid "Delete?" +msgstr "Sil?" + +#: templates/organization/requests/request.html:18 +msgid "Your reason for joining:" +msgstr "Katılma sebebin:" + +#: templates/organization/requests/request.html:20 +msgid "Request" +msgstr "İstek" + +#: templates/organization/requests/tabs.html:4 +msgid "Pending" +msgstr "Beklemede" + +#: templates/organization/requests/tabs.html:7 +msgid "Log" +msgstr "" + +#: templates/organization/requests/tabs.html:10 +msgid "Approved" +msgstr "Onaylandı" + +#: templates/organization/requests/tabs.html:13 +msgid "Rejected" +msgstr "Geri çevrildi" + +#: templates/organization/users-table.html:15 +msgid "Kick" +msgstr "At" + +#: templates/problem/clone.html:37 +msgid "Enter a new code for the cloned problem:" +msgstr "" + +#: templates/problem/data.html:353 +msgid "View YAML" +msgstr "YAML'i görüntüle" + +#: templates/problem/data.html:369 +msgid "Show columns:" +msgstr "Sütunları göster" + +#: templates/problem/data.html:372 templates/problem/data.html:396 +msgid "Output prefix" +msgstr "Çıktı öneki" + +#: templates/problem/data.html:376 templates/problem/data.html:397 +msgid "Output limit" +msgstr "Çıktı sınırı" + +#: templates/problem/data.html:380 templates/problem/data.html:398 +msgid "Checker" +msgstr "" + +#: templates/problem/data.html:384 templates/problem/data.html:399 +msgid "Generator args" +msgstr "Generator değişkenleri" + +#: templates/problem/data.html:391 +msgid "Type" +msgstr "Tip" + +#: templates/problem/data.html:392 +msgid "Input file" +msgstr "Girdi dosyası" + +#: templates/problem/data.html:393 +msgid "Output file" +msgstr "Çıktı dosyası" + +#: templates/problem/data.html:395 +msgid "Pretest?" +msgstr "Ön test?" + +#: templates/problem/data.html:447 templates/problem/submit.html:252 +msgid "Submit!" +msgstr "Gönder!" + +#: templates/problem/data.html:448 +msgid "Add new case" +msgstr "Yeni test ekle" + +#: 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 "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/list.html:62 +msgid "Filter by type..." +msgstr "Tipe göre filtrele..." + +#: templates/problem/list.html:185 +msgid "Hot problems" +msgstr "Popüler problemler" + +#: templates/problem/list.html:207 templates/problem/list.html:224 +#: templates/problem/search-form.html:30 templates/user/user-problems.html:57 +msgid "Category" +msgstr "Kategori" + +#: templates/problem/list.html:209 templates/problem/list.html:228 +msgid "Types" +msgstr "Tipler" + +#: templates/problem/list.html:235 +#, python-format +msgid "AC %%" +msgstr "AC %%" + +#: 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:142 +msgid "Filter by result:" +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 "PDF olarak göster" + +#: templates/problem/problem.html:101 templates/problem/problem.html:111 +#: templates/problem/problem.html:116 +msgid "Submit solution" +msgstr "Çözüm yolla" + +#: templates/problem/problem.html:104 +#, python-format +msgid "%(counter)s submission left" +msgid_plural "%(counter)s submissions left" +msgstr[0] "%(counter)s gönderi kaldı" +msgstr[1] "%(counter)s gönderi kaldı" + +#: templates/problem/problem.html:112 +msgid "0 submissions left" +msgstr "0 çözüm kaldı" + +#: templates/problem/problem.html:124 +msgid "My submissions" +msgstr "Benim çözümlerim" + +#: templates/problem/problem.html:128 +msgid "Best submissions" +msgstr "En iyi çözümler" + +#: templates/problem/problem.html:132 +msgid "Read editorial" +msgstr "Problem analizine git" + +#: templates/problem/problem.html:137 +msgid "Manage tickets" +msgstr "Biletleri yönet" + +#: templates/problem/problem.html:141 +msgid "Edit problem" +msgstr "Soruyu düzenle" + +#: templates/problem/problem.html:143 +msgid "Edit test data" +msgstr "Test verisini düzenle" + +#: templates/problem/problem.html:148 +msgid "My tickets" +msgstr "" + +#: templates/problem/problem.html:156 +msgid "Manage submissions" +msgstr "" + +#: templates/problem/problem.html:162 +msgid "Clone problem" +msgstr "Soruyu çoğalt" + +#: templates/problem/problem.html:169 +msgid "Points:" +msgstr "Puan:" + +#: templates/problem/problem.html:172 templates/problem/problem.html:174 +msgid "(partial)" +msgstr "(kısmi)" + +#: templates/problem/problem.html:179 +msgid "Time limit:" +msgstr "Zaman sınırı:" + +#: templates/problem/problem.html:191 +msgid "Memory limit:" +msgstr "Bellek sınırı:" + +#: templates/problem/problem.html:210 +msgid "Author:" +msgid_plural "Authors:" +msgstr[0] "Yazar" +msgstr[1] "Yazarlar" + +#: templates/problem/problem.html:225 +msgid "Problem type" +msgid_plural "Problem types" +msgstr[0] "Soru tipi" +msgstr[1] "Soru tipleri" + +#: templates/problem/problem.html:238 +msgid "Allowed languages" +msgstr "İzin verilen diller" + +#: templates/problem/problem.html:246 +#, python-format +msgid "No %(lang)s judge online" +msgstr "%(lang)s için çevrimiçi judge yok" + +#: templates/problem/problem.html:257 +msgid "Judge:" +msgid_plural "Judges:" +msgstr[0] "" +msgstr[1] "" + +#: templates/problem/problem.html:274 +msgid "none available" +msgstr "" + +#: templates/problem/problem.html:299 +msgid "Request clarification" +msgstr "Açıklama talebi" + +#: templates/problem/problem.html:301 +msgid "Report an issue" +msgstr "Bir sorun bildir" + +#: 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 "Problem ara" + +#: templates/problem/search-form.html:8 +msgid "Search problems..." +msgstr "Problemlerde ara..." + +#: templates/problem/search-form.html:14 +msgid "Full text search" +msgstr "Tam metin araması" + +#: templates/problem/search-form.html:21 +msgid "Hide solved problems" +msgstr "Çözülmüş problemleri gizle" + +#: templates/problem/search-form.html:27 +msgid "Show problem types" +msgstr "Problem tiplerini göster" + +#: templates/problem/search-form.html:33 templates/problem/search-form.html:35 +#: templates/submission/submission-list-tabs.html:4 +msgid "All" +msgstr "Tümü" + +#: templates/problem/search-form.html:46 +msgid "Problem types" +msgstr "Problem tipleri" + +#: templates/problem/search-form.html:57 +msgid "Point range" +msgstr "Puan aralığı" + +#: templates/problem/search-form.html:63 templates/submission/list.html:337 +#: templates/ticket/list.html:248 +msgid "Go" +msgstr "Git" + +#: templates/problem/search-form.html:64 +msgid "Random" +msgstr "Rastgele" + +#: templates/problem/submit.html:192 +#, python-format +msgid "Warning! Your default language, %(default_language)s, is unavailable for this problem and has been deselected." +msgstr "Uyarı Varsayılan dilin, %(default_language)s, bu soru için kullanılamıyor." + +#: templates/problem/submit.html:203 +#, python-format +msgid "\n" +" You have %(left)s submission left\n" +" " +msgid_plural "\n" +" You have %(left)s submissions left\n" +" " +msgstr[0] "\n" +"Geriye %(left)s çözümün kaldı" +msgstr[1] "\n" +"Geriye %(left)s çözümün kaldı" + +#: templates/problem/submit.html:212 +msgid "You have 0 submissions left" +msgstr "Geriye 0 çözümün kaldı" + +#: templates/problem/submit.html:250 +msgid "No judge is available for this problem." +msgstr "Bu problem için herhangi bir judge mevcut değil." + +#: templates/registration/activate.html:3 +#, python-format +msgid "%(key)s is an invalid activation key." +msgstr "Geçersiz aktivasyon kodu: %(key)s." + +#: templates/registration/activation_complete.html:3 +msgid "Your account has been successfully activated." +msgstr "Hesabın başarıyla aktifleştirildi." + +#: templates/registration/login.html:43 +msgid "Invalid username or password." +msgstr "Kullanıcı adı veya şifre yanlış" + +#: templates/registration/login.html:61 +#: templates/registration/totp_auth.html:39 +msgid "Login!" +msgstr "Giriş Yap!" + +#: templates/registration/login.html:64 +msgid "Forgot your password?" +msgstr "Şifremi unuttum" + +#: templates/registration/login.html:67 +msgid "Or log in with..." +msgstr "Diğer giriş seçenekleri:" + +#: templates/registration/logout.html:3 +msgid "See you later!" +msgstr "Görüşürüz!" + +#: templates/registration/password_change_done.html:3 +msgid "Your password was sucessfully changed." +msgstr "Şifren başarıyla değiştirildi." + +#: templates/registration/password_change_form.html:8 +msgid "Change Password" +msgstr "Şifre Değiştir" + +#: templates/registration/password_reset.html:7 +msgid "Send Reset Email" +msgstr "Sıfırlama E-postası Gönder" + +#: templates/registration/password_reset_complete.html:3 +msgid "Your password has been set. You may go ahead and log in now" +msgstr "Şifren oluşturuldu. Şimdi giriş yapabilirsin." + +#: templates/registration/password_reset_confirm.html:9 +msgid "Reset Password" +msgstr "Şifreyi sıfırla" + +#: templates/registration/password_reset_done.html:4 +msgid "We've emailed you instructions for setting your password. You should be receiving them shortly." +msgstr "Şifreni belirlemen için sana yapman gerekenleri içeren bir e-posta gönderdik. Birazdan sana ulaşacaktır." + +#: 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 "Eğer bir e-posta almadıysan, kaydolduğun e-posta adresini girdiğinden emin ol ve spam klasörünü kontrol et." + +#: 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 "Bu e-posta %(site_name)s üyeliğinin şifre sıfırlaması için gönderildi." + +#: templates/registration/password_reset_email.txt:3 +msgid "Please go to the following page and choose a new password:" +msgstr "Lütfen bu sayfaya git ve yeni bir şifre seç:" + +#: templates/registration/password_reset_email.txt:7 +msgid "Your username, in case you've forgotten:" +msgstr "Unuttuysan diye, kullanıcı adın:" + +#: templates/registration/password_reset_email.txt:9 +msgid "Thanks for using our site!" +msgstr "Sitemizi kullandığın için teşekkür ederiz!" + +#: templates/registration/password_reset_email.txt:11 +#, python-format +msgid "The %(site_name)s team" +msgstr "%(site_name)s takımı" + +#: templates/registration/password_reset_subject.txt:1 +#, python-format +msgid "Password reset on %(site_name)s" +msgstr "%(site_name)s şifre sıfırlaması" + +#: templates/registration/profile_creation.html:36 +#: templates/registration/username_select.html:7 +msgid "Continue >" +msgstr "Devam et >" + +#: 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 "Başarıyla kaydoldun! Girdiğin e-posta adresine kaydını onaylaman için bir e-posta gönderdik." + +#: templates/registration/registration_form.html:166 +msgid "(again, for confirmation)" +msgstr "(onaylamak için lütfen tekrar gir)" + +#: templates/registration/registration_form.html:173 +msgid "(select your closest major city)" +msgstr "(sana en yakın büyük şehri seç)" + +#: templates/registration/registration_form.html:178 +msgid "pick from map" +msgstr "Haritadan seç" + +#: templates/registration/registration_form.html:183 +msgid "Default language" +msgstr "Varsayılan dil" + +#: templates/registration/registration_form.html:186 +#: templates/user/edit-profile.html:162 +msgid "Affiliated organizations" +msgstr "Organizasyon üyelikleri" + +#: templates/registration/registration_form.html:192 +#: templates/user/edit-profile.html:121 +msgid "Notify me about upcoming contests" +msgstr "Gelecek yarışmalar hakkında beni bilgilendir" + +#: templates/registration/registration_form.html:206 +msgid "By registering, you agree to our" +msgstr "Kayıt olmakla birlikte şunları kabul edersin:" + +#: templates/registration/registration_form.html:207 +msgid "Terms & Conditions" +msgstr "Şartlar & Koşullar" + +#: templates/registration/registration_form.html:210 +msgid "Register!" +msgstr "Kaydol!" + +#: templates/registration/totp_auth.html:36 +#: templates/registration/totp_disable.html:45 +#: templates/registration/totp_enable.html:83 +msgid "Enter the 6-digit code generated by your app:" +msgstr "" + +#: templates/registration/totp_auth.html:41 +#, python-format +msgid "If you lost your authentication device, please contact us at %(email)s." +msgstr "" + +#: templates/registration/totp_disable.html:38 +msgid "To protect your account, you must first authenticate before you can disable Two Factor Authentication." +msgstr "" + +#: templates/registration/totp_enable.html:71 +msgid "Scan this code with your authenticator app:" +msgstr "" + +#: templates/registration/totp_enable.html:72 +msgid "QR code" +msgstr "" + +#: templates/registration/totp_enable.html:73 +msgid "Or enter this code manually:" +msgstr "" + +#: templates/stats/base.html:9 templates/submission/list.html:345 +msgid "Statistics" +msgstr "İstatistikler" + +#: templates/stats/language.html:11 +msgid "Submission Statistics" +msgstr "Çözüm İstatistikleri" + +#: templates/stats/language.html:16 +msgid "Submissions by Language" +msgstr "Dillere Göre Çözümler" + +#: templates/stats/language.html:21 +msgid "AC Submissions by Language" +msgstr "Dillere Göre AC Alan Çözümler" + +#: templates/stats/language.html:26 +msgid "Language AC Rate" +msgstr "Dil AC Oranı" + +#: templates/status/judge-status-table.html:2 +msgid "Judge" +msgstr "" + +#: templates/status/judge-status-table.html:4 +msgid "Online" +msgstr "" + +#: templates/status/judge-status-table.html:6 +msgid "Uptime" +msgstr "Çalışma süresi" + +#: templates/status/judge-status-table.html:7 +msgid "Ping" +msgstr "" + +#: templates/status/judge-status-table.html:8 +msgid "Load" +msgstr "Yükle" + +#: 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 +msgid "There are no judges available at this time." +msgstr "Şu an mevcut hiçbir judge bulunmuyor." + +#: templates/status/language-list.html:33 templates/ticket/list.html:261 +msgid "ID" +msgstr "" + +#: templates/status/language-list.html:35 +msgid "Runtime Info" +msgstr "Dil sürümü bilgileri" + +#: templates/status/status-tabs.html:4 +msgid "Judges" +msgstr "Judge'lar" + +#: templates/status/status-tabs.html:6 +msgid "Version Matrix" +msgstr "Sürüm Matrisi" + +#: templates/submission/internal-error-message.html:8 +msgid "An internal error occurred while grading." +msgstr "Değerlendirme sırasında bir hata oluştu." + +#: templates/submission/internal-error-message.html:15 +msgid "Error information" +msgstr "Hata bilgisi" + +#: templates/submission/list.html:76 +msgid "Filter by status..." +msgstr "Duruma göre filtrele..." + +#: templates/submission/list.html:82 +msgid "Filter by language..." +msgstr "Dile göre filtrele..." + +#: templates/submission/list.html:315 +msgid "Filter submissions" +msgstr "Çözümleri filtrele" + +#: templates/submission/list.html:351 +msgid "Total:" +msgstr "" + +#: templates/submission/list.html:361 +msgid "You were disconnected. Refresh to show latest updates." +msgstr "Bağlantın koptu. Son güncellemeleri görmek için sayfayı yenile." + +#: templates/submission/row.html:39 +#, python-format +msgid "Case #%(case)s" +msgstr "Test #%(case)s" + +#: templates/submission/row.html:49 +msgid "view" +msgstr "görüntüle " + +#: templates/submission/row.html:53 +msgid "rejudge" +msgstr "yeniden değerlendir" + +#: templates/submission/row.html:58 +msgid "admin" +msgstr "yönetici" + +#: templates/submission/source.html:25 +msgid "View status" +msgstr "Durumu görüntüle" + +#: templates/submission/source.html:26 +msgid "View raw source" +msgstr "Ham kaynağı görüntüle" + +#: templates/submission/source.html:28 templates/submission/status.html:61 +msgid "Resubmit" +msgstr "yeniden gönder" + +#: templates/submission/status-testcases.html:10 +msgid "We are waiting for a suitable judge to process your submission..." +msgstr "Çözümünü değerlendirmeye uygun bir judge bekleniyor..." + +#: templates/submission/status-testcases.html:12 +msgid "Your submission is being processed..." +msgstr "Çözüm değerlendiriliyor..." + +#: templates/submission/status-testcases.html:14 +msgid "Compilation Error" +msgstr "Derleme Hatası" + +#: templates/submission/status-testcases.html:18 +msgid "Compilation Warnings" +msgstr "Derleme Uyarıları" + +#: templates/submission/status-testcases.html:23 +msgid "Pretest Execution Results" +msgstr "Ön Test Sonuçları" + +#: templates/submission/status-testcases.html:25 +msgid "Execution Results" +msgstr "Sonuçlar" + +#: templates/submission/status-testcases.html:31 +msgid "Batch " +msgstr "Küme" + +#: templates/submission/status-testcases.html:43 +msgid "Case" +msgstr "Test" + +#: templates/submission/status-testcases.html:45 +msgid "Pretest" +msgstr "Ön test" + +#: templates/submission/status-testcases.html:47 +msgid "Test case" +msgstr "Test" + +#: templates/submission/status-testcases.html:79 +msgid "Your output (clipped)" +msgstr "Çıktı (kısaltılmış)" + +#: templates/submission/status-testcases.html:90 +msgid "Judge feedback" +msgstr "" + +#: templates/submission/status-testcases.html:106 +msgid "Resources:" +msgstr "" + +#: templates/submission/status-testcases.html:115 +msgid "Final pretest score:" +msgstr "Ön test puanı:" + +#: templates/submission/status-testcases.html:117 +msgid "Final score:" +msgstr "Puan:" + +#: templates/submission/status-testcases.html:131 +msgid "Passing pretests does not guarantee a full score on system tests." +msgstr "Ön testleri geçmek sistem testlerinde tam puan almayı garantilemez." + +#: templates/submission/status-testcases.html:134 +msgid "Submission aborted!" +msgstr "Çözüm iptal edildi!" + +#: templates/submission/status.html:59 +msgid "View source" +msgstr "Kaynağı görüntüle" + +#: templates/submission/status.html:88 +msgid "Abort" +msgstr "İptal et" + +#: templates/submission/submission-list-tabs.html:6 +msgid "Mine" +msgstr "Çözümlerim" + +#: templates/submission/submission-list-tabs.html:9 +msgid "Best" +msgstr "En iyi" + +#: templates/submission/submission-list-tabs.html:12 +#, python-format +msgid "%(user)s's" +msgstr "%(user)s" + +#: templates/ticket/list.html:135 templates/ticket/ticket.html:257 +msgid "Reopened: " +msgstr "Yeniden açıldı:" + +#: templates/ticket/list.html:138 templates/ticket/ticket.html:258 +msgid "Closed: " +msgstr "Kapatıldı:" + +#: templates/ticket/list.html:221 +msgid "Use desktop notification" +msgstr "Masaüstü bildirimlerini kullan" + +#: templates/ticket/list.html:227 +msgid "Show my tickets only" +msgstr "Sadece benim biletlerimi göster" + +#: templates/ticket/list.html:231 +msgid "Filing user" +msgstr "Dolduran kullanıcı" + +#: templates/ticket/list.html:240 +msgid "Assignee" +msgstr "Sorumlu" + +#: templates/ticket/list.html:262 +msgid "Title" +msgstr "Başlık" + +#: templates/ticket/list.html:264 templates/ticket/ticket.html:304 +msgid "Assignees" +msgstr "Sorumlular" + +#: templates/ticket/new_problem.html:7 +msgid "Thanks for opening a ticket!" +msgstr "Bilet oluşturduğunuz için teşekkürler!" + +#: 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 "Lütfen bu formun problem metni hakkındaki sorunları belirtmek için olduğunu dikkate al. Bu form yardım istemek için değildir. Yardıma ihtiyacın varsa, sorunu yorumlarda sormayı deneyebilirsin." + +#: templates/ticket/ticket.html:298 +msgid "Associated object" +msgstr "İlişkili nesne" + +#: templates/ticket/ticket.html:309 +msgid "No one is assigned." +msgstr "Kimse atanmamış." + +#: templates/ticket/ticket.html:315 +msgid "Close ticket" +msgstr "Bileti kapat" + +#: templates/ticket/ticket.html:317 +msgid "Reopen ticket" +msgstr "Bileti yeniden aç" + +#: templates/ticket/ticket.html:321 +msgid "Assignee notes" +msgstr "Sorumlu notları" + +#: templates/ticket/ticket.html:328 templates/widgets/select_all.html:4 +msgid "Nothing here." +msgstr "Burada hiçbir şey yok :(" + +#: templates/ticket/ticket.html:378 +msgid "Post" +msgstr "Gönderi" + +#: templates/user/base-users-table.html:3 +msgid "Rank" +msgstr "Sıralama" + +#: templates/user/base-users.html:14 templates/user/base-users.html:69 +msgid "Search by handle..." +msgstr "Kullanıcı adı ile ara..." + +#: templates/user/edit-profile.html:90 +msgid "Self-description" +msgstr "Künye" + +#: templates/user/edit-profile.html:98 +msgid "Select your closest major city" +msgstr "En yakın büyük şehri seç" + +#: templates/user/edit-profile.html:107 +msgid "Editor theme" +msgstr "Editör teması" + +#: templates/user/edit-profile.html:112 +msgid "Math engine" +msgstr "Matematik motoru" + +#: templates/user/edit-profile.html:136 templates/user/edit-profile.html:137 +msgid "Change your avatar" +msgstr "Profil fotoğrafı değiştir" + +#: templates/user/edit-profile.html:143 +msgid "Change your password" +msgstr "Şifre değiştir" + +#: templates/user/edit-profile.html:150 +msgid "Two Factor Authentication is enabled." +msgstr "" + +#: templates/user/edit-profile.html:153 +msgid "Two Factor Authentication is disabled." +msgstr "" + +#: templates/user/edit-profile.html:170 +msgid "User-script" +msgstr "Userscript" + +#: templates/user/edit-profile.html:174 +msgid "Update profile" +msgstr "Profilini güncelle" + +#: templates/user/pp-row.html:22 +#, python-format +msgid "\n" +" weighted %(weight)s%%\n" +" " +msgstr "\n" +"ağırlık %(weight)s%%" + +#: templates/user/pp-row.html:27 +#, python-format +msgid "%(pp).1fpp" +msgstr "%(pp).1fpp" + +#: templates/user/pp-row.html:29 +#, python-format +msgid "%(pp).0fpp" +msgstr "%(pp).0fpp" + +#: templates/user/user-about.html:14 +msgid "From" +msgstr "Organizasyonlar" + +#: 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 "Hakkında" + +#: templates/user/user-about.html:40 +msgid "You have not shared any information." +msgstr "Henüz hiçbir bilgi paylaşmadın." + +#: templates/user/user-about.html:42 +msgid "This user has not shared any information." +msgstr "Bu kullanıcı henüz hiçbir bilgi paylaşmadı." + +#: 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 "Puan sırası:" + +#: templates/user/user-base.html:53 +msgid "Total points:" +msgstr "Toplam puan:" + +#: templates/user/user-base.html:68 +msgid "Rank by rating:" +msgstr "Derece sırası:" + +#: templates/user/user-base.html:70 +msgid "Rating:" +msgstr "" + +#: templates/user/user-base.html:71 +msgid "Volatility:" +msgstr "Değişkenlik:" + +#: templates/user/user-base.html:72 +msgid "Min. rating:" +msgstr "En düşük derece:" + +#: templates/user/user-base.html:73 +msgid "Max rating:" +msgstr "En yüksek derece:" + +#: templates/user/user-problems.html:35 +msgid "Points Breakdown" +msgstr "Puan Dağılımı" + +#: templates/user/user-problems.html:41 +msgid "Load more..." +msgstr "Daha fazla yükle..." + +#: templates/user/user-problems.html:45 +msgid "This user has not yet solved any problems." +msgstr "Bu kullanıcı henüz hiç soru çözmedi." + +#: templates/user/user-problems.html:51 +msgid "Authored Problems" +msgstr "Yazılan Problemler" + +#: templates/user/user-problems.html:83 +msgid "Hide problems I've solved" +msgstr "Çözdüğüm soruları gizle" + +#: templates/user/user-problems.html:93 +#, python-format +msgid "%(points).1f points" +msgstr "%(points).1f puan" + +#: templates/user/user-problems.html:99 +msgid "Score" +msgstr "Puan" + +#: templates/user/user-problems.html:110 +#, python-format +msgid "%(points)s / %(total)s" +msgstr "%(points)s/%(total)s" + +#: templates/user/user-tabs.html:7 +msgid "Impersonate" +msgstr "Yerine geç" + +#: templates/user/user-tabs.html:13 +msgid "Admin User" +msgstr "Yönetici kullanıcı" + +#: templates/user/user-tabs.html:16 +msgid "Admin Profile" +msgstr "Yönetici Profili" + +#: templates/widgets/select_all.html:8 +msgid "Check all" +msgstr "Tümünü seç" + diff --git a/locale/tr/LC_MESSAGES/djangojs.po b/locale/tr/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..387b0b4 --- /dev/null +++ b/locale/tr/LC_MESSAGES/djangojs.po @@ -0,0 +1,30 @@ +msgid "" +msgstr "" +"Project-Id-Version: dmoj\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-10-01 23:12+0000\n" +"PO-Revision-Date: 2019-11-11 22:06\n" +"Last-Translator: Icyene\n" +"Language-Team: Turkish\n" +"Language: tr_TR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: crowdin.com\n" +"X-Crowdin-Project: dmoj\n" +"X-Crowdin-Language: tr\n" +"X-Crowdin-File: djangojs.po\n" + +#: resources/common.js:207 +msgctxt "time format with day" +msgid "%d day %h:%m:%s" +msgid_plural "%d days %h:%m:%s" +msgstr[0] "%d gün, %h:%m:%s" +msgstr[1] "%d gün, %h:%m:%s" + +#: resources/common.js:210 +msgctxt "time format without day" +msgid "%h:%m:%s" +msgstr "%h:%m:%s" + diff --git a/locale/vi/LC_MESSAGES/django.po b/locale/vi/LC_MESSAGES/django.po new file mode 100644 index 0000000..960ea68 --- /dev/null +++ b/locale/vi/LC_MESSAGES/django.po @@ -0,0 +1,4513 @@ +msgid "" +msgstr "" +"Project-Id-Version: dmoj\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-11-11 21:54+0000\n" +"PO-Revision-Date: 2019-11-11 22:06\n" +"Last-Translator: Icyene\n" +"Language-Team: Vietnamese\n" +"Language: vi_VN\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: crowdin.com\n" +"X-Crowdin-Project: dmoj\n" +"X-Crowdin-Language: vi\n" +"X-Crowdin-File: django.po\n" + +#: dmoj/settings.py:337 +msgid "German" +msgstr "Tiếng Đức" + +#: dmoj/settings.py:338 +msgid "English" +msgstr "Tiếng Anh" + +#: dmoj/settings.py:339 +msgid "Spanish" +msgstr "Tiếng Tây Ban Nha" + +#: dmoj/settings.py:340 +msgid "French" +msgstr "Tiếng Pháp" + +#: dmoj/settings.py:341 +msgid "Croatian" +msgstr "Tiếng Croatia" + +#: dmoj/settings.py:342 +msgid "Hungarian" +msgstr "Tiếng Hung-ga-ri" + +#: dmoj/settings.py:343 +msgid "Japanese" +msgstr "Tiếng Nhật Bản" + +#: dmoj/settings.py:344 +msgid "Korean" +msgstr "Tiếng Hàn Quốc" + +#: dmoj/settings.py:345 +msgid "Brazilian Portuguese" +msgstr "Tiếng Braxin-Bồ Đào Nha" + +#: dmoj/settings.py:346 +msgid "Romanian" +msgstr "Tiếng Romania" + +#: dmoj/settings.py:347 +msgid "Russian" +msgstr "Tiếng Nga" + +#: dmoj/settings.py:348 +msgid "Serbian (Latin)" +msgstr "Tiếng Séc-bi (Latin)" + +#: dmoj/settings.py:349 +msgid "Turkish" +msgstr "Tiếng Thổ Nhĩ Kỳ" + +#: dmoj/settings.py:350 +msgid "Vietnamese" +msgstr "Tiếng Việt" + +#: dmoj/settings.py:351 +msgid "Simplified Chinese" +msgstr "Tiếng Trung (Giản thể)" + +#: dmoj/urls.py:54 +msgid "Login" +msgstr "Đăng nhập" + +#: dmoj/urls.py:102 templates/base.html:190 +msgid "Home" +msgstr "Trang chủ" + +#: judge/admin/comments.py:40 +#, python-format +msgid "%d comment successfully hidden." +msgid_plural "%d comments successfully hidden." +msgstr[0] "%d bình luận đã được ẩn." + +#: judge/admin/comments.py:43 +msgid "Hide comments" +msgstr "Ẩn bình luận" + +#: judge/admin/comments.py:47 +#, python-format +msgid "%d comment successfully unhidden." +msgid_plural "%d comments successfully unhidden." +msgstr[0] "%d bình luận đã được hiện lại." + +#: judge/admin/comments.py:50 +msgid "Unhide comments" +msgstr "Bỏ ẩn bình luận" + +#: judge/admin/comments.py:58 +msgid "Associated page" +msgstr "Trang liên kết" + +#: judge/admin/contest.py:29 +msgid "Included contests" +msgstr "Các cuộc thi" + +#: judge/admin/contest.py:65 templates/contest/contest.html:83 +#: templates/contest/moss.html:43 templates/problem/list.html:206 +#: templates/problem/list.html:221 templates/user/user-problems.html:56 +#: templates/user/user-problems.html:98 +msgid "Problem" +msgstr "Đề bài" + +#: judge/admin/contest.py:113 +msgid "Settings" +msgstr "Cài đặt" + +#: judge/admin/contest.py:115 +msgid "Scheduling" +msgstr "Kế hoạch" + +#: judge/admin/contest.py:116 +msgid "Details" +msgstr "Chi tiêt" + +#: judge/admin/contest.py:117 +msgid "Format" +msgstr "Định dạng" + +#: judge/admin/contest.py:118 templates/contest/ranking-table.html:5 +msgid "Rating" +msgstr "Xếp loại" + +#: judge/admin/contest.py:119 +msgid "Access" +msgstr "Truy cập" + +#: judge/admin/contest.py:121 judge/admin/problem.py:131 +msgid "Justice" +msgstr "Luật" + +#: judge/admin/contest.py:159 +#, 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:162 +msgid "Mark contests as visible" +msgstr "Đánh dấu các kỳ thi là có thể thấy" + +#: judge/admin/contest.py:166 +#, 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:169 +msgid "Mark contests as hidden" +msgstr "Đánh dấu các kỳ thi là ẩn" + +#: judge/admin/contest.py:180 judge/admin/submission.py:149 +#: judge/admin/submission.py:171 +msgid "You do not have the permission to rejudge submissions." +msgstr "Bạn không có quyền chấm lại bài." + +#: judge/admin/contest.py:187 judge/admin/submission.py:155 +msgid "You do not have the permission to rejudge THAT many submissions." +msgstr "Bạn không không có quyền chấm lại QUÁ NHIỀU bài nộp." + +#: judge/admin/contest.py:194 judge/admin/submission.py:164 +#, 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:265 +#, python-format +msgid "%d participation recalculated." +msgid_plural "%d participations recalculated." +msgstr[0] "%d tham gia tính lại." + +#: judge/admin/contest.py:268 +msgid "Recalculate results" +msgstr "Kết quả tính lại" + +#: judge/admin/contest.py:272 judge/admin/organization.py:65 +msgid "username" +msgstr "tên người dùng" + +#: judge/admin/contest.py:277 templates/base.html:258 +msgid "virtual" +msgstr "ảo" + +#: judge/admin/interface.py:28 judge/models/interface.py:46 +msgid "link path" +msgstr "đường dẫn liên kết" + +#: judge/admin/interface.py:62 +msgid "Content" +msgstr "Nội dung" + +#: judge/admin/interface.py:63 +msgid "Summary" +msgstr "Tổng hợp" + +#: judge/admin/interface.py:107 judge/models/contest.py:251 +#: judge/models/contest.py:355 judge/models/profile.py:189 +msgid "user" +msgstr "thành viên" + +#: judge/admin/interface.py:148 +msgid "object" +msgstr "đối tượng" + +#: judge/admin/organization.py:34 judge/admin/problem.py:171 +#: judge/admin/profile.py:78 +msgid "View on site" +msgstr "Xem trên trang web" + +#: judge/admin/problem.py:28 +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:126 +msgid "Social Media" +msgstr "Mạng Xã hội" + +#: judge/admin/problem.py:127 +msgid "Taxonomy" +msgstr "Phân loại" + +#: judge/admin/problem.py:128 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:58 +msgid "Points" +msgstr "Điểm" + +#: judge/admin/problem.py:129 +msgid "Limits" +msgstr "Giới hạn" + +#: judge/admin/problem.py:130 judge/admin/submission.py:232 +#: templates/stats/base.html:14 templates/submission/list.html:328 +msgid "Language" +msgstr "Ngôn ngữ" + +#: judge/admin/problem.py:132 +msgid "History" +msgstr "Lịch sử" + +#: judge/admin/problem.py:168 +msgid "Authors" +msgstr "Tác giả" + +#: judge/admin/problem.py:183 +#, 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:187 +msgid "Mark problems as public" +msgstr "Công bố đề bài" + +#: judge/admin/problem.py:193 +#, 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:197 +msgid "Mark problems as private" +msgstr "Đánh dấu bài toán là cá nhân" + +#: judge/admin/profile.py:32 +msgid "timezone" +msgstr "múi giờ" + +#: judge/admin/profile.py:84 judge/admin/submission.py:211 +#: templates/organization/requests/log.html:9 +#: templates/organization/requests/pending.html:12 +#: templates/ticket/list.html:263 +msgid "User" +msgstr "Thành viên" + +#: judge/admin/profile.py:89 templates/registration/registration_form.html:145 +msgid "Email" +msgstr "Hộp thư" + +#: judge/admin/profile.py:94 judge/views/register.py:29 +#: templates/registration/registration_form.html:173 +#: templates/user/edit-profile.html:99 +msgid "Timezone" +msgstr "Múi giờ" + +#: judge/admin/profile.py:99 +msgid "date joined" +msgstr "ngày tham gia" + +#: judge/admin/profile.py:106 +#, 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:109 +msgid "Recalculate scores" +msgstr "Tính lại điểm" + +#: judge/admin/runtime.py:19 +msgid "Disallowed problems" +msgstr "Đề bài không được cho phép" + +#: judge/admin/runtime.py:22 +msgid "These problems are NOT allowed to be submitted in this language" +msgstr "Đề này KHÔNG được cho phép nộp bằng ngôn ngữ này" + +#: judge/admin/runtime.py:83 +msgid "Description" +msgstr "Mô tả" + +#: judge/admin/runtime.py:84 +msgid "Information" +msgstr "Thông tin" + +#: judge/admin/runtime.py:85 +msgid "Capabilities" +msgstr "Khả năng" + +#: judge/admin/submission.py:23 judge/admin/submission.py:42 +#: judge/admin/submission.py:221 +msgid "None" +msgstr "Không" + +#: judge/admin/submission.py:23 +msgid "Not done" +msgstr "Chưa hoàn thành" + +#: judge/admin/submission.py:23 +msgid "Exceptional" +msgstr "Lỗi" + +#: judge/admin/submission.py:42 +msgid "Unaccepted" +msgstr "Không chấp nhận" + +#: judge/admin/submission.py:89 +#, python-format +msgctxt "contest problem" +msgid "%(problem)s in %(contest)s" +msgstr "%(problem)s trong %(contest)s" + +#: judge/admin/submission.py:167 +msgid "Rejudge the selected submissions" +msgstr "Chấm lại các bài đã chọn" + +#: judge/admin/submission.py:193 judge/views/problem_manage.py:128 +#, python-format +msgid "%d submission were successfully rescored." +msgid_plural "%d submissions were successfully rescored." +msgstr[0] "%d bài đã được tính điểm lại." + +#: judge/admin/submission.py:196 +msgid "Rescore the selected submissions" +msgstr "Tính điểm lại các bài đã chọn" + +#: judge/admin/submission.py:200 +msgid "Problem code" +msgstr "Mã bài tập" + +#: judge/admin/submission.py:205 +msgid "Problem name" +msgstr "Tên bài" + +#: judge/admin/submission.py:215 templates/organization/requests/log.html:10 +#: templates/organization/requests/pending.html:13 +msgid "Time" +msgstr "Thời gian" + +#: judge/admin/submission.py:223 +#, python-format +msgid "%d KB" +msgstr "%d KB" + +#: judge/admin/submission.py:225 +#, python-format +msgid "%.2f MB" +msgstr "%.2f MB" + +#: judge/admin/submission.py:227 +msgid "Memory" +msgstr "Bộ nhớ" + +#: judge/admin/taxon.py:11 judge/admin/taxon.py:34 +msgid "Included problems" +msgstr "Bao gồm các đề" + +#: judge/admin/taxon.py:14 +msgid "These problems are included in this group of problems" +msgstr "Các đề bài này đã được bao gồm trong nhóm" + +#: judge/admin/taxon.py:37 +msgid "These problems are included in this type of problems" +msgstr "Các đề bài đã chọn đã được bao gồm trong loại bài này" + +#: judge/apps.py:8 +msgid "Online Judge" +msgstr "Chấm bài trực tuyến" + +#: judge/comments.py:41 +msgid "Comment body" +msgstr "Bình luận" + +#: judge/comments.py:47 judge/views/ticket.py:46 +msgid "Your part is silent, little toad." +msgstr "Không có phần nói của ngươi, đồ cóc ghẻ." + +#: judge/comments.py:50 templates/comments/list.html:131 +msgid "You need to have solved at least one problem before your voice can be heard." +msgstr "Bạn cần giải được ít nhất một bài tập trước khi lời nói của bạn có thể được lắng nghe." + +#: judge/comments.py:92 +msgid "Posted comment" +msgstr "Đăng bình luận" + +#: judge/contest_format/atcoder.py:19 +msgid "AtCoder" +msgstr "AtCoder" + +#: judge/contest_format/default.py:18 +msgid "Default" +msgstr "Mặc định" + +#: judge/contest_format/ecoo.py:19 +msgid "ECOO" +msgstr "ECOO" + +#: judge/contest_format/ioi.py:19 +msgid "IOI" +msgstr "IOI" + +#: judge/forms.py:27 +msgid "Subscribe to contest updates" +msgstr "Đăng ký để nhận các cập nhật về cuộc thi" + +#: judge/forms.py:28 +msgid "Enable experimental features" +msgstr "Bật các tính năng đang thử nghiệm" + +#: judge/forms.py:57 judge/views/organization.py:127 +#, 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:107 judge/views/register.py:26 +#: templates/registration/registration_form.html:139 +#: templates/user/base-users-table.html:5 +msgid "Username" +msgstr "Tên truy cập" + +#: judge/forms.py:108 templates/registration/registration_form.html:151 +#: templates/registration/registration_form.html:165 +msgid "Password" +msgstr "Mật khẩu" + +#: judge/forms.py:130 +msgid "Two Factor Authentication tokens must be 6 decimal digits." +msgstr "Mã xác thực hai lớp phải có 6 chữ số thập phân." + +#: judge/forms.py:139 templates/registration/totp_auth.html:32 +msgid "Invalid Two Factor Authentication token." +msgstr "Mã xác thực hai lớp không hợp lệ." + +#: judge/forms.py:143 judge/models/problem.py:97 +msgid "Problem code must be ^[a-z0-9]+$" +msgstr "Mã đầu bài chỉ bao gồm ^[a-z0-9] + $" + +#: judge/forms.py:148 +msgid "Problem with code already exists." +msgstr "Mã bài tập đã tồn tại." + +#: judge/forms.py:153 judge/models/contest.py:51 +msgid "Contest id must be ^[a-z0-9]+$" +msgstr "id cuộc thi phải bao gồm ^[a-z0-9] + $" + +#: judge/forms.py:158 +msgid "Contest with key already exists." +msgstr "Mã kỳ thi đã tồn tại." + +#: judge/jinja2/datetime.py:26 templates/blog/content.html:27 +#: templates/blog/dashboard.html:21 +msgid "N j, Y, g:i a" +msgstr "N j, Y, g:i a" + +#: judge/jinja2/datetime.py:26 +#, python-brace-format +msgid "{time}" +msgstr "{time}" + +#: judge/jinja2/datetime.py:26 +#, python-brace-format +msgid "on {time}" +msgstr "vào lúc {time}" + +#: judge/models/choices.py:59 +msgid "Leave as LaTeX" +msgstr "Giữ nguyên dạng LaTeX" + +#: judge/models/choices.py:60 +msgid "SVG with PNG fallback" +msgstr "SVG với PNG dự phòng" + +#: judge/models/choices.py:61 +msgid "MathML only" +msgstr "Chỉ dạng MathML" + +#: judge/models/choices.py:62 +msgid "MathJax with SVG/PNG fallback" +msgstr "MathJax với SVG/PNG dự phòng" + +#: judge/models/choices.py:63 +msgid "Detect best quality" +msgstr "Phát hiện chất lượng tốt nhất" + +#: judge/models/comment.py:25 +msgid "Page code must be ^[pcs]:[a-z0-9]+$|^b:\\d+$" +msgstr "Mã trang phải bao gồm ^[pcs]:[a-z0-9]+$|^b:\\d+$" + +#: judge/models/comment.py:41 +msgid "commenter" +msgstr "bình luận" + +#: judge/models/comment.py:42 +msgid "posted time" +msgstr "thời gian đăng" + +#: judge/models/comment.py:43 judge/models/comment.py:176 +msgid "associated page" +msgstr "trang liên kết" + +#: judge/models/comment.py:45 +msgid "votes" +msgstr "đánh giá" + +#: judge/models/comment.py:46 +msgid "body of comment" +msgstr "nhận xét" + +#: judge/models/comment.py:47 +msgid "hide the comment" +msgstr "ẩn bình luận" + +#: judge/models/comment.py:48 +msgid "parent" +msgstr "cấp trên" + +#: judge/models/comment.py:53 +msgid "comment" +msgstr "bình luận" + +#: judge/models/comment.py:54 +msgid "comments" +msgstr "nhận xét" + +#: judge/models/comment.py:136 judge/models/problem.py:406 +#, python-format +msgid "Editorial for %s" +msgstr "Hướng giải cho %s" + +#: judge/models/comment.py:171 +msgid "comment vote" +msgstr "đánh giá bình luận" + +#: judge/models/comment.py:172 +msgid "comment votes" +msgstr "đánh giá bình luận" + +#: judge/models/comment.py:181 +msgid "Override comment lock" +msgstr "Ghi đè khóa nhận xét" + +#: judge/models/contest.py:21 +msgid "Invalid colour." +msgstr "Màu sắc không hợp lệ." + +#: judge/models/contest.py:23 +msgid "tag name" +msgstr "tên thẻ" + +#: judge/models/contest.py:24 +msgid "Lowercase letters and hyphens only." +msgstr "Chỉ bao gồm chữ thường và dấu gạch ngang." + +#: judge/models/contest.py:25 +msgid "tag colour" +msgstr "màu thẻ" + +#: judge/models/contest.py:26 +msgid "tag description" +msgstr "mô tả thẻ" + +#: judge/models/contest.py:45 +msgid "contest tag" +msgstr "thẻ cuộc thi" + +#: judge/models/contest.py:46 judge/models/contest.py:100 +msgid "contest tags" +msgstr "thẻ cuộc thi" + +#: judge/models/contest.py:50 +msgid "contest id" +msgstr "mã Id cuộc thi" + +#: judge/models/contest.py:52 +msgid "contest name" +msgstr "tên cuộc thi" + +#: judge/models/contest.py:53 +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." + +#: judge/models/contest.py:55 judge/models/runtime.py:124 +#: src/dmoj-wpadmin/test_project/apps/books/admin.py:20 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:27 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:27 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:27 +msgid "description" +msgstr "mô tả" + +#: judge/models/contest.py:56 judge/models/problem.py:353 +#: judge/models/runtime.py:126 +msgid "problems" +msgstr "đề bài" + +#: judge/models/contest.py:57 judge/models/contest.py:252 +msgid "start time" +msgstr "t. gian b. đầu" + +#: judge/models/contest.py:58 +msgid "end time" +msgstr "thời gian kết thúc" + +#: judge/models/contest.py:59 judge/models/problem.py:118 +#: judge/models/problem.py:377 +msgid "time limit" +msgstr "giới hạn thời gian" + +#: judge/models/contest.py:60 judge/models/problem.py:136 +msgid "publicly visible" +msgstr "công khai" + +#: judge/models/contest.py:61 +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:64 +msgid "contest rated" +msgstr "cuộc thi đã được xếp hạng" + +#: judge/models/contest.py:64 +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:66 +msgid "hide scoreboard" +msgstr "ẩn bảng điểm" + +#: judge/models/contest.py:67 +msgid "Whether the scoreboard should remain hidden for the duration of the contest." +msgstr "Liệu bảng điểm có nên được giấu trong suốt thời gian của kỳ thi." + +#: judge/models/contest.py:70 +msgid "no comments" +msgstr "không có bình luận gì" + +#: judge/models/contest.py:71 +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:73 +msgid "Rating floor for contest" +msgstr "Xếp loại thấp nhất cho cuộc thi" + +#: judge/models/contest.py:75 +msgid "Rating ceiling for contest" +msgstr "Xếp loại cao nhất cho cuộc thi" + +#: judge/models/contest.py:77 +msgid "rate all" +msgstr "đánh giá tất cả" + +#: judge/models/contest.py:77 +msgid "Rate all users who joined." +msgstr "Đánh giá những người đã tham gia." + +#: judge/models/contest.py:78 +msgid "exclude from ratings" +msgstr "không xếp hạng" + +#: judge/models/contest.py:80 +msgid "private to specific users" +msgstr "riêng tu cho thành viên cụ thể" + +#: judge/models/contest.py:81 +msgid "private contestants" +msgstr "thí sinh riêng tư" + +#: judge/models/contest.py:82 +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:84 +msgid "hide problem tags" +msgstr "ẩn các thẻ đầu bài" + +#: judge/models/contest.py:85 +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:87 +msgid "run pretests only" +msgstr "chỉ chạy các phép thử trước" + +#: judge/models/contest.py:88 +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:92 judge/models/problem.py:157 +msgid "private to organizations" +msgstr "dành riêng cho tổ chức" + +#: judge/models/contest.py:93 judge/models/problem.py:155 +#: judge/models/profile.py:76 +msgid "organizations" +msgstr "tổ chức" + +#: judge/models/contest.py:94 +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:95 judge/models/problem.py:145 +msgid "OpenGraph image" +msgstr "Ảnh OpenGraph" + +#: judge/models/contest.py:96 judge/models/profile.py:47 +msgid "Logo override image" +msgstr "Ghi đè ảnh Logo" + +#: judge/models/contest.py:98 +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:101 +msgid "the amount of live participants" +msgstr "số lượng người tham gia trực tiếp" + +#: judge/models/contest.py:102 +msgid "contest summary" +msgstr "tổng kết cuộc thi" + +#: judge/models/contest.py:103 judge/models/problem.py:147 +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:104 judge/models/profile.py:46 +msgid "access code" +msgstr "mã truy cập" + +#: judge/models/contest.py:105 +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:107 judge/models/problem.py:141 +msgid "personae non gratae" +msgstr "cá nhân - không tính điểm" + +#: judge/models/contest.py:108 +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:109 +msgid "contest format" +msgstr "định dạng kỳ thi" + +#: judge/models/contest.py:110 +msgid "The contest format module to use." +msgstr "Dạng mô đun sử dụng cho kỳ thi." + +#: judge/models/contest.py:111 +msgid "contest format configuration" +msgstr "cấu hình dạng kỳ thi" + +#: judge/models/contest.py:112 +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:233 +msgid "See private contests" +msgstr "Xem các kỳ thi riêng tư" + +#: judge/models/contest.py:234 +msgid "Edit own contests" +msgstr "Sửa các kỳ thi sở hữu" + +#: judge/models/contest.py:235 +msgid "Edit all contests" +msgstr "Sửa tất cả các kỳ thi" + +#: judge/models/contest.py:236 +msgid "Clone contest" +msgstr "Nhân bản kỳ thi" + +#: judge/models/contest.py:237 templates/contest/moss.html:74 +msgid "MOSS contest" +msgstr "Kỳ thi MOSS" + +#: judge/models/contest.py:238 +msgid "Rate contests" +msgstr "Đánh gia các kỳ thi" + +#: judge/models/contest.py:239 +msgid "Contest access codes" +msgstr "Mã truy cập kỳ thi" + +#: judge/models/contest.py:240 +msgid "Create private contests" +msgstr "Tạo kỳ thi riêng tư" + +#: judge/models/contest.py:242 judge/models/contest.py:320 +#: judge/models/contest.py:356 judge/models/contest.py:378 +#: judge/models/submission.py:83 +msgid "contest" +msgstr "cuộc thi" + +#: judge/models/contest.py:243 +msgid "contests" +msgstr "cuộc thi" + +#: judge/models/contest.py:250 +msgid "associated contest" +msgstr "cuộc thi liên quan" + +#: judge/models/contest.py:253 +msgid "score" +msgstr "điểm" + +#: judge/models/contest.py:254 +msgid "cumulative time" +msgstr "thời gian tích lũy" + +#: judge/models/contest.py:255 +msgid "virtual participation id" +msgstr "mã số tham gia ảo" + +#: judge/models/contest.py:256 +msgid "0 means non-virtual, otherwise the n-th virtual participation" +msgstr "0 có nghĩa là không ảo, n nếu tham gia ảo" + +#: judge/models/contest.py:257 +msgid "contest format specific data" +msgstr "định dạng dữ liệu cụ thể của kỳ thi" + +#: judge/models/contest.py:306 +#, python-format +msgid "%s spectating in %s" +msgstr "%s spectating trong %s" + +#: judge/models/contest.py:308 +#, python-format +msgid "%s in %s, v%d" +msgstr "%s trong %s, v%d" + +#: judge/models/contest.py:309 +#, python-format +msgid "%s in %s" +msgstr "%s trong %s" + +#: judge/models/contest.py:312 +msgid "contest participation" +msgstr "tham gia cuộc thi" + +#: judge/models/contest.py:313 +msgid "contest participations" +msgstr "tham gia cuộc thi" + +#: judge/models/contest.py:319 judge/models/contest.py:340 +#: judge/models/contest.py:379 judge/models/problem.py:352 +#: judge/models/problem.py:357 judge/models/problem.py:375 +#: judge/models/problem_data.py:35 +msgid "problem" +msgstr "vấn đề" + +#: judge/models/contest.py:321 judge/models/contest.py:344 +#: judge/models/problem.py:129 +msgid "points" +msgstr "điểm" + +#: judge/models/contest.py:322 +msgid "partial" +msgstr "một phần" + +#: judge/models/contest.py:323 judge/models/contest.py:345 +msgid "is pretested" +msgstr "được test trước" + +#: judge/models/contest.py:324 judge/models/interface.py:43 +msgid "order" +msgstr "thứ tự" + +#: judge/models/contest.py:325 +msgid "output prefix length override" +msgstr "ghi đè độ dài output prefix" + +#: judge/models/contest.py:326 +msgid "Maximum number of submissions for this problem, or 0 for no limit." +msgstr "Số lượng tối đa lần nộp cho bài này, hoặc 0 nếu không giới hạn." + +#: judge/models/contest.py:328 +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:333 +msgid "contest problem" +msgstr "đề bài của cuộc thi" + +#: judge/models/contest.py:334 +msgid "contest problems" +msgstr "đề bài của cuộc thi" + +#: judge/models/contest.py:338 judge/models/submission.py:181 +msgid "submission" +msgstr "nộp bài" + +#: judge/models/contest.py:342 judge/models/contest.py:357 +msgid "participation" +msgstr "tham dự" + +#: judge/models/contest.py:346 +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:350 +msgid "contest submission" +msgstr "nộp bài thi" + +#: judge/models/contest.py:351 +msgid "contest submissions" +msgstr "nộp bài thi" + +#: judge/models/contest.py:359 +msgid "rank" +msgstr "hạng" + +#: judge/models/contest.py:360 +msgid "rating" +msgstr "đánh giá" + +#: judge/models/contest.py:361 +msgid "volatility" +msgstr "volative" + +#: judge/models/contest.py:362 +msgid "last rated" +msgstr "lần xếp hạng cuối" + +#: judge/models/contest.py:366 +msgid "contest rating" +msgstr "xếp hạng cuộc thi" + +#: judge/models/contest.py:367 +msgid "contest ratings" +msgstr "xếp hạng cuộc thi" + +#: judge/models/contest.py:386 +msgid "contest moss result" +msgstr "kết quả kỳ thi moss" + +#: judge/models/contest.py:387 +msgid "contest moss results" +msgstr "kết quả kỳ thi moss" + +#: judge/models/interface.py:24 +msgid "configuration item" +msgstr "cấu hình" + +#: judge/models/interface.py:25 +msgid "miscellaneous configuration" +msgstr "cấu hình khác" + +#: judge/models/interface.py:37 +msgid "navigation item" +msgstr "mục điều hướng" + +#: judge/models/interface.py:38 +msgid "navigation bar" +msgstr "thanh điều hướng" + +#: judge/models/interface.py:44 +msgid "identifier" +msgstr "định danh" + +#: judge/models/interface.py:45 +msgid "label" +msgstr "nhãn" + +#: judge/models/interface.py:47 +msgid "highlight regex" +msgstr "làm nổi regex" + +#: judge/models/interface.py:48 +msgid "parent item" +msgstr "mục cha" + +#: judge/models/interface.py:66 +msgid "post title" +msgstr "tiêu đề bài viết" + +#: judge/models/interface.py:67 judge/models/problem.py:395 +msgid "authors" +msgstr "tác giả" + +#: judge/models/interface.py:68 +msgid "slug" +msgstr "slug" + +#: judge/models/interface.py:69 judge/models/problem.py:393 +msgid "public visibility" +msgstr "hiển thị công khai" + +#: judge/models/interface.py:70 +msgid "sticky" +msgstr "dán" + +#: judge/models/interface.py:71 +msgid "publish after" +msgstr "xuất bản sau" + +#: judge/models/interface.py:72 +msgid "post content" +msgstr "đăng nội dung" + +#: judge/models/interface.py:73 +msgid "post summary" +msgstr "đăng bài tóm tắt" + +#: judge/models/interface.py:74 +msgid "openGraph image" +msgstr "ảnh OpenGraph" + +#: judge/models/interface.py:91 +msgid "Edit all posts" +msgstr "Chỉnh sửa tất cả bài viết" + +#: judge/models/interface.py:93 +msgid "blog post" +msgstr "bài đăng blog" + +#: judge/models/interface.py:94 +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:29 +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:26 +msgid "problem category ID" +msgstr "ID của đề bài" + +#: judge/models/problem.py:27 +msgid "problem category name" +msgstr "phân loại đề bài" + +#: judge/models/problem.py:34 +msgid "problem type" +msgstr "kiểu vấn đề" + +#: judge/models/problem.py:35 judge/models/problem.py:113 +msgid "problem types" +msgstr "kiểu vấn đề" + +#: judge/models/problem.py:39 +msgid "problem group ID" +msgstr "iD của nhóm đề bài" + +#: judge/models/problem.py:40 +msgid "problem group name" +msgstr "tên nhóm đề bài" + +#: judge/models/problem.py:47 judge/models/problem.py:116 +msgid "problem group" +msgstr "nhóm đề bài" + +#: judge/models/problem.py:48 +msgid "problem groups" +msgstr "nhóm đề bài" + +#: judge/models/problem.py:52 +msgid "key" +msgstr "khóa" + +#: judge/models/problem.py:54 +msgid "link" +msgstr "liên kết" + +#: judge/models/problem.py:55 +msgid "full name" +msgstr "tên đầy đủ" + +#: judge/models/problem.py:56 judge/models/profile.py:32 +#: judge/models/runtime.py:23 +msgid "short name" +msgstr "tên viết tắt" + +#: judge/models/problem.py:57 +msgid "Displayed on pages under this license" +msgstr "Được hiển thị trên các trang theo giấy phép này" + +#: judge/models/problem.py:58 +msgid "icon" +msgstr "biểu tượng" + +#: judge/models/problem.py:58 +msgid "URL to the icon" +msgstr "URL cho biểu tượng" + +#: judge/models/problem.py:59 +msgid "license text" +msgstr "văn bản cấp phép" + +#: judge/models/problem.py:68 +msgid "license" +msgstr "giấy phép" + +#: judge/models/problem.py:69 +msgid "licenses" +msgstr "giấy phép" + +#: judge/models/problem.py:96 +msgid "problem code" +msgstr "mã đầu bài" + +#: judge/models/problem.py:98 +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:100 +msgid "problem name" +msgstr "tên bài toán" + +#: judge/models/problem.py:101 +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:103 +msgid "problem body" +msgstr "bài toán" + +#: judge/models/problem.py:104 +msgid "creators" +msgstr "người tạo" + +#: judge/models/problem.py:105 +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:107 +msgid "curators" +msgstr "giám khảo" + +#: judge/models/problem.py:108 +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:110 +msgid "testers" +msgstr "người kiểm tra" + +#: judge/models/problem.py:112 +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:114 +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:117 +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:119 +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:123 judge/models/problem.py:380 +msgid "memory limit" +msgstr "giới hạn bộ nhớ" + +#: judge/models/problem.py:124 +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:130 +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:133 +msgid "allows partial points" +msgstr "cho phép cho điểm từng phần" + +#: judge/models/problem.py:134 +msgid "allowed languages" +msgstr "ngôn ngữ cho phép" + +#: judge/models/problem.py:135 +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:137 +msgid "manually managed" +msgstr "quản lý thủ công" + +#: judge/models/problem.py:138 +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:139 +msgid "date of publishing" +msgstr "ngày xuất bản" + +#: judge/models/problem.py:140 +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:142 +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:144 +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:146 +msgid "problem summary" +msgstr "tổng quan bài tập" + +#: judge/models/problem.py:148 +msgid "number of users" +msgstr "số thành viên" + +#: judge/models/problem.py:149 +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:150 +msgid "solve rate" +msgstr "tỉ lệ giải được" + +#: judge/models/problem.py:156 +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:358 judge/models/problem.py:376 +#: judge/models/runtime.py:99 +msgid "language" +msgstr "ngôn ngữ" + +#: judge/models/problem.py:359 +msgid "translated name" +msgstr "tên bộ dịch" + +#: judge/models/problem.py:360 +msgid "translated description" +msgstr "mô tả bộ dịch" + +#: judge/models/problem.py:364 +msgid "problem translation" +msgstr "dịch đầu bài" + +#: judge/models/problem.py:365 +msgid "problem translations" +msgstr "dịch đầu bài" + +#: judge/models/problem.py:369 +msgid "clarified problem" +msgstr "bài tập được làm rõ" + +#: judge/models/problem.py:370 +msgid "clarification body" +msgstr "nội dung làm rõ" + +#: judge/models/problem.py:371 +msgid "clarification timestamp" +msgstr "thời gian làm rõ" + +#: judge/models/problem.py:386 +msgid "language-specific resource limit" +msgstr "giới hạn tài nguyên theo ngôn ngữ" + +#: judge/models/problem.py:387 +msgid "language-specific resource limits" +msgstr "giới hạn tài nguyên theo ngôn ngữ" + +#: judge/models/problem.py:391 +msgid "associated problem" +msgstr "đầu bài liên quan" + +#: judge/models/problem.py:394 +msgid "publish date" +msgstr "ngày công bố" + +#: judge/models/problem.py:396 +msgid "editorial content" +msgstr "biên tập kỳ thi" + +#: judge/models/problem.py:412 +msgid "solution" +msgstr "lời giải" + +#: judge/models/problem.py:413 +msgid "solutions" +msgstr "lời giải" + +#: judge/models/problem_data.py:23 +msgid "Standard" +msgstr "Mặc định" + +#: judge/models/problem_data.py:24 +msgid "Floats" +msgstr "Số thực" + +#: judge/models/problem_data.py:25 +msgid "Floats (absolute)" +msgstr "Số thực (tuyệt đối)" + +#: judge/models/problem_data.py:26 +msgid "Floats (relative)" +msgstr "Số thực (tương đối)" + +#: judge/models/problem_data.py:27 +msgid "Non-trailing spaces" +msgstr "Dấu cách liền" + +#: judge/models/problem_data.py:28 +msgid "Unordered" +msgstr "Không sắp xếp" + +#: judge/models/problem_data.py:29 +msgid "Byte identical" +msgstr "Byte tương tự" + +#: judge/models/problem_data.py:30 +msgid "Line-by-line" +msgstr "Dòng với dòng" + +#: judge/models/problem_data.py:37 +msgid "data zip file" +msgstr "tập tin dữ liệu nén dạng zip" + +#: judge/models/problem_data.py:39 +msgid "generator file" +msgstr "file tạo mã" + +#: judge/models/problem_data.py:41 judge/models/problem_data.py:90 +msgid "output prefix length" +msgstr "độ dài prefix" + +#: judge/models/problem_data.py:42 judge/models/problem_data.py:91 +msgid "output limit length" +msgstr "hạn chế chiều dài đầu ra" + +#: judge/models/problem_data.py:43 +msgid "init.yml generation feedback" +msgstr "phải hồi init.yml" + +#: judge/models/problem_data.py:44 judge/models/problem_data.py:92 +msgid "checker" +msgstr "kiểm tra" + +#: judge/models/problem_data.py:45 judge/models/problem_data.py:93 +msgid "checker arguments" +msgstr "đối số kiểm tra" + +#: judge/models/problem_data.py:46 judge/models/problem_data.py:94 +msgid "checker arguments as a JSON object" +msgstr "kiểm tra đối số như là một đối tượng JSON" + +#: judge/models/problem_data.py:77 +msgid "problem data set" +msgstr "tập dữ liệu đề bài" + +#: judge/models/problem_data.py:79 +msgid "case position" +msgstr "vị trí phép thử" + +#: judge/models/problem_data.py:80 +msgid "case type" +msgstr "kiểu phép thử" + +#: judge/models/problem_data.py:81 +msgid "Normal case" +msgstr "Test đơn" + +#: judge/models/problem_data.py:82 +msgid "Batch start" +msgstr "Bắt đầu lô" + +#: judge/models/problem_data.py:83 +msgid "Batch end" +msgstr "Hết lô" + +#: judge/models/problem_data.py:85 +msgid "input file name" +msgstr "tên tập tin đầu vào" + +#: judge/models/problem_data.py:86 +msgid "output file name" +msgstr "tên tập tin đầu ra" + +#: judge/models/problem_data.py:87 +msgid "generator arguments" +msgstr "bộ sinh đối số" + +#: judge/models/problem_data.py:88 +msgid "point value" +msgstr "giá trị điểm" + +#: judge/models/problem_data.py:89 +msgid "case is pretest?" +msgstr "test mẫu?" + +#: judge/models/profile.py:29 +msgid "organization title" +msgstr "tiêu đề của tổ chức" + +#: judge/models/profile.py:30 +msgid "organization slug" +msgstr "organization slug" + +#: judge/models/profile.py:31 +msgid "Organization name shown in URL" +msgstr "Tên tổ chức thể hiện trong URL" + +#: judge/models/profile.py:33 +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:34 +msgid "organization description" +msgstr "mô tả tổ chức" + +#: judge/models/profile.py:35 +msgid "registrant" +msgstr "người đăng ký" + +#: judge/models/profile.py:36 +msgid "User who registered this organization" +msgstr "Người dùng đã đăng ký tổ chức này" + +#: judge/models/profile.py:37 +msgid "administrators" +msgstr "quản trị viên" + +#: judge/models/profile.py:38 +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:39 +msgid "creation date" +msgstr "ngày tạo" + +#: judge/models/profile.py:40 +msgid "is open organization?" +msgstr "là tổ chức mở?" + +#: judge/models/profile.py:41 +msgid "Allow joining organization" +msgstr "Cho phép tham gia tổ chức" + +#: judge/models/profile.py:42 +msgid "maximum size" +msgstr "dung lượng tối đa" + +#: judge/models/profile.py:43 +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:45 +msgid "Student access code" +msgstr "Mã truy cập sinh viên" + +#: judge/models/profile.py:49 +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:75 judge/models/profile.py:91 +#: judge/models/profile.py:190 +msgid "organization" +msgstr "tổ chức" + +#: judge/models/profile.py:80 +msgid "user associated" +msgstr "liên kết với người sử dụng" + +#: judge/models/profile.py:81 +msgid "self-description" +msgstr "tự mô tả" + +#: judge/models/profile.py:82 +msgid "location" +msgstr "vị trí" + +#: judge/models/profile.py:84 +msgid "preferred language" +msgstr "ngôn ngữ" + +#: judge/models/profile.py:89 +msgid "last access time" +msgstr "lần truy cập cuối cùng" + +#: judge/models/profile.py:90 +msgid "last IP" +msgstr "IP" + +#: judge/models/profile.py:93 +msgid "display rank" +msgstr "hiển thị xếp hạng" + +#: judge/models/profile.py:95 +msgid "comment mute" +msgstr "bình luận tắt" + +#: judge/models/profile.py:95 +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:97 +msgid "unlisted user" +msgstr "thành viên không được liệt kê" + +#: judge/models/profile.py:97 +msgid "User will not be ranked." +msgstr "Thành viên không được xếp hạng." + +#: judge/models/profile.py:100 +msgid "user script" +msgstr "script tự định nghĩa" + +#: judge/models/profile.py:101 +msgid "User-defined JavaScript for site customization." +msgstr "JavaScript tự định nghĩa để tùy chỉnh trang web" + +#: judge/models/profile.py:102 +msgid "current contest" +msgstr "cuộc thi hiện tại" + +#: judge/models/profile.py:104 +msgid "math engine" +msgstr "bộ xử lý toán học" + +#: judge/models/profile.py:106 +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:107 +msgid "2FA enabled" +msgstr "2FA có hiệu lực" + +#: judge/models/profile.py:108 +msgid "check to enable TOTP-based two factor authentication" +msgstr "đánh dấu để hiệu lực hóa xác minh hai yếu tố TOTP-based" + +#: judge/models/profile.py:109 +msgid "TOTP key" +msgstr "Mã TOTP" + +#: judge/models/profile.py:110 +msgid "32 character base32-encoded key for TOTP" +msgstr "mã 32 ký tự base32-encoded cho TOTP" + +#: judge/models/profile.py:112 +msgid "TOTP key must be empty or base32" +msgstr "Mã TOTP cần rỗng hoặc base32" + +#: judge/models/profile.py:113 +msgid "internal notes" +msgstr "ghi chú nội bộ" + +#: judge/models/profile.py:114 +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:184 +msgid "user profile" +msgstr "hồ sơ người dùng" + +#: judge/models/profile.py:185 +msgid "user profiles" +msgstr "hồ sơ người dùng" + +#: judge/models/profile.py:192 +msgid "request time" +msgstr "thời gian yêu cầu" + +#: judge/models/profile.py:193 +msgid "state" +msgstr "trạng thái" + +#: judge/models/profile.py:198 +msgid "reason" +msgstr "lý do" + +#: judge/models/profile.py:201 +msgid "organization join request" +msgstr "yêu cầu tham gia tổ chức" + +#: judge/models/profile.py:202 +msgid "organization join requests" +msgstr "yêu cầu tham gia tổ chức" + +#: judge/models/runtime.py:18 +msgid "short identifier" +msgstr "nhận dạng ngắn" + +#: judge/models/runtime.py:19 +msgid "The identifier for this language; the same as its executor id for judges." +msgstr "Mã định danh ngôn ngữ này; giống như id chấp hành cho bộ chấm." + +#: judge/models/runtime.py:21 +msgid "long name" +msgstr "tên dài" + +#: judge/models/runtime.py:22 +msgid "Longer name for the language, e.g. \"Python 2\" or \"C++11\"." +msgstr "Tên dài của ngôn ngữ, ví dụ như \"Python 2\" hay \"C ++ 11\"." + +#: judge/models/runtime.py:24 +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 "Tên ngắn, dễ đọc hơn, để hiển thị công khai; Ví dụ: \"PY2\" hoặc \"C ++ 11\". Nếu để trống, nó sẽ sử dụng ID ngắn." + +#: judge/models/runtime.py:28 +msgid "common name" +msgstr "tên chung" + +#: judge/models/runtime.py:29 +msgid "Common name for the language. For example, the common name for C++03, C++11, and C++14 would be \"C++\"" +msgstr "Tên phổ biến cho các ngôn ngữ. Ví dụ, tên gọi chung cho C ++ 03, 11 C ++ và C ++ 14 sẽ là \"C++\"" + +#: judge/models/runtime.py:31 +msgid "ace mode name" +msgstr "chế độ tên ace" + +#: judge/models/runtime.py:32 +msgid "Language ID for Ace.js editor highlighting, appended to \"mode-\" to determine the Ace JavaScript file to use, e.g., \"python\"." +msgstr "ID cho ngôn ngữ Ace.js, được nối thêm vào \"mode-\" để xác định tập tin Ace JavaScript để sử dụng, ví dụ như, \"python\"." + +#: judge/models/runtime.py:34 +msgid "pygments name" +msgstr "tên pygments" + +#: judge/models/runtime.py:35 +msgid "Language ID for Pygments highlighting in source windows." +msgstr "Highligh ID cho Pygments trong cửa sổ mã nguồn." + +#: judge/models/runtime.py:36 +msgid "code template" +msgstr "code mẫu" + +#: judge/models/runtime.py:37 +msgid "Code template to display in submission editor." +msgstr "Mẫu mã nguồn hiển thị trong trình soạn thảo khi nộp bài." + +#: judge/models/runtime.py:38 +msgid "runtime info override" +msgstr "ghi đè thời gian chạy" + +#: judge/models/runtime.py:39 +msgid "Do not set this unless you know what you're doing! It will override the usually more specific, judge-provided runtime info!" +msgstr "Không đặt này trừ khi bạn biết những gì bạn đang làm! Nó sẽ thiết lập các thông tin thời gian chạy, cung cấp cho chương trình chấm!" + +#: judge/models/runtime.py:41 +msgid "language description" +msgstr "mô tả ngôn ngữ" + +#: judge/models/runtime.py:42 +msgid "Use field this to inform users of quirks with your environment, additional restrictions, etc." +msgstr "Sử dụng trường này để thông báo cho người dùng quirks môi trường, hạn chế bổ sung, vv." + +#: judge/models/runtime.py:44 +msgid "extension" +msgstr "phần mở rộng" + +#: judge/models/runtime.py:45 +msgid "The extension of source files, e.g., \"py\" or \"cpp\"." +msgstr "Phần mở rộng tập tin mã nguồn, ví dụ như, \"py\" hay \"cpp\"." + +#: judge/models/runtime.py:100 +msgid "languages" +msgstr "ngôn ngữ" + +#: judge/models/runtime.py:104 +msgid "language to which this runtime belongs" +msgstr "ngôn ngữ tạo ra runtime" + +#: judge/models/runtime.py:105 +msgid "judge on which this runtime exists" +msgstr "máy chấm tạo ra runtime" + +#: judge/models/runtime.py:106 +msgid "runtime name" +msgstr "tên runtime" + +#: judge/models/runtime.py:107 +msgid "runtime version" +msgstr "phiên bản runtime" + +#: judge/models/runtime.py:108 +msgid "order in which to display this runtime" +msgstr "thứ tự hiện thị runtime" + +#: judge/models/runtime.py:112 +msgid "Server name, hostname-style" +msgstr "Tên server, tên host" + +#: judge/models/runtime.py:113 +msgid "time of creation" +msgstr "thời gian tạo" + +#: judge/models/runtime.py:114 +msgid "A key to authenticated this judge" +msgstr "Mã truy cập chấm bài" + +#: judge/models/runtime.py:115 +msgid "authentication key" +msgstr "mã xác thực" + +#: judge/models/runtime.py:116 +msgid "block judge" +msgstr "khóa trình chấm" + +#: judge/models/runtime.py:117 +msgid "Whether this judge should be blocked from connecting, even if its key is correct." +msgstr "" + +#: judge/models/runtime.py:119 +msgid "judge online status" +msgstr "trạng thái bộ chấm online" + +#: judge/models/runtime.py:120 +msgid "judge start time" +msgstr "thời gian bắt đầu chấm" + +#: judge/models/runtime.py:121 +msgid "response time" +msgstr "thời gian đáp ứng" + +#: judge/models/runtime.py:122 +msgid "system load" +msgstr "mức tải của hệ thống" + +#: judge/models/runtime.py:123 +msgid "Load for the last minute, divided by processors to be fair." +msgstr "Tải cho phút cuối cùng, chia cho số bộ vi xử lý." + +#: judge/models/runtime.py:127 judge/models/runtime.py:167 +msgid "judges" +msgstr "chấm điểm" + +#: judge/models/runtime.py:166 +msgid "judge" +msgstr "máy chấm" + +#: judge/models/submission.py:20 judge/models/submission.py:47 +#: judge/utils/problems.py:86 +msgid "Accepted" +msgstr "Chấp nhận (AC)" + +#: judge/models/submission.py:21 judge/models/submission.py:48 +msgid "Wrong Answer" +msgstr "Kết quả sai (WA)" + +#: judge/models/submission.py:22 judge/models/submission.py:50 +msgid "Time Limit Exceeded" +msgstr "Quá thời gian (TLE)" + +#: judge/models/submission.py:23 judge/models/submission.py:51 +msgid "Memory Limit Exceeded" +msgstr "Tràn bộ nhớ (MLE)" + +#: judge/models/submission.py:24 judge/models/submission.py:52 +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 +msgid "Invalid Return" +msgstr "Lỗi khi chạy chương trình (IR)" + +#: judge/models/submission.py:26 judge/models/submission.py:54 +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:88 +msgid "Compile Error" +msgstr "Lỗi dịch (CE)" + +#: judge/models/submission.py:28 judge/models/submission.py:40 +msgid "Internal Error" +msgstr "Lỗi Nội Bộ" + +#: judge/models/submission.py:29 +msgid "Short circuit" +msgstr "Ngắn mạch" + +#: judge/models/submission.py:30 judge/models/submission.py:42 +#: judge/models/submission.py:61 +msgid "Aborted" +msgstr "Bị hủy bỏ" + +#: judge/models/submission.py:36 judge/models/submission.py:57 +msgid "Queued" +msgstr "Đang chờ" + +#: judge/models/submission.py:37 judge/models/submission.py:58 +msgid "Processing" +msgstr "Đang xử lý" + +#: judge/models/submission.py:38 judge/models/submission.py:59 +msgid "Grading" +msgstr "Chấm điểm" + +#: judge/models/submission.py:39 judge/models/submission.py:60 +msgid "Completed" +msgstr "Đã Hoàn Thành" + +#: judge/models/submission.py:56 +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 +msgid "submission time" +msgstr "ngày nộp bài" + +#: judge/models/submission.py:67 judge/models/submission.py:201 +msgid "execution time" +msgstr "thời gian thực hiện tối đa" + +#: judge/models/submission.py:68 judge/models/submission.py:202 +msgid "memory usage" +msgstr "bộ nhớ sử dụng" + +#: judge/models/submission.py:69 judge/models/submission.py:203 +msgid "points granted" +msgstr "điểm được cho" + +#: judge/models/submission.py:70 +msgid "submission language" +msgstr "ngôn ngữ lập trình" + +#: judge/models/submission.py:71 +msgid "status" +msgstr "trạng thái" + +#: judge/models/submission.py:72 +msgid "result" +msgstr "kết quả" + +#: judge/models/submission.py:74 +msgid "compile errors" +msgstr "lỗi dịch" + +#: judge/models/submission.py:76 +msgid "batched cases" +msgstr "nhóm test" + +#: judge/models/submission.py:77 +msgid "test case points" +msgstr "điểm cho testcase" + +#: judge/models/submission.py:78 +msgid "test case total points" +msgstr "tổng điểm test case" + +#: judge/models/submission.py:79 +msgid "judged on" +msgstr "đánh giá trên" + +#: judge/models/submission.py:81 +msgid "was rejudged by admin" +msgstr "được chấm lại bởi admin" + +#: judge/models/submission.py:82 +msgid "was ran on pretests only" +msgstr "chỉ được chạy bởi test sơ bộ" + +#: judge/models/submission.py:182 templates/contest/moss.html:58 +msgid "submissions" +msgstr "nộp bài" + +#: judge/models/submission.py:186 judge/models/submission.py:197 +msgid "associated submission" +msgstr "bài nộp liên quan" + +#: judge/models/submission.py:188 +msgid "source code" +msgstr "mã nguồn" + +#: judge/models/submission.py:199 +msgid "test case ID" +msgstr "mã testcase" + +#: judge/models/submission.py:200 +msgid "status flag" +msgstr "cờ trạng thái" + +#: judge/models/submission.py:204 +msgid "points possible" +msgstr "khả năng điểm" + +#: judge/models/submission.py:205 +msgid "batch number" +msgstr "lô số" + +#: judge/models/submission.py:206 +msgid "judging feedback" +msgstr "phản hồi chấm thi" + +#: judge/models/submission.py:207 +msgid "extended judging feedback" +msgstr "" + +#: judge/models/submission.py:208 +msgid "program output" +msgstr "lập trình đầu ra" + +#: judge/models/submission.py:216 +msgid "submission test case" +msgstr "test case của bài" + +#: judge/models/submission.py:217 +msgid "submission test cases" +msgstr "các test case của bài" + +#: judge/models/ticket.py:10 +msgid "ticket title" +msgstr "" + +#: judge/models/ticket.py:11 +msgid "ticket creator" +msgstr "" + +#: judge/models/ticket.py:13 +msgid "creation time" +msgstr "" + +#: judge/models/ticket.py:14 +msgid "assignees" +msgstr "" + +#: judge/models/ticket.py:15 +msgid "quick notes" +msgstr "" + +#: judge/models/ticket.py:16 +msgid "Staff notes for this issue to aid in processing." +msgstr "" + +#: judge/models/ticket.py:17 +msgid "linked item type" +msgstr "" + +#: judge/models/ticket.py:19 +msgid "linked item ID" +msgstr "" + +#: judge/models/ticket.py:21 +msgid "is ticket open?" +msgstr "" + +#: judge/models/ticket.py:25 +msgid "ticket" +msgstr "" + +#: judge/models/ticket.py:27 +msgid "poster" +msgstr "" + +#: judge/models/ticket.py:30 +msgid "message time" +msgstr "" + +#: judge/pdf_problems.py:134 judge/pdf_problems.py:186 +#: judge/pdf_problems.py:246 +msgid "Page [page] of [topage]" +msgstr "Trang [page] /[topage]" + +#: judge/tasks/moss.py:25 +msgid "Running MOSS" +msgstr "" + +#: judge/tasks/submission.py:43 +msgid "Modifying submissions" +msgstr "" + +#: judge/tasks/submission.py:56 +msgid "Recalculating user points" +msgstr "" + +#: judge/utils/problem_data.py:63 +msgid "Empty batches not allowed." +msgstr "Lệnh theo lô trống là không được phép." + +#: judge/utils/problem_data.py:82 +#, python-format +msgid "Points must be defined for non-batch case #%d." +msgstr "Điểm phải được xác định cho các trường hợp không theo lô #%d." + +#: judge/utils/problem_data.py:87 +#, python-format +msgid "Input file for case %d does not exist: %s" +msgstr "Các tập tin đầu vào cho trường hợp %d không tồn tại: %s" + +#: judge/utils/problem_data.py:90 +#, python-format +msgid "Output file for case %d does not exist: %s" +msgstr "Các tập tin đầu vào cho trường hợp %d không tồn tại: %s" + +#: judge/utils/problem_data.py:115 +#, python-format +msgid "Batch start case #%d requires points." +msgstr "Phép thử theo lô #%d yêu cầu điểm." + +#: judge/utils/problem_data.py:136 +#, python-format +msgid "Attempt to end batch outside of one in case #%d" +msgstr "Cố gắng để kết thúc bộ số liệu nằm ngoài một trong các trường hợp #%d" + +#: judge/utils/problem_data.py:154 +msgid "How did you corrupt the zip path?" +msgstr "Bạn đã làm hỏng đường dẫn zip?" + +#: judge/utils/problem_data.py:160 +msgid "How did you corrupt the generator path?" +msgstr "" + +#: judge/utils/problems.py:76 +msgid "Can't pass both queryset and keyword filters" +msgstr "Không thể bỏ qua cả bộ lọc queryset và keyword" + +#: judge/utils/problems.py:87 +msgid "Wrong" +msgstr "" + +#: judge/utils/problems.py:89 +msgid "Timeout" +msgstr "" + +#: judge/utils/problems.py:90 +msgid "Error" +msgstr "" + +#: 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/timedelta.py:49 +msgctxt "time format with day" +msgid "%d day %h:%m:%s" +msgid_plural "%d days %h:%m:%s" +msgstr[0] "%d ngày %h:%m:%s" + +#: judge/utils/timedelta.py:53 +msgctxt "time format without day" +msgid "%h:%m:%s" +msgstr "%h:%m:%s" + +#: 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] "%d ngày %h:%m" + +#: judge/utils/timedelta.py:61 +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d ngày" + +#: judge/utils/timedelta.py:63 +msgctxt "hours and minutes" +msgid "%h:%m" +msgstr "%h:%m" + +#: judge/views/blog.py:38 +#, python-format +msgid "Page %d of Posts" +msgstr "Trang %d của bài viết" + +#: judge/views/comment.py:27 +msgid "Messing around, are we?" +msgstr "Bị rối?" + +#: judge/views/comment.py:36 +msgid "You must solve at least one problem before you can vote." +msgstr "" + +#: judge/views/comment.py:63 +msgid "You already voted." +msgstr "Bạn đã bỏ phiếu rồi." + +#: judge/views/comment.py:120 judge/views/organization.py:299 +msgid "Edited from site" +msgstr "Biên tập từ trang web" + +#: judge/views/comment.py:141 +msgid "Editing comment" +msgstr "Đang chỉnh sửa bình luận" + +#: judge/views/contests.py:49 judge/views/contests.py:211 +#: judge/views/contests.py:214 judge/views/contests.py:385 +msgid "No such contest" +msgstr "Không có cuộc thi như vậy" + +#: judge/views/contests.py:50 judge/views/contests.py:212 +#, 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:75 +msgid "Contests" +msgstr "Cuộc thi" + +#: judge/views/contests.py:215 +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:218 +#, 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:242 +msgid "Clone Contest" +msgstr "" + +#: judge/views/contests.py:305 +msgid "Contest not ongoing" +msgstr "Cuộc thi không đang diễn ra" + +#: judge/views/contests.py:306 +#, python-format +msgid "\"%s\" is not currently ongoing." +msgstr "\"%s\" không đang diễn ra." + +#: judge/views/contests.py:310 +msgid "Already in contest" +msgstr "Đang trong cuộc thi" + +#: judge/views/contests.py:311 +#, python-format +msgid "You are already in a contest: \"%s\"." +msgstr "Bạn đang ở một cuộc thi: \"%s\"." + +#: judge/views/contests.py:314 +msgid "Banned from joining" +msgstr "" + +#: judge/views/contests.py:315 +msgid "You have been declared persona non grata for this contest. You are permanently barred from joining this contest." +msgstr "" + +#: judge/views/contests.py:375 +#, python-format +msgid "Enter access code for \"%s\"" +msgstr "" + +#: judge/views/contests.py:386 +#, 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:405 +msgid "ContestCalendar requires integer year and month" +msgstr "" + +#: judge/views/contests.py:445 +#, python-format +msgid "Contests in %(month)s" +msgstr "Cuộc thi tại %(month)s" + +#: judge/views/contests.py:445 +msgid "F Y" +msgstr "" + +#: judge/views/contests.py:531 +msgid "???" +msgstr "" + +#: judge/views/contests.py:594 +#, python-format +msgid "%s Rankings" +msgstr "%s xếp hạng" + +#: judge/views/contests.py:610 +#, python-format +msgid "Your participation in %s" +msgstr "Tham gia của bạn vào %s" + +#: judge/views/contests.py:611 +#, python-format +msgid "%s's participation in %s" +msgstr "%s tham gia vào %s" + +#: judge/views/contests.py:615 +msgid "Live" +msgstr "Trực tuyến" + +#: judge/views/contests.py:627 templates/contest/contest-tabs.html:13 +msgid "Participation" +msgstr "Tham gia" + +#: judge/views/contests.py:654 +#, python-format +msgid "%s MOSS Results" +msgstr "" + +#: judge/views/contests.py:681 +#, python-format +msgid "Running MOSS for %s..." +msgstr "" + +#: judge/views/contests.py:704 +#, python-format +msgid "Contest tag: %s" +msgstr "Thẻ cuộc thi %s" + +#: judge/views/error.py:14 +msgid "404 error" +msgstr "lỗi 404" + +#: judge/views/error.py:15 +#, python-format +msgid "Could not find page \"%s\"" +msgstr "Không thể tìm thấy trang \"%s\"" + +#: judge/views/error.py:22 +#, python-format +msgid "no permission for %s" +msgstr "không cho phép %s" + +#: judge/views/error.py:30 +#, python-format +msgid "corrupt page %s" +msgstr "trang lỗi %s" + +#: judge/views/language.py:12 templates/status/judge-status-table.html:9 +#: templates/status/status-tabs.html:5 +msgid "Runtimes" +msgstr "Đang chạy" + +#: judge/views/organization.py:44 judge/views/organization.py:47 +msgid "No such organization" +msgstr "Không có tổ chức như vậy" + +#: judge/views/organization.py:45 +#, 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 +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 +#: templates/organization/list.html:15 templates/user/user-list-tabs.html:5 +msgid "Organizations" +msgstr "Tổ chức" + +#: judge/views/organization.py:93 +#, 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 +msgid "Joining organization" +msgstr "Đang tham gia tổ chức" + +#: judge/views/organization.py:118 +msgid "You are already in the organization." +msgstr "Bạn đã trong tổ chức." + +#: judge/views/organization.py:121 +msgid "This organization is not open." +msgstr "Tổ chức này không phải là mở." + +#: judge/views/organization.py:138 +msgid "Leaving organization" +msgstr "Rời khỏi tổ chức" + +#: judge/views/organization.py:138 +#, python-format +msgid "You are not in \"%s\"." +msgstr "Bạn đang không ở trong \"%s\"." + +#: judge/views/organization.py:162 +#, python-format +msgid "Request to join %s" +msgstr "Yêu cầu tham gia %s" + +#: judge/views/organization.py:180 +msgid "Join request detail" +msgstr "Chi tiết yêu cầu tham gia" + +#: judge/views/organization.py:209 +#, 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:240 +#, 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:252 +#, 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:253 +#, 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:283 +#, python-format +msgid "Editing %s" +msgstr "Đang chỉnh sửa %s" + +#: judge/views/organization.py:307 judge/views/organization.py:315 +msgid "Can't edit organization" +msgstr "Không thể chỉnh sửa tổ chức" + +#: judge/views/organization.py:308 +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:316 +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:321 judge/views/organization.py:325 +msgid "Can't kick user" +msgstr "Không thể loại thành viên" + +#: judge/views/organization.py:322 +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:326 +#, 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:68 +msgid "No such problem" +msgstr "Không có vấn đề như vậy" + +#: 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:111 +#, python-brace-format +msgid "Editorial for {0}" +msgstr "Hướng giải của {0}" + +#: judge/views/problem.py:114 +#, python-brace-format +msgid "Editorial for {0}" +msgstr "Hướng giải của {0}" + +#: judge/views/problem.py:285 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:546 +msgid "Banned from submitting" +msgstr "" + +#: judge/views/problem.py:547 +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:560 +msgid "Too many submissions" +msgstr "Quá nhiều bài nộp" + +#: judge/views/problem.py:561 +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:627 judge/views/problem.py:630 +#, python-format +msgid "Submit to %(problem)s" +msgstr "Nộp lời giải cho %(problem)s" + +#: judge/views/problem.py:646 +msgid "Clone Problem" +msgstr "Nhân bản bài tập" + +#: 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" + +#: judge/views/problem_data.py:39 +msgid "Checker arguments is invalid JSON" +msgstr "Đối số kiểm tra là đối tượng JSON không hợp lệ" + +#: judge/views/problem_data.py:46 +msgid "Your zip file is invalid!" +msgstr "File nén bị lỗi!" + +#: judge/views/problem_data.py:104 +#, python-brace-format +msgid "Comparing submissions for {0}" +msgstr "So sánh các bài nộp cho {0}" + +#: judge/views/problem_data.py:107 +#, python-brace-format +msgid "Comparing submissions for {0}" +msgstr "So sánh các bài nộp cho {0}" + +#: judge/views/problem_data.py:142 +#, python-brace-format +msgid "Editing data for {0}" +msgstr "Sửa dữ liệu cho {0}" + +#: judge/views/problem_data.py:145 +#, python-format +msgid "Editing data for %s" +msgstr "Chỉnh sửa các dữ liệu cho %s" + +#: judge/views/problem_data.py:237 judge/views/problem_data.py:238 +#, python-format +msgid "Generated init.yml for %s" +msgstr "Tạo file Init.yml cho %s" + +#: judge/views/problem_manage.py:50 judge/views/problem_manage.py:53 +#, python-format +msgid "Managing submissions for %s" +msgstr "Quản lí các bài nộp cho %s" + +#: judge/views/problem_manage.py:95 +#, python-format +msgid "Rejudging selected submissions for %s..." +msgstr "Chấm lại các bài nộp đã chọn cho %s..." + +#: judge/views/problem_manage.py:110 +#, python-format +msgid "Rescoring all submissions for %s..." +msgstr "Tính lại điểm cho %s..." + +#: 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] "" + +#: judge/views/ranked_submission.py:58 +#, python-format +msgid "Best solutions for %s" +msgstr "Các giải pháp tốt nhất cho %s" + +#: judge/views/ranked_submission.py:61 +#, python-brace-format +msgid "Best solutions for {0}" +msgstr "Các giải pháp tốt nhất cho {0}" + +#: judge/views/ranked_submission.py:71 +#, 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:74 +#, 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:80 +#, 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:83 +#, 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 +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 templates/user/edit-profile.html:103 +msgid "Preferred language" +msgstr "Ngôn ngữ ưa thích" + +#: judge/views/register.py:38 +msgid "Subscribe to newsletter?" +msgstr "Đăng ký nhận bản tin?" + +#: judge/views/register.py:45 +#, 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 +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 +msgid "Registration" +msgstr "Đăng ký" + +#: judge/views/register.py:106 +msgid "Authentication failure" +msgstr "Xác thực không thành công" + +#: judge/views/stats.py:105 +msgid "Language statistics" +msgstr "Thống kê theo ngôn ngữ" + +#: judge/views/status.py:24 templates/submission/list.html:319 +msgid "Status" +msgstr "Trạng thái" + +#: judge/views/status.py:108 +msgid "Version matrix" +msgstr "Ma trận phiên bản" + +#: judge/views/submission.py:59 judge/views/submission.py:66 +#, python-format +msgid "Submission of %(problem)s by %(user)s" +msgstr "Nộp %(problem)s bởi %(user)s" + +#: judge/views/submission.py:161 judge/views/submission.py:162 +#: templates/problem/problem.html:127 +msgid "All submissions" +msgstr "Tất cả các bài nộp" + +#: judge/views/submission.py:303 +msgid "All my submissions" +msgstr "Tất cả những lần nộp bài của tôi" + +#: judge/views/submission.py:304 +#, python-format +msgid "All submissions by %s" +msgstr "Tất cả các bài nộp bởi %s" + +#: judge/views/submission.py:335 +#, python-format +msgid "All submissions for %s" +msgstr "Tất cả các bài nộp bởi %s" + +#: judge/views/submission.py:354 +msgid "Must pass a problem" +msgstr "Phải giải được 1 bài" + +#: judge/views/submission.py:397 +#, 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:398 +#, 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:495 +msgid "Must pass a contest" +msgstr "Phải vượt qua một cuộc thi" + +#: judge/views/submission.py:514 +#, python-brace-format +msgid "{0}'s submissions for {2} in {4}" +msgstr "{0} gửi cho {2} trong {4}" + +#: judge/views/submission.py:519 +#, 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 "" + +#: judge/views/ticket.py:40 +msgid "Issue description" +msgstr "" + +#: judge/views/ticket.py:85 judge/views/ticket.py:88 +#, python-format +msgid "New ticket for %s" +msgstr "" + +#: judge/views/ticket.py:139 +#, python-format +msgid "%(title)s - Ticket %(id)d" +msgstr "" + +#: judge/views/ticket.py:248 +#, python-format +msgid "Tickets - Page %(number)d of %(total)d" +msgstr "" + +#: judge/views/ticket.py:297 +#, python-format +msgid "New Ticket: %s" +msgstr "" + +#: judge/views/ticket.py:298 +#, python-format +msgid "#%(id)d, assigned to: %(users)s" +msgstr "" + +#: judge/views/ticket.py:300 +msgid ", " +msgstr ", " + +#: judge/views/ticket.py:300 +msgid "no one" +msgstr "không có ai" + +#: judge/views/totp.py:42 templates/registration/totp_enable.html:86 +msgid "Enable Two Factor Authentication" +msgstr "" + +#: judge/views/totp.py:89 templates/registration/totp_disable.html:48 +msgid "Disable Two Factor Authentication" +msgstr "" + +#: judge/views/totp.py:103 +msgid "Perform Two Factor Authentication" +msgstr "" + +#: judge/views/user.py:68 +msgid "No such user" +msgstr "Không có thư mục này" + +#: judge/views/user.py:68 +#, python-format +msgid "No user handle \"%s\"." +msgstr "Không xử lý người dùng \"%s\"." + +#: judge/views/user.py:72 +msgid "My account" +msgstr "Tài khoản của tôi" + +#: judge/views/user.py:73 +#, python-format +msgid "User %s" +msgstr "Người dùng %s" + +#: judge/views/user.py:136 +msgid "M j, Y, G:i" +msgstr "M j, Y, G:i" + +#: judge/views/user.py:221 +msgid "Updated on site" +msgstr "Cập Nhật trên trang web" + +#: judge/views/user.py:253 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:10 +msgid "Edit profile" +msgstr "Chỉnh sửa tiểu sử" + +#: judge/views/user.py:262 templates/user/user-list-tabs.html:4 +msgid "Leaderboard" +msgstr "Leaderboard" + +#: judge/views/widgets.py:48 judge/views/widgets.py:58 +#, python-format +msgid "Invalid upstream data: %s" +msgstr "Dữ liệu nguồn không hợp lệ %s" + +#: judge/views/widgets.py:68 +msgid "Bad latitude or longitude" +msgstr "Sai tọa độ" + +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:13 +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:27 +msgid "Photo" +msgstr "" + +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:14 +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:28 +msgid "Photos" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:9 +msgid "first name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:10 +msgid "last name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:11 +msgid "biography" +msgstr "tiểu sử" + +#: src/dmoj-wpadmin/test_project/apps/books/admin.py:24 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:30 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:30 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:30 +msgid "owner" +msgstr "chủ sở hữu" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:12 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:12 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:12 +msgid "name" +msgstr "tên" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:19 +msgid "Category of Books" +msgstr "Thể loại sách" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:20 +msgid "Categories of Books" +msgstr "Thể loại sách" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:26 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:26 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:26 +msgid "title" +msgstr "tiêu đề" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:28 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:28 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:28 +msgid "category" +msgstr "thể loại" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:29 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:29 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:29 +msgid "author" +msgstr "tác giả" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:31 +msgid "publication date" +msgstr "ngày xuất bản" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:37 +msgid "Book" +msgstr "Sách" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:38 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:136 +msgid "Books" +msgstr "Sách" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:19 +msgid "Category of CDs" +msgstr "Thể loại CDs" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:20 +msgid "Categories of CDs" +msgstr "Thể loại CDs" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:36 +msgid "CD" +msgstr "CD" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:37 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:141 +msgid "CDs" +msgstr "CDs" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:19 +msgid "Category of DVDs" +msgstr "Thể loại DVDs" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:20 +msgid "Categories of DVDs" +msgstr "Thể loại DVDs" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:36 +msgid "DVD" +msgstr "DVD" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:37 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:146 +msgid "DVDs" +msgstr "DVDs" + +#: src/dmoj-wpadmin/test_project/templates/admin/base_site.html:7 +msgid "Django administration" +msgstr "Quản trị viên Django" + +#: src/dmoj-wpadmin/test_project/test_project/forms.py:12 +#, python-format +msgid "Please enter the correct %(username)s and password for an admin account. Note that both fields may be case-sensitive." +msgstr "Hãy nhập %(username)s và mật khẩu hợp lệ cho tài khoản quản trị. Chú ý cả hai trường có phân biệt chữ Hoa-thường." + +#: src/dmoj-wpadmin/test_project/test_project/forms.py:32 +#, python-format +msgid "Please enter the correct %(username)s and password for an user account. Note that both fields may be case-sensitive." +msgstr "Hãy nhập %(username)s và mật khẩu hợp lệ cho tài khoản thành viên. Chú ý cả hai trường có phân biệt chữ Hoa-thường." + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:27 +msgid "Site" +msgstr "Trang" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:38 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:41 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:130 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:133 +msgid "Dashboard" +msgstr "Bảng điều khiển" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:48 +msgid "Applications" +msgstr "Ứng dụng" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:53 +msgid "Administration" +msgstr "Quản trị viên" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:64 +msgid "Color theme" +msgstr "Chủ đề màu sắc" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:66 +msgid "Change color theme" +msgstr "Đổi chủ đề màu sắc" + +#: templates/admin/judge/contest/change_form.html:9 +msgid "Are you sure you want to rejudge ALL the submissions?" +msgstr "Bạn có chắc chắn muốn chấm lại TẤT CẢ các bài nộp?" + +#: templates/admin/judge/contest/change_form.html:17 +#: templates/admin/judge/contest/change_form.html:20 +msgid "Rate" +msgstr "Đánh giá" + +#: templates/admin/judge/contest/change_list.html:9 +msgid "Rate all ratable contests" +msgstr "Đánh giá các cuộc thi" + +#: templates/admin/judge/judge/change_form.html:15 +#: templates/admin/judge/judge/change_form.html:18 +msgid "Disconnect" +msgstr "Ngắt kết nối" + +#: templates/admin/judge/judge/change_form.html:20 +#: templates/admin/judge/judge/change_form.html:23 +msgid "Terminate" +msgstr "Chấm dứt" + +#: templates/admin/judge/problem/change_form.html:14 +msgid "View Submissions" +msgstr "Xem các bài nộp" + +#: templates/admin/judge/problem/change_form.html:17 +#: templates/user/user-base.html:61 +msgid "View submissions" +msgstr "Xem các bài nộp" + +#: templates/admin/judge/profile/change_form.html:14 +#: templates/admin/judge/profile/change_form.html:17 +msgid "Edit user" +msgstr "Cập nhật người dùng" + +#: 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 +msgid "Rejudge" +msgstr "Chấm lại" + +#: templates/base.html:214 +#, python-format +msgid "Hello, %(username)s." +msgstr "Xin chào, %(username)s." + +#: templates/base.html:220 templates/comments/list.html:89 +#: templates/contest/contest-list-tabs.html:24 +#: templates/problem/problem-list-tabs.html:6 +#: templates/submission/info-base.html:12 +#: templates/submission/submission-list-tabs.html:15 +msgid "Admin" +msgstr "Quản trị" + +#: templates/base.html:229 +msgid "Log out" +msgstr "Đăng xuất" + +#: templates/base.html:238 +#: templates/registration/password_reset_complete.html:4 +msgid "Log in" +msgstr "Đăng nhập" + +#: templates/base.html:239 templates/registration/registration_form.html:177 +msgid "or" +msgstr "hoặc" + +#: templates/base.html:240 +msgid "Sign up" +msgstr "Đăng ký" + +#: templates/base.html:252 +msgid "spectating" +msgstr "spectating" + +#: templates/base.html:265 +msgid "This site works best with JavaScript enabled." +msgstr "Trang web này hoạt động tốt nhất với JavaScript được cho phép." + +#: templates/blog/content.html:13 templates/comments/list.html:68 +#: templates/comments/list.html:83 templates/contest/contest-tabs.html:20 +#: 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 +msgid "Edit" +msgstr "Soạn thảo" + +#: templates/blog/content.html:27 +#, python-format +msgid "\n" +" posted on %(time)s\n" +" " +msgstr "\n" +" đăng vào lúc %(time)s\n" +" " + +#: templates/blog/dashboard.html:21 +#, python-format +msgid "\n" +" on %(time)s\n" +" " +msgstr "\n" +" vào lúc %(time)s\n" +" " + +#: templates/blog/list.html:85 +msgid "Blog" +msgstr "Blog" + +#: templates/blog/list.html:87 +msgid "Events" +msgstr "Sự kiện" + +#: templates/blog/list.html:92 +msgid "News" +msgstr "Tin tức" + +#: templates/blog/list.html:106 +#, python-brace-format +msgid "posted on {time}" +msgstr "đã đăng lúc {time}" + +#: templates/blog/list.html:130 templates/problem/problem.html:310 +msgid "Clarifications" +msgstr "Làm rõ" + +#: templates/blog/list.html:146 templates/problem/problem.html:321 +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." + +#: templates/blog/list.html:154 +msgid "Ongoing contests" +msgstr "Cuộc thi đang diễn ra" + +#: templates/blog/list.html:172 +msgid "Upcoming contests" +msgstr "Sự kiện sắp tới" + +#: templates/blog/list.html:189 +msgid "Comment stream" +msgstr "Dòng bình luận" + +#: templates/blog/list.html:208 +msgid "New problems" +msgstr "Đề bài mới" + +#: templates/blog/list.html:225 +msgid "My open tickets" +msgstr "Thẻ mở của tôi" + +#: templates/blog/list.html:246 +msgid "New tickets" +msgstr "Thẻ mới" + +#: templates/comments/list.html:2 +msgid "Comments" +msgstr "Nhận xét" + +#: templates/comments/list.html:18 templates/comments/list.html:27 +msgid "Please login to vote" +msgstr "Hãy đăng nhập để bình chọn" + +#: templates/comments/list.html:40 +#, python-brace-format +msgid "commented on {time}" +msgstr "đã bình luận lúc {time}" + +#: templates/comments/list.html:49 +#, python-format +msgid "edit %(edits)s" +msgstr "sửa %(edits)s" + +#: templates/comments/list.html:51 templates/comments/media-js.html:77 +msgid "edited" +msgstr "chỉnh sửa" + +#: templates/comments/list.html:60 +msgid "Link" +msgstr "Liên kết" + +#: templates/comments/list.html:73 templates/comments/list.html:80 +msgid "Reply" +msgstr "Phản hồi" + +#: templates/comments/list.html:86 +msgid "Hide" +msgstr "Ẩn" + +#: templates/comments/list.html:101 +#, 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:120 +msgid "There are no comments at the moment." +msgstr "Không có ý kiến tại thời điểm này." + +#: templates/comments/list.html:126 +msgid "New comment" +msgstr "Bình luận mới" + +#: templates/comments/list.html:140 +msgid "Invalid comment body." +msgstr "Bình luận không hợp lệ." + +#: templates/comments/list.html:148 +msgid "Post!" +msgstr "Đăng!" + +#: templates/comments/list.html:156 +msgid "Comments are disabled on this page." +msgstr "Bình luận đã bị vô hiệu hóa trên trang này." + +#: templates/comments/media-js.html:72 +#, python-brace-format +msgid "edit {edits}" +msgstr "chỉnh sửa {edits}" + +#: templates/comments/media-js.html:75 +msgid "original" +msgstr "nguyên bản" + +#: templates/contest/access_code.html:26 +msgid "Invalid access code." +msgstr "Mã truy cập không hợp lệ." + +#: templates/contest/access_code.html:29 +msgid "Please enter your access code:" +msgstr "Hãy nhập mã truy cập của bạn:" + +#: templates/contest/access_code.html:32 +msgid "Join Contest" +msgstr "Tham gia kỳ thi" + +#: templates/contest/calendar.html:12 +msgid "Sunday" +msgstr "Chủ nhật" + +#: templates/contest/calendar.html:13 +msgid "Monday" +msgstr "Thứ Hai" + +#: templates/contest/calendar.html:14 +msgid "Tuesday" +msgstr "Thứ Ba" + +#: templates/contest/calendar.html:15 +msgid "Wednesday" +msgstr "Thứ tư" + +#: templates/contest/calendar.html:16 +msgid "Thursday" +msgstr "Thứ Năm" + +#: templates/contest/calendar.html:17 +msgid "Friday" +msgstr "Thứ Sáu" + +#: templates/contest/calendar.html:18 +msgid "Saturday" +msgstr "Thứ Bảy" + +#: templates/contest/clone.html:37 +msgid "Enter a new key for the cloned contest:" +msgstr "Nhập mã mới cho kỳ thi đã nhân bản:" + +#: templates/contest/clone.html:40 templates/problem/clone.html:40 +msgid "Clone!" +msgstr "Nhân bản!" + +#: templates/contest/contest-list-tabs.html:7 +msgid "Prev" +msgstr "Trước" + +#: templates/contest/contest-list-tabs.html:10 +msgid "Today" +msgstr "Hôm nay" + +#: templates/contest/contest-list-tabs.html:13 +msgid "Next" +msgstr "Kế tiếp" + +#: templates/contest/contest-list-tabs.html:21 +#: templates/problem/problem-list-tabs.html:5 +msgid "List" +msgstr "" + +#: templates/contest/contest-list-tabs.html:22 +msgid "Calendar" +msgstr "Lịch" + +#: templates/contest/contest-tabs.html:4 +msgid "Info" +msgstr "Thông tin" + +#: templates/contest/contest-tabs.html:8 +msgid "Rankings" +msgstr "Bảng xếp hạng" + +#: templates/contest/contest-tabs.html:10 +msgid "Hidden Rankings" +msgstr "" + +#: templates/contest/contest-tabs.html:18 +msgid "MOSS" +msgstr "" + +#: templates/contest/contest-tabs.html:23 +msgid "Clone" +msgstr "" + +#: templates/contest/contest-tabs.html:34 +#: templates/contest/contest-tabs.html:54 +msgid "Leave contest" +msgstr "Rời khỏi cuộc thi" + +#: templates/contest/contest-tabs.html:41 templates/contest/list.html:293 +msgid "Virtual join" +msgstr "Tham gia ảo" + +#: templates/contest/contest-tabs.html:52 +msgid "Stop spectating" +msgstr "Ngừng theo dõi" + +#: templates/contest/contest-tabs.html:61 +msgid "Spectate contest" +msgstr "Theo dõi cuộc thi" + +#: templates/contest/contest-tabs.html:67 +#: templates/contest/contest-tabs.html:73 +msgid "Join contest" +msgstr "Tham gia cuộc thi" + +#: templates/contest/contest-tabs.html:82 +msgid "Login to participate" +msgstr "Đăng nhập để tham gia" + +#: templates/contest/contest.html:37 +msgid "Participating virtually." +msgstr "" + +#: templates/contest/contest.html:43 +msgid "Contest is over." +msgstr "Cuộc thi kết thúc." + +#: templates/contest/contest.html:59 templates/contest/contest.html:63 +msgid "F j, Y, G:i T" +msgstr "F j, Y, G:i T" + +#: templates/contest/contest.html:59 +#, python-format +msgid "%(time_limit)s window between %(start_time)s and %(end_time)s" +msgstr "cửa sổ %(time_limit)s giữa %(start_time)s%(end_time)s" + +#: templates/contest/contest.html:63 +#, python-format +msgid "%(length)s long starting on %(start_time)s" +msgstr "%(length)s tính từ %(start_time)s" + +#: templates/contest/contest.html:85 +msgid "AC Rate" +msgstr "Tỷ lệ AC" + +#: templates/contest/contest.html:86 templates/contest/list.html:153 +#: templates/contest/list.html:195 templates/contest/list.html:271 +#: templates/problem/list.html:212 templates/problem/list.html:238 +msgid "Users" +msgstr "Thành viên" + +#: templates/contest/contest.html:111 +msgid "Editorial" +msgstr "Hướng dẫn giải" + +#: templates/contest/list.html:31 templates/contest/media-js.html:9 +msgid "Are you sure you want to join?" +msgstr "Bạn có chắc bạn muốn tham gia?" + +#: templates/contest/list.html:32 +msgid "Joining a contest for the first time starts your timer, after which it becomes unstoppable." +msgstr "Truy cập vào một cuộc thi lần đầu tiên sẽ bắt đầu việc đếm ngược thời gian cuộc thi và không thể dừng lại được." + +#: templates/contest/list.html:65 +msgid "hidden" +msgstr "" + +#: templates/contest/list.html:70 +msgid "private" +msgstr "" + +#: templates/contest/list.html:84 +msgid "rated" +msgstr "" + +#: templates/contest/list.html:132 +msgid "Spectate" +msgstr "Hóng" + +#: templates/contest/list.html:138 +msgid "Join" +msgstr "Tham gia" + +#: templates/contest/list.html:148 +msgid "Active Contests" +msgstr "" + +#: templates/contest/list.html:152 templates/contest/list.html:194 +#: templates/contest/list.html:232 templates/contest/list.html:270 +msgid "Contest" +msgstr "Cuộc thi" + +#: templates/contest/list.html:190 +msgid "Ongoing Contests" +msgstr "Cuộc thi đang diễn ra" + +#: templates/contest/list.html:227 +msgid "Upcoming Contests" +msgstr "Sự kiện sắp tới" + +#: templates/contest/list.html:255 +msgid "There are no scheduled contests at this time." +msgstr "Không có không có cuộc thi dự kiến tại thời điểm này." + +#: templates/contest/list.html:261 +msgid "Past Contests" +msgstr "Cuộc thi đã qua" + +#: templates/contest/media-js.html:4 +msgid "Are you sure you want to leave?" +msgstr "Bạn có chắc bạn muốn bỏ qua?" + +#: templates/contest/media-js.html:5 +msgid "You cannot come back to a virtual participation. You will have to start a new one." +msgstr "Bạn không thể trở lại với việc tham gia ảo. Bạn phải bắt đầu một tham gia ảo mới." + +#: templates/contest/media-js.html:10 +msgid "Joining a contest starts your timer, after which it becomes unstoppable." +msgstr "Truy cập một cuộc thi sẽ bắt đầu đếm ngược thời gian cuộc thi đó, và không thể dừng lại được." + +#: 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 "Chỉ có các tổ chức sau có thể truy cập vào cuộc thi này:" + +#: templates/contest/ranking-table.html:7 +msgid "Organization" +msgstr "Tổ chức" + +#: templates/contest/ranking-table.html:27 +#, python-brace-format +msgid "Started on {time}" +msgstr "" + +#: templates/contest/ranking-table.html:30 +msgid "Participation ended." +msgstr "Kết thúc tham gia." + +#: templates/contest/ranking.html:232 +msgid "View user participation" +msgstr "Xem thành viên tham gia" + +#: templates/contest/ranking.html:236 +msgid "Show organizations" +msgstr "Hiển thị các tổ chức" + +#: templates/license.html:12 +msgid "Source:" +msgstr "Nguồn:" + +#: 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 "Bản tin" + +#: 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 "hoạt động" + +#: templates/newsletter/subscription_unsubscribe_activated.html:8 +msgid "You have successfully been unsubscribed." +msgstr "Bạn đã bỏ đăng ký thành công." + +#: 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 "Bỏ đăng ký bản tin" + +#: 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 "Đã nhận yêu cầu hủy đăng ký của bạn. Email đã được gửi cho bạn với một liên kết bạn cần phải làm theo để xác nhận hủy đăng ký." + +#: templates/newsletter/subscription_unsubscribe_user.html:17 +msgid "Do you want to unsubscribe from this newsletter?" +msgstr "Bạn có muốn hủy đăng ký bản tin này?" + +#: templates/newsletter/subscription_unsubscribe_user.html:21 +msgid "Unsubscribe" +msgstr "Hủy đăng ký" + +#: 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 "Bản tin Cập Nhật" + +#: 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 "Do một lỗi kỹ thuật chúng tôi đã không thể gửi email xác nhận. Điều này có thể bởi vì địa chỉ email không hợp lệ." + +#: templates/newsletter/subscription_update.html:14 +msgid "Update subscription" +msgstr "Cập nhật bài nộp của tôi" + +#: templates/newsletter/subscription_update_activated.html:8 +msgid "Your subscription has successfully been updated." +msgstr "Đăng ký của bạn đã được cập nhật thành công." + +#: 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 "Yêu cầu bản Cập Nhật của bạn đã được nhận thành công và kích hoạt email đã được gửi đến bạn. Trong email đó, bạn sẽ tìm thấy một liên kết mà bạn cần phải làm theo để cập nhật đăng ký của bạn." + +#: templates/organization/edit.html:46 +#: templates/organization/requests/pending.html:34 +#: templates/ticket/edit-notes.html:4 +msgid "Update" +msgstr "Cập Nhật" + +#: 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 "Rời khỏi tổ chức" + +#: templates/organization/home.html:29 +msgid "Join organization" +msgstr "Tham gia tổ chức" + +#: templates/organization/home.html:33 +msgid "Request membership" +msgstr "Yêu cầu tư cách thành viên" + +#: templates/organization/home.html:39 +msgid "Edit organization" +msgstr "Chỉnh sửa các tổ chức" + +#: templates/organization/home.html:43 +msgid "View requests" +msgstr "Xem yêu cầu" + +#: templates/organization/home.html:50 +msgid "Admin organization" +msgstr "Tổ chức người quản trị" + +#: templates/organization/home.html:55 +msgid "View members" +msgstr "Xem các thành viên" + +#: templates/organization/list.html:23 templates/status/language-list.html:34 +msgid "Name" +msgstr "Tên" + +#: templates/organization/list.html:24 +msgid "Members" +msgstr "Các thành viên" + +#: templates/organization/new.html:10 templates/ticket/new.html:38 +msgid "Create" +msgstr "Tạo" + +#: templates/organization/requests/detail.html:13 +msgid "User:" +msgstr "Người dùng:" + +#: templates/organization/requests/detail.html:17 +msgid "Organization:" +msgstr "Tổ chức:" + +#: templates/organization/requests/detail.html:25 +msgid "Time:" +msgstr "Thời gian:" + +#: templates/organization/requests/detail.html:29 +msgid "Reason:" +msgstr "Lý Do:" + +#: templates/organization/requests/log.html:11 +#: templates/organization/requests/pending.html:14 +msgid "State" +msgstr "Trạng thái" + +#: templates/organization/requests/log.html:12 +#: templates/organization/requests/pending.html:15 +msgid "Reason" +msgstr "Lý do" + +#: templates/organization/requests/log.html:28 +#: templates/organization/requests/pending.html:37 +msgid "There are no requests to approve." +msgstr "Không có yêu cầu để chấp nhận." + +#: templates/organization/requests/pending.html:17 +#: templates/problem/data.html:401 +msgid "Delete?" +msgstr "Xoá?" + +#: templates/organization/requests/request.html:18 +msgid "Your reason for joining:" +msgstr "Lý do của bạn để tham gia:" + +#: templates/organization/requests/request.html:20 +msgid "Request" +msgstr "Yêu cầu" + +#: templates/organization/requests/tabs.html:4 +msgid "Pending" +msgstr "Đang chờ" + +#: templates/organization/requests/tabs.html:7 +msgid "Log" +msgstr "Nhật ký" + +#: templates/organization/requests/tabs.html:10 +msgid "Approved" +msgstr "Phê duyệt" + +#: templates/organization/requests/tabs.html:13 +msgid "Rejected" +msgstr "Bị từ chối" + +#: templates/organization/users-table.html:15 +msgid "Kick" +msgstr "Loại" + +#: templates/problem/clone.html:37 +msgid "Enter a new code for the cloned problem:" +msgstr "" + +#: templates/problem/data.html:353 +msgid "View YAML" +msgstr "Xem YAML" + +#: templates/problem/data.html:369 +msgid "Show columns:" +msgstr "Hiển thị các cột:" + +#: templates/problem/data.html:372 templates/problem/data.html:396 +msgid "Output prefix" +msgstr "Tiền tố đầu ra" + +#: templates/problem/data.html:376 templates/problem/data.html:397 +msgid "Output limit" +msgstr "Giới hạn đầu ra" + +#: templates/problem/data.html:380 templates/problem/data.html:398 +msgid "Checker" +msgstr "Kiểm tra" + +#: templates/problem/data.html:384 templates/problem/data.html:399 +msgid "Generator args" +msgstr "Bộ sinh args" + +#: templates/problem/data.html:391 +msgid "Type" +msgstr "Kiểu" + +#: templates/problem/data.html:392 +msgid "Input file" +msgstr "Tập tin đầu vào" + +#: templates/problem/data.html:393 +msgid "Output file" +msgstr "Tập tin đầu ra" + +#: templates/problem/data.html:395 +msgid "Pretest?" +msgstr "Thử sơ bộ?" + +#: templates/problem/data.html:447 templates/problem/submit.html:252 +msgid "Submit!" +msgstr "Nộp bài!" + +#: templates/problem/data.html:448 +msgid "Add new case" +msgstr "Thêm mới trường hợp" + +#: 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 "" + +#: templates/problem/list.html:62 +msgid "Filter by type..." +msgstr "Lọc theo loại..." + +#: templates/problem/list.html:185 +msgid "Hot problems" +msgstr "Những bài tập nổi bật" + +#: templates/problem/list.html:207 templates/problem/list.html:224 +#: templates/problem/search-form.html:30 templates/user/user-problems.html:57 +msgid "Category" +msgstr "Thuộc Danh mục" + +#: templates/problem/list.html:209 templates/problem/list.html:228 +msgid "Types" +msgstr "Kiểu" + +#: templates/problem/list.html:235 +#, python-format +msgid "AC %%" +msgstr "AC %%" + +#: 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:142 +msgid "Filter by result:" +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 "Xem dạng PDF" + +#: templates/problem/problem.html:101 templates/problem/problem.html:111 +#: templates/problem/problem.html:116 +msgid "Submit solution" +msgstr "Gửi bài giải" + +#: templates/problem/problem.html:104 +#, python-format +msgid "%(counter)s submission left" +msgid_plural "%(counter)s submissions left" +msgstr[0] "Còn %(counter)s lần nộp" + +#: templates/problem/problem.html:112 +msgid "0 submissions left" +msgstr "Còn 0 lần nộp" + +#: templates/problem/problem.html:124 +msgid "My submissions" +msgstr "Lời giải của tôi" + +#: templates/problem/problem.html:128 +msgid "Best submissions" +msgstr "Lời giải tốt nhất" + +#: templates/problem/problem.html:132 +msgid "Read editorial" +msgstr "" + +#: templates/problem/problem.html:137 +msgid "Manage tickets" +msgstr "Quản lý thẻ" + +#: templates/problem/problem.html:141 +msgid "Edit problem" +msgstr "Sửa đề bài" + +#: templates/problem/problem.html:143 +msgid "Edit test data" +msgstr "Sửa đổi test" + +#: templates/problem/problem.html:148 +msgid "My tickets" +msgstr "" + +#: templates/problem/problem.html:156 +msgid "Manage submissions" +msgstr "" + +#: templates/problem/problem.html:162 +msgid "Clone problem" +msgstr "Copy sang bài mới" + +#: templates/problem/problem.html:169 +msgid "Points:" +msgstr "Điểm:" + +#: templates/problem/problem.html:172 templates/problem/problem.html:174 +msgid "(partial)" +msgstr "(một phần)" + +#: templates/problem/problem.html:179 +msgid "Time limit:" +msgstr "Giới hạn thời gian:" + +#: templates/problem/problem.html:191 +msgid "Memory limit:" +msgstr "Giới hạn bộ nhớ:" + +#: templates/problem/problem.html:210 +msgid "Author:" +msgid_plural "Authors:" +msgstr[0] "Tác giả:" + +#: templates/problem/problem.html:225 +msgid "Problem type" +msgid_plural "Problem types" +msgstr[0] "Loại đề bài" + +#: templates/problem/problem.html:238 +msgid "Allowed languages" +msgstr "Ngôn ngữ cho phép" + +#: templates/problem/problem.html:246 +#, python-format +msgid "No %(lang)s judge online" +msgstr "Không có máy chấm %(lang)s đang online" + +#: templates/problem/problem.html:257 +msgid "Judge:" +msgid_plural "Judges:" +msgstr[0] "" + +#: templates/problem/problem.html:274 +msgid "none available" +msgstr "" + +#: templates/problem/problem.html:299 +msgid "Request clarification" +msgstr "Gửi thắc mắc" + +#: templates/problem/problem.html:301 +msgid "Report an issue" +msgstr "Báo cáo vấn đề" + +#: 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 "Tìm kiếm bài tập" + +#: templates/problem/search-form.html:8 +msgid "Search problems..." +msgstr "Tìm đề bài..." + +#: templates/problem/search-form.html:14 +msgid "Full text search" +msgstr "Tìm kiếm" + +#: templates/problem/search-form.html:21 +msgid "Hide solved problems" +msgstr "Ẩn các bài đã có lời giải" + +#: templates/problem/search-form.html:27 +msgid "Show problem types" +msgstr "Hiện loại đề" + +#: templates/problem/search-form.html:33 templates/problem/search-form.html:35 +#: templates/submission/submission-list-tabs.html:4 +msgid "All" +msgstr "Tất cả" + +#: templates/problem/search-form.html:46 +msgid "Problem types" +msgstr "Kiểu bài tập" + +#: templates/problem/search-form.html:57 +msgid "Point range" +msgstr "" + +#: templates/problem/search-form.html:63 templates/submission/list.html:337 +#: templates/ticket/list.html:248 +msgid "Go" +msgstr "Tìm" + +#: templates/problem/search-form.html:64 +msgid "Random" +msgstr "Ngẫu nhiên" + +#: templates/problem/submit.html:192 +#, python-format +msgid "Warning! Your default language, %(default_language)s, is unavailable for this problem and has been deselected." +msgstr "" + +#: templates/problem/submit.html:203 +#, python-format +msgid "\n" +" You have %(left)s submission left\n" +" " +msgid_plural "\n" +" You have %(left)s submissions left\n" +" " +msgstr[0] "" + +#: templates/problem/submit.html:212 +msgid "You have 0 submissions left" +msgstr "Bạn còn 0 lần nộp" + +#: templates/problem/submit.html:250 +msgid "No judge is available for this problem." +msgstr "Bài tập này hiện không sẵn sàng để chấm." + +#: templates/registration/activate.html:3 +#, python-format +msgid "%(key)s is an invalid activation key." +msgstr "%(key)s là một mã kích hoạt không hợp lệ." + +#: templates/registration/activation_complete.html:3 +msgid "Your account has been successfully activated." +msgstr "Tài khoản của bạn đã được kích hoạt thành công." + +#: templates/registration/login.html:43 +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:61 +#: templates/registration/totp_auth.html:39 +msgid "Login!" +msgstr "Đăng nhập!" + +#: templates/registration/login.html:64 +msgid "Forgot your password?" +msgstr "Quên mật khẩu?" + +#: templates/registration/login.html:67 +msgid "Or log in with..." +msgstr "Hoặc đăng nhập bằng..." + +#: templates/registration/logout.html:3 +msgid "See you later!" +msgstr "Hẹn gặp lại!" + +#: templates/registration/password_change_done.html:3 +msgid "Your password was sucessfully changed." +msgstr "Mật khẩu của bạn đã được thay đổi." + +#: templates/registration/password_change_form.html:8 +msgid "Change Password" +msgstr "Đổi mật khẩu" + +#: templates/registration/password_reset.html:7 +msgid "Send Reset Email" +msgstr "Gửi email đặt lại mật khẩu" + +#: templates/registration/password_reset_complete.html:3 +msgid "Your password has been set. You may go ahead and log in now" +msgstr "Mật khẩu của bạn đã được đặt. Giờ bạn đã có thể đăng nhập" + +#: templates/registration/password_reset_confirm.html:9 +msgid "Reset Password" +msgstr "Đặt lại mật khẩu" + +#: 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 +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 +#, python-format +msgid "You're receiving this email because you requested a password reset for your user account at %(site_name)s." +msgstr "Bạn nhận được email này bởi vì bạn đã yêu cầu đặt lại mật khẩu cho tài khoản của mình tại %(site_name)s." + +#: templates/registration/password_reset_email.txt:3 +msgid "Please go to the following page and choose a new password:" +msgstr "Hãy đi đến trang sau và chọn một mật khẩu mới:" + +#: templates/registration/password_reset_email.txt:7 +msgid "Your username, in case you've forgotten:" +msgstr "Tên người dùng của bạn, trong trường hợp bạn quên:" + +#: templates/registration/password_reset_email.txt:9 +msgid "Thanks for using our site!" +msgstr "Cảm ơn đã sử dụng hệ thống của chúng tôi!" + +#: templates/registration/password_reset_email.txt:11 +#, python-format +msgid "The %(site_name)s team" +msgstr "Đội ngũ %(site_name)s" + +#: templates/registration/password_reset_subject.txt:1 +#, python-format +msgid "Password reset on %(site_name)s" +msgstr "Đặt lại mật khẩu tại %(site_name)s" + +#: templates/registration/profile_creation.html:36 +#: templates/registration/username_select.html:7 +msgid "Continue >" +msgstr "Tiếp tục >" + +#: templates/registration/registration_closed.html:3 +msgid "Registration is currently closed. Please contact an administrator." +msgstr "Việc đăng ký hiện đã đóng. Vui lòng liên hệ với quản trị viên." + +#: 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 "Chúc mừng bạn đã đăng ký thành công. Một Email đã được gửi đến cho bạn để xác nhận đăng ký của bạn." + +#: templates/registration/registration_form.html:166 +msgid "(again, for confirmation)" +msgstr "(một lần nữa, để xác nhận)" + +#: templates/registration/registration_form.html:173 +msgid "(select your closest major city)" +msgstr "(chọn thành phố gần bạn nhất)" + +#: templates/registration/registration_form.html:178 +msgid "pick from map" +msgstr "chọn từ bản đồ" + +#: templates/registration/registration_form.html:183 +msgid "Default language" +msgstr "Ngôn ngữ mặc định" + +#: templates/registration/registration_form.html:186 +#: templates/user/edit-profile.html:162 +msgid "Affiliated organizations" +msgstr "Tổ chức đại diện" + +#: templates/registration/registration_form.html:192 +#: templates/user/edit-profile.html:121 +msgid "Notify me about upcoming contests" +msgstr "Thông báo cho tôi về các cuộc thi sắp tới" + +#: templates/registration/registration_form.html:206 +msgid "By registering, you agree to our" +msgstr "Để đăng ký, bạn đồng ý với chúng tôi" + +#: templates/registration/registration_form.html:207 +msgid "Terms & Conditions" +msgstr "Điều khoản & Điều kiện" + +#: templates/registration/registration_form.html:210 +msgid "Register!" +msgstr "Đăng ký!" + +#: templates/registration/totp_auth.html:36 +#: templates/registration/totp_disable.html:45 +#: templates/registration/totp_enable.html:83 +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_auth.html:41 +#, python-format +msgid "If you lost your authentication device, please contact us at %(email)s." +msgstr "Nếu bạn mất thiết bị xác thực, liên hệ với chúng tội tại %(email)s." + +#: templates/registration/totp_disable.html:38 +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_enable.html:71 +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:72 +msgid "QR code" +msgstr "Mã QR" + +#: templates/registration/totp_enable.html:73 +msgid "Or enter this code manually:" +msgstr "Hoặc nhập mã này thủ công:" + +#: templates/stats/base.html:9 templates/submission/list.html:345 +msgid "Statistics" +msgstr "Thống kê" + +#: templates/stats/language.html:11 +msgid "Submission Statistics" +msgstr "Thống kê bài nộp" + +#: templates/stats/language.html:16 +msgid "Submissions by Language" +msgstr "Bài nộp theo ngôn ngữ" + +#: templates/stats/language.html:21 +msgid "AC Submissions by Language" +msgstr "Các bài nộp đã AC theo ngôn ngữ" + +#: templates/stats/language.html:26 +msgid "Language AC Rate" +msgstr "Tỉ lệ AC của ngôn ngữ" + +#: templates/status/judge-status-table.html:2 +msgid "Judge" +msgstr "Máy chấm" + +#: templates/status/judge-status-table.html:4 +msgid "Online" +msgstr "Trực tuyến" + +#: templates/status/judge-status-table.html:6 +msgid "Uptime" +msgstr "Thời gian hoạt động" + +#: templates/status/judge-status-table.html:7 +msgid "Ping" +msgstr "Ping" + +#: templates/status/judge-status-table.html:8 +msgid "Load" +msgstr "Tải" + +#: 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 "Không có thông tin" + +#: templates/status/judge-status-table.html:64 +msgid "There are no judges available at this time." +msgstr "Không có máy chấm nào tại thời điểm này." + +#: templates/status/language-list.html:33 templates/ticket/list.html:261 +msgid "ID" +msgstr "ID" + +#: templates/status/language-list.html:35 +msgid "Runtime Info" +msgstr "Thông tin thời gian chạy" + +#: templates/status/status-tabs.html:4 +msgid "Judges" +msgstr "Máy chấm" + +#: templates/status/status-tabs.html:6 +msgid "Version Matrix" +msgstr "Mã trận phiên bản" + +#: templates/submission/internal-error-message.html:8 +msgid "An internal error occurred while grading." +msgstr "Một lỗi hệ thống vừa xảy ra trong quá trình chấm bài." + +#: templates/submission/internal-error-message.html:15 +msgid "Error information" +msgstr "Thông tin về lỗi" + +#: templates/submission/list.html:76 +msgid "Filter by status..." +msgstr "Lọc theo trạng thái..." + +#: templates/submission/list.html:82 +msgid "Filter by language..." +msgstr "Lọc theo ngôn ngữ..." + +#: templates/submission/list.html:315 +msgid "Filter submissions" +msgstr "Lọc các bài nộp" + +#: templates/submission/list.html:351 +msgid "Total:" +msgstr "Tổng:" + +#: templates/submission/list.html:361 +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." + +#: templates/submission/row.html:39 +#, python-format +msgid "Case #%(case)s" +msgstr "Trường hợp #%(case)s" + +#: templates/submission/row.html:49 +msgid "view" +msgstr "xem" + +#: templates/submission/row.html:53 +msgid "rejudge" +msgstr "chấm lại" + +#: templates/submission/row.html:58 +msgid "admin" +msgstr "quản trị" + +#: templates/submission/source.html:25 +msgid "View status" +msgstr "Xem trạng thái" + +#: templates/submission/source.html:26 +msgid "View raw source" +msgstr "Xem mã nguồn" + +#: templates/submission/source.html:28 templates/submission/status.html:61 +msgid "Resubmit" +msgstr "Gửi lại" + +#: templates/submission/status-testcases.html:10 +msgid "We are waiting for a suitable judge to process your submission..." +msgstr "Chúng tôi đang chờ đợi cho một máy chấm phù hợp để xử lý thông tin của bạn..." + +#: templates/submission/status-testcases.html:12 +msgid "Your submission is being processed..." +msgstr "Bài nộp của bạn đang được xử lý..." + +#: templates/submission/status-testcases.html:14 +msgid "Compilation Error" +msgstr "Lỗi dịch" + +#: templates/submission/status-testcases.html:18 +msgid "Compilation Warnings" +msgstr "Các cảnh báo Biên dịch" + +#: templates/submission/status-testcases.html:23 +msgid "Pretest Execution Results" +msgstr "Kết quả thực hiện Pretest" + +#: templates/submission/status-testcases.html:25 +msgid "Execution Results" +msgstr "Kết quả thực hiện" + +#: templates/submission/status-testcases.html:31 +msgid "Batch " +msgstr "Hàng loạt " + +#: templates/submission/status-testcases.html:43 +msgid "Case" +msgstr "Trường hợp" + +#: templates/submission/status-testcases.html:45 +msgid "Pretest" +msgstr "Test đề bài" + +#: templates/submission/status-testcases.html:47 +msgid "Test case" +msgstr "Bộ test" + +#: templates/submission/status-testcases.html:79 +msgid "Your output (clipped)" +msgstr "Output của bạn (cắt xén)" + +#: templates/submission/status-testcases.html:90 +msgid "Judge feedback" +msgstr "Phản hồi trình chấm" + +#: templates/submission/status-testcases.html:106 +msgid "Resources:" +msgstr "Tài nguyên:" + +#: templates/submission/status-testcases.html:115 +msgid "Final pretest score:" +msgstr "Final pretest score:" + +#: templates/submission/status-testcases.html:117 +msgid "Final score:" +msgstr "Điểm cuối cùng:" + +#: templates/submission/status-testcases.html:131 +msgid "Passing pretests does not guarantee a full score on system tests." +msgstr "Vượt qua các bộ test thử không chắc chắn được toàn bộ số điểm từ các bộ test hệ thống." + +#: templates/submission/status-testcases.html:134 +msgid "Submission aborted!" +msgstr "Bài nộp đã bị huỷ!" + +#: templates/submission/status.html:59 +msgid "View source" +msgstr "Xem nguồn" + +#: templates/submission/status.html:88 +msgid "Abort" +msgstr "Huỷ bỏ" + +#: templates/submission/submission-list-tabs.html:6 +msgid "Mine" +msgstr "Bài của tôi" + +#: templates/submission/submission-list-tabs.html:9 +msgid "Best" +msgstr "Tốt nhất" + +#: templates/submission/submission-list-tabs.html:12 +#, python-format +msgid "%(user)s's" +msgstr "%(user)s's" + +#: templates/ticket/list.html:135 templates/ticket/ticket.html:257 +msgid "Reopened: " +msgstr "Đã mở lại: " + +#: templates/ticket/list.html:138 templates/ticket/ticket.html:258 +msgid "Closed: " +msgstr "Đã đóng: " + +#: templates/ticket/list.html:221 +msgid "Use desktop notification" +msgstr "Sử dụng thông báo trên màn hình" + +#: templates/ticket/list.html:227 +msgid "Show my tickets only" +msgstr "Chỉ hiện thẻ của tôi" + +#: templates/ticket/list.html:231 +msgid "Filing user" +msgstr "Filing user" + +#: templates/ticket/list.html:240 +msgid "Assignee" +msgstr "" + +#: templates/ticket/list.html:262 +msgid "Title" +msgstr "Tiêu đề" + +#: templates/ticket/list.html:264 templates/ticket/ticket.html:304 +msgid "Assignees" +msgstr "" + +#: templates/ticket/new_problem.html:7 +msgid "Thanks for opening a ticket!" +msgstr "" + +#: 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 "Xin lưu ý rằng biểu mẫu này dành cho việc báo cáo các vấn đề của đề bài, và không dành cho việc hỏi xin trợ giúp. Nếu bạn cần hỗ trợ về việc giải bài, hỏi trong phần bình luận." + +#: templates/ticket/ticket.html:298 +msgid "Associated object" +msgstr "" + +#: templates/ticket/ticket.html:309 +msgid "No one is assigned." +msgstr "" + +#: templates/ticket/ticket.html:315 +msgid "Close ticket" +msgstr "" + +#: templates/ticket/ticket.html:317 +msgid "Reopen ticket" +msgstr "" + +#: templates/ticket/ticket.html:321 +msgid "Assignee notes" +msgstr "" + +#: templates/ticket/ticket.html:328 templates/widgets/select_all.html:4 +msgid "Nothing here." +msgstr "Không có gì ở đây." + +#: templates/ticket/ticket.html:378 +msgid "Post" +msgstr "Bài viết" + +#: templates/user/base-users-table.html:3 +msgid "Rank" +msgstr "Xếp hạng" + +#: templates/user/base-users.html:14 templates/user/base-users.html:69 +msgid "Search by handle..." +msgstr "" + +#: templates/user/edit-profile.html:90 +msgid "Self-description" +msgstr "" + +#: templates/user/edit-profile.html:98 +msgid "Select your closest major city" +msgstr "" + +#: templates/user/edit-profile.html:107 +msgid "Editor theme" +msgstr "Giao diện khung viết code" + +#: templates/user/edit-profile.html:112 +msgid "Math engine" +msgstr "" + +#: templates/user/edit-profile.html:136 templates/user/edit-profile.html:137 +msgid "Change your avatar" +msgstr "Đổi ảnh đại diện của bạn" + +#: templates/user/edit-profile.html:143 +msgid "Change your password" +msgstr "Đổi mật khẩu của bạn" + +#: templates/user/edit-profile.html:150 +msgid "Two Factor Authentication is enabled." +msgstr "" + +#: templates/user/edit-profile.html:153 +msgid "Two Factor Authentication is disabled." +msgstr "" + +#: templates/user/edit-profile.html:170 +msgid "User-script" +msgstr "" + +#: templates/user/edit-profile.html:174 +msgid "Update profile" +msgstr "Cập nhật profile" + +#: templates/user/pp-row.html:22 +#, python-format +msgid "\n" +" weighted %(weight)s%%\n" +" " +msgstr "" + +#: templates/user/pp-row.html:27 +#, python-format +msgid "%(pp).1fpp" +msgstr "" + +#: templates/user/pp-row.html:29 +#, python-format +msgid "%(pp).0fpp" +msgstr "" + +#: templates/user/user-about.html:14 +msgid "From" +msgstr "" + +#: 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:40 +msgid "You have not shared any information." +msgstr "" + +#: templates/user/user-about.html:42 +msgid "This user has not shared any information." +msgstr "" + +#: templates/user/user-base.html:42 +#, python-format +msgid "%(counter)s problem solved" +msgid_plural "%(counter)s problems solved" +msgstr[0] "" + +#: templates/user/user-base.html:50 +msgid "Rank by points:" +msgstr "" + +#: templates/user/user-base.html:53 +msgid "Total points:" +msgstr "" + +#: templates/user/user-base.html:68 +msgid "Rank by rating:" +msgstr "Xếp hạng theo điểm số:" + +#: templates/user/user-base.html:70 +msgid "Rating:" +msgstr "Điểm số:" + +#: templates/user/user-base.html:71 +msgid "Volatility:" +msgstr "Độ biến động:" + +#: templates/user/user-base.html:72 +msgid "Min. rating:" +msgstr "Điểm số thấp nhất:" + +#: templates/user/user-base.html:73 +msgid "Max rating:" +msgstr "Điểm số cao nhất:" + +#: templates/user/user-problems.html:35 +msgid "Points Breakdown" +msgstr "" + +#: templates/user/user-problems.html:41 +msgid "Load more..." +msgstr "Xem thêm..." + +#: templates/user/user-problems.html:45 +msgid "This user has not yet solved any problems." +msgstr "Người dùng này chưa giải bài tập nào." + +#: templates/user/user-problems.html:51 +msgid "Authored Problems" +msgstr "" + +#: templates/user/user-problems.html:83 +msgid "Hide problems I've solved" +msgstr "Ẩn các bài tôi đã giải được" + +#: templates/user/user-problems.html:93 +#, python-format +msgid "%(points).1f points" +msgstr "" + +#: templates/user/user-problems.html:99 +msgid "Score" +msgstr "Điểm" + +#: templates/user/user-problems.html:110 +#, python-format +msgid "%(points)s / %(total)s" +msgstr "" + +#: templates/user/user-tabs.html:7 +msgid "Impersonate" +msgstr "" + +#: templates/user/user-tabs.html:13 +msgid "Admin User" +msgstr "" + +#: templates/user/user-tabs.html:16 +msgid "Admin Profile" +msgstr "" + +#: templates/widgets/select_all.html:8 +msgid "Check all" +msgstr "Chọn tất cả" + diff --git a/locale/vi/LC_MESSAGES/djangojs.po b/locale/vi/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..57fbddb --- /dev/null +++ b/locale/vi/LC_MESSAGES/djangojs.po @@ -0,0 +1,29 @@ +msgid "" +msgstr "" +"Project-Id-Version: dmoj\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-10-01 23:12+0000\n" +"PO-Revision-Date: 2019-11-11 22:06\n" +"Last-Translator: Icyene\n" +"Language-Team: Vietnamese\n" +"Language: vi_VN\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: crowdin.com\n" +"X-Crowdin-Project: dmoj\n" +"X-Crowdin-Language: vi\n" +"X-Crowdin-File: djangojs.po\n" + +#: resources/common.js:207 +msgctxt "time format with day" +msgid "%d day %h:%m:%s" +msgid_plural "%d days %h:%m:%s" +msgstr[0] "%d ngày %h:%m:%s" + +#: resources/common.js:210 +msgctxt "time format without day" +msgid "%h:%m:%s" +msgstr "%h:%m:%s" + diff --git a/locale/zh_Hans/LC_MESSAGES/django.po b/locale/zh_Hans/LC_MESSAGES/django.po new file mode 100644 index 0000000..db53c7d --- /dev/null +++ b/locale/zh_Hans/LC_MESSAGES/django.po @@ -0,0 +1,4517 @@ +msgid "" +msgstr "" +"Project-Id-Version: dmoj\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-11-11 21:54+0000\n" +"PO-Revision-Date: 2019-11-11 22:05\n" +"Last-Translator: Icyene\n" +"Language-Team: Chinese Simplified\n" +"Language: zh_CN\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: crowdin.com\n" +"X-Crowdin-Project: dmoj\n" +"X-Crowdin-Language: zh-CN\n" +"X-Crowdin-File: django.po\n" + +#: dmoj/settings.py:337 +msgid "German" +msgstr "德语" + +#: dmoj/settings.py:338 +msgid "English" +msgstr "英语" + +#: dmoj/settings.py:339 +msgid "Spanish" +msgstr "西班牙语" + +#: dmoj/settings.py:340 +msgid "French" +msgstr "法语" + +#: dmoj/settings.py:341 +msgid "Croatian" +msgstr "克罗地亚语" + +#: dmoj/settings.py:342 +msgid "Hungarian" +msgstr "匈牙利语" + +#: dmoj/settings.py:343 +msgid "Japanese" +msgstr "" + +#: dmoj/settings.py:344 +msgid "Korean" +msgstr "韩语" + +#: dmoj/settings.py:345 +msgid "Brazilian Portuguese" +msgstr "" + +#: dmoj/settings.py:346 +msgid "Romanian" +msgstr "罗马尼亚语" + +#: dmoj/settings.py:347 +msgid "Russian" +msgstr "俄语" + +#: dmoj/settings.py:348 +msgid "Serbian (Latin)" +msgstr "塞尔维亚文(拉丁字母)" + +#: dmoj/settings.py:349 +msgid "Turkish" +msgstr "土耳其语" + +#: dmoj/settings.py:350 +msgid "Vietnamese" +msgstr "越南语" + +#: dmoj/settings.py:351 +msgid "Simplified Chinese" +msgstr "简体中文" + +#: dmoj/urls.py:54 +msgid "Login" +msgstr "登录" + +#: dmoj/urls.py:102 templates/base.html:190 +msgid "Home" +msgstr "首页" + +#: judge/admin/comments.py:40 +#, python-format +msgid "%d comment successfully hidden." +msgid_plural "%d comments successfully hidden." +msgstr[0] "%d个评论成功隐藏。" + +#: judge/admin/comments.py:43 +msgid "Hide comments" +msgstr "隐藏选定评论" + +#: judge/admin/comments.py:47 +#, python-format +msgid "%d comment successfully unhidden." +msgid_plural "%d comments successfully unhidden." +msgstr[0] "%d个评论成功取消隐藏。" + +#: judge/admin/comments.py:50 +msgid "Unhide comments" +msgstr "取消隐藏选定评论" + +#: judge/admin/comments.py:58 +msgid "Associated page" +msgstr "关联页" + +#: judge/admin/contest.py:29 +msgid "Included contests" +msgstr "带标签的竞赛" + +#: judge/admin/contest.py:65 templates/contest/contest.html:83 +#: templates/contest/moss.html:43 templates/problem/list.html:206 +#: templates/problem/list.html:221 templates/user/user-problems.html:56 +#: templates/user/user-problems.html:98 +msgid "Problem" +msgstr "题目" + +#: judge/admin/contest.py:113 +msgid "Settings" +msgstr "" + +#: judge/admin/contest.py:115 +msgid "Scheduling" +msgstr "时间计划" + +#: judge/admin/contest.py:116 +msgid "Details" +msgstr "详细信息" + +#: judge/admin/contest.py:117 +msgid "Format" +msgstr "" + +#: judge/admin/contest.py:118 templates/contest/ranking-table.html:5 +msgid "Rating" +msgstr "评分" + +#: judge/admin/contest.py:119 +msgid "Access" +msgstr "" + +#: judge/admin/contest.py:121 judge/admin/problem.py:131 +msgid "Justice" +msgstr "司法" + +#: judge/admin/contest.py:159 +#, python-format +msgid "%d contest successfully marked as visible." +msgid_plural "%d contests successfully marked as visible." +msgstr[0] "" + +#: judge/admin/contest.py:162 +msgid "Mark contests as visible" +msgstr "" + +#: judge/admin/contest.py:166 +#, python-format +msgid "%d contest successfully marked as hidden." +msgid_plural "%d contests successfully marked as hidden." +msgstr[0] "" + +#: judge/admin/contest.py:169 +msgid "Mark contests as hidden" +msgstr "" + +#: judge/admin/contest.py:180 judge/admin/submission.py:149 +#: judge/admin/submission.py:171 +msgid "You do not have the permission to rejudge submissions." +msgstr "您没有为程序重新评分的权利。" + +#: judge/admin/contest.py:187 judge/admin/submission.py:155 +msgid "You do not have the permission to rejudge THAT many submissions." +msgstr "您没有为这么多程序重新评分的权利。" + +#: judge/admin/contest.py:194 judge/admin/submission.py:164 +#, 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:265 +#, python-format +msgid "%d participation recalculated." +msgid_plural "%d participations recalculated." +msgstr[0] "" + +#: judge/admin/contest.py:268 +msgid "Recalculate results" +msgstr "" + +#: judge/admin/contest.py:272 judge/admin/organization.py:65 +msgid "username" +msgstr "用户名" + +#: judge/admin/contest.py:277 templates/base.html:258 +msgid "virtual" +msgstr "模拟竞赛" + +#: judge/admin/interface.py:28 judge/models/interface.py:46 +msgid "link path" +msgstr "链接路径" + +#: judge/admin/interface.py:62 +msgid "Content" +msgstr "内容" + +#: judge/admin/interface.py:63 +msgid "Summary" +msgstr "概要" + +#: judge/admin/interface.py:107 judge/models/contest.py:251 +#: judge/models/contest.py:355 judge/models/profile.py:189 +msgid "user" +msgstr "用户" + +#: judge/admin/interface.py:148 +msgid "object" +msgstr "" + +#: judge/admin/organization.py:34 judge/admin/problem.py:171 +#: judge/admin/profile.py:78 +msgid "View on site" +msgstr "查看" + +#: judge/admin/problem.py:28 +msgid "Describe the changes you made (optional)" +msgstr "描述所你所做的更改 (可选)" + +#: judge/admin/problem.py:126 +msgid "Social Media" +msgstr "社交媒体" + +#: judge/admin/problem.py:127 +msgid "Taxonomy" +msgstr "分类" + +#: judge/admin/problem.py:128 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:58 +msgid "Points" +msgstr "分数" + +#: judge/admin/problem.py:129 +msgid "Limits" +msgstr "限制" + +#: judge/admin/problem.py:130 judge/admin/submission.py:232 +#: templates/stats/base.html:14 templates/submission/list.html:328 +msgid "Language" +msgstr "语言" + +#: judge/admin/problem.py:132 +msgid "History" +msgstr "编辑历史" + +#: judge/admin/problem.py:168 +msgid "Authors" +msgstr "作者" + +#: judge/admin/problem.py:183 +#, python-format +msgid "%d problem successfully marked as public." +msgid_plural "%d problems successfully marked as public." +msgstr[0] "%d 个题目已被成功地公开。" + +#: judge/admin/problem.py:187 +msgid "Mark problems as public" +msgstr "公开题目" + +#: judge/admin/problem.py:193 +#, python-format +msgid "%d problem successfully marked as private." +msgid_plural "%d problems successfully marked as private." +msgstr[0] "%d 个题目已被成功地隐藏。" + +#: judge/admin/problem.py:197 +msgid "Mark problems as private" +msgstr "隐藏题目" + +#: judge/admin/profile.py:32 +msgid "timezone" +msgstr "时区" + +#: judge/admin/profile.py:84 judge/admin/submission.py:211 +#: templates/organization/requests/log.html:9 +#: templates/organization/requests/pending.html:12 +#: templates/ticket/list.html:263 +msgid "User" +msgstr "用户" + +#: judge/admin/profile.py:89 templates/registration/registration_form.html:145 +msgid "Email" +msgstr "电子邮箱" + +#: judge/admin/profile.py:94 judge/views/register.py:29 +#: templates/registration/registration_form.html:173 +#: templates/user/edit-profile.html:99 +msgid "Timezone" +msgstr "时区" + +#: judge/admin/profile.py:99 +msgid "date joined" +msgstr "加入日期" + +#: judge/admin/profile.py:106 +#, python-format +msgid "%d user have scores recalculated." +msgid_plural "%d users have scores recalculated." +msgstr[0] "%d 个用户的总分已被重新计算。" + +#: judge/admin/profile.py:109 +msgid "Recalculate scores" +msgstr "重新计算总分" + +#: judge/admin/runtime.py:19 +msgid "Disallowed problems" +msgstr "排除题目" + +#: judge/admin/runtime.py:22 +msgid "These problems are NOT allowed to be submitted in this language" +msgstr "这些题目不允许使用该语言解决" + +#: judge/admin/runtime.py:83 +msgid "Description" +msgstr "描述" + +#: judge/admin/runtime.py:84 +msgid "Information" +msgstr "信息" + +#: judge/admin/runtime.py:85 +msgid "Capabilities" +msgstr "能力" + +#: judge/admin/submission.py:23 judge/admin/submission.py:42 +#: judge/admin/submission.py:221 +msgid "None" +msgstr "无" + +#: judge/admin/submission.py:23 +msgid "Not done" +msgstr "未完成" + +#: judge/admin/submission.py:23 +msgid "Exceptional" +msgstr "错误" + +#: judge/admin/submission.py:42 +msgid "Unaccepted" +msgstr "未被接受" + +#: judge/admin/submission.py:89 +#, python-format +msgctxt "contest problem" +msgid "%(problem)s in %(contest)s" +msgstr "%(contest)s 中的 %(problem)s" + +#: judge/admin/submission.py:167 +msgid "Rejudge the selected submissions" +msgstr "重新评分选定的程序" + +#: judge/admin/submission.py:193 judge/views/problem_manage.py:128 +#, python-format +msgid "%d submission were successfully rescored." +msgid_plural "%d submissions were successfully rescored." +msgstr[0] "%d个程序提交的分数已被重新计算。" + +#: judge/admin/submission.py:196 +msgid "Rescore the selected submissions" +msgstr "重新计算选定程序的分数" + +#: judge/admin/submission.py:200 +msgid "Problem code" +msgstr "题目代码" + +#: judge/admin/submission.py:205 +msgid "Problem name" +msgstr "题目名称" + +#: judge/admin/submission.py:215 templates/organization/requests/log.html:10 +#: templates/organization/requests/pending.html:13 +msgid "Time" +msgstr "时间" + +#: judge/admin/submission.py:223 +#, python-format +msgid "%d KB" +msgstr "%d KB" + +#: judge/admin/submission.py:225 +#, python-format +msgid "%.2f MB" +msgstr "%.2f MB" + +#: judge/admin/submission.py:227 +msgid "Memory" +msgstr "内存" + +#: judge/admin/taxon.py:11 judge/admin/taxon.py:34 +msgid "Included problems" +msgstr "包括题目" + +#: judge/admin/taxon.py:14 +msgid "These problems are included in this group of problems" +msgstr "这些题目属于该题目组" + +#: judge/admin/taxon.py:37 +msgid "These problems are included in this type of problems" +msgstr "这些题目属于该题目类型" + +#: judge/apps.py:8 +msgid "Online Judge" +msgstr "在线评测系统" + +#: judge/comments.py:41 +msgid "Comment body" +msgstr "评论正文" + +#: judge/comments.py:47 judge/views/ticket.py:46 +msgid "Your part is silent, little toad." +msgstr "你已被静音……" + +#: judge/comments.py:50 templates/comments/list.html:131 +msgid "You need to have solved at least one problem before your voice can be heard." +msgstr "只有解决了一个题目以后你才能有发言权。" + +#: judge/comments.py:92 +msgid "Posted comment" +msgstr "发布了评论" + +#: judge/contest_format/atcoder.py:19 +msgid "AtCoder" +msgstr "" + +#: judge/contest_format/default.py:18 +msgid "Default" +msgstr "" + +#: judge/contest_format/ecoo.py:19 +msgid "ECOO" +msgstr "" + +#: judge/contest_format/ioi.py:19 +msgid "IOI" +msgstr "" + +#: judge/forms.py:27 +msgid "Subscribe to contest updates" +msgstr "订阅有关于竞赛的资讯" + +#: judge/forms.py:28 +msgid "Enable experimental features" +msgstr "允许使用实验性功能" + +#: judge/forms.py:57 judge/views/organization.py:127 +#, python-brace-format +msgid "You may not be part of more than {count} public organizations." +msgstr "你不能参与超过 {count} 个组织" + +#: judge/forms.py:107 judge/views/register.py:26 +#: templates/registration/registration_form.html:139 +#: templates/user/base-users-table.html:5 +msgid "Username" +msgstr "用户名" + +#: judge/forms.py:108 templates/registration/registration_form.html:151 +#: templates/registration/registration_form.html:165 +msgid "Password" +msgstr "密码" + +#: judge/forms.py:130 +msgid "Two Factor Authentication tokens must be 6 decimal digits." +msgstr "" + +#: judge/forms.py:139 templates/registration/totp_auth.html:32 +msgid "Invalid Two Factor Authentication token." +msgstr "" + +#: judge/forms.py:143 judge/models/problem.py:97 +msgid "Problem code must be ^[a-z0-9]+$" +msgstr "题目代码必须匹配 ^[a-z0-9]+$" + +#: judge/forms.py:148 +msgid "Problem with code already exists." +msgstr "" + +#: judge/forms.py:153 judge/models/contest.py:51 +msgid "Contest id must be ^[a-z0-9]+$" +msgstr "竞赛标识必须匹配 ^[a-z0-9]+$" + +#: judge/forms.py:158 +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 "Y年n月j日 G:i" + +#: judge/jinja2/datetime.py:26 +#, python-brace-format +msgid "{time}" +msgstr "{time}" + +#: judge/jinja2/datetime.py:26 +#, python-brace-format +msgid "on {time}" +msgstr "在{time}" + +#: judge/models/choices.py:59 +msgid "Leave as LaTeX" +msgstr "显示为LaTeX" + +#: judge/models/choices.py:60 +msgid "SVG with PNG fallback" +msgstr "SVG,自动PNG切换" + +#: judge/models/choices.py:61 +msgid "MathML only" +msgstr "仅使用 MathML" + +#: judge/models/choices.py:62 +msgid "MathJax with SVG/PNG fallback" +msgstr "MathJax,自动SVG/PNG切换" + +#: judge/models/choices.py:63 +msgid "Detect best quality" +msgstr "检测最佳质量" + +#: judge/models/comment.py:25 +msgid "Page code must be ^[pcs]:[a-z0-9]+$|^b:\\d+$" +msgstr "" + +#: judge/models/comment.py:41 +msgid "commenter" +msgstr "评论者" + +#: judge/models/comment.py:42 +msgid "posted time" +msgstr "发布时间" + +#: judge/models/comment.py:43 judge/models/comment.py:176 +msgid "associated page" +msgstr "" + +#: judge/models/comment.py:45 +msgid "votes" +msgstr "投票" + +#: judge/models/comment.py:46 +msgid "body of comment" +msgstr "评论正文" + +#: judge/models/comment.py:47 +msgid "hide the comment" +msgstr "隐藏评论" + +#: judge/models/comment.py:48 +msgid "parent" +msgstr "母评论" + +#: judge/models/comment.py:53 +msgid "comment" +msgstr "评论" + +#: judge/models/comment.py:54 +msgid "comments" +msgstr "评论" + +#: judge/models/comment.py:136 judge/models/problem.py:406 +#, python-format +msgid "Editorial for %s" +msgstr "%s 的题解" + +#: judge/models/comment.py:171 +msgid "comment vote" +msgstr "评论投票" + +#: judge/models/comment.py:172 +msgid "comment votes" +msgstr "评论投票" + +#: judge/models/comment.py:181 +msgid "Override comment lock" +msgstr "" + +#: judge/models/contest.py:21 +msgid "Invalid colour." +msgstr "无效的颜色。" + +#: judge/models/contest.py:23 +msgid "tag name" +msgstr "标签名称" + +#: judge/models/contest.py:24 +msgid "Lowercase letters and hyphens only." +msgstr "只允许小写字母和连字号(-)。" + +#: judge/models/contest.py:25 +msgid "tag colour" +msgstr "标签颜色" + +#: judge/models/contest.py:26 +msgid "tag description" +msgstr "标签说明" + +#: judge/models/contest.py:45 +msgid "contest tag" +msgstr "竞赛标签" + +#: judge/models/contest.py:46 judge/models/contest.py:100 +msgid "contest tags" +msgstr "竞赛标签" + +#: judge/models/contest.py:50 +msgid "contest id" +msgstr "竞赛标识" + +#: judge/models/contest.py:52 +msgid "contest name" +msgstr "竞赛名称" + +#: judge/models/contest.py:53 +msgid "These people will be able to edit the contest." +msgstr "这些人将可以编辑竞赛。" + +#: judge/models/contest.py:55 judge/models/runtime.py:124 +#: src/dmoj-wpadmin/test_project/apps/books/admin.py:20 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:27 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:27 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:27 +msgid "description" +msgstr "描述" + +#: judge/models/contest.py:56 judge/models/problem.py:353 +#: judge/models/runtime.py:126 +msgid "problems" +msgstr "题目" + +#: judge/models/contest.py:57 judge/models/contest.py:252 +msgid "start time" +msgstr "开始时间" + +#: judge/models/contest.py:58 +msgid "end time" +msgstr "结束时间" + +#: judge/models/contest.py:59 judge/models/problem.py:118 +#: judge/models/problem.py:377 +msgid "time limit" +msgstr "时间限制" + +#: judge/models/contest.py:60 judge/models/problem.py:136 +msgid "publicly visible" +msgstr "公开" + +#: judge/models/contest.py:61 +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:64 +msgid "contest rated" +msgstr "竞赛参与评分" + +#: judge/models/contest.py:64 +msgid "Whether this contest can be rated." +msgstr "竞赛是否参与用户评分" + +#: judge/models/contest.py:66 +msgid "hide scoreboard" +msgstr "隐藏记分板" + +#: judge/models/contest.py:67 +msgid "Whether the scoreboard should remain hidden for the duration of the contest." +msgstr "记分牌是否在比赛期间保持隐藏。" + +#: judge/models/contest.py:70 +msgid "no comments" +msgstr "没有评论" + +#: judge/models/contest.py:71 +msgid "Use clarification system instead of comments." +msgstr "请使用澄清系统,而不是评论" + +#: judge/models/contest.py:73 +msgid "Rating floor for contest" +msgstr "" + +#: judge/models/contest.py:75 +msgid "Rating ceiling for contest" +msgstr "" + +#: judge/models/contest.py:77 +msgid "rate all" +msgstr "为所有用户评分" + +#: judge/models/contest.py:77 +msgid "Rate all users who joined." +msgstr "所有参与竞赛的用户,包含没有提交任何程序的用户,都将被评分。" + +#: judge/models/contest.py:78 +msgid "exclude from ratings" +msgstr "不会被评分" + +#: judge/models/contest.py:80 +msgid "private to specific users" +msgstr "" + +#: judge/models/contest.py:81 +msgid "private contestants" +msgstr "" + +#: judge/models/contest.py:82 +msgid "If private, only these users may see the contest" +msgstr "" + +#: judge/models/contest.py:84 +msgid "hide problem tags" +msgstr "隐藏题目标签" + +#: judge/models/contest.py:85 +msgid "Whether problem tags should be hidden by default." +msgstr "设置竞赛内题目标签是否默认被隐藏。" + +#: judge/models/contest.py:87 +msgid "run pretests only" +msgstr "只运行预测试" + +#: judge/models/contest.py:88 +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:92 judge/models/problem.py:157 +msgid "private to organizations" +msgstr "只对组织可见" + +#: judge/models/contest.py:93 judge/models/problem.py:155 +#: judge/models/profile.py:76 +msgid "organizations" +msgstr "组织" + +#: judge/models/contest.py:94 +msgid "If private, only these organizations may see the contest" +msgstr "选中时,只对选择的组织才可见" + +#: judge/models/contest.py:95 judge/models/problem.py:145 +msgid "OpenGraph image" +msgstr "OpenGraph 图像" + +#: judge/models/contest.py:96 judge/models/profile.py:47 +msgid "Logo override image" +msgstr "" + +#: judge/models/contest.py:98 +msgid "This image will replace the default site logo for users inside the contest." +msgstr "" + +#: judge/models/contest.py:101 +msgid "the amount of live participants" +msgstr "实时参与者数" + +#: judge/models/contest.py:102 +msgid "contest summary" +msgstr "竞赛简介" + +#: judge/models/contest.py:103 judge/models/problem.py:147 +msgid "Plain-text, shown in meta description tag, e.g. for social media." +msgstr "在meta description标签内显示的纯文本介绍。" + +#: judge/models/contest.py:104 judge/models/profile.py:46 +msgid "access code" +msgstr "访问码" + +#: judge/models/contest.py:105 +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:107 judge/models/problem.py:141 +msgid "personae non gratae" +msgstr "不受欢迎人物" + +#: judge/models/contest.py:108 +msgid "Bans the selected users from joining this contest." +msgstr "" + +#: judge/models/contest.py:109 +msgid "contest format" +msgstr "" + +#: judge/models/contest.py:110 +msgid "The contest format module to use." +msgstr "" + +#: judge/models/contest.py:111 +msgid "contest format configuration" +msgstr "" + +#: judge/models/contest.py:112 +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:233 +msgid "See private contests" +msgstr "查看私人竞赛" + +#: judge/models/contest.py:234 +msgid "Edit own contests" +msgstr "编辑我的竞赛" + +#: judge/models/contest.py:235 +msgid "Edit all contests" +msgstr "编辑全部竞赛" + +#: judge/models/contest.py:236 +msgid "Clone contest" +msgstr "" + +#: judge/models/contest.py:237 templates/contest/moss.html:74 +msgid "MOSS contest" +msgstr "" + +#: judge/models/contest.py:238 +msgid "Rate contests" +msgstr "计算积分的比赛" + +#: judge/models/contest.py:239 +msgid "Contest access codes" +msgstr "比赛访问码" + +#: judge/models/contest.py:240 +msgid "Create private contests" +msgstr "" + +#: judge/models/contest.py:242 judge/models/contest.py:320 +#: judge/models/contest.py:356 judge/models/contest.py:378 +#: judge/models/submission.py:83 +msgid "contest" +msgstr "竞赛" + +#: judge/models/contest.py:243 +msgid "contests" +msgstr "竞赛" + +#: judge/models/contest.py:250 +msgid "associated contest" +msgstr "关联的竞赛" + +#: judge/models/contest.py:253 +msgid "score" +msgstr "得分" + +#: judge/models/contest.py:254 +msgid "cumulative time" +msgstr "累积时间" + +#: judge/models/contest.py:255 +msgid "virtual participation id" +msgstr "虚拟参与信息编号" + +#: judge/models/contest.py:256 +msgid "0 means non-virtual, otherwise the n-th virtual participation" +msgstr "0 表示正式参与,否则表示第n次虚拟参与。" + +#: judge/models/contest.py:257 +msgid "contest format specific data" +msgstr "" + +#: judge/models/contest.py:306 +#, python-format +msgid "%s spectating in %s" +msgstr "%s旁观%s中" + +#: judge/models/contest.py:308 +#, python-format +msgid "%s in %s, v%d" +msgstr "%s于%s的第%d次虚拟参与" + +#: judge/models/contest.py:309 +#, python-format +msgid "%s in %s" +msgstr "%s参与%s中" + +#: judge/models/contest.py:312 +msgid "contest participation" +msgstr "竞赛参与信息" + +#: judge/models/contest.py:313 +msgid "contest participations" +msgstr "竞赛参与信息" + +#: judge/models/contest.py:319 judge/models/contest.py:340 +#: judge/models/contest.py:379 judge/models/problem.py:352 +#: judge/models/problem.py:357 judge/models/problem.py:375 +#: judge/models/problem_data.py:35 +msgid "problem" +msgstr "题目" + +#: judge/models/contest.py:321 judge/models/contest.py:344 +#: judge/models/problem.py:129 +msgid "points" +msgstr "分" + +#: judge/models/contest.py:322 +msgid "partial" +msgstr "部分" + +#: judge/models/contest.py:323 judge/models/contest.py:345 +msgid "is pretested" +msgstr "仅通过预测试" + +#: judge/models/contest.py:324 judge/models/interface.py:43 +msgid "order" +msgstr "顺序" + +#: judge/models/contest.py:325 +msgid "output prefix length override" +msgstr "输出前缀替换" + +#: judge/models/contest.py:326 +msgid "Maximum number of submissions for this problem, or 0 for no limit." +msgstr "此问题的最大提交数量,或输入0表示无限制" + +#: judge/models/contest.py:328 +msgid "Why include a problem you can't submit to?" +msgstr "为什么包括一个你不能提交的问题?" + +#: judge/models/contest.py:333 +msgid "contest problem" +msgstr "竞赛题目" + +#: judge/models/contest.py:334 +msgid "contest problems" +msgstr "竞赛题目" + +#: judge/models/contest.py:338 judge/models/submission.py:181 +msgid "submission" +msgstr "提交信息" + +#: judge/models/contest.py:342 judge/models/contest.py:357 +msgid "participation" +msgstr "参与" + +#: judge/models/contest.py:346 +msgid "Whether this submission was ran only on pretests." +msgstr "该程序是否只通过预测试。" + +#: judge/models/contest.py:350 +msgid "contest submission" +msgstr "竞赛提交信息" + +#: judge/models/contest.py:351 +msgid "contest submissions" +msgstr "竞赛提交历史" + +#: judge/models/contest.py:359 +msgid "rank" +msgstr "排名" + +#: judge/models/contest.py:360 +msgid "rating" +msgstr "评分" + +#: judge/models/contest.py:361 +msgid "volatility" +msgstr "波动性" + +#: judge/models/contest.py:362 +msgid "last rated" +msgstr "上次评分" + +#: judge/models/contest.py:366 +msgid "contest rating" +msgstr "竞赛评分信息" + +#: judge/models/contest.py:367 +msgid "contest ratings" +msgstr "竞赛评分历史" + +#: judge/models/contest.py:386 +msgid "contest moss result" +msgstr "" + +#: judge/models/contest.py:387 +msgid "contest moss results" +msgstr "" + +#: judge/models/interface.py:24 +msgid "configuration item" +msgstr "配置项目" + +#: judge/models/interface.py:25 +msgid "miscellaneous configuration" +msgstr "杂项配置" + +#: judge/models/interface.py:37 +msgid "navigation item" +msgstr "导航项" + +#: judge/models/interface.py:38 +msgid "navigation bar" +msgstr "导航栏" + +#: judge/models/interface.py:44 +msgid "identifier" +msgstr "标识符" + +#: judge/models/interface.py:45 +msgid "label" +msgstr "标签" + +#: judge/models/interface.py:47 +msgid "highlight regex" +msgstr "突出显示正则表达式" + +#: judge/models/interface.py:48 +msgid "parent item" +msgstr "父项" + +#: judge/models/interface.py:66 +msgid "post title" +msgstr "文章标题" + +#: judge/models/interface.py:67 judge/models/problem.py:395 +msgid "authors" +msgstr "作者" + +#: judge/models/interface.py:68 +msgid "slug" +msgstr "网址标识" + +#: judge/models/interface.py:69 judge/models/problem.py:393 +msgid "public visibility" +msgstr "公共可见性" + +#: judge/models/interface.py:70 +msgid "sticky" +msgstr "置顶" + +#: judge/models/interface.py:71 +msgid "publish after" +msgstr "发布时间" + +#: judge/models/interface.py:72 +msgid "post content" +msgstr "发布内容" + +#: judge/models/interface.py:73 +msgid "post summary" +msgstr "发布摘要" + +#: judge/models/interface.py:74 +msgid "openGraph image" +msgstr "openGraph 图像" + +#: judge/models/interface.py:91 +msgid "Edit all posts" +msgstr "编辑所有的帖子" + +#: judge/models/interface.py:93 +msgid "blog post" +msgstr "博客文章" + +#: judge/models/interface.py:94 +msgid "blog posts" +msgstr "博客文章" + +#: judge/models/message.py:11 +msgid "message title" +msgstr "消息标题" + +#: judge/models/message.py:12 judge/models/ticket.py:29 +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:26 +msgid "problem category ID" +msgstr "题目类型标识符" + +#: judge/models/problem.py:27 +msgid "problem category name" +msgstr "题目类型名称" + +#: judge/models/problem.py:34 +msgid "problem type" +msgstr "题目类型" + +#: judge/models/problem.py:35 judge/models/problem.py:113 +msgid "problem types" +msgstr "题目类型" + +#: judge/models/problem.py:39 +msgid "problem group ID" +msgstr "题目组标识符" + +#: judge/models/problem.py:40 +msgid "problem group name" +msgstr "题目组名称" + +#: judge/models/problem.py:47 judge/models/problem.py:116 +msgid "problem group" +msgstr "题目组" + +#: judge/models/problem.py:48 +msgid "problem groups" +msgstr "题目组" + +#: judge/models/problem.py:52 +msgid "key" +msgstr "键" + +#: judge/models/problem.py:54 +msgid "link" +msgstr "链接" + +#: judge/models/problem.py:55 +msgid "full name" +msgstr "全名字" + +#: judge/models/problem.py:56 judge/models/profile.py:32 +#: judge/models/runtime.py:23 +msgid "short name" +msgstr "简称" + +#: judge/models/problem.py:57 +msgid "Displayed on pages under this license" +msgstr "在本许可证下的页面上显示" + +#: judge/models/problem.py:58 +msgid "icon" +msgstr "图标" + +#: judge/models/problem.py:58 +msgid "URL to the icon" +msgstr "图标的 URL" + +#: judge/models/problem.py:59 +msgid "license text" +msgstr "许可证文本" + +#: judge/models/problem.py:68 +msgid "license" +msgstr "许可证" + +#: judge/models/problem.py:69 +msgid "licenses" +msgstr "许可证" + +#: judge/models/problem.py:96 +msgid "problem code" +msgstr "题目代码" + +#: judge/models/problem.py:98 +msgid "A short, unique code for the problem, used in the url after /problem/" +msgstr "" + +#: judge/models/problem.py:100 +msgid "problem name" +msgstr "题目名称" + +#: judge/models/problem.py:101 +msgid "The full name of the problem, as shown in the problem list." +msgstr "" + +#: judge/models/problem.py:103 +msgid "problem body" +msgstr "题目正文" + +#: judge/models/problem.py:104 +msgid "creators" +msgstr "作者" + +#: judge/models/problem.py:105 +msgid "These users will be able to edit the problem, and be listed as authors." +msgstr "" + +#: judge/models/problem.py:107 +msgid "curators" +msgstr "管理员" + +#: judge/models/problem.py:108 +msgid "These users will be able to edit the problem, but not be listed as authors." +msgstr "" + +#: judge/models/problem.py:110 +msgid "testers" +msgstr "测试人员" + +#: judge/models/problem.py:112 +msgid "These users will be able to view the private problem, but not edit it." +msgstr "" + +#: judge/models/problem.py:114 +msgid "The type of problem, as shown on the problem's page." +msgstr "" + +#: judge/models/problem.py:117 +msgid "The group of problem, shown under Category in the problem list." +msgstr "" + +#: judge/models/problem.py:119 +msgid "The time limit for this problem, in seconds. Fractional seconds (e.g. 1.5) are supported." +msgstr "这个问题的时间限制(以秒为单位。支持小数秒计时方式(例如1.5)。" + +#: judge/models/problem.py:123 judge/models/problem.py:380 +msgid "memory limit" +msgstr "内存限制" + +#: judge/models/problem.py:124 +msgid "The memory limit for this problem, in kilobytes (e.g. 64mb = 65536 kilobytes)." +msgstr "此问题的存储限制,以kb为单位(例如 64mb = 65536 kb)" + +#: judge/models/problem.py:130 +msgid "Points awarded for problem completion. Points are displayed with a 'p' suffix if partial." +msgstr "" + +#: judge/models/problem.py:133 +msgid "allows partial points" +msgstr "允许部分分数" + +#: judge/models/problem.py:134 +msgid "allowed languages" +msgstr "允许的语言" + +#: judge/models/problem.py:135 +msgid "List of allowed submission languages." +msgstr "" + +#: judge/models/problem.py:137 +msgid "manually managed" +msgstr "手动管理" + +#: judge/models/problem.py:138 +msgid "Whether judges should be allowed to manage data or not." +msgstr "" + +#: judge/models/problem.py:139 +msgid "date of publishing" +msgstr "公开日期" + +#: judge/models/problem.py:140 +msgid "Doesn't have magic ability to auto-publish due to backward compatibility" +msgstr "无法自动在时间后公开题目" + +#: judge/models/problem.py:142 +msgid "Bans the selected users from submitting to this problem." +msgstr "" + +#: judge/models/problem.py:144 +msgid "The license under which this problem is published." +msgstr "" + +#: judge/models/problem.py:146 +msgid "problem summary" +msgstr "问题摘要" + +#: judge/models/problem.py:148 +msgid "number of users" +msgstr "" + +#: judge/models/problem.py:149 +msgid "The number of users who solved the problem." +msgstr "" + +#: judge/models/problem.py:150 +msgid "solve rate" +msgstr "" + +#: judge/models/problem.py:156 +msgid "If private, only these organizations may see the problem." +msgstr "" + +#: judge/models/problem.py:358 judge/models/problem.py:376 +#: judge/models/runtime.py:99 +msgid "language" +msgstr "语言" + +#: judge/models/problem.py:359 +msgid "translated name" +msgstr "翻译题目名" + +#: judge/models/problem.py:360 +msgid "translated description" +msgstr "翻译题目正文" + +#: judge/models/problem.py:364 +msgid "problem translation" +msgstr "题目翻译" + +#: judge/models/problem.py:365 +msgid "problem translations" +msgstr "题目翻译" + +#: judge/models/problem.py:369 +msgid "clarified problem" +msgstr "已澄清的问题" + +#: judge/models/problem.py:370 +msgid "clarification body" +msgstr "澄清的身体" + +#: judge/models/problem.py:371 +msgid "clarification timestamp" +msgstr "澄清时间戳" + +#: judge/models/problem.py:386 +msgid "language-specific resource limit" +msgstr "语言特定资源限制" + +#: judge/models/problem.py:387 +msgid "language-specific resource limits" +msgstr "语言特定资源限制" + +#: judge/models/problem.py:391 +msgid "associated problem" +msgstr "关联的题目" + +#: judge/models/problem.py:394 +msgid "publish date" +msgstr "发布日期" + +#: judge/models/problem.py:396 +msgid "editorial content" +msgstr "可编辑的内容" + +#: judge/models/problem.py:412 +msgid "solution" +msgstr "题目讲解" + +#: judge/models/problem.py:413 +msgid "solutions" +msgstr "题目讲解" + +#: judge/models/problem_data.py:23 +msgid "Standard" +msgstr "标准" + +#: judge/models/problem_data.py:24 +msgid "Floats" +msgstr "浮点数" + +#: judge/models/problem_data.py:25 +msgid "Floats (absolute)" +msgstr "浮点数(仅绝对值)" + +#: judge/models/problem_data.py:26 +msgid "Floats (relative)" +msgstr "浮点数(仅相对值)" + +#: judge/models/problem_data.py:27 +msgid "Non-trailing spaces" +msgstr "无尾随空格" + +#: judge/models/problem_data.py:28 +msgid "Unordered" +msgstr "无序的" + +#: judge/models/problem_data.py:29 +msgid "Byte identical" +msgstr "字节全等" + +#: judge/models/problem_data.py:30 +msgid "Line-by-line" +msgstr "" + +#: judge/models/problem_data.py:37 +msgid "data zip file" +msgstr "zip数据文件" + +#: judge/models/problem_data.py:39 +msgid "generator file" +msgstr "生成器文件" + +#: judge/models/problem_data.py:41 judge/models/problem_data.py:90 +msgid "output prefix length" +msgstr "输出前缀长度" + +#: judge/models/problem_data.py:42 judge/models/problem_data.py:91 +msgid "output limit length" +msgstr "输出限制长度" + +#: judge/models/problem_data.py:43 +msgid "init.yml generation feedback" +msgstr "init.yml生成反馈" + +#: judge/models/problem_data.py:44 judge/models/problem_data.py:92 +msgid "checker" +msgstr "检查器" + +#: judge/models/problem_data.py:45 judge/models/problem_data.py:93 +msgid "checker arguments" +msgstr "检查器参数" + +#: judge/models/problem_data.py:46 judge/models/problem_data.py:94 +msgid "checker arguments as a JSON object" +msgstr "检查器参数作为JSON对象" + +#: judge/models/problem_data.py:77 +msgid "problem data set" +msgstr "题目数据集" + +#: judge/models/problem_data.py:79 +msgid "case position" +msgstr "测试编号" + +#: judge/models/problem_data.py:80 +msgid "case type" +msgstr "测试类型" + +#: judge/models/problem_data.py:81 +msgid "Normal case" +msgstr "正常测试" + +#: judge/models/problem_data.py:82 +msgid "Batch start" +msgstr "测试组开始" + +#: judge/models/problem_data.py:83 +msgid "Batch end" +msgstr "测试组结束" + +#: judge/models/problem_data.py:85 +msgid "input file name" +msgstr "输入的文件的名称" + +#: judge/models/problem_data.py:86 +msgid "output file name" +msgstr "输出文件的名称" + +#: judge/models/problem_data.py:87 +msgid "generator arguments" +msgstr "生成器参数" + +#: judge/models/problem_data.py:88 +msgid "point value" +msgstr "分数" + +#: judge/models/problem_data.py:89 +msgid "case is pretest?" +msgstr "是否为预测试?" + +#: judge/models/profile.py:29 +msgid "organization title" +msgstr "组织名称" + +#: judge/models/profile.py:30 +msgid "organization slug" +msgstr "" + +#: judge/models/profile.py:31 +msgid "Organization name shown in URL" +msgstr "" + +#: judge/models/profile.py:33 +msgid "Displayed beside user name during contests" +msgstr "竞赛时显示在用户名旁边" + +#: judge/models/profile.py:34 +msgid "organization description" +msgstr "组织描述" + +#: judge/models/profile.py:35 +msgid "registrant" +msgstr "注册人" + +#: judge/models/profile.py:36 +msgid "User who registered this organization" +msgstr "注册此组织的用户" + +#: judge/models/profile.py:37 +msgid "administrators" +msgstr "管理员" + +#: judge/models/profile.py:38 +msgid "Those who can edit this organization" +msgstr "这些用户可以编辑此组织" + +#: judge/models/profile.py:39 +msgid "creation date" +msgstr "创建日期" + +#: judge/models/profile.py:40 +msgid "is open organization?" +msgstr "是开放的组织吗?" + +#: judge/models/profile.py:41 +msgid "Allow joining organization" +msgstr "允许加入组织" + +#: judge/models/profile.py:42 +msgid "maximum size" +msgstr "最大大小" + +#: judge/models/profile.py:43 +msgid "Maximum amount of users in this organization, only applicable to private organizations" +msgstr "这个组织用户最大数量,只适用于私人组织" + +#: judge/models/profile.py:45 +msgid "Student access code" +msgstr "学生访问码" + +#: judge/models/profile.py:49 +msgid "This image will replace the default site logo for users viewing the organization." +msgstr "" + +#: judge/models/profile.py:75 judge/models/profile.py:91 +#: judge/models/profile.py:190 +msgid "organization" +msgstr "组织" + +#: judge/models/profile.py:80 +msgid "user associated" +msgstr "关联的用户" + +#: judge/models/profile.py:81 +msgid "self-description" +msgstr "自我描述" + +#: judge/models/profile.py:82 +msgid "location" +msgstr "位置" + +#: judge/models/profile.py:84 +msgid "preferred language" +msgstr "首选语言" + +#: judge/models/profile.py:89 +msgid "last access time" +msgstr "上次访问时间" + +#: judge/models/profile.py:90 +msgid "last IP" +msgstr "上次访问 IP" + +#: judge/models/profile.py:93 +msgid "display rank" +msgstr "显示排名" + +#: judge/models/profile.py:95 +msgid "comment mute" +msgstr "禁止评论" + +#: judge/models/profile.py:95 +msgid "Some users are at their best when silent." +msgstr "某些用户在沉默时表现最佳。" + +#: judge/models/profile.py:97 +msgid "unlisted user" +msgstr "" + +#: judge/models/profile.py:97 +msgid "User will not be ranked." +msgstr "" + +#: judge/models/profile.py:100 +msgid "user script" +msgstr "用户脚本" + +#: judge/models/profile.py:101 +msgid "User-defined JavaScript for site customization." +msgstr "用户自定义 JavaScript。" + +#: judge/models/profile.py:102 +msgid "current contest" +msgstr "当前竞赛" + +#: judge/models/profile.py:104 +msgid "math engine" +msgstr "数学引擎" + +#: judge/models/profile.py:106 +msgid "the rendering engine used to render math" +msgstr "数学渲染使用的引擎" + +#: judge/models/profile.py:107 +msgid "2FA enabled" +msgstr "" + +#: judge/models/profile.py:108 +msgid "check to enable TOTP-based two factor authentication" +msgstr "" + +#: judge/models/profile.py:109 +msgid "TOTP key" +msgstr "" + +#: judge/models/profile.py:110 +msgid "32 character base32-encoded key for TOTP" +msgstr "" + +#: judge/models/profile.py:112 +msgid "TOTP key must be empty or base32" +msgstr "" + +#: judge/models/profile.py:113 +msgid "internal notes" +msgstr "" + +#: judge/models/profile.py:114 +msgid "Notes for administrators regarding this user." +msgstr "" + +#: judge/models/profile.py:184 +msgid "user profile" +msgstr "用户信息" + +#: judge/models/profile.py:185 +msgid "user profiles" +msgstr "用户信息" + +#: judge/models/profile.py:192 +msgid "request time" +msgstr "请求时间" + +#: judge/models/profile.py:193 +msgid "state" +msgstr "状态" + +#: judge/models/profile.py:198 +msgid "reason" +msgstr "原因" + +#: judge/models/profile.py:201 +msgid "organization join request" +msgstr "组织加入请求" + +#: judge/models/profile.py:202 +msgid "organization join requests" +msgstr "组织加入请求" + +#: judge/models/runtime.py:18 +msgid "short identifier" +msgstr "标识符" + +#: judge/models/runtime.py:19 +msgid "The identifier for this language; the same as its executor id for judges." +msgstr "语言标识符(和裁判服务器的执行器标识符一样)" + +#: judge/models/runtime.py:21 +msgid "long name" +msgstr "长名称" + +#: judge/models/runtime.py:22 +msgid "Longer name for the language, e.g. \"Python 2\" or \"C++11\"." +msgstr "语言全称,比如“Python 2”或”C++11“。" + +#: judge/models/runtime.py:24 +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 "比较好听的公开语言简称,比如“PY2”和“C++11”,如果放空则使用短标识符。" + +#: judge/models/runtime.py:28 +msgid "common name" +msgstr "通用名" + +#: judge/models/runtime.py:29 +msgid "Common name for the language. For example, the common name for C++03, C++11, and C++14 would be \"C++\"" +msgstr "语言的通用名称,例如C++03、C++11、C++14的通用名称为“C++”。" + +#: judge/models/runtime.py:31 +msgid "ace mode name" +msgstr "ace 模式名称" + +#: judge/models/runtime.py:32 +msgid "Language ID for Ace.js editor highlighting, appended to \"mode-\" to determine the Ace JavaScript file to use, e.g., \"python\"." +msgstr "Ace.js编辑器高亮显示的语言标识符,加上“mode-”前缀而决定使用的JavaScript文件。" + +#: judge/models/runtime.py:34 +msgid "pygments name" +msgstr "pygments 名称" + +#: judge/models/runtime.py:35 +msgid "Language ID for Pygments highlighting in source windows." +msgstr "Pygments代码高亮语言标识符,在查看代码是使用。" + +#: judge/models/runtime.py:36 +msgid "code template" +msgstr "代码模板" + +#: judge/models/runtime.py:37 +msgid "Code template to display in submission editor." +msgstr "在提交版面中显示的代码模板" + +#: judge/models/runtime.py:38 +msgid "runtime info override" +msgstr "软件信息覆盖" + +#: judge/models/runtime.py:39 +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:41 +msgid "language description" +msgstr "语言描述" + +#: judge/models/runtime.py:42 +msgid "Use field this to inform users of quirks with your environment, additional restrictions, etc." +msgstr "使用本空间来表达运行环境的特性、额外限制等信息。" + +#: judge/models/runtime.py:44 +msgid "extension" +msgstr "扩展" + +#: judge/models/runtime.py:45 +msgid "The extension of source files, e.g., \"py\" or \"cpp\"." +msgstr "源文件扩展名,例如:\"py\"或\"cpp\"。" + +#: judge/models/runtime.py:100 +msgid "languages" +msgstr "语言" + +#: judge/models/runtime.py:104 +msgid "language to which this runtime belongs" +msgstr "软件属于的语言" + +#: judge/models/runtime.py:105 +msgid "judge on which this runtime exists" +msgstr "拥有次语言的裁判服务器" + +#: judge/models/runtime.py:106 +msgid "runtime name" +msgstr "软件名称" + +#: judge/models/runtime.py:107 +msgid "runtime version" +msgstr "软件版本" + +#: judge/models/runtime.py:108 +msgid "order in which to display this runtime" +msgstr "软件显示顺序" + +#: judge/models/runtime.py:112 +msgid "Server name, hostname-style" +msgstr "服务器名称" + +#: judge/models/runtime.py:113 +msgid "time of creation" +msgstr "创建时间" + +#: judge/models/runtime.py:114 +msgid "A key to authenticated this judge" +msgstr "裁判服务器连接密匙" + +#: judge/models/runtime.py:115 +msgid "authentication key" +msgstr "连接密匙" + +#: judge/models/runtime.py:116 +msgid "block judge" +msgstr "" + +#: judge/models/runtime.py:117 +msgid "Whether this judge should be blocked from connecting, even if its key is correct." +msgstr "" + +#: judge/models/runtime.py:119 +msgid "judge online status" +msgstr "裁判在线状态" + +#: judge/models/runtime.py:120 +msgid "judge start time" +msgstr "裁判启动时间" + +#: judge/models/runtime.py:121 +msgid "response time" +msgstr "响应时间" + +#: judge/models/runtime.py:122 +msgid "system load" +msgstr "系统负载" + +#: judge/models/runtime.py:123 +msgid "Load for the last minute, divided by processors to be fair." +msgstr "最后一分钟的系统负载(每处理器平均值)" + +#: judge/models/runtime.py:127 judge/models/runtime.py:167 +msgid "judges" +msgstr "裁判服务器" + +#: judge/models/runtime.py:166 +msgid "judge" +msgstr "裁判服务器" + +#: judge/models/submission.py:20 judge/models/submission.py:47 +#: judge/utils/problems.py:86 +msgid "Accepted" +msgstr "接受" + +#: judge/models/submission.py:21 judge/models/submission.py:48 +msgid "Wrong Answer" +msgstr "答案错误" + +#: judge/models/submission.py:22 judge/models/submission.py:50 +msgid "Time Limit Exceeded" +msgstr "超出时间限制" + +#: judge/models/submission.py:23 judge/models/submission.py:51 +msgid "Memory Limit Exceeded" +msgstr "超出内存限制" + +#: judge/models/submission.py:24 judge/models/submission.py:52 +msgid "Output Limit Exceeded" +msgstr "超出输出限制" + +#: judge/models/submission.py:25 judge/models/submission.py:53 +msgid "Invalid Return" +msgstr "错误退出代码" + +#: judge/models/submission.py:26 judge/models/submission.py:54 +msgid "Runtime Error" +msgstr "运行错误" + +#: judge/models/submission.py:27 judge/models/submission.py:41 +#: judge/models/submission.py:55 judge/utils/problems.py:88 +msgid "Compile Error" +msgstr "编译错误" + +#: judge/models/submission.py:28 judge/models/submission.py:40 +msgid "Internal Error" +msgstr "内部错误" + +#: judge/models/submission.py:29 +msgid "Short circuit" +msgstr "跳过" + +#: judge/models/submission.py:30 judge/models/submission.py:42 +#: judge/models/submission.py:61 +msgid "Aborted" +msgstr "中止" + +#: judge/models/submission.py:36 judge/models/submission.py:57 +msgid "Queued" +msgstr "等待中" + +#: judge/models/submission.py:37 judge/models/submission.py:58 +msgid "Processing" +msgstr "处理中" + +#: judge/models/submission.py:38 judge/models/submission.py:59 +msgid "Grading" +msgstr "评分中" + +#: judge/models/submission.py:39 judge/models/submission.py:60 +msgid "Completed" +msgstr "完成" + +#: judge/models/submission.py:56 +msgid "Internal Error (judging server error)" +msgstr "内部错误 (裁判服务器错误)" + +#: judge/models/submission.py:66 +msgid "submission time" +msgstr "提交时间" + +#: judge/models/submission.py:67 judge/models/submission.py:201 +msgid "execution time" +msgstr "执行时间" + +#: judge/models/submission.py:68 judge/models/submission.py:202 +msgid "memory usage" +msgstr "内存使用" + +#: judge/models/submission.py:69 judge/models/submission.py:203 +msgid "points granted" +msgstr "获得分数" + +#: judge/models/submission.py:70 +msgid "submission language" +msgstr "提交语言" + +#: judge/models/submission.py:71 +msgid "status" +msgstr "状态" + +#: judge/models/submission.py:72 +msgid "result" +msgstr "结果" + +#: judge/models/submission.py:74 +msgid "compile errors" +msgstr "编译错误" + +#: judge/models/submission.py:76 +msgid "batched cases" +msgstr "测试组" + +#: judge/models/submission.py:77 +msgid "test case points" +msgstr "测试点分值" + +#: judge/models/submission.py:78 +msgid "test case total points" +msgstr "测试用例总分" + +#: judge/models/submission.py:79 +msgid "judged on" +msgstr "裁判服务器" + +#: judge/models/submission.py:81 +msgid "was rejudged by admin" +msgstr "被管理员重新评分" + +#: judge/models/submission.py:82 +msgid "was ran on pretests only" +msgstr "只进行过预测试" + +#: judge/models/submission.py:182 templates/contest/moss.html:58 +msgid "submissions" +msgstr "提交历史" + +#: judge/models/submission.py:186 judge/models/submission.py:197 +msgid "associated submission" +msgstr "相关提交" + +#: judge/models/submission.py:188 +msgid "source code" +msgstr "源码" + +#: judge/models/submission.py:199 +msgid "test case ID" +msgstr "测试编号" + +#: judge/models/submission.py:200 +msgid "status flag" +msgstr "状态标志" + +#: judge/models/submission.py:204 +msgid "points possible" +msgstr "满分" + +#: judge/models/submission.py:205 +msgid "batch number" +msgstr "批号" + +#: judge/models/submission.py:206 +msgid "judging feedback" +msgstr "评测反馈" + +#: judge/models/submission.py:207 +msgid "extended judging feedback" +msgstr "" + +#: judge/models/submission.py:208 +msgid "program output" +msgstr "程序输出" + +#: judge/models/submission.py:216 +msgid "submission test case" +msgstr "程序测试" + +#: judge/models/submission.py:217 +msgid "submission test cases" +msgstr "程序测试" + +#: judge/models/ticket.py:10 +msgid "ticket title" +msgstr "票标题" + +#: judge/models/ticket.py:11 +msgid "ticket creator" +msgstr "ticket创建者" + +#: judge/models/ticket.py:13 +msgid "creation time" +msgstr "创造时间" + +#: judge/models/ticket.py:14 +msgid "assignees" +msgstr "受让人" + +#: judge/models/ticket.py:15 +msgid "quick notes" +msgstr "便笺" + +#: judge/models/ticket.py:16 +msgid "Staff notes for this issue to aid in processing." +msgstr "工作人员表示,问题正在受处理的过程中" + +#: judge/models/ticket.py:17 +msgid "linked item type" +msgstr "链接的项目类型" + +#: judge/models/ticket.py:19 +msgid "linked item ID" +msgstr "链接的项目 ID" + +#: judge/models/ticket.py:21 +msgid "is ticket open?" +msgstr "门票开了吗?" + +#: judge/models/ticket.py:25 +msgid "ticket" +msgstr "票" + +#: judge/models/ticket.py:27 +msgid "poster" +msgstr "海报" + +#: judge/models/ticket.py:30 +msgid "message time" +msgstr "消息时间" + +#: judge/pdf_problems.py:134 judge/pdf_problems.py:186 +#: judge/pdf_problems.py:246 +msgid "Page [page] of [topage]" +msgstr "第[page]页,共[topage]页" + +#: judge/tasks/moss.py:25 +msgid "Running MOSS" +msgstr "" + +#: judge/tasks/submission.py:43 +msgid "Modifying submissions" +msgstr "" + +#: judge/tasks/submission.py:56 +msgid "Recalculating user points" +msgstr "" + +#: judge/utils/problem_data.py:63 +msgid "Empty batches not allowed." +msgstr "不允许测试组为空。" + +#: judge/utils/problem_data.py:82 +#, python-format +msgid "Points must be defined for non-batch case #%d." +msgstr "编号为%d的组外测试必须设置分数。" + +#: judge/utils/problem_data.py:87 +#, python-format +msgid "Input file for case %d does not exist: %s" +msgstr "编号为%d的测试输入文件不存在:%s" + +#: judge/utils/problem_data.py:90 +#, python-format +msgid "Output file for case %d does not exist: %s" +msgstr "编号为%d的测试输出文件不存在:%s" + +#: judge/utils/problem_data.py:115 +#, python-format +msgid "Batch start case #%d requires points." +msgstr "编号为%d的测试组必须设置分数。" + +#: judge/utils/problem_data.py:136 +#, python-format +msgid "Attempt to end batch outside of one in case #%d" +msgstr "测试编号%d:试图在组外结束测试组。" + +#: judge/utils/problem_data.py:154 +msgid "How did you corrupt the zip path?" +msgstr "你怎么损坏zip文件路径???" + +#: judge/utils/problem_data.py:160 +msgid "How did you corrupt the generator path?" +msgstr "你怎么使生成器路径崩溃?" + +#: judge/utils/problems.py:76 +msgid "Can't pass both queryset and keyword filters" +msgstr "无法同时使用 queryset 和关键字筛选" + +#: judge/utils/problems.py:87 +msgid "Wrong" +msgstr "" + +#: judge/utils/problems.py:89 +msgid "Timeout" +msgstr "" + +#: judge/utils/problems.py:90 +msgid "Error" +msgstr "" + +#: 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/timedelta.py:49 +msgctxt "time format with day" +msgid "%d day %h:%m:%s" +msgid_plural "%d days %h:%m:%s" +msgstr[0] "%d 天 %h:%m:%s" + +#: judge/utils/timedelta.py:53 +msgctxt "time format without day" +msgid "%h:%m:%s" +msgstr "%h:%m:%s" + +#: 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] "%d 天 %h:%m" + +#: judge/utils/timedelta.py:61 +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d 天" + +#: judge/utils/timedelta.py:63 +msgctxt "hours and minutes" +msgid "%h:%m" +msgstr "%h:%m" + +#: judge/views/blog.py:38 +#, python-format +msgid "Page %d of Posts" +msgstr "帖子第%d页" + +#: judge/views/comment.py:27 +msgid "Messing around, are we?" +msgstr "请别捣乱。" + +#: judge/views/comment.py:36 +msgid "You must solve at least one problem before you can vote." +msgstr "" + +#: judge/views/comment.py:63 +msgid "You already voted." +msgstr "你已经投了票。" + +#: judge/views/comment.py:120 judge/views/organization.py:299 +msgid "Edited from site" +msgstr "从网站中上编辑" + +#: judge/views/comment.py:141 +msgid "Editing comment" +msgstr "编辑评论" + +#: judge/views/contests.py:49 judge/views/contests.py:211 +#: judge/views/contests.py:214 judge/views/contests.py:385 +msgid "No such contest" +msgstr "该竞赛不存在" + +#: judge/views/contests.py:50 judge/views/contests.py:212 +#, python-format +msgid "Could not find a contest with the key \"%s\"." +msgstr "找不到标识符为“%s“的竞赛。" + +#: judge/views/contests.py:75 +msgid "Contests" +msgstr "竞赛" + +#: judge/views/contests.py:215 +msgid "Could not find such contest." +msgstr "找不到该竞赛。" + +#: judge/views/contests.py:218 +#, python-format +msgid "Access to contest \"%s\" denied" +msgstr "对竞赛”%s“的访问被拒绝" + +#: judge/views/contests.py:242 +msgid "Clone Contest" +msgstr "" + +#: judge/views/contests.py:305 +msgid "Contest not ongoing" +msgstr "竞赛不在进行" + +#: judge/views/contests.py:306 +#, python-format +msgid "\"%s\" is not currently ongoing." +msgstr "“%s“不在进行。" + +#: judge/views/contests.py:310 +msgid "Already in contest" +msgstr "已经参与了竞赛" + +#: judge/views/contests.py:311 +#, python-format +msgid "You are already in a contest: \"%s\"." +msgstr "您已经参与了竞赛:”%s“。" + +#: judge/views/contests.py:314 +msgid "Banned from joining" +msgstr "" + +#: judge/views/contests.py:315 +msgid "You have been declared persona non grata for this contest. You are permanently barred from joining this contest." +msgstr "" + +#: judge/views/contests.py:375 +#, python-format +msgid "Enter access code for \"%s\"" +msgstr "输入”%s“的访问码" + +#: judge/views/contests.py:386 +#, python-format +msgid "You are not in contest \"%s\"." +msgstr "你不是在竞赛\"%s\"中。" + +#: judge/views/contests.py:405 +msgid "ContestCalendar requires integer year and month" +msgstr "" + +#: judge/views/contests.py:445 +#, python-format +msgid "Contests in %(month)s" +msgstr "%(month)s的竞赛" + +#: judge/views/contests.py:445 +msgid "F Y" +msgstr "" + +#: judge/views/contests.py:531 +msgid "???" +msgstr "???" + +#: judge/views/contests.py:594 +#, python-format +msgid "%s Rankings" +msgstr "%s 排行榜" + +#: judge/views/contests.py:610 +#, python-format +msgid "Your participation in %s" +msgstr "你在%s中的参与历史" + +#: judge/views/contests.py:611 +#, python-format +msgid "%s's participation in %s" +msgstr "%s在%s中的参与历史" + +#: judge/views/contests.py:615 +msgid "Live" +msgstr "实时" + +#: judge/views/contests.py:627 templates/contest/contest-tabs.html:13 +msgid "Participation" +msgstr "参与历史" + +#: judge/views/contests.py:654 +#, python-format +msgid "%s MOSS Results" +msgstr "" + +#: judge/views/contests.py:681 +#, python-format +msgid "Running MOSS for %s..." +msgstr "" + +#: judge/views/contests.py:704 +#, python-format +msgid "Contest tag: %s" +msgstr "竞赛标签:%s" + +#: judge/views/error.py:14 +msgid "404 error" +msgstr "404 错误" + +#: judge/views/error.py:15 +#, python-format +msgid "Could not find page \"%s\"" +msgstr "找不到网页\"%s\"。" + +#: judge/views/error.py:22 +#, python-format +msgid "no permission for %s" +msgstr "无权访问 %s" + +#: judge/views/error.py:30 +#, python-format +msgid "corrupt page %s" +msgstr "页面错误 %s" + +#: 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:44 judge/views/organization.py:47 +msgid "No such organization" +msgstr "无该组织" + +#: judge/views/organization.py:45 +#, python-format +msgid "Could not find an organization with the key \"%s\"." +msgstr "找不到标识符为”%s“的组织。" + +#: judge/views/organization.py:48 +msgid "Could not find such organization." +msgstr "找不到该组织。" + +#: judge/views/organization.py:72 judge/views/register.py:34 +#: templates/organization/list.html:15 templates/user/user-list-tabs.html:5 +msgid "Organizations" +msgstr "组织" + +#: judge/views/organization.py:93 +#, python-format +msgid "%s Members" +msgstr "%s 成员列表" + +#: judge/views/organization.py:118 judge/views/organization.py:121 +#: judge/views/organization.py:126 +msgid "Joining organization" +msgstr "加入组织" + +#: judge/views/organization.py:118 +msgid "You are already in the organization." +msgstr "你已经是该组织的成员。" + +#: judge/views/organization.py:121 +msgid "This organization is not open." +msgstr "该组织不开放。" + +#: judge/views/organization.py:138 +msgid "Leaving organization" +msgstr "离开组织" + +#: judge/views/organization.py:138 +#, python-format +msgid "You are not in \"%s\"." +msgstr "你不是是“%s”的成员。" + +#: judge/views/organization.py:162 +#, python-format +msgid "Request to join %s" +msgstr "请求加入 %s" + +#: judge/views/organization.py:180 +msgid "Join request detail" +msgstr "组织加入请求详细信息" + +#: judge/views/organization.py:209 +#, python-format +msgid "Managing join requests for %s" +msgstr "管理 %s 的加入请求" + +#: judge/views/organization.py:240 +#, python-format +msgid "Your organization can only receive %d more members. You cannot approve %d users." +msgstr "你的组织只能再接受%d个用户,无法接受%d个。" + +#: judge/views/organization.py:252 +#, python-format +msgid "Approved %d user." +msgid_plural "Approved %d users." +msgstr[0] "批准了%d个用户。" + +#: judge/views/organization.py:253 +#, python-format +msgid "Rejected %d user." +msgid_plural "Rejected %d users." +msgstr[0] "拒绝了%d个用户。" + +#: judge/views/organization.py:283 +#, python-format +msgid "Editing %s" +msgstr "编辑 %s" + +#: judge/views/organization.py:307 judge/views/organization.py:315 +msgid "Can't edit organization" +msgstr "无法编辑组织" + +#: judge/views/organization.py:308 +msgid "You are not allowed to edit this organization." +msgstr "您没有编辑该组织的权利。" + +#: judge/views/organization.py:316 +msgid "You are not allowed to kick people from this organization." +msgstr "你没有踢组织成员的权利。" + +#: judge/views/organization.py:321 judge/views/organization.py:325 +msgid "Can't kick user" +msgstr "无法踢用户" + +#: judge/views/organization.py:322 +msgid "The user you are trying to kick does not exist!" +msgstr "你想踢的用户不存在!" + +#: judge/views/organization.py:326 +#, python-format +msgid "The user you are trying to kick is not in organization: %s." +msgstr "你想踢的用户不是组织成员:%s" + +#: judge/views/problem.py:68 +msgid "No such problem" +msgstr "无该题目" + +#: judge/views/problem.py:69 +#, python-format +msgid "Could not find a problem with the code \"%s\"." +msgstr "找不到代码为“%s”的题目。" + +#: judge/views/problem.py:111 +#, python-brace-format +msgid "Editorial for {0}" +msgstr "{0} 的题解" + +#: judge/views/problem.py:114 +#, python-brace-format +msgid "Editorial for {0}" +msgstr "{0}的题解" + +#: judge/views/problem.py:285 templates/contest/contest.html:79 +#: templates/user/user-tabs.html:5 templates/user/users-table.html:23 +msgid "Problems" +msgstr "题目" + +#: judge/views/problem.py:546 +msgid "Banned from submitting" +msgstr "禁止提交" + +#: judge/views/problem.py:547 +msgid "You have been declared persona non grata for this problem. You are permanently barred from submitting this problem." +msgstr "您在该题目不受欢迎。您被永久禁止为该题目提交解决程序。" + +#: judge/views/problem.py:560 +msgid "Too many submissions" +msgstr "提交太多了" + +#: judge/views/problem.py:561 +msgid "You have exceeded the submission limit for this problem." +msgstr "您已超出此问题的提交限制。" + +#: judge/views/problem.py:627 judge/views/problem.py:630 +#, python-format +msgid "Submit to %(problem)s" +msgstr "提交于 %(problem)s" + +#: judge/views/problem.py:646 +msgid "Clone Problem" +msgstr "" + +#: judge/views/problem_data.py:37 +msgid "Checker arguments must be a JSON object" +msgstr "检查器参数必须是一个 JSON 对象" + +#: judge/views/problem_data.py:39 +msgid "Checker arguments is invalid JSON" +msgstr "检查参数是无效的 JSON" + +#: judge/views/problem_data.py:46 +msgid "Your zip file is invalid!" +msgstr "您的 zip 文件是无效的 !" + +#: judge/views/problem_data.py:104 +#, python-brace-format +msgid "Comparing submissions for {0}" +msgstr "比较 {0} 的提交" + +#: judge/views/problem_data.py:107 +#, python-brace-format +msgid "Comparing submissions for {0}" +msgstr "正在比较 {0} 的提交情况" + +#: judge/views/problem_data.py:142 +#, python-brace-format +msgid "Editing data for {0}" +msgstr "正在编辑 {0} 的数据" + +#: judge/views/problem_data.py:145 +#, python-format +msgid "Editing data for %s" +msgstr "编辑%s的测试数据" + +#: judge/views/problem_data.py:237 judge/views/problem_data.py:238 +#, python-format +msgid "Generated init.yml for %s" +msgstr "为%s生成的init.yml" + +#: 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] "" + +#: judge/views/ranked_submission.py:58 +#, python-format +msgid "Best solutions for %s" +msgstr "%s 排行榜" + +#: judge/views/ranked_submission.py:61 +#, python-brace-format +msgid "Best solutions for {0}" +msgstr "{0} 排行榜" + +#: judge/views/ranked_submission.py:71 +#, python-format +msgid "Best solutions for %(problem)s in %(contest)s" +msgstr "竞赛 %(contest)s 中 %(problem)s 排行榜" + +#: judge/views/ranked_submission.py:74 +#, python-format +msgid "Best solutions for problem %(number)s in %(contest)s" +msgstr "%(contest)s 第 %(number)s 题的最佳解决方案" + +#: judge/views/ranked_submission.py:80 +#, python-brace-format +msgid "Best solutions for {0} in {2}" +msgstr "竞赛 {2}{0} 排行榜" + +#: judge/views/ranked_submission.py:83 +#, python-brace-format +msgid "Best solutions for problem {0} in {1}" +msgstr "{1} 第 {0} 题的最佳解决方案" + +#: judge/views/register.py:27 +msgid "A username must contain letters, numbers, or underscores" +msgstr "用户名只能包含字母、 数字或下划线。" + +#: judge/views/register.py:31 templates/user/edit-profile.html:103 +msgid "Preferred language" +msgstr "首选语言" + +#: judge/views/register.py:38 +msgid "Subscribe to newsletter?" +msgstr "订阅简讯" + +#: judge/views/register.py:45 +#, python-format +msgid "The email address \"%s\" is already taken. Only one registration is allowed per address." +msgstr "电子邮件地址“%s“已被使用。每个电子邮件地址只允许一个账户。" + +#: judge/views/register.py:51 +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 +msgid "Registration" +msgstr "注册" + +#: judge/views/register.py:106 +msgid "Authentication failure" +msgstr "身份验证失败" + +#: judge/views/stats.py:105 +msgid "Language statistics" +msgstr "语言统计信息" + +#: judge/views/status.py:24 templates/submission/list.html:319 +msgid "Status" +msgstr "状态" + +#: judge/views/status.py:108 +msgid "Version matrix" +msgstr "版本矩阵" + +#: judge/views/submission.py:59 judge/views/submission.py:66 +#, python-format +msgid "Submission of %(problem)s by %(user)s" +msgstr "%(user)s 在 %(problem)s 的提交结果" + +#: judge/views/submission.py:161 judge/views/submission.py:162 +#: templates/problem/problem.html:127 +msgid "All submissions" +msgstr "所有提交历史" + +#: judge/views/submission.py:303 +msgid "All my submissions" +msgstr "我提交的程序" + +#: judge/views/submission.py:304 +#, python-format +msgid "All submissions by %s" +msgstr "%s 的提交历史" + +#: judge/views/submission.py:335 +#, python-format +msgid "All submissions for %s" +msgstr "%s 的提交历史" + +#: judge/views/submission.py:354 +msgid "Must pass a problem" +msgstr "必须给予题目" + +#: judge/views/submission.py:397 +#, python-format +msgid "My submissions for %(problem)s" +msgstr "我对 %(problem)s 提交的程序" + +#: judge/views/submission.py:398 +#, python-format +msgid "%(user)s's submissions for %(problem)s" +msgstr "%(user)s 在 %(problem)s 的提交历史" + +#: judge/views/submission.py:495 +msgid "Must pass a contest" +msgstr "必须给予竞赛" + +#: judge/views/submission.py:514 +#, python-brace-format +msgid "{0}'s submissions for {2} in {4}" +msgstr "{4}{0}{2} 的提交历史" + +#: judge/views/submission.py:519 +#, python-brace-format +msgid "{0}'s submissions for problem {2} in {3}" +msgstr "{0}{3} 第 {2} 题提交的程序" + +#: judge/views/ticket.py:33 judge/views/ticket.py:39 +msgid "Ticket title" +msgstr "工单标题" + +#: judge/views/ticket.py:40 +msgid "Issue description" +msgstr "问题说明" + +#: judge/views/ticket.py:85 judge/views/ticket.py:88 +#, python-format +msgid "New ticket for %s" +msgstr "新工单:%s" + +#: judge/views/ticket.py:139 +#, python-format +msgid "%(title)s - Ticket %(id)d" +msgstr "%(title)s -工单 %(id)d" + +#: judge/views/ticket.py:248 +#, python-format +msgid "Tickets - Page %(number)d of %(total)d" +msgstr "工单 - 第 %(number)d 页,共 %(total)d 页" + +#: judge/views/ticket.py:297 +#, python-format +msgid "New Ticket: %s" +msgstr "新工单:%s" + +#: judge/views/ticket.py:298 +#, python-format +msgid "#%(id)d, assigned to: %(users)s" +msgstr "#%(id)d, 分配给: %(users)s" + +#: judge/views/ticket.py:300 +msgid ", " +msgstr ", " + +#: judge/views/ticket.py:300 +msgid "no one" +msgstr "没人" + +#: judge/views/totp.py:42 templates/registration/totp_enable.html:86 +msgid "Enable Two Factor Authentication" +msgstr "" + +#: judge/views/totp.py:89 templates/registration/totp_disable.html:48 +msgid "Disable Two Factor Authentication" +msgstr "" + +#: judge/views/totp.py:103 +msgid "Perform Two Factor Authentication" +msgstr "" + +#: judge/views/user.py:68 +msgid "No such user" +msgstr "无该用户" + +#: judge/views/user.py:68 +#, python-format +msgid "No user handle \"%s\"." +msgstr "无名为“%s“的用户" + +#: judge/views/user.py:72 +msgid "My account" +msgstr "我的帐户" + +#: judge/views/user.py:73 +#, python-format +msgid "User %s" +msgstr "用户 %s" + +#: judge/views/user.py:136 +msgid "M j, Y, G:i" +msgstr "Y年n月j日 G:i" + +#: judge/views/user.py:221 +msgid "Updated on site" +msgstr "在网站上更新" + +#: judge/views/user.py:253 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:10 +msgid "Edit profile" +msgstr "编辑个人资料" + +#: judge/views/user.py:262 templates/user/user-list-tabs.html:4 +msgid "Leaderboard" +msgstr "排行榜" + +#: judge/views/widgets.py:48 judge/views/widgets.py:58 +#, python-format +msgid "Invalid upstream data: %s" +msgstr "无效的上游数据: %s" + +#: judge/views/widgets.py:68 +msgid "Bad latitude or longitude" +msgstr "无效的纬度或经度" + +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:13 +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:27 +msgid "Photo" +msgstr "" + +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:14 +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:28 +msgid "Photos" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:9 +msgid "first name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:10 +msgid "last name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:11 +msgid "biography" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/admin.py:24 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:30 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:30 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:30 +msgid "owner" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:12 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:12 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:12 +msgid "name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:19 +msgid "Category of Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:20 +msgid "Categories of Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:26 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:26 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:26 +msgid "title" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:28 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:28 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:28 +msgid "category" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:29 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:29 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:29 +msgid "author" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:31 +msgid "publication date" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:37 +msgid "Book" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:38 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:136 +msgid "Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:19 +msgid "Category of CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:20 +msgid "Categories of CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:36 +msgid "CD" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:37 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:141 +msgid "CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:19 +msgid "Category of DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:20 +msgid "Categories of DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:36 +msgid "DVD" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:37 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:146 +msgid "DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/templates/admin/base_site.html:7 +msgid "Django administration" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/forms.py:12 +#, python-format +msgid "Please enter the correct %(username)s and password for an admin account. Note that both fields may be case-sensitive." +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/forms.py:32 +#, python-format +msgid "Please enter the correct %(username)s and password for an user account. Note that both fields may be case-sensitive." +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:27 +msgid "Site" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:38 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:41 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:130 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:133 +msgid "Dashboard" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:48 +msgid "Applications" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:53 +msgid "Administration" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:64 +msgid "Color theme" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:66 +msgid "Change color theme" +msgstr "" + +#: 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 +msgid "Rate all ratable contests" +msgstr "评分所有可评分竞赛" + +#: 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 +msgid "Rejudge" +msgstr "重新评分" + +#: templates/base.html:214 +#, python-format +msgid "Hello, %(username)s." +msgstr "你好,%(username)s。" + +#: templates/base.html:220 templates/comments/list.html:89 +#: templates/contest/contest-list-tabs.html:24 +#: templates/problem/problem-list-tabs.html:6 +#: templates/submission/info-base.html:12 +#: templates/submission/submission-list-tabs.html:15 +msgid "Admin" +msgstr "管理" + +#: templates/base.html:229 +msgid "Log out" +msgstr "登出" + +#: templates/base.html:238 +#: templates/registration/password_reset_complete.html:4 +msgid "Log in" +msgstr "登录" + +#: templates/base.html:239 templates/registration/registration_form.html:177 +msgid "or" +msgstr "或" + +#: templates/base.html:240 +msgid "Sign up" +msgstr "" + +#: templates/base.html:252 +msgid "spectating" +msgstr "旁观中" + +#: templates/base.html:265 +msgid "This site works best with JavaScript enabled." +msgstr "本网站启用 JavaScript 效果最好。" + +#: templates/blog/content.html:13 templates/comments/list.html:68 +#: templates/comments/list.html:83 templates/contest/contest-tabs.html:20 +#: 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 +msgid "Edit" +msgstr "编辑" + +#: templates/blog/content.html:27 +#, python-format +msgid "\n" +" posted on %(time)s\n" +" " +msgstr "\n" +" 于 %(time)s 张贴 \n" +" " + +#: templates/blog/dashboard.html:21 +#, python-format +msgid "\n" +" on %(time)s\n" +" " +msgstr "\n" +" 在 %(time)s\n" +" " + +#: templates/blog/list.html:85 +msgid "Blog" +msgstr "更新" + +#: templates/blog/list.html:87 +msgid "Events" +msgstr "活动" + +#: templates/blog/list.html:92 +msgid "News" +msgstr "新闻" + +#: templates/blog/list.html:106 +#, python-brace-format +msgid "posted on {time}" +msgstr "贴在 {time}" + +#: templates/blog/list.html:130 templates/problem/problem.html:310 +msgid "Clarifications" +msgstr "澄清" + +#: templates/blog/list.html:146 templates/problem/problem.html:321 +msgid "No clarifications have been made at this time." +msgstr "目前还没有作出任何澄清。" + +#: templates/blog/list.html:154 +msgid "Ongoing contests" +msgstr "进行中的竞赛" + +#: templates/blog/list.html:172 +msgid "Upcoming contests" +msgstr "未来的竞赛" + +#: templates/blog/list.html:189 +msgid "Comment stream" +msgstr "评论流" + +#: templates/blog/list.html:208 +msgid "New problems" +msgstr "新题目" + +#: templates/blog/list.html:225 +msgid "My open tickets" +msgstr "我的活动工单" + +#: templates/blog/list.html:246 +msgid "New tickets" +msgstr "新工单" + +#: templates/comments/list.html:2 +msgid "Comments" +msgstr "评论" + +#: templates/comments/list.html:18 templates/comments/list.html:27 +msgid "Please login to vote" +msgstr "登录后才可投票" + +#: templates/comments/list.html:40 +#, python-brace-format +msgid "commented on {time}" +msgstr "于 {time} 时评论" + +#: templates/comments/list.html:49 +#, python-format +msgid "edit %(edits)s" +msgstr "编辑 %(edits)s" + +#: templates/comments/list.html:51 templates/comments/media-js.html:77 +msgid "edited" +msgstr "已编辑" + +#: templates/comments/list.html:60 +msgid "Link" +msgstr "链接" + +#: templates/comments/list.html:73 templates/comments/list.html:80 +msgid "Reply" +msgstr "回复" + +#: templates/comments/list.html:86 +msgid "Hide" +msgstr "隐藏" + +#: templates/comments/list.html:101 +#, 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:120 +msgid "There are no comments at the moment." +msgstr "目前没有评论。" + +#: templates/comments/list.html:126 +msgid "New comment" +msgstr "新评论" + +#: templates/comments/list.html:140 +msgid "Invalid comment body." +msgstr "无效的评论内容。" + +#: templates/comments/list.html:148 +msgid "Post!" +msgstr "发布" + +#: templates/comments/list.html:156 +msgid "Comments are disabled on this page." +msgstr "" + +#: templates/comments/media-js.html:72 +#, python-brace-format +msgid "edit {edits}" +msgstr "编辑 {edits}" + +#: templates/comments/media-js.html:75 +msgid "original" +msgstr "源语言" + +#: templates/contest/access_code.html:26 +msgid "Invalid access code." +msgstr "无效的访问代码。" + +#: templates/contest/access_code.html:29 +msgid "Please enter your access code:" +msgstr "请输入你的访问码" + +#: templates/contest/access_code.html:32 +msgid "Join Contest" +msgstr "参加竞赛" + +#: templates/contest/calendar.html:12 +msgid "Sunday" +msgstr "星期日" + +#: templates/contest/calendar.html:13 +msgid "Monday" +msgstr "星期一" + +#: templates/contest/calendar.html:14 +msgid "Tuesday" +msgstr "星期二" + +#: templates/contest/calendar.html:15 +msgid "Wednesday" +msgstr "星期三" + +#: templates/contest/calendar.html:16 +msgid "Thursday" +msgstr "星期四" + +#: templates/contest/calendar.html:17 +msgid "Friday" +msgstr "星期五" + +#: templates/contest/calendar.html:18 +msgid "Saturday" +msgstr "星期六" + +#: 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 +msgid "Today" +msgstr "" + +#: templates/contest/contest-list-tabs.html:13 +msgid "Next" +msgstr "下个月" + +#: templates/contest/contest-list-tabs.html:21 +#: templates/problem/problem-list-tabs.html:5 +msgid "List" +msgstr "清单" + +#: templates/contest/contest-list-tabs.html:22 +msgid "Calendar" +msgstr "日历" + +#: templates/contest/contest-tabs.html:4 +msgid "Info" +msgstr "资料和信息" + +#: templates/contest/contest-tabs.html:8 +msgid "Rankings" +msgstr "排行榜" + +#: templates/contest/contest-tabs.html:10 +msgid "Hidden Rankings" +msgstr "隐藏的排名" + +#: templates/contest/contest-tabs.html:18 +msgid "MOSS" +msgstr "" + +#: templates/contest/contest-tabs.html:23 +msgid "Clone" +msgstr "" + +#: templates/contest/contest-tabs.html:34 +#: templates/contest/contest-tabs.html:54 +msgid "Leave contest" +msgstr "离开竞赛" + +#: templates/contest/contest-tabs.html:41 templates/contest/list.html:293 +msgid "Virtual join" +msgstr "参加虚拟竞赛" + +#: templates/contest/contest-tabs.html:52 +msgid "Stop spectating" +msgstr "停止旁观" + +#: templates/contest/contest-tabs.html:61 +msgid "Spectate contest" +msgstr "旁观竞赛" + +#: templates/contest/contest-tabs.html:67 +#: templates/contest/contest-tabs.html:73 +msgid "Join contest" +msgstr "参加竞赛" + +#: templates/contest/contest-tabs.html:82 +msgid "Login to participate" +msgstr "登录即可进入" + +#: templates/contest/contest.html:37 +msgid "Participating virtually." +msgstr "虚拟参与中。" + +#: templates/contest/contest.html:43 +msgid "Contest is over." +msgstr "竞赛已结束。" + +#: templates/contest/contest.html:59 templates/contest/contest.html:63 +msgid "F j, Y, G:i T" +msgstr "Y年n月j日 G:i T" + +#: templates/contest/contest.html:59 +#, python-format +msgid "%(time_limit)s window between %(start_time)s and %(end_time)s" +msgstr "%(start_time)s%(end_time)s中的%(time_limit)s小时窗口" + +#: templates/contest/contest.html:63 +#, python-format +msgid "%(length)s long starting on %(start_time)s" +msgstr "从 %(start_time)s 开始的 %(length)s 时间段" + +#: templates/contest/contest.html:85 +msgid "AC Rate" +msgstr "AC率" + +#: templates/contest/contest.html:86 templates/contest/list.html:153 +#: templates/contest/list.html:195 templates/contest/list.html:271 +#: templates/problem/list.html:212 templates/problem/list.html:238 +msgid "Users" +msgstr "用户" + +#: templates/contest/contest.html:111 +msgid "Editorial" +msgstr "编辑" + +#: templates/contest/list.html:31 templates/contest/media-js.html:9 +msgid "Are you sure you want to join?" +msgstr "你确定你想要加入吗?" + +#: 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:65 +msgid "hidden" +msgstr "" + +#: templates/contest/list.html:70 +msgid "private" +msgstr "" + +#: templates/contest/list.html:84 +msgid "rated" +msgstr "" + +#: templates/contest/list.html:132 +msgid "Spectate" +msgstr "旁观" + +#: templates/contest/list.html:138 +msgid "Join" +msgstr "加入!" + +#: templates/contest/list.html:148 +msgid "Active Contests" +msgstr "" + +#: templates/contest/list.html:152 templates/contest/list.html:194 +#: templates/contest/list.html:232 templates/contest/list.html:270 +msgid "Contest" +msgstr "竞赛" + +#: templates/contest/list.html:190 +msgid "Ongoing Contests" +msgstr "进行中的竞赛" + +#: templates/contest/list.html:227 +msgid "Upcoming Contests" +msgstr "未来的竞赛" + +#: templates/contest/list.html:255 +msgid "There are no scheduled contests at this time." +msgstr "现在没有预定的竞赛。" + +#: templates/contest/list.html:261 +msgid "Past Contests" +msgstr "过去的竞赛" + +#: templates/contest/media-js.html:4 +msgid "Are you sure you want to leave?" +msgstr "您确定要离开吗?" + +#: 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 +msgid "Joining a contest starts your timer, after which it becomes unstoppable." +msgstr "计时器在你第一次参加比赛的时候就会启动,比赛开始后将不会停止" + +#: 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:7 +msgid "Organization" +msgstr "组织" + +#: templates/contest/ranking-table.html:27 +#, python-brace-format +msgid "Started on {time}" +msgstr "开始时间{time}" + +#: templates/contest/ranking-table.html:30 +msgid "Participation ended." +msgstr "竞赛窗口已结束。" + +#: templates/contest/ranking.html:232 +msgid "View user participation" +msgstr "查看用户参与历史" + +#: templates/contest/ranking.html:236 +msgid "Show organizations" +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 +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 +msgid "activate" +msgstr "激活" + +#: 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 +msgid "Newsletter unsubscribe" +msgstr "退订" + +#: 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 +msgid "Do you want to unsubscribe from this newsletter?" +msgstr "您真的想要取消订阅该电子简报吗?" + +#: 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 +msgid "Newsletter update" +msgstr "电子简报更新" + +#: 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 +msgid "Update subscription" +msgstr "更新订阅" + +#: templates/newsletter/subscription_update_activated.html:8 +msgid "Your subscription has successfully been updated." +msgstr "您的订阅已成功更新。" + +#: 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:34 +#: templates/ticket/edit-notes.html:4 +msgid "Update" +msgstr "升级" + +#: 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:29 +msgid "Join organization" +msgstr "加入组织" + +#: templates/organization/home.html:33 +msgid "Request membership" +msgstr "申请加入" + +#: templates/organization/home.html:39 +msgid "Edit organization" +msgstr "编辑组织" + +#: templates/organization/home.html:43 +msgid "View requests" +msgstr "查看请求" + +#: templates/organization/home.html:50 +msgid "Admin organization" +msgstr "管理组织" + +#: templates/organization/home.html:55 +msgid "View members" +msgstr "查看成员" + +#: templates/organization/list.html:23 templates/status/language-list.html:34 +msgid "Name" +msgstr "名称" + +#: templates/organization/list.html:24 +msgid "Members" +msgstr "成员" + +#: templates/organization/new.html:10 templates/ticket/new.html:38 +msgid "Create" +msgstr "创建" + +#: templates/organization/requests/detail.html:13 +msgid "User:" +msgstr "用户:" + +#: templates/organization/requests/detail.html:17 +msgid "Organization:" +msgstr "组织:" + +#: templates/organization/requests/detail.html:25 +msgid "Time:" +msgstr "时间:" + +#: templates/organization/requests/detail.html:29 +msgid "Reason:" +msgstr "理由:" + +#: 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:15 +msgid "Reason" +msgstr "理由" + +#: 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:17 +#: templates/problem/data.html:401 +msgid "Delete?" +msgstr "删除?" + +#: templates/organization/requests/request.html:18 +msgid "Your reason for joining:" +msgstr "你加入的理由:" + +#: templates/organization/requests/request.html:20 +msgid "Request" +msgstr "请求" + +#: templates/organization/requests/tabs.html:4 +msgid "Pending" +msgstr "待确认" + +#: templates/organization/requests/tabs.html:7 +msgid "Log" +msgstr "日志" + +#: templates/organization/requests/tabs.html:10 +msgid "Approved" +msgstr "已批准" + +#: templates/organization/requests/tabs.html:13 +msgid "Rejected" +msgstr "已拒绝" + +#: templates/organization/users-table.html:15 +msgid "Kick" +msgstr "踢出" + +#: templates/problem/clone.html:37 +msgid "Enter a new code for the cloned problem:" +msgstr "" + +#: templates/problem/data.html:353 +msgid "View YAML" +msgstr "查看 YAML" + +#: templates/problem/data.html:369 +msgid "Show columns:" +msgstr "显示列:" + +#: templates/problem/data.html:372 templates/problem/data.html:396 +msgid "Output prefix" +msgstr "输出前缀" + +#: templates/problem/data.html:376 templates/problem/data.html:397 +msgid "Output limit" +msgstr "输出限制" + +#: templates/problem/data.html:380 templates/problem/data.html:398 +msgid "Checker" +msgstr "检查器" + +#: templates/problem/data.html:384 templates/problem/data.html:399 +msgid "Generator args" +msgstr "生成器参数" + +#: templates/problem/data.html:391 +msgid "Type" +msgstr "类型" + +#: templates/problem/data.html:392 +msgid "Input file" +msgstr "输入文件" + +#: templates/problem/data.html:393 +msgid "Output file" +msgstr "输出文件" + +#: templates/problem/data.html:395 +msgid "Pretest?" +msgstr "预测试?" + +#: templates/problem/data.html:447 templates/problem/submit.html:252 +msgid "Submit!" +msgstr "提交!" + +#: templates/problem/data.html:448 +msgid "Add new case" +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 editorialist.

Submitting an official solution before solving the problem yourself is a bannable offence." +msgstr "记住 在没有思路时使用题解,不要从它复制粘贴代码。请尊重题目和题解的作者。

在真正解决问题之前提交题解的代码是可以封禁的罪行。" + +#: templates/problem/list.html:62 +msgid "Filter by type..." +msgstr "根据类型过滤" + +#: templates/problem/list.html:185 +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:57 +msgid "Category" +msgstr "分类" + +#: templates/problem/list.html:209 templates/problem/list.html:228 +msgid "Types" +msgstr "类型" + +#: templates/problem/list.html:235 +#, python-format +msgid "AC %%" +msgstr "AC%%" + +#: 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:142 +msgid "Filter by result:" +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 "PDF 视图" + +#: templates/problem/problem.html:101 templates/problem/problem.html:111 +#: templates/problem/problem.html:116 +msgid "Submit solution" +msgstr "提交程序" + +#: templates/problem/problem.html:104 +#, python-format +msgid "%(counter)s submission left" +msgid_plural "%(counter)s submissions left" +msgstr[0] "还剩%(counter)s 提交数" + +#: templates/problem/problem.html:112 +msgid "0 submissions left" +msgstr "还剩下 0 次提交" + +#: templates/problem/problem.html:124 +msgid "My submissions" +msgstr "我的提交历史" + +#: templates/problem/problem.html:128 +msgid "Best submissions" +msgstr "提交排行" + +#: templates/problem/problem.html:132 +msgid "Read editorial" +msgstr "阅读题解" + +#: templates/problem/problem.html:137 +msgid "Manage tickets" +msgstr "管理工单" + +#: templates/problem/problem.html:141 +msgid "Edit problem" +msgstr "编辑题目" + +#: templates/problem/problem.html:143 +msgid "Edit test data" +msgstr "编辑测试数据" + +#: templates/problem/problem.html:148 +msgid "My tickets" +msgstr "" + +#: templates/problem/problem.html:156 +msgid "Manage submissions" +msgstr "" + +#: templates/problem/problem.html:162 +msgid "Clone problem" +msgstr "复制题目" + +#: templates/problem/problem.html:169 +msgid "Points:" +msgstr "分数:" + +#: templates/problem/problem.html:172 templates/problem/problem.html:174 +msgid "(partial)" +msgstr "(部分)" + +#: templates/problem/problem.html:179 +msgid "Time limit:" +msgstr "时间限制:" + +#: templates/problem/problem.html:191 +msgid "Memory limit:" +msgstr "内存限制:" + +#: templates/problem/problem.html:210 +msgid "Author:" +msgid_plural "Authors:" +msgstr[0] "作者:" + +#: templates/problem/problem.html:225 +msgid "Problem type" +msgid_plural "Problem types" +msgstr[0] "题目类型" + +#: templates/problem/problem.html:238 +msgid "Allowed languages" +msgstr "允许的语言" + +#: templates/problem/problem.html:246 +#, python-format +msgid "No %(lang)s judge online" +msgstr "没有支持 %(lang)s 的裁判服务器。" + +#: templates/problem/problem.html:257 +msgid "Judge:" +msgid_plural "Judges:" +msgstr[0] "" + +#: templates/problem/problem.html:274 +msgid "none available" +msgstr "" + +#: templates/problem/problem.html:299 +msgid "Request clarification" +msgstr "提出问题" + +#: templates/problem/problem.html:301 +msgid "Report an issue" +msgstr "反馈问题" + +#: 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 +msgid "Search problems..." +msgstr "搜索题目…" + +#: templates/problem/search-form.html:14 +msgid "Full text search" +msgstr "全文搜索" + +#: templates/problem/search-form.html:21 +msgid "Hide solved problems" +msgstr "隐藏已解决的题目" + +#: 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 +msgid "All" +msgstr "所有" + +#: templates/problem/search-form.html:46 +msgid "Problem types" +msgstr "题目类型" + +#: templates/problem/search-form.html:57 +msgid "Point range" +msgstr "分数范围" + +#: templates/problem/search-form.html:63 templates/submission/list.html:337 +#: templates/ticket/list.html:248 +msgid "Go" +msgstr "搜索" + +#: templates/problem/search-form.html:64 +msgid "Random" +msgstr "随机" + +#: templates/problem/submit.html:192 +#, python-format +msgid "Warning! Your default language, %(default_language)s, is unavailable for this problem and has been deselected." +msgstr "警告! 您的默认编程语言, %(default_language)s, 在此问题不可用,且已取消选择。" + +#: templates/problem/submit.html:203 +#, python-format +msgid "\n" +" You have %(left)s submission left\n" +" " +msgid_plural "\n" +" You have %(left)s submissions left\n" +" " +msgstr[0] "\n" +" 您还剩下 %(left)s 次提交机会 \n" +" " + +#: templates/problem/submit.html:212 +msgid "You have 0 submissions left" +msgstr "你還可以提交0次" + +#: templates/problem/submit.html:250 +msgid "No judge is available for this problem." +msgstr "此题目没有可用的裁判服务器。" + +#: templates/registration/activate.html:3 +#, python-format +msgid "%(key)s is an invalid activation key." +msgstr "%(key)s 是一个无效的激活密钥。" + +#: templates/registration/activation_complete.html:3 +msgid "Your account has been successfully activated." +msgstr "已成功激活您的帐户。" + +#: templates/registration/login.html:43 +msgid "Invalid username or password." +msgstr "无效的用户名或密码!" + +#: templates/registration/login.html:61 +#: templates/registration/totp_auth.html:39 +msgid "Login!" +msgstr "登录!" + +#: templates/registration/login.html:64 +msgid "Forgot your password?" +msgstr "忘记密码?" + +#: templates/registration/login.html:67 +msgid "Or log in with..." +msgstr "或使用…" + +#: templates/registration/logout.html:3 +msgid "See you later!" +msgstr "再见!" + +#: templates/registration/password_change_done.html:3 +msgid "Your password was sucessfully changed." +msgstr "您的密码已成功更改。" + +#: templates/registration/password_change_form.html:8 +msgid "Change Password" +msgstr "更换密码" + +#: templates/registration/password_reset.html:7 +msgid "Send Reset Email" +msgstr "发送密码重置电子邮件" + +#: 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_confirm.html:9 +msgid "Reset Password" +msgstr "重置密码" + +#: 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 +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 +#, python-format +msgid "You're receiving this email because you requested a password reset for your user account at %(site_name)s." +msgstr "因为您要求您的用户帐户在 %(site_name)s 重置密码,所以您收到这封电子邮件。" + +#: 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 +msgid "Your username, in case you've forgotten:" +msgstr "您的用户名:" + +#: templates/registration/password_reset_email.txt:9 +msgid "Thanks for using our site!" +msgstr "感谢您使用我们的网站!" + +#: templates/registration/password_reset_email.txt:11 +#, python-format +msgid "The %(site_name)s team" +msgstr "%(site_name)s 团队" + +#: templates/registration/password_reset_subject.txt:1 +#, python-format +msgid "Password reset on %(site_name)s" +msgstr "在 %(site_name)s 上重置密码" + +#: templates/registration/profile_creation.html:36 +#: templates/registration/username_select.html:7 +msgid "Continue >" +msgstr "继续 >" + +#: 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:166 +msgid "(again, for confirmation)" +msgstr "(再输一次密码以确定)" + +#: templates/registration/registration_form.html:173 +msgid "(select your closest major city)" +msgstr "(选择离您最近的主要城市)" + +#: templates/registration/registration_form.html:178 +msgid "pick from map" +msgstr "从地图中选" + +#: templates/registration/registration_form.html:183 +msgid "Default language" +msgstr "默认语言" + +#: templates/registration/registration_form.html:186 +#: templates/user/edit-profile.html:162 +msgid "Affiliated organizations" +msgstr "关联的组织" + +#: templates/registration/registration_form.html:192 +#: templates/user/edit-profile.html:121 +msgid "Notify me about upcoming contests" +msgstr "通过Email发送未来竞赛的通知" + +#: templates/registration/registration_form.html:206 +msgid "By registering, you agree to our" +msgstr "注册即表示您同意我们的" + +#: templates/registration/registration_form.html:207 +msgid "Terms & Conditions" +msgstr "使用条款" + +#: templates/registration/registration_form.html:210 +msgid "Register!" +msgstr "注册!" + +#: templates/registration/totp_auth.html:36 +#: templates/registration/totp_disable.html:45 +#: templates/registration/totp_enable.html:83 +msgid "Enter the 6-digit code generated by your app:" +msgstr "" + +#: templates/registration/totp_auth.html:41 +#, python-format +msgid "If you lost your authentication device, please contact us at %(email)s." +msgstr "" + +#: templates/registration/totp_disable.html:38 +msgid "To protect your account, you must first authenticate before you can disable Two Factor Authentication." +msgstr "" + +#: templates/registration/totp_enable.html:71 +msgid "Scan this code with your authenticator app:" +msgstr "" + +#: templates/registration/totp_enable.html:72 +msgid "QR code" +msgstr "" + +#: templates/registration/totp_enable.html:73 +msgid "Or enter this code manually:" +msgstr "" + +#: templates/stats/base.html:9 templates/submission/list.html:345 +msgid "Statistics" +msgstr "统计数据" + +#: templates/stats/language.html:11 +msgid "Submission Statistics" +msgstr "提交统计" + +#: templates/stats/language.html:16 +msgid "Submissions by Language" +msgstr "按语言的提交数量" + +#: templates/stats/language.html:21 +msgid "AC Submissions by Language" +msgstr "按语言的接受提交数量" + +#: templates/stats/language.html:26 +msgid "Language AC Rate" +msgstr "语言提交接受率" + +#: templates/status/judge-status-table.html:2 +msgid "Judge" +msgstr "评测" + +#: templates/status/judge-status-table.html:4 +msgid "Online" +msgstr "在线" + +#: templates/status/judge-status-table.html:6 +msgid "Uptime" +msgstr "启动时间" + +#: templates/status/judge-status-table.html:7 +msgid "Ping" +msgstr "延迟" + +#: 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 +msgid "N/A" +msgstr "N/A" + +#: templates/status/judge-status-table.html:64 +msgid "There are no judges available at this time." +msgstr "本语言没有可用的裁判服务器。" + +#: templates/status/language-list.html:33 templates/ticket/list.html:261 +msgid "ID" +msgstr "ID" + +#: templates/status/language-list.html:35 +msgid "Runtime Info" +msgstr "软件信息" + +#: templates/status/status-tabs.html:4 +msgid "Judges" +msgstr "裁判服务器" + +#: templates/status/status-tabs.html:6 +msgid "Version Matrix" +msgstr "版本矩阵" + +#: templates/submission/internal-error-message.html:8 +msgid "An internal error occurred while grading." +msgstr "评分时裁判服务端发生了内部错误。" + +#: templates/submission/internal-error-message.html:15 +msgid "Error information" +msgstr "错误信息" + +#: templates/submission/list.html:76 +msgid "Filter by status..." +msgstr "按状态过滤" + +#: templates/submission/list.html:82 +msgid "Filter by language..." +msgstr "按语言筛选......" + +#: templates/submission/list.html:315 +msgid "Filter submissions" +msgstr "提交筛选" + +#: templates/submission/list.html:351 +msgid "Total:" +msgstr "" + +#: templates/submission/list.html:361 +msgid "You were disconnected. Refresh to show latest updates." +msgstr "您处于离线状态。刷新以显示最近的更新。" + +#: templates/submission/row.html:39 +#, python-format +msgid "Case #%(case)s" +msgstr "测试数据 #%(case)s" + +#: templates/submission/row.html:49 +msgid "view" +msgstr "查看" + +#: templates/submission/row.html:53 +msgid "rejudge" +msgstr "重新评分" + +#: templates/submission/row.html:58 +msgid "admin" +msgstr "管理" + +#: templates/submission/source.html:25 +msgid "View status" +msgstr "查看状态" + +#: templates/submission/source.html:26 +msgid "View raw source" +msgstr "查看原始源代码" + +#: templates/submission/source.html:28 templates/submission/status.html:61 +msgid "Resubmit" +msgstr "重新提交" + +#: 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 +msgid "Your submission is being processed..." +msgstr "正在处理您提交的程序…" + +#: templates/submission/status-testcases.html:14 +msgid "Compilation Error" +msgstr "编译错误" + +#: templates/submission/status-testcases.html:18 +msgid "Compilation Warnings" +msgstr "编译警告" + +#: templates/submission/status-testcases.html:23 +msgid "Pretest Execution Results" +msgstr "预测试执行结果" + +#: templates/submission/status-testcases.html:25 +msgid "Execution Results" +msgstr "执行结果" + +#: templates/submission/status-testcases.html:31 +msgid "Batch " +msgstr "批" + +#: templates/submission/status-testcases.html:43 +msgid "Case" +msgstr "测试" + +#: templates/submission/status-testcases.html:45 +msgid "Pretest" +msgstr "预测试" + +#: templates/submission/status-testcases.html:47 +msgid "Test case" +msgstr "测试情况" + +#: templates/submission/status-testcases.html:79 +msgid "Your output (clipped)" +msgstr "您的输出(部分)" + +#: templates/submission/status-testcases.html:90 +msgid "Judge feedback" +msgstr "" + +#: templates/submission/status-testcases.html:106 +msgid "Resources:" +msgstr "" + +#: templates/submission/status-testcases.html:115 +msgid "Final pretest score:" +msgstr "最终预测试得分:" + +#: templates/submission/status-testcases.html:117 +msgid "Final score:" +msgstr "最终得分:" + +#: templates/submission/status-testcases.html:131 +msgid "Passing pretests does not guarantee a full score on system tests." +msgstr "通过预测试不代表程序可以通过完整测试。" + +#: templates/submission/status-testcases.html:134 +msgid "Submission aborted!" +msgstr "评分终止!" + +#: templates/submission/status.html:59 +msgid "View source" +msgstr "查看源代码" + +#: templates/submission/status.html:88 +msgid "Abort" +msgstr "停止" + +#: templates/submission/submission-list-tabs.html:6 +msgid "Mine" +msgstr "我的" + +#: templates/submission/submission-list-tabs.html:9 +msgid "Best" +msgstr "最佳" + +#: templates/submission/submission-list-tabs.html:12 +#, python-format +msgid "%(user)s's" +msgstr "%(user)s 的" + +#: templates/ticket/list.html:135 templates/ticket/ticket.html:257 +msgid "Reopened: " +msgstr "重新打开状态: " + +#: templates/ticket/list.html:138 templates/ticket/ticket.html:258 +msgid "Closed: " +msgstr "已关闭: " + +#: templates/ticket/list.html:221 +msgid "Use desktop notification" +msgstr "使用桌面通知" + +#: templates/ticket/list.html:227 +msgid "Show my tickets only" +msgstr "只显示我的工单" + +#: templates/ticket/list.html:231 +msgid "Filing user" +msgstr "归档用户" + +#: templates/ticket/list.html:240 +msgid "Assignee" +msgstr "被分配的人" + +#: templates/ticket/list.html:262 +msgid "Title" +msgstr "标题" + +#: templates/ticket/list.html:264 templates/ticket/ticket.html:304 +msgid "Assignees" +msgstr "被分配的人" + +#: templates/ticket/new_problem.html:7 +msgid "Thanks for opening a ticket!" +msgstr "感谢您提交工单!" + +#: 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 +msgid "Associated object" +msgstr "相关的项目" + +#: templates/ticket/ticket.html:309 +msgid "No one is assigned." +msgstr "没有人被分配到这个工单。" + +#: templates/ticket/ticket.html:315 +msgid "Close ticket" +msgstr "关闭工单" + +#: templates/ticket/ticket.html:317 +msgid "Reopen ticket" +msgstr "重开工单" + +#: templates/ticket/ticket.html:321 +msgid "Assignee notes" +msgstr "受让人说明" + +#: templates/ticket/ticket.html:328 templates/widgets/select_all.html:4 +msgid "Nothing here." +msgstr "暂无内容!" + +#: templates/ticket/ticket.html:378 +msgid "Post" +msgstr "帖子" + +#: templates/user/base-users-table.html:3 +msgid "Rank" +msgstr "排名" + +#: templates/user/base-users.html:14 templates/user/base-users.html:69 +msgid "Search by handle..." +msgstr "用户名搜索…" + +#: templates/user/edit-profile.html:90 +msgid "Self-description" +msgstr "自我描述" + +#: templates/user/edit-profile.html:98 +msgid "Select your closest major city" +msgstr "选择离您最近的主要城市" + +#: templates/user/edit-profile.html:107 +msgid "Editor theme" +msgstr "编辑主题" + +#: templates/user/edit-profile.html:112 +msgid "Math engine" +msgstr "数学引擎" + +#: templates/user/edit-profile.html:136 templates/user/edit-profile.html:137 +msgid "Change your avatar" +msgstr "修改头像" + +#: templates/user/edit-profile.html:143 +msgid "Change your password" +msgstr "更改密码" + +#: templates/user/edit-profile.html:150 +msgid "Two Factor Authentication is enabled." +msgstr "" + +#: templates/user/edit-profile.html:153 +msgid "Two Factor Authentication is disabled." +msgstr "" + +#: templates/user/edit-profile.html:170 +msgid "User-script" +msgstr "用户脚本" + +#: templates/user/edit-profile.html:174 +msgid "Update profile" +msgstr "更新资料" + +#: templates/user/pp-row.html:22 +#, python-format +msgid "\n" +" weighted %(weight)s%%\n" +" " +msgstr "\n" +" 比重 %(weight)s%%\n" +" " + +#: templates/user/pp-row.html:27 +#, python-format +msgid "%(pp).1fpp" +msgstr "%(pp).1fpp" + +#: templates/user/pp-row.html:29 +#, python-format +msgid "%(pp).0fpp" +msgstr "%(pp).0fpp" + +#: templates/user/user-about.html:14 +msgid "From" +msgstr "组织" + +#: 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:40 +msgid "You have not shared any information." +msgstr "您还没有共享的任何信息。" + +#: templates/user/user-about.html:42 +msgid "This user has not shared any information." +msgstr "此用户没有共享的任何信息。" + +#: templates/user/user-base.html:42 +#, python-format +msgid "%(counter)s problem solved" +msgid_plural "%(counter)s problems solved" +msgstr[0] "" + +#: templates/user/user-base.html:50 +msgid "Rank by points:" +msgstr "得分排名:" + +#: templates/user/user-base.html:53 +msgid "Total points:" +msgstr "总得分:" + +#: templates/user/user-base.html:68 +msgid "Rank by rating:" +msgstr "竞赛评分排名:" + +#: templates/user/user-base.html:70 +msgid "Rating:" +msgstr "竞赛评分:" + +#: templates/user/user-base.html:71 +msgid "Volatility:" +msgstr "波动性:" + +#: templates/user/user-base.html:72 +msgid "Min. rating:" +msgstr "最低评分:" + +#: templates/user/user-base.html:73 +msgid "Max rating:" +msgstr "最高评分:" + +#: templates/user/user-problems.html:35 +msgid "Points Breakdown" +msgstr "分数细分" + +#: templates/user/user-problems.html:41 +msgid "Load more..." +msgstr "加载更多..." + +#: templates/user/user-problems.html:45 +msgid "This user has not yet solved any problems." +msgstr "此用户尚未解决任何问题。" + +#: templates/user/user-problems.html:51 +msgid "Authored Problems" +msgstr "创作的题目" + +#: templates/user/user-problems.html:83 +msgid "Hide problems I've solved" +msgstr "隐藏我已经解决的题目" + +#: templates/user/user-problems.html:93 +#, python-format +msgid "%(points).1f points" +msgstr "%(points).1f 分" + +#: templates/user/user-problems.html:99 +msgid "Score" +msgstr "得分" + +#: templates/user/user-problems.html:110 +#, python-format +msgid "%(points)s / %(total)s" +msgstr "%(points)s / %(total)s" + +#: templates/user/user-tabs.html:7 +msgid "Impersonate" +msgstr "假冒用户" + +#: templates/user/user-tabs.html:13 +msgid "Admin User" +msgstr "管理用户" + +#: templates/user/user-tabs.html:16 +msgid "Admin Profile" +msgstr "管理资料" + +#: templates/widgets/select_all.html:8 +msgid "Check all" +msgstr "全选" + diff --git a/locale/zh_Hans/LC_MESSAGES/djangojs.po b/locale/zh_Hans/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..6531402 --- /dev/null +++ b/locale/zh_Hans/LC_MESSAGES/djangojs.po @@ -0,0 +1,29 @@ +msgid "" +msgstr "" +"Project-Id-Version: dmoj\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-10-01 23:12+0000\n" +"PO-Revision-Date: 2019-11-11 22:05\n" +"Last-Translator: Icyene\n" +"Language-Team: Chinese Simplified\n" +"Language: zh_CN\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: crowdin.com\n" +"X-Crowdin-Project: dmoj\n" +"X-Crowdin-Language: zh-CN\n" +"X-Crowdin-File: djangojs.po\n" + +#: resources/common.js:207 +msgctxt "time format with day" +msgid "%d day %h:%m:%s" +msgid_plural "%d days %h:%m:%s" +msgstr[0] "%d 天 %h:%m:%s" + +#: resources/common.js:210 +msgctxt "time format without day" +msgid "%h:%m:%s" +msgstr "%h:%m:%s" + diff --git a/locale/zh_Hant/LC_MESSAGES/django.po b/locale/zh_Hant/LC_MESSAGES/django.po new file mode 100644 index 0000000..c49f8c4 --- /dev/null +++ b/locale/zh_Hant/LC_MESSAGES/django.po @@ -0,0 +1,4509 @@ +msgid "" +msgstr "" +"Project-Id-Version: dmoj\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-11-11 21:54+0000\n" +"PO-Revision-Date: 2019-11-11 22:05\n" +"Last-Translator: Icyene\n" +"Language-Team: Chinese Traditional\n" +"Language: zh_TW\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: crowdin.com\n" +"X-Crowdin-Project: dmoj\n" +"X-Crowdin-Language: zh-TW\n" +"X-Crowdin-File: django.po\n" + +#: dmoj/settings.py:337 +msgid "German" +msgstr "德文" + +#: dmoj/settings.py:338 +msgid "English" +msgstr "英文" + +#: dmoj/settings.py:339 +msgid "Spanish" +msgstr "西班牙文" + +#: dmoj/settings.py:340 +msgid "French" +msgstr "法文" + +#: dmoj/settings.py:341 +msgid "Croatian" +msgstr "克羅地亞文" + +#: dmoj/settings.py:342 +msgid "Hungarian" +msgstr "匈牙利文" + +#: dmoj/settings.py:343 +msgid "Japanese" +msgstr "" + +#: dmoj/settings.py:344 +msgid "Korean" +msgstr "韓文" + +#: dmoj/settings.py:345 +msgid "Brazilian Portuguese" +msgstr "" + +#: dmoj/settings.py:346 +msgid "Romanian" +msgstr "羅馬尼亞文" + +#: dmoj/settings.py:347 +msgid "Russian" +msgstr "俄文" + +#: dmoj/settings.py:348 +msgid "Serbian (Latin)" +msgstr "塞爾維亞文 (拉丁語系)" + +#: dmoj/settings.py:349 +msgid "Turkish" +msgstr "土耳其文" + +#: dmoj/settings.py:350 +msgid "Vietnamese" +msgstr "越南文" + +#: dmoj/settings.py:351 +msgid "Simplified Chinese" +msgstr "簡體中文" + +#: dmoj/urls.py:54 +msgid "Login" +msgstr "登入" + +#: dmoj/urls.py:102 templates/base.html:190 +msgid "Home" +msgstr "首頁" + +#: judge/admin/comments.py:40 +#, python-format +msgid "%d comment successfully hidden." +msgid_plural "%d comments successfully hidden." +msgstr[0] "%d 個回應已成功隱藏。" + +#: judge/admin/comments.py:43 +msgid "Hide comments" +msgstr "隱藏評論" + +#: judge/admin/comments.py:47 +#, python-format +msgid "%d comment successfully unhidden." +msgid_plural "%d comments successfully unhidden." +msgstr[0] "%d 個回應已成功取消隱藏。" + +#: judge/admin/comments.py:50 +msgid "Unhide comments" +msgstr "取消隱藏回應" + +#: judge/admin/comments.py:58 +msgid "Associated page" +msgstr "關聯頁" + +#: judge/admin/contest.py:29 +msgid "Included contests" +msgstr "" + +#: judge/admin/contest.py:65 templates/contest/contest.html:83 +#: templates/contest/moss.html:43 templates/problem/list.html:206 +#: templates/problem/list.html:221 templates/user/user-problems.html:56 +#: templates/user/user-problems.html:98 +msgid "Problem" +msgstr "題目" + +#: judge/admin/contest.py:113 +msgid "Settings" +msgstr "" + +#: judge/admin/contest.py:115 +msgid "Scheduling" +msgstr "排程" + +#: judge/admin/contest.py:116 +msgid "Details" +msgstr "詳細資訊" + +#: judge/admin/contest.py:117 +msgid "Format" +msgstr "" + +#: judge/admin/contest.py:118 templates/contest/ranking-table.html:5 +msgid "Rating" +msgstr "評分" + +#: judge/admin/contest.py:119 +msgid "Access" +msgstr "" + +#: judge/admin/contest.py:121 judge/admin/problem.py:131 +msgid "Justice" +msgstr "" + +#: judge/admin/contest.py:159 +#, python-format +msgid "%d contest successfully marked as visible." +msgid_plural "%d contests successfully marked as visible." +msgstr[0] "" + +#: judge/admin/contest.py:162 +msgid "Mark contests as visible" +msgstr "" + +#: judge/admin/contest.py:166 +#, python-format +msgid "%d contest successfully marked as hidden." +msgid_plural "%d contests successfully marked as hidden." +msgstr[0] "" + +#: judge/admin/contest.py:169 +msgid "Mark contests as hidden" +msgstr "" + +#: judge/admin/contest.py:180 judge/admin/submission.py:149 +#: judge/admin/submission.py:171 +msgid "You do not have the permission to rejudge submissions." +msgstr "" + +#: judge/admin/contest.py:187 judge/admin/submission.py:155 +msgid "You do not have the permission to rejudge THAT many submissions." +msgstr "" + +#: judge/admin/contest.py:194 judge/admin/submission.py:164 +#, 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:265 +#, python-format +msgid "%d participation recalculated." +msgid_plural "%d participations recalculated." +msgstr[0] "" + +#: judge/admin/contest.py:268 +msgid "Recalculate results" +msgstr "" + +#: judge/admin/contest.py:272 judge/admin/organization.py:65 +msgid "username" +msgstr "使用者名稱" + +#: judge/admin/contest.py:277 templates/base.html:258 +msgid "virtual" +msgstr "" + +#: judge/admin/interface.py:28 judge/models/interface.py:46 +msgid "link path" +msgstr "" + +#: judge/admin/interface.py:62 +msgid "Content" +msgstr "内容" + +#: judge/admin/interface.py:63 +msgid "Summary" +msgstr "概要" + +#: judge/admin/interface.py:107 judge/models/contest.py:251 +#: judge/models/contest.py:355 judge/models/profile.py:189 +msgid "user" +msgstr "使用者" + +#: judge/admin/interface.py:148 +msgid "object" +msgstr "" + +#: judge/admin/organization.py:34 judge/admin/problem.py:171 +#: judge/admin/profile.py:78 +msgid "View on site" +msgstr "" + +#: judge/admin/problem.py:28 +msgid "Describe the changes you made (optional)" +msgstr "" + +#: judge/admin/problem.py:126 +msgid "Social Media" +msgstr "社交媒體" + +#: judge/admin/problem.py:127 +msgid "Taxonomy" +msgstr "" + +#: judge/admin/problem.py:128 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:58 +msgid "Points" +msgstr "分數" + +#: judge/admin/problem.py:129 +msgid "Limits" +msgstr "限制" + +#: judge/admin/problem.py:130 judge/admin/submission.py:232 +#: templates/stats/base.html:14 templates/submission/list.html:328 +msgid "Language" +msgstr "語言" + +#: judge/admin/problem.py:132 +msgid "History" +msgstr "歷史記錄" + +#: judge/admin/problem.py:168 +msgid "Authors" +msgstr "作者" + +#: judge/admin/problem.py:183 +#, python-format +msgid "%d problem successfully marked as public." +msgid_plural "%d problems successfully marked as public." +msgstr[0] "" + +#: judge/admin/problem.py:187 +msgid "Mark problems as public" +msgstr "" + +#: judge/admin/problem.py:193 +#, python-format +msgid "%d problem successfully marked as private." +msgid_plural "%d problems successfully marked as private." +msgstr[0] "" + +#: judge/admin/problem.py:197 +msgid "Mark problems as private" +msgstr "" + +#: judge/admin/profile.py:32 +msgid "timezone" +msgstr "時區" + +#: judge/admin/profile.py:84 judge/admin/submission.py:211 +#: templates/organization/requests/log.html:9 +#: templates/organization/requests/pending.html:12 +#: templates/ticket/list.html:263 +msgid "User" +msgstr "使用者" + +#: judge/admin/profile.py:89 templates/registration/registration_form.html:145 +msgid "Email" +msgstr "電子郵件" + +#: judge/admin/profile.py:94 judge/views/register.py:29 +#: templates/registration/registration_form.html:173 +#: templates/user/edit-profile.html:99 +msgid "Timezone" +msgstr "時區" + +#: judge/admin/profile.py:99 +msgid "date joined" +msgstr "" + +#: judge/admin/profile.py:106 +#, python-format +msgid "%d user have scores recalculated." +msgid_plural "%d users have scores recalculated." +msgstr[0] "" + +#: judge/admin/profile.py:109 +msgid "Recalculate scores" +msgstr "" + +#: judge/admin/runtime.py:19 +msgid "Disallowed problems" +msgstr "" + +#: judge/admin/runtime.py:22 +msgid "These problems are NOT allowed to be submitted in this language" +msgstr "" + +#: judge/admin/runtime.py:83 +msgid "Description" +msgstr "描述說明" + +#: judge/admin/runtime.py:84 +msgid "Information" +msgstr "" + +#: judge/admin/runtime.py:85 +msgid "Capabilities" +msgstr "" + +#: judge/admin/submission.py:23 judge/admin/submission.py:42 +#: judge/admin/submission.py:221 +msgid "None" +msgstr "" + +#: judge/admin/submission.py:23 +msgid "Not done" +msgstr "" + +#: judge/admin/submission.py:23 +msgid "Exceptional" +msgstr "" + +#: judge/admin/submission.py:42 +msgid "Unaccepted" +msgstr "" + +#: judge/admin/submission.py:89 +#, python-format +msgctxt "contest problem" +msgid "%(problem)s in %(contest)s" +msgstr "" + +#: judge/admin/submission.py:167 +msgid "Rejudge the selected submissions" +msgstr "" + +#: judge/admin/submission.py:193 judge/views/problem_manage.py:128 +#, python-format +msgid "%d submission were successfully rescored." +msgid_plural "%d submissions were successfully rescored." +msgstr[0] "" + +#: judge/admin/submission.py:196 +msgid "Rescore the selected submissions" +msgstr "" + +#: judge/admin/submission.py:200 +msgid "Problem code" +msgstr "" + +#: judge/admin/submission.py:205 +msgid "Problem name" +msgstr "題目名稱" + +#: judge/admin/submission.py:215 templates/organization/requests/log.html:10 +#: templates/organization/requests/pending.html:13 +msgid "Time" +msgstr "時間" + +#: judge/admin/submission.py:223 +#, python-format +msgid "%d KB" +msgstr "%d KB" + +#: judge/admin/submission.py:225 +#, python-format +msgid "%.2f MB" +msgstr "%.2f MB" + +#: judge/admin/submission.py:227 +msgid "Memory" +msgstr "記憶體" + +#: judge/admin/taxon.py:11 judge/admin/taxon.py:34 +msgid "Included problems" +msgstr "" + +#: judge/admin/taxon.py:14 +msgid "These problems are included in this group of problems" +msgstr "" + +#: judge/admin/taxon.py:37 +msgid "These problems are included in this type of problems" +msgstr "" + +#: judge/apps.py:8 +msgid "Online Judge" +msgstr "線上裁判" + +#: judge/comments.py:41 +msgid "Comment body" +msgstr "" + +#: judge/comments.py:47 judge/views/ticket.py:46 +msgid "Your part is silent, little toad." +msgstr "" + +#: judge/comments.py:50 templates/comments/list.html:131 +msgid "You need to have solved at least one problem before your voice can be heard." +msgstr "" + +#: judge/comments.py:92 +msgid "Posted comment" +msgstr "" + +#: judge/contest_format/atcoder.py:19 +msgid "AtCoder" +msgstr "" + +#: judge/contest_format/default.py:18 +msgid "Default" +msgstr "" + +#: judge/contest_format/ecoo.py:19 +msgid "ECOO" +msgstr "" + +#: judge/contest_format/ioi.py:19 +msgid "IOI" +msgstr "" + +#: judge/forms.py:27 +msgid "Subscribe to contest updates" +msgstr "" + +#: judge/forms.py:28 +msgid "Enable experimental features" +msgstr "" + +#: judge/forms.py:57 judge/views/organization.py:127 +#, python-brace-format +msgid "You may not be part of more than {count} public organizations." +msgstr "" + +#: judge/forms.py:107 judge/views/register.py:26 +#: templates/registration/registration_form.html:139 +#: templates/user/base-users-table.html:5 +msgid "Username" +msgstr "使用者名稱" + +#: judge/forms.py:108 templates/registration/registration_form.html:151 +#: templates/registration/registration_form.html:165 +msgid "Password" +msgstr "密碼" + +#: judge/forms.py:130 +msgid "Two Factor Authentication tokens must be 6 decimal digits." +msgstr "" + +#: judge/forms.py:139 templates/registration/totp_auth.html:32 +msgid "Invalid Two Factor Authentication token." +msgstr "" + +#: judge/forms.py:143 judge/models/problem.py:97 +msgid "Problem code must be ^[a-z0-9]+$" +msgstr "" + +#: judge/forms.py:148 +msgid "Problem with code already exists." +msgstr "" + +#: judge/forms.py:153 judge/models/contest.py:51 +msgid "Contest id must be ^[a-z0-9]+$" +msgstr "" + +#: judge/forms.py:158 +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:59 +msgid "Leave as LaTeX" +msgstr "" + +#: judge/models/choices.py:60 +msgid "SVG with PNG fallback" +msgstr "" + +#: judge/models/choices.py:61 +msgid "MathML only" +msgstr "" + +#: judge/models/choices.py:62 +msgid "MathJax with SVG/PNG fallback" +msgstr "" + +#: judge/models/choices.py:63 +msgid "Detect best quality" +msgstr "" + +#: judge/models/comment.py:25 +msgid "Page code must be ^[pcs]:[a-z0-9]+$|^b:\\d+$" +msgstr "" + +#: judge/models/comment.py:41 +msgid "commenter" +msgstr "" + +#: judge/models/comment.py:42 +msgid "posted time" +msgstr "發佈時間" + +#: judge/models/comment.py:43 judge/models/comment.py:176 +msgid "associated page" +msgstr "" + +#: judge/models/comment.py:45 +msgid "votes" +msgstr "投票" + +#: judge/models/comment.py:46 +msgid "body of comment" +msgstr "" + +#: judge/models/comment.py:47 +msgid "hide the comment" +msgstr "" + +#: judge/models/comment.py:48 +msgid "parent" +msgstr "" + +#: judge/models/comment.py:53 +msgid "comment" +msgstr "" + +#: judge/models/comment.py:54 +msgid "comments" +msgstr "" + +#: judge/models/comment.py:136 judge/models/problem.py:406 +#, python-format +msgid "Editorial for %s" +msgstr "" + +#: judge/models/comment.py:171 +msgid "comment vote" +msgstr "" + +#: judge/models/comment.py:172 +msgid "comment votes" +msgstr "" + +#: judge/models/comment.py:181 +msgid "Override comment lock" +msgstr "" + +#: judge/models/contest.py:21 +msgid "Invalid colour." +msgstr "" + +#: judge/models/contest.py:23 +msgid "tag name" +msgstr "" + +#: judge/models/contest.py:24 +msgid "Lowercase letters and hyphens only." +msgstr "" + +#: judge/models/contest.py:25 +msgid "tag colour" +msgstr "" + +#: judge/models/contest.py:26 +msgid "tag description" +msgstr "" + +#: judge/models/contest.py:45 +msgid "contest tag" +msgstr "" + +#: judge/models/contest.py:46 judge/models/contest.py:100 +msgid "contest tags" +msgstr "" + +#: judge/models/contest.py:50 +msgid "contest id" +msgstr "" + +#: judge/models/contest.py:52 +msgid "contest name" +msgstr "" + +#: judge/models/contest.py:53 +msgid "These people will be able to edit the contest." +msgstr "" + +#: judge/models/contest.py:55 judge/models/runtime.py:124 +#: src/dmoj-wpadmin/test_project/apps/books/admin.py:20 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:27 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:27 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:13 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:27 +msgid "description" +msgstr "" + +#: judge/models/contest.py:56 judge/models/problem.py:353 +#: judge/models/runtime.py:126 +msgid "problems" +msgstr "" + +#: judge/models/contest.py:57 judge/models/contest.py:252 +msgid "start time" +msgstr "" + +#: judge/models/contest.py:58 +msgid "end time" +msgstr "" + +#: judge/models/contest.py:59 judge/models/problem.py:118 +#: judge/models/problem.py:377 +msgid "time limit" +msgstr "" + +#: judge/models/contest.py:60 judge/models/problem.py:136 +msgid "publicly visible" +msgstr "" + +#: judge/models/contest.py:61 +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:64 +msgid "contest rated" +msgstr "" + +#: judge/models/contest.py:64 +msgid "Whether this contest can be rated." +msgstr "" + +#: judge/models/contest.py:66 +msgid "hide scoreboard" +msgstr "" + +#: judge/models/contest.py:67 +msgid "Whether the scoreboard should remain hidden for the duration of the contest." +msgstr "" + +#: judge/models/contest.py:70 +msgid "no comments" +msgstr "" + +#: judge/models/contest.py:71 +msgid "Use clarification system instead of comments." +msgstr "" + +#: judge/models/contest.py:73 +msgid "Rating floor for contest" +msgstr "" + +#: judge/models/contest.py:75 +msgid "Rating ceiling for contest" +msgstr "" + +#: judge/models/contest.py:77 +msgid "rate all" +msgstr "" + +#: judge/models/contest.py:77 +msgid "Rate all users who joined." +msgstr "" + +#: judge/models/contest.py:78 +msgid "exclude from ratings" +msgstr "" + +#: judge/models/contest.py:80 +msgid "private to specific users" +msgstr "" + +#: judge/models/contest.py:81 +msgid "private contestants" +msgstr "" + +#: judge/models/contest.py:82 +msgid "If private, only these users may see the contest" +msgstr "" + +#: judge/models/contest.py:84 +msgid "hide problem tags" +msgstr "" + +#: judge/models/contest.py:85 +msgid "Whether problem tags should be hidden by default." +msgstr "" + +#: judge/models/contest.py:87 +msgid "run pretests only" +msgstr "" + +#: judge/models/contest.py:88 +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:92 judge/models/problem.py:157 +msgid "private to organizations" +msgstr "" + +#: judge/models/contest.py:93 judge/models/problem.py:155 +#: judge/models/profile.py:76 +msgid "organizations" +msgstr "" + +#: judge/models/contest.py:94 +msgid "If private, only these organizations may see the contest" +msgstr "" + +#: judge/models/contest.py:95 judge/models/problem.py:145 +msgid "OpenGraph image" +msgstr "" + +#: judge/models/contest.py:96 judge/models/profile.py:47 +msgid "Logo override image" +msgstr "" + +#: judge/models/contest.py:98 +msgid "This image will replace the default site logo for users inside the contest." +msgstr "" + +#: judge/models/contest.py:101 +msgid "the amount of live participants" +msgstr "" + +#: judge/models/contest.py:102 +msgid "contest summary" +msgstr "" + +#: judge/models/contest.py:103 judge/models/problem.py:147 +msgid "Plain-text, shown in meta description tag, e.g. for social media." +msgstr "" + +#: judge/models/contest.py:104 judge/models/profile.py:46 +msgid "access code" +msgstr "" + +#: judge/models/contest.py:105 +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:107 judge/models/problem.py:141 +msgid "personae non gratae" +msgstr "" + +#: judge/models/contest.py:108 +msgid "Bans the selected users from joining this contest." +msgstr "" + +#: judge/models/contest.py:109 +msgid "contest format" +msgstr "" + +#: judge/models/contest.py:110 +msgid "The contest format module to use." +msgstr "" + +#: judge/models/contest.py:111 +msgid "contest format configuration" +msgstr "" + +#: judge/models/contest.py:112 +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:233 +msgid "See private contests" +msgstr "" + +#: judge/models/contest.py:234 +msgid "Edit own contests" +msgstr "" + +#: judge/models/contest.py:235 +msgid "Edit all contests" +msgstr "" + +#: judge/models/contest.py:236 +msgid "Clone contest" +msgstr "" + +#: judge/models/contest.py:237 templates/contest/moss.html:74 +msgid "MOSS contest" +msgstr "" + +#: judge/models/contest.py:238 +msgid "Rate contests" +msgstr "" + +#: judge/models/contest.py:239 +msgid "Contest access codes" +msgstr "" + +#: judge/models/contest.py:240 +msgid "Create private contests" +msgstr "" + +#: judge/models/contest.py:242 judge/models/contest.py:320 +#: judge/models/contest.py:356 judge/models/contest.py:378 +#: judge/models/submission.py:83 +msgid "contest" +msgstr "" + +#: judge/models/contest.py:243 +msgid "contests" +msgstr "" + +#: judge/models/contest.py:250 +msgid "associated contest" +msgstr "" + +#: judge/models/contest.py:253 +msgid "score" +msgstr "得分" + +#: judge/models/contest.py:254 +msgid "cumulative time" +msgstr "累計時間" + +#: judge/models/contest.py:255 +msgid "virtual participation id" +msgstr "" + +#: judge/models/contest.py:256 +msgid "0 means non-virtual, otherwise the n-th virtual participation" +msgstr "" + +#: judge/models/contest.py:257 +msgid "contest format specific data" +msgstr "" + +#: judge/models/contest.py:306 +#, python-format +msgid "%s spectating in %s" +msgstr "" + +#: judge/models/contest.py:308 +#, python-format +msgid "%s in %s, v%d" +msgstr "" + +#: judge/models/contest.py:309 +#, python-format +msgid "%s in %s" +msgstr "" + +#: judge/models/contest.py:312 +msgid "contest participation" +msgstr "" + +#: judge/models/contest.py:313 +msgid "contest participations" +msgstr "" + +#: judge/models/contest.py:319 judge/models/contest.py:340 +#: judge/models/contest.py:379 judge/models/problem.py:352 +#: judge/models/problem.py:357 judge/models/problem.py:375 +#: judge/models/problem_data.py:35 +msgid "problem" +msgstr "題目" + +#: judge/models/contest.py:321 judge/models/contest.py:344 +#: judge/models/problem.py:129 +msgid "points" +msgstr "分" + +#: judge/models/contest.py:322 +msgid "partial" +msgstr "部分" + +#: judge/models/contest.py:323 judge/models/contest.py:345 +msgid "is pretested" +msgstr "" + +#: judge/models/contest.py:324 judge/models/interface.py:43 +msgid "order" +msgstr "" + +#: judge/models/contest.py:325 +msgid "output prefix length override" +msgstr "" + +#: judge/models/contest.py:326 +msgid "Maximum number of submissions for this problem, or 0 for no limit." +msgstr "" + +#: judge/models/contest.py:328 +msgid "Why include a problem you can't submit to?" +msgstr "" + +#: judge/models/contest.py:333 +msgid "contest problem" +msgstr "" + +#: judge/models/contest.py:334 +msgid "contest problems" +msgstr "" + +#: judge/models/contest.py:338 judge/models/submission.py:181 +msgid "submission" +msgstr "" + +#: judge/models/contest.py:342 judge/models/contest.py:357 +msgid "participation" +msgstr "" + +#: judge/models/contest.py:346 +msgid "Whether this submission was ran only on pretests." +msgstr "" + +#: judge/models/contest.py:350 +msgid "contest submission" +msgstr "" + +#: judge/models/contest.py:351 +msgid "contest submissions" +msgstr "" + +#: judge/models/contest.py:359 +msgid "rank" +msgstr "排名" + +#: judge/models/contest.py:360 +msgid "rating" +msgstr "" + +#: judge/models/contest.py:361 +msgid "volatility" +msgstr "" + +#: judge/models/contest.py:362 +msgid "last rated" +msgstr "" + +#: judge/models/contest.py:366 +msgid "contest rating" +msgstr "" + +#: judge/models/contest.py:367 +msgid "contest ratings" +msgstr "" + +#: judge/models/contest.py:386 +msgid "contest moss result" +msgstr "" + +#: judge/models/contest.py:387 +msgid "contest moss results" +msgstr "" + +#: judge/models/interface.py:24 +msgid "configuration item" +msgstr "" + +#: judge/models/interface.py:25 +msgid "miscellaneous configuration" +msgstr "" + +#: judge/models/interface.py:37 +msgid "navigation item" +msgstr "" + +#: judge/models/interface.py:38 +msgid "navigation bar" +msgstr "" + +#: judge/models/interface.py:44 +msgid "identifier" +msgstr "" + +#: judge/models/interface.py:45 +msgid "label" +msgstr "" + +#: judge/models/interface.py:47 +msgid "highlight regex" +msgstr "" + +#: judge/models/interface.py:48 +msgid "parent item" +msgstr "" + +#: judge/models/interface.py:66 +msgid "post title" +msgstr "" + +#: judge/models/interface.py:67 judge/models/problem.py:395 +msgid "authors" +msgstr "" + +#: judge/models/interface.py:68 +msgid "slug" +msgstr "" + +#: judge/models/interface.py:69 judge/models/problem.py:393 +msgid "public visibility" +msgstr "" + +#: judge/models/interface.py:70 +msgid "sticky" +msgstr "" + +#: judge/models/interface.py:71 +msgid "publish after" +msgstr "" + +#: judge/models/interface.py:72 +msgid "post content" +msgstr "" + +#: judge/models/interface.py:73 +msgid "post summary" +msgstr "" + +#: judge/models/interface.py:74 +msgid "openGraph image" +msgstr "" + +#: judge/models/interface.py:91 +msgid "Edit all posts" +msgstr "" + +#: judge/models/interface.py:93 +msgid "blog post" +msgstr "" + +#: judge/models/interface.py:94 +msgid "blog posts" +msgstr "" + +#: judge/models/message.py:11 +msgid "message title" +msgstr "" + +#: judge/models/message.py:12 judge/models/ticket.py:29 +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:26 +msgid "problem category ID" +msgstr "" + +#: judge/models/problem.py:27 +msgid "problem category name" +msgstr "" + +#: judge/models/problem.py:34 +msgid "problem type" +msgstr "題目類型" + +#: judge/models/problem.py:35 judge/models/problem.py:113 +msgid "problem types" +msgstr "題目類型" + +#: judge/models/problem.py:39 +msgid "problem group ID" +msgstr "" + +#: judge/models/problem.py:40 +msgid "problem group name" +msgstr "" + +#: judge/models/problem.py:47 judge/models/problem.py:116 +msgid "problem group" +msgstr "" + +#: judge/models/problem.py:48 +msgid "problem groups" +msgstr "" + +#: judge/models/problem.py:52 +msgid "key" +msgstr "" + +#: judge/models/problem.py:54 +msgid "link" +msgstr "" + +#: judge/models/problem.py:55 +msgid "full name" +msgstr "" + +#: judge/models/problem.py:56 judge/models/profile.py:32 +#: judge/models/runtime.py:23 +msgid "short name" +msgstr "" + +#: judge/models/problem.py:57 +msgid "Displayed on pages under this license" +msgstr "" + +#: judge/models/problem.py:58 +msgid "icon" +msgstr "" + +#: judge/models/problem.py:58 +msgid "URL to the icon" +msgstr "" + +#: judge/models/problem.py:59 +msgid "license text" +msgstr "" + +#: judge/models/problem.py:68 +msgid "license" +msgstr "" + +#: judge/models/problem.py:69 +msgid "licenses" +msgstr "" + +#: judge/models/problem.py:96 +msgid "problem code" +msgstr "" + +#: judge/models/problem.py:98 +msgid "A short, unique code for the problem, used in the url after /problem/" +msgstr "" + +#: judge/models/problem.py:100 +msgid "problem name" +msgstr "題目名稱" + +#: judge/models/problem.py:101 +msgid "The full name of the problem, as shown in the problem list." +msgstr "" + +#: judge/models/problem.py:103 +msgid "problem body" +msgstr "" + +#: judge/models/problem.py:104 +msgid "creators" +msgstr "建立者" + +#: judge/models/problem.py:105 +msgid "These users will be able to edit the problem, and be listed as authors." +msgstr "" + +#: judge/models/problem.py:107 +msgid "curators" +msgstr "" + +#: judge/models/problem.py:108 +msgid "These users will be able to edit the problem, but not be listed as authors." +msgstr "" + +#: judge/models/problem.py:110 +msgid "testers" +msgstr "" + +#: judge/models/problem.py:112 +msgid "These users will be able to view the private problem, but not edit it." +msgstr "" + +#: judge/models/problem.py:114 +msgid "The type of problem, as shown on the problem's page." +msgstr "" + +#: judge/models/problem.py:117 +msgid "The group of problem, shown under Category in the problem list." +msgstr "" + +#: judge/models/problem.py:119 +msgid "The time limit for this problem, in seconds. Fractional seconds (e.g. 1.5) are supported." +msgstr "" + +#: judge/models/problem.py:123 judge/models/problem.py:380 +msgid "memory limit" +msgstr "記憶體限制" + +#: judge/models/problem.py:124 +msgid "The memory limit for this problem, in kilobytes (e.g. 64mb = 65536 kilobytes)." +msgstr "此問題的記憶體限制,以kb為單位 ( 例如 64mb = 65536 kb)" + +#: judge/models/problem.py:130 +msgid "Points awarded for problem completion. Points are displayed with a 'p' suffix if partial." +msgstr "" + +#: judge/models/problem.py:133 +msgid "allows partial points" +msgstr "" + +#: judge/models/problem.py:134 +msgid "allowed languages" +msgstr "允許的語言" + +#: judge/models/problem.py:135 +msgid "List of allowed submission languages." +msgstr "" + +#: judge/models/problem.py:137 +msgid "manually managed" +msgstr "" + +#: judge/models/problem.py:138 +msgid "Whether judges should be allowed to manage data or not." +msgstr "" + +#: judge/models/problem.py:139 +msgid "date of publishing" +msgstr "" + +#: judge/models/problem.py:140 +msgid "Doesn't have magic ability to auto-publish due to backward compatibility" +msgstr "" + +#: judge/models/problem.py:142 +msgid "Bans the selected users from submitting to this problem." +msgstr "" + +#: judge/models/problem.py:144 +msgid "The license under which this problem is published." +msgstr "" + +#: judge/models/problem.py:146 +msgid "problem summary" +msgstr "" + +#: judge/models/problem.py:148 +msgid "number of users" +msgstr "" + +#: judge/models/problem.py:149 +msgid "The number of users who solved the problem." +msgstr "" + +#: judge/models/problem.py:150 +msgid "solve rate" +msgstr "" + +#: judge/models/problem.py:156 +msgid "If private, only these organizations may see the problem." +msgstr "" + +#: judge/models/problem.py:358 judge/models/problem.py:376 +#: judge/models/runtime.py:99 +msgid "language" +msgstr "" + +#: judge/models/problem.py:359 +msgid "translated name" +msgstr "" + +#: judge/models/problem.py:360 +msgid "translated description" +msgstr "" + +#: judge/models/problem.py:364 +msgid "problem translation" +msgstr "" + +#: judge/models/problem.py:365 +msgid "problem translations" +msgstr "" + +#: judge/models/problem.py:369 +msgid "clarified problem" +msgstr "" + +#: judge/models/problem.py:370 +msgid "clarification body" +msgstr "" + +#: judge/models/problem.py:371 +msgid "clarification timestamp" +msgstr "" + +#: judge/models/problem.py:386 +msgid "language-specific resource limit" +msgstr "" + +#: judge/models/problem.py:387 +msgid "language-specific resource limits" +msgstr "" + +#: judge/models/problem.py:391 +msgid "associated problem" +msgstr "" + +#: judge/models/problem.py:394 +msgid "publish date" +msgstr "" + +#: judge/models/problem.py:396 +msgid "editorial content" +msgstr "" + +#: judge/models/problem.py:412 +msgid "solution" +msgstr "題解" + +#: judge/models/problem.py:413 +msgid "solutions" +msgstr "題解" + +#: judge/models/problem_data.py:23 +msgid "Standard" +msgstr "標準" + +#: judge/models/problem_data.py:24 +msgid "Floats" +msgstr "浮點數" + +#: judge/models/problem_data.py:25 +msgid "Floats (absolute)" +msgstr "浮點數(絕對值)" + +#: judge/models/problem_data.py:26 +msgid "Floats (relative)" +msgstr "浮點數(相對值)" + +#: judge/models/problem_data.py:27 +msgid "Non-trailing spaces" +msgstr "" + +#: judge/models/problem_data.py:28 +msgid "Unordered" +msgstr "" + +#: judge/models/problem_data.py:29 +msgid "Byte identical" +msgstr "" + +#: 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:39 +msgid "generator file" +msgstr "" + +#: judge/models/problem_data.py:41 judge/models/problem_data.py:90 +msgid "output prefix length" +msgstr "" + +#: judge/models/problem_data.py:42 judge/models/problem_data.py:91 +msgid "output limit length" +msgstr "" + +#: judge/models/problem_data.py:43 +msgid "init.yml generation feedback" +msgstr "" + +#: judge/models/problem_data.py:44 judge/models/problem_data.py:92 +msgid "checker" +msgstr "" + +#: judge/models/problem_data.py:45 judge/models/problem_data.py:93 +msgid "checker arguments" +msgstr "" + +#: 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:77 +msgid "problem data set" +msgstr "" + +#: judge/models/problem_data.py:79 +msgid "case position" +msgstr "" + +#: judge/models/problem_data.py:80 +msgid "case type" +msgstr "" + +#: judge/models/problem_data.py:81 +msgid "Normal case" +msgstr "" + +#: judge/models/problem_data.py:82 +msgid "Batch start" +msgstr "" + +#: judge/models/problem_data.py:83 +msgid "Batch end" +msgstr "" + +#: judge/models/problem_data.py:85 +msgid "input file name" +msgstr "" + +#: judge/models/problem_data.py:86 +msgid "output file name" +msgstr "" + +#: judge/models/problem_data.py:87 +msgid "generator arguments" +msgstr "" + +#: judge/models/problem_data.py:88 +msgid "point value" +msgstr "" + +#: judge/models/problem_data.py:89 +msgid "case is pretest?" +msgstr "" + +#: judge/models/profile.py:29 +msgid "organization title" +msgstr "" + +#: judge/models/profile.py:30 +msgid "organization slug" +msgstr "" + +#: judge/models/profile.py:31 +msgid "Organization name shown in URL" +msgstr "" + +#: judge/models/profile.py:33 +msgid "Displayed beside user name during contests" +msgstr "" + +#: judge/models/profile.py:34 +msgid "organization description" +msgstr "" + +#: judge/models/profile.py:35 +msgid "registrant" +msgstr "" + +#: judge/models/profile.py:36 +msgid "User who registered this organization" +msgstr "" + +#: judge/models/profile.py:37 +msgid "administrators" +msgstr "管理員" + +#: judge/models/profile.py:38 +msgid "Those who can edit this organization" +msgstr "" + +#: judge/models/profile.py:39 +msgid "creation date" +msgstr "" + +#: judge/models/profile.py:40 +msgid "is open organization?" +msgstr "" + +#: judge/models/profile.py:41 +msgid "Allow joining organization" +msgstr "" + +#: judge/models/profile.py:42 +msgid "maximum size" +msgstr "" + +#: judge/models/profile.py:43 +msgid "Maximum amount of users in this organization, only applicable to private organizations" +msgstr "" + +#: judge/models/profile.py:45 +msgid "Student access code" +msgstr "" + +#: judge/models/profile.py:49 +msgid "This image will replace the default site logo for users viewing the organization." +msgstr "" + +#: judge/models/profile.py:75 judge/models/profile.py:91 +#: judge/models/profile.py:190 +msgid "organization" +msgstr "" + +#: judge/models/profile.py:80 +msgid "user associated" +msgstr "" + +#: judge/models/profile.py:81 +msgid "self-description" +msgstr "" + +#: judge/models/profile.py:82 +msgid "location" +msgstr "位置" + +#: judge/models/profile.py:84 +msgid "preferred language" +msgstr "" + +#: judge/models/profile.py:89 +msgid "last access time" +msgstr "" + +#: judge/models/profile.py:90 +msgid "last IP" +msgstr "上一訪問 IP" + +#: judge/models/profile.py:93 +msgid "display rank" +msgstr "顯示排名" + +#: judge/models/profile.py:95 +msgid "comment mute" +msgstr "" + +#: judge/models/profile.py:95 +msgid "Some users are at their best when silent." +msgstr "" + +#: judge/models/profile.py:97 +msgid "unlisted user" +msgstr "" + +#: judge/models/profile.py:97 +msgid "User will not be ranked." +msgstr "" + +#: judge/models/profile.py:100 +msgid "user script" +msgstr "" + +#: judge/models/profile.py:101 +msgid "User-defined JavaScript for site customization." +msgstr "" + +#: judge/models/profile.py:102 +msgid "current contest" +msgstr "" + +#: judge/models/profile.py:104 +msgid "math engine" +msgstr "" + +#: judge/models/profile.py:106 +msgid "the rendering engine used to render math" +msgstr "" + +#: judge/models/profile.py:107 +msgid "2FA enabled" +msgstr "" + +#: judge/models/profile.py:108 +msgid "check to enable TOTP-based two factor authentication" +msgstr "" + +#: judge/models/profile.py:109 +msgid "TOTP key" +msgstr "" + +#: judge/models/profile.py:110 +msgid "32 character base32-encoded key for TOTP" +msgstr "" + +#: judge/models/profile.py:112 +msgid "TOTP key must be empty or base32" +msgstr "" + +#: judge/models/profile.py:113 +msgid "internal notes" +msgstr "" + +#: judge/models/profile.py:114 +msgid "Notes for administrators regarding this user." +msgstr "" + +#: judge/models/profile.py:184 +msgid "user profile" +msgstr "使用者個人檔案" + +#: judge/models/profile.py:185 +msgid "user profiles" +msgstr "使用者個人檔案" + +#: judge/models/profile.py:192 +msgid "request time" +msgstr "" + +#: judge/models/profile.py:193 +msgid "state" +msgstr "" + +#: judge/models/profile.py:198 +msgid "reason" +msgstr "" + +#: judge/models/profile.py:201 +msgid "organization join request" +msgstr "" + +#: judge/models/profile.py:202 +msgid "organization join requests" +msgstr "" + +#: judge/models/runtime.py:18 +msgid "short identifier" +msgstr "" + +#: judge/models/runtime.py:19 +msgid "The identifier for this language; the same as its executor id for judges." +msgstr "" + +#: judge/models/runtime.py:21 +msgid "long name" +msgstr "" + +#: judge/models/runtime.py:22 +msgid "Longer name for the language, e.g. \"Python 2\" or \"C++11\"." +msgstr "" + +#: judge/models/runtime.py:24 +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:28 +msgid "common name" +msgstr "" + +#: judge/models/runtime.py:29 +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:31 +msgid "ace mode name" +msgstr "" + +#: judge/models/runtime.py:32 +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:34 +msgid "pygments name" +msgstr "" + +#: judge/models/runtime.py:35 +msgid "Language ID for Pygments highlighting in source windows." +msgstr "" + +#: judge/models/runtime.py:36 +msgid "code template" +msgstr "" + +#: judge/models/runtime.py:37 +msgid "Code template to display in submission editor." +msgstr "" + +#: judge/models/runtime.py:38 +msgid "runtime info override" +msgstr "" + +#: judge/models/runtime.py:39 +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:41 +msgid "language description" +msgstr "" + +#: judge/models/runtime.py:42 +msgid "Use field this to inform users of quirks with your environment, additional restrictions, etc." +msgstr "" + +#: judge/models/runtime.py:44 +msgid "extension" +msgstr "" + +#: judge/models/runtime.py:45 +msgid "The extension of source files, e.g., \"py\" or \"cpp\"." +msgstr "" + +#: judge/models/runtime.py:100 +msgid "languages" +msgstr "語言" + +#: judge/models/runtime.py:104 +msgid "language to which this runtime belongs" +msgstr "" + +#: judge/models/runtime.py:105 +msgid "judge on which this runtime exists" +msgstr "" + +#: judge/models/runtime.py:106 +msgid "runtime name" +msgstr "" + +#: judge/models/runtime.py:107 +msgid "runtime version" +msgstr "" + +#: judge/models/runtime.py:108 +msgid "order in which to display this runtime" +msgstr "" + +#: judge/models/runtime.py:112 +msgid "Server name, hostname-style" +msgstr "" + +#: judge/models/runtime.py:113 +msgid "time of creation" +msgstr "" + +#: judge/models/runtime.py:114 +msgid "A key to authenticated this judge" +msgstr "" + +#: judge/models/runtime.py:115 +msgid "authentication key" +msgstr "" + +#: judge/models/runtime.py:116 +msgid "block judge" +msgstr "" + +#: judge/models/runtime.py:117 +msgid "Whether this judge should be blocked from connecting, even if its key is correct." +msgstr "" + +#: judge/models/runtime.py:119 +msgid "judge online status" +msgstr "" + +#: judge/models/runtime.py:120 +msgid "judge start time" +msgstr "" + +#: judge/models/runtime.py:121 +msgid "response time" +msgstr "" + +#: judge/models/runtime.py:122 +msgid "system load" +msgstr "" + +#: judge/models/runtime.py:123 +msgid "Load for the last minute, divided by processors to be fair." +msgstr "" + +#: judge/models/runtime.py:127 judge/models/runtime.py:167 +msgid "judges" +msgstr "" + +#: judge/models/runtime.py:166 +msgid "judge" +msgstr "" + +#: judge/models/submission.py:20 judge/models/submission.py:47 +#: judge/utils/problems.py:86 +msgid "Accepted" +msgstr "接受" + +#: judge/models/submission.py:21 judge/models/submission.py:48 +msgid "Wrong Answer" +msgstr "錯誤答案" + +#: judge/models/submission.py:22 judge/models/submission.py:50 +msgid "Time Limit Exceeded" +msgstr "超出了時間限制" + +#: judge/models/submission.py:23 judge/models/submission.py:51 +msgid "Memory Limit Exceeded" +msgstr "超出了記憶體限制" + +#: judge/models/submission.py:24 judge/models/submission.py:52 +msgid "Output Limit Exceeded" +msgstr "超出了輸出限制" + +#: judge/models/submission.py:25 judge/models/submission.py:53 +msgid "Invalid Return" +msgstr "" + +#: judge/models/submission.py:26 judge/models/submission.py:54 +msgid "Runtime Error" +msgstr "運行時錯誤" + +#: judge/models/submission.py:27 judge/models/submission.py:41 +#: judge/models/submission.py:55 judge/utils/problems.py:88 +msgid "Compile Error" +msgstr "編譯錯誤" + +#: judge/models/submission.py:28 judge/models/submission.py:40 +msgid "Internal Error" +msgstr "內部錯誤" + +#: judge/models/submission.py:29 +msgid "Short circuit" +msgstr "" + +#: judge/models/submission.py:30 judge/models/submission.py:42 +#: judge/models/submission.py:61 +msgid "Aborted" +msgstr "" + +#: judge/models/submission.py:36 judge/models/submission.py:57 +msgid "Queued" +msgstr "已排入佇列" + +#: judge/models/submission.py:37 judge/models/submission.py:58 +msgid "Processing" +msgstr "正在處理" + +#: judge/models/submission.py:38 judge/models/submission.py:59 +msgid "Grading" +msgstr "評分中" + +#: judge/models/submission.py:39 judge/models/submission.py:60 +msgid "Completed" +msgstr "已完成" + +#: judge/models/submission.py:56 +msgid "Internal Error (judging server error)" +msgstr "" + +#: judge/models/submission.py:66 +msgid "submission time" +msgstr "提交時間" + +#: judge/models/submission.py:67 judge/models/submission.py:201 +msgid "execution time" +msgstr "執行時間" + +#: judge/models/submission.py:68 judge/models/submission.py:202 +msgid "memory usage" +msgstr "記憶體使用量" + +#: judge/models/submission.py:69 judge/models/submission.py:203 +msgid "points granted" +msgstr "獲得分數" + +#: judge/models/submission.py:70 +msgid "submission language" +msgstr "提交語言" + +#: judge/models/submission.py:71 +msgid "status" +msgstr "狀態" + +#: judge/models/submission.py:72 +msgid "result" +msgstr "結果" + +#: judge/models/submission.py:74 +msgid "compile errors" +msgstr "編譯錯誤" + +#: judge/models/submission.py:76 +msgid "batched cases" +msgstr "" + +#: judge/models/submission.py:77 +msgid "test case points" +msgstr "" + +#: judge/models/submission.py:78 +msgid "test case total points" +msgstr "" + +#: judge/models/submission.py:79 +msgid "judged on" +msgstr "" + +#: judge/models/submission.py:81 +msgid "was rejudged by admin" +msgstr "" + +#: judge/models/submission.py:82 +msgid "was ran on pretests only" +msgstr "" + +#: judge/models/submission.py:182 templates/contest/moss.html:58 +msgid "submissions" +msgstr "" + +#: judge/models/submission.py:186 judge/models/submission.py:197 +msgid "associated submission" +msgstr "" + +#: judge/models/submission.py:188 +msgid "source code" +msgstr "源碼" + +#: judge/models/submission.py:199 +msgid "test case ID" +msgstr "" + +#: judge/models/submission.py:200 +msgid "status flag" +msgstr "" + +#: judge/models/submission.py:204 +msgid "points possible" +msgstr "" + +#: judge/models/submission.py:205 +msgid "batch number" +msgstr "" + +#: judge/models/submission.py:206 +msgid "judging feedback" +msgstr "" + +#: judge/models/submission.py:207 +msgid "extended judging feedback" +msgstr "" + +#: judge/models/submission.py:208 +msgid "program output" +msgstr "" + +#: judge/models/submission.py:216 +msgid "submission test case" +msgstr "" + +#: judge/models/submission.py:217 +msgid "submission test cases" +msgstr "" + +#: judge/models/ticket.py:10 +msgid "ticket title" +msgstr "" + +#: judge/models/ticket.py:11 +msgid "ticket creator" +msgstr "" + +#: judge/models/ticket.py:13 +msgid "creation time" +msgstr "" + +#: judge/models/ticket.py:14 +msgid "assignees" +msgstr "" + +#: judge/models/ticket.py:15 +msgid "quick notes" +msgstr "" + +#: judge/models/ticket.py:16 +msgid "Staff notes for this issue to aid in processing." +msgstr "" + +#: judge/models/ticket.py:17 +msgid "linked item type" +msgstr "" + +#: judge/models/ticket.py:19 +msgid "linked item ID" +msgstr "" + +#: judge/models/ticket.py:21 +msgid "is ticket open?" +msgstr "" + +#: judge/models/ticket.py:25 +msgid "ticket" +msgstr "" + +#: judge/models/ticket.py:27 +msgid "poster" +msgstr "" + +#: judge/models/ticket.py:30 +msgid "message time" +msgstr "" + +#: judge/pdf_problems.py:134 judge/pdf_problems.py:186 +#: judge/pdf_problems.py:246 +msgid "Page [page] of [topage]" +msgstr "" + +#: judge/tasks/moss.py:25 +msgid "Running MOSS" +msgstr "" + +#: judge/tasks/submission.py:43 +msgid "Modifying submissions" +msgstr "" + +#: judge/tasks/submission.py:56 +msgid "Recalculating user points" +msgstr "" + +#: judge/utils/problem_data.py:63 +msgid "Empty batches not allowed." +msgstr "" + +#: 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 +#, python-format +msgid "Input file for case %d does not exist: %s" +msgstr "" + +#: 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 +#, python-format +msgid "Batch start case #%d requires points." +msgstr "" + +#: 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 +msgid "How did you corrupt the zip path?" +msgstr "" + +#: judge/utils/problem_data.py:160 +msgid "How did you corrupt the generator path?" +msgstr "" + +#: judge/utils/problems.py:76 +msgid "Can't pass both queryset and keyword filters" +msgstr "" + +#: judge/utils/problems.py:87 +msgid "Wrong" +msgstr "" + +#: judge/utils/problems.py:89 +msgid "Timeout" +msgstr "" + +#: judge/utils/problems.py:90 +msgid "Error" +msgstr "" + +#: 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/timedelta.py:49 +msgctxt "time format with day" +msgid "%d day %h:%m:%s" +msgid_plural "%d days %h:%m:%s" +msgstr[0] "%d 天 %h:%m:%s" + +#: judge/utils/timedelta.py:53 +msgctxt "time format without day" +msgid "%h:%m:%s" +msgstr "%h:%m:%s" + +#: 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] "%d 天 %h:%m" + +#: judge/utils/timedelta.py:61 +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d 天" + +#: judge/utils/timedelta.py:63 +msgctxt "hours and minutes" +msgid "%h:%m" +msgstr "%h:%m" + +#: judge/views/blog.py:38 +#, python-format +msgid "Page %d of Posts" +msgstr "" + +#: judge/views/comment.py:27 +msgid "Messing around, are we?" +msgstr "" + +#: judge/views/comment.py:36 +msgid "You must solve at least one problem before you can vote." +msgstr "" + +#: judge/views/comment.py:63 +msgid "You already voted." +msgstr "" + +#: judge/views/comment.py:120 judge/views/organization.py:299 +msgid "Edited from site" +msgstr "" + +#: judge/views/comment.py:141 +msgid "Editing comment" +msgstr "" + +#: judge/views/contests.py:49 judge/views/contests.py:211 +#: judge/views/contests.py:214 judge/views/contests.py:385 +msgid "No such contest" +msgstr "" + +#: judge/views/contests.py:50 judge/views/contests.py:212 +#, python-format +msgid "Could not find a contest with the key \"%s\"." +msgstr "" + +#: judge/views/contests.py:75 +msgid "Contests" +msgstr "" + +#: judge/views/contests.py:215 +msgid "Could not find such contest." +msgstr "" + +#: judge/views/contests.py:218 +#, python-format +msgid "Access to contest \"%s\" denied" +msgstr "" + +#: judge/views/contests.py:242 +msgid "Clone Contest" +msgstr "" + +#: judge/views/contests.py:305 +msgid "Contest not ongoing" +msgstr "" + +#: judge/views/contests.py:306 +#, python-format +msgid "\"%s\" is not currently ongoing." +msgstr "" + +#: judge/views/contests.py:310 +msgid "Already in contest" +msgstr "" + +#: judge/views/contests.py:311 +#, python-format +msgid "You are already in a contest: \"%s\"." +msgstr "" + +#: judge/views/contests.py:314 +msgid "Banned from joining" +msgstr "" + +#: judge/views/contests.py:315 +msgid "You have been declared persona non grata for this contest. You are permanently barred from joining this contest." +msgstr "" + +#: judge/views/contests.py:375 +#, python-format +msgid "Enter access code for \"%s\"" +msgstr "" + +#: judge/views/contests.py:386 +#, python-format +msgid "You are not in contest \"%s\"." +msgstr "" + +#: judge/views/contests.py:405 +msgid "ContestCalendar requires integer year and month" +msgstr "" + +#: judge/views/contests.py:445 +#, python-format +msgid "Contests in %(month)s" +msgstr "" + +#: judge/views/contests.py:445 +msgid "F Y" +msgstr "" + +#: judge/views/contests.py:531 +msgid "???" +msgstr "" + +#: judge/views/contests.py:594 +#, python-format +msgid "%s Rankings" +msgstr "" + +#: judge/views/contests.py:610 +#, python-format +msgid "Your participation in %s" +msgstr "" + +#: judge/views/contests.py:611 +#, python-format +msgid "%s's participation in %s" +msgstr "" + +#: judge/views/contests.py:615 +msgid "Live" +msgstr "" + +#: judge/views/contests.py:627 templates/contest/contest-tabs.html:13 +msgid "Participation" +msgstr "" + +#: judge/views/contests.py:654 +#, python-format +msgid "%s MOSS Results" +msgstr "" + +#: judge/views/contests.py:681 +#, python-format +msgid "Running MOSS for %s..." +msgstr "" + +#: judge/views/contests.py:704 +#, python-format +msgid "Contest tag: %s" +msgstr "" + +#: judge/views/error.py:14 +msgid "404 error" +msgstr "" + +#: judge/views/error.py:15 +#, python-format +msgid "Could not find page \"%s\"" +msgstr "" + +#: judge/views/error.py:22 +#, python-format +msgid "no permission for %s" +msgstr "" + +#: 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 +msgid "Runtimes" +msgstr "" + +#: judge/views/organization.py:44 judge/views/organization.py:47 +msgid "No such organization" +msgstr "" + +#: judge/views/organization.py:45 +#, python-format +msgid "Could not find an organization with the key \"%s\"." +msgstr "" + +#: judge/views/organization.py:48 +msgid "Could not find such organization." +msgstr "" + +#: judge/views/organization.py:72 judge/views/register.py:34 +#: templates/organization/list.html:15 templates/user/user-list-tabs.html:5 +msgid "Organizations" +msgstr "" + +#: judge/views/organization.py:93 +#, python-format +msgid "%s Members" +msgstr "" + +#: judge/views/organization.py:118 judge/views/organization.py:121 +#: judge/views/organization.py:126 +msgid "Joining organization" +msgstr "" + +#: judge/views/organization.py:118 +msgid "You are already in the organization." +msgstr "" + +#: judge/views/organization.py:121 +msgid "This organization is not open." +msgstr "" + +#: judge/views/organization.py:138 +msgid "Leaving organization" +msgstr "" + +#: judge/views/organization.py:138 +#, python-format +msgid "You are not in \"%s\"." +msgstr "" + +#: judge/views/organization.py:162 +#, python-format +msgid "Request to join %s" +msgstr "" + +#: judge/views/organization.py:180 +msgid "Join request detail" +msgstr "" + +#: judge/views/organization.py:209 +#, python-format +msgid "Managing join requests for %s" +msgstr "" + +#: judge/views/organization.py:240 +#, python-format +msgid "Your organization can only receive %d more members. You cannot approve %d users." +msgstr "" + +#: judge/views/organization.py:252 +#, python-format +msgid "Approved %d user." +msgid_plural "Approved %d users." +msgstr[0] "" + +#: judge/views/organization.py:253 +#, python-format +msgid "Rejected %d user." +msgid_plural "Rejected %d users." +msgstr[0] "" + +#: judge/views/organization.py:283 +#, python-format +msgid "Editing %s" +msgstr "" + +#: judge/views/organization.py:307 judge/views/organization.py:315 +msgid "Can't edit organization" +msgstr "" + +#: judge/views/organization.py:308 +msgid "You are not allowed to edit this organization." +msgstr "" + +#: judge/views/organization.py:316 +msgid "You are not allowed to kick people from this organization." +msgstr "" + +#: judge/views/organization.py:321 judge/views/organization.py:325 +msgid "Can't kick user" +msgstr "" + +#: judge/views/organization.py:322 +msgid "The user you are trying to kick does not exist!" +msgstr "" + +#: judge/views/organization.py:326 +#, python-format +msgid "The user you are trying to kick is not in organization: %s." +msgstr "" + +#: judge/views/problem.py:68 +msgid "No such problem" +msgstr "沒有這個題目" + +#: judge/views/problem.py:69 +#, python-format +msgid "Could not find a problem with the code \"%s\"." +msgstr "" + +#: judge/views/problem.py:111 +#, python-brace-format +msgid "Editorial for {0}" +msgstr "" + +#: judge/views/problem.py:114 +#, python-brace-format +msgid "Editorial for {0}" +msgstr "" + +#: judge/views/problem.py:285 templates/contest/contest.html:79 +#: templates/user/user-tabs.html:5 templates/user/users-table.html:23 +msgid "Problems" +msgstr "問題" + +#: judge/views/problem.py:546 +msgid "Banned from submitting" +msgstr "" + +#: judge/views/problem.py:547 +msgid "You have been declared persona non grata for this problem. You are permanently barred from submitting this problem." +msgstr "" + +#: judge/views/problem.py:560 +msgid "Too many submissions" +msgstr "" + +#: judge/views/problem.py:561 +msgid "You have exceeded the submission limit for this problem." +msgstr "" + +#: judge/views/problem.py:627 judge/views/problem.py:630 +#, python-format +msgid "Submit to %(problem)s" +msgstr "" + +#: judge/views/problem.py:646 +msgid "Clone Problem" +msgstr "" + +#: judge/views/problem_data.py:37 +msgid "Checker arguments must be a JSON object" +msgstr "" + +#: judge/views/problem_data.py:39 +msgid "Checker arguments is invalid JSON" +msgstr "" + +#: judge/views/problem_data.py:46 +msgid "Your zip file is invalid!" +msgstr "" + +#: judge/views/problem_data.py:104 +#, python-brace-format +msgid "Comparing submissions for {0}" +msgstr "" + +#: judge/views/problem_data.py:107 +#, python-brace-format +msgid "Comparing submissions for {0}" +msgstr "" + +#: judge/views/problem_data.py:142 +#, python-brace-format +msgid "Editing data for {0}" +msgstr "" + +#: judge/views/problem_data.py:145 +#, python-format +msgid "Editing data for %s" +msgstr "" + +#: judge/views/problem_data.py:237 judge/views/problem_data.py:238 +#, python-format +msgid "Generated init.yml for %s" +msgstr "" + +#: 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] "" + +#: judge/views/ranked_submission.py:58 +#, python-format +msgid "Best solutions for %s" +msgstr "" + +#: judge/views/ranked_submission.py:61 +#, python-brace-format +msgid "Best solutions for {0}" +msgstr "" + +#: judge/views/ranked_submission.py:71 +#, python-format +msgid "Best solutions for %(problem)s in %(contest)s" +msgstr "" + +#: judge/views/ranked_submission.py:74 +#, python-format +msgid "Best solutions for problem %(number)s in %(contest)s" +msgstr "" + +#: judge/views/ranked_submission.py:80 +#, python-brace-format +msgid "Best solutions for {0} in {2}" +msgstr "" + +#: judge/views/ranked_submission.py:83 +#, python-brace-format +msgid "Best solutions for problem {0} in {1}" +msgstr "" + +#: judge/views/register.py:27 +msgid "A username must contain letters, numbers, or underscores" +msgstr "" + +#: judge/views/register.py:31 templates/user/edit-profile.html:103 +msgid "Preferred language" +msgstr "" + +#: judge/views/register.py:38 +msgid "Subscribe to newsletter?" +msgstr "" + +#: judge/views/register.py:45 +#, python-format +msgid "The email address \"%s\" is already taken. Only one registration is allowed per address." +msgstr "" + +#: judge/views/register.py:51 +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 +msgid "Registration" +msgstr "" + +#: judge/views/register.py:106 +msgid "Authentication failure" +msgstr "" + +#: judge/views/stats.py:105 +msgid "Language statistics" +msgstr "" + +#: judge/views/status.py:24 templates/submission/list.html:319 +msgid "Status" +msgstr "" + +#: judge/views/status.py:108 +msgid "Version matrix" +msgstr "" + +#: judge/views/submission.py:59 judge/views/submission.py:66 +#, python-format +msgid "Submission of %(problem)s by %(user)s" +msgstr "" + +#: judge/views/submission.py:161 judge/views/submission.py:162 +#: templates/problem/problem.html:127 +msgid "All submissions" +msgstr "全部的提交" + +#: judge/views/submission.py:303 +msgid "All my submissions" +msgstr "我的提交" + +#: judge/views/submission.py:304 +#, python-format +msgid "All submissions by %s" +msgstr "%s 的提交" + +#: judge/views/submission.py:335 +#, python-format +msgid "All submissions for %s" +msgstr "" + +#: judge/views/submission.py:354 +msgid "Must pass a problem" +msgstr "" + +#: judge/views/submission.py:397 +#, python-format +msgid "My submissions for %(problem)s" +msgstr "" + +#: judge/views/submission.py:398 +#, python-format +msgid "%(user)s's submissions for %(problem)s" +msgstr "" + +#: judge/views/submission.py:495 +msgid "Must pass a contest" +msgstr "" + +#: judge/views/submission.py:514 +#, python-brace-format +msgid "{0}'s submissions for {2} in {4}" +msgstr "" + +#: judge/views/submission.py:519 +#, 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 "" + +#: judge/views/ticket.py:40 +msgid "Issue description" +msgstr "" + +#: judge/views/ticket.py:85 judge/views/ticket.py:88 +#, python-format +msgid "New ticket for %s" +msgstr "" + +#: judge/views/ticket.py:139 +#, python-format +msgid "%(title)s - Ticket %(id)d" +msgstr "" + +#: judge/views/ticket.py:248 +#, python-format +msgid "Tickets - Page %(number)d of %(total)d" +msgstr "" + +#: judge/views/ticket.py:297 +#, python-format +msgid "New Ticket: %s" +msgstr "" + +#: judge/views/ticket.py:298 +#, python-format +msgid "#%(id)d, assigned to: %(users)s" +msgstr "" + +#: judge/views/ticket.py:300 +msgid ", " +msgstr "" + +#: judge/views/ticket.py:300 +msgid "no one" +msgstr "" + +#: judge/views/totp.py:42 templates/registration/totp_enable.html:86 +msgid "Enable Two Factor Authentication" +msgstr "" + +#: judge/views/totp.py:89 templates/registration/totp_disable.html:48 +msgid "Disable Two Factor Authentication" +msgstr "" + +#: judge/views/totp.py:103 +msgid "Perform Two Factor Authentication" +msgstr "" + +#: judge/views/user.py:68 +msgid "No such user" +msgstr "" + +#: judge/views/user.py:68 +#, python-format +msgid "No user handle \"%s\"." +msgstr "" + +#: judge/views/user.py:72 +msgid "My account" +msgstr "我的帳戶" + +#: judge/views/user.py:73 +#, python-format +msgid "User %s" +msgstr "用戶 %s" + +#: judge/views/user.py:136 +msgid "M j, Y, G:i" +msgstr "" + +#: judge/views/user.py:221 +msgid "Updated on site" +msgstr "" + +#: judge/views/user.py:253 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:10 +msgid "Edit profile" +msgstr "" + +#: judge/views/user.py:262 templates/user/user-list-tabs.html:4 +msgid "Leaderboard" +msgstr "" + +#: judge/views/widgets.py:48 judge/views/widgets.py:58 +#, python-format +msgid "Invalid upstream data: %s" +msgstr "" + +#: judge/views/widgets.py:68 +msgid "Bad latitude or longitude" +msgstr "" + +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:13 +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:27 +msgid "Photo" +msgstr "" + +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:14 +#: src/django-sortedm2m/sortedm2m_tests/migrations_tests/models.py:28 +msgid "Photos" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:9 +msgid "first name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:10 +msgid "last name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/authors/models.py:11 +msgid "biography" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/admin.py:24 +#: src/dmoj-wpadmin/test_project/apps/books/models.py:30 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:30 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:30 +msgid "owner" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:12 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:12 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:12 +msgid "name" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:19 +msgid "Category of Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:20 +msgid "Categories of Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:26 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:26 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:26 +msgid "title" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:28 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:28 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:28 +msgid "category" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:29 +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:29 +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:29 +msgid "author" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:31 +msgid "publication date" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:37 +msgid "Book" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/books/models.py:38 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:136 +msgid "Books" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:19 +msgid "Category of CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:20 +msgid "Categories of CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:36 +msgid "CD" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/cds/models.py:37 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:141 +msgid "CDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:19 +msgid "Category of DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:20 +msgid "Categories of DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:36 +msgid "DVD" +msgstr "" + +#: src/dmoj-wpadmin/test_project/apps/dvds/models.py:37 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:146 +msgid "DVDs" +msgstr "" + +#: src/dmoj-wpadmin/test_project/templates/admin/base_site.html:7 +msgid "Django administration" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/forms.py:12 +#, python-format +msgid "Please enter the correct %(username)s and password for an admin account. Note that both fields may be case-sensitive." +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/forms.py:32 +#, python-format +msgid "Please enter the correct %(username)s and password for an user account. Note that both fields may be case-sensitive." +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:27 +msgid "Site" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:38 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:41 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:130 +#: src/dmoj-wpadmin/test_project/test_project/wp.py:133 +msgid "Dashboard" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:48 +msgid "Applications" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:53 +msgid "Administration" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:64 +msgid "Color theme" +msgstr "" + +#: src/dmoj-wpadmin/test_project/test_project/wp.py:66 +msgid "Change color theme" +msgstr "" + +#: 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 +msgid "Rate all ratable contests" +msgstr "" + +#: 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 +msgid "Rejudge" +msgstr "" + +#: templates/base.html:214 +#, python-format +msgid "Hello, %(username)s." +msgstr "" + +#: templates/base.html:220 templates/comments/list.html:89 +#: templates/contest/contest-list-tabs.html:24 +#: templates/problem/problem-list-tabs.html:6 +#: templates/submission/info-base.html:12 +#: templates/submission/submission-list-tabs.html:15 +msgid "Admin" +msgstr "" + +#: templates/base.html:229 +msgid "Log out" +msgstr "登出" + +#: templates/base.html:238 +#: templates/registration/password_reset_complete.html:4 +msgid "Log in" +msgstr "" + +#: templates/base.html:239 templates/registration/registration_form.html:177 +msgid "or" +msgstr "" + +#: templates/base.html:240 +msgid "Sign up" +msgstr "" + +#: templates/base.html:252 +msgid "spectating" +msgstr "" + +#: 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:20 +#: 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 +msgid "Edit" +msgstr "" + +#: templates/blog/content.html:27 +#, python-format +msgid "\n" +" posted on %(time)s\n" +" " +msgstr "" + +#: templates/blog/dashboard.html:21 +#, python-format +msgid "\n" +" on %(time)s\n" +" " +msgstr "" + +#: templates/blog/list.html:85 +msgid "Blog" +msgstr "" + +#: templates/blog/list.html:87 +msgid "Events" +msgstr "" + +#: templates/blog/list.html:92 +msgid "News" +msgstr "" + +#: templates/blog/list.html:106 +#, python-brace-format +msgid "posted on {time}" +msgstr "" + +#: templates/blog/list.html:130 templates/problem/problem.html:310 +msgid "Clarifications" +msgstr "" + +#: templates/blog/list.html:146 templates/problem/problem.html:321 +msgid "No clarifications have been made at this time." +msgstr "" + +#: templates/blog/list.html:154 +msgid "Ongoing contests" +msgstr "" + +#: templates/blog/list.html:172 +msgid "Upcoming contests" +msgstr "" + +#: templates/blog/list.html:189 +msgid "Comment stream" +msgstr "" + +#: templates/blog/list.html:208 +msgid "New problems" +msgstr "" + +#: templates/blog/list.html:225 +msgid "My open tickets" +msgstr "" + +#: templates/blog/list.html:246 +msgid "New tickets" +msgstr "" + +#: templates/comments/list.html:2 +msgid "Comments" +msgstr "" + +#: templates/comments/list.html:18 templates/comments/list.html:27 +msgid "Please login to vote" +msgstr "" + +#: templates/comments/list.html:40 +#, python-brace-format +msgid "commented on {time}" +msgstr "" + +#: templates/comments/list.html:49 +#, python-format +msgid "edit %(edits)s" +msgstr "" + +#: templates/comments/list.html:51 templates/comments/media-js.html:77 +msgid "edited" +msgstr "" + +#: templates/comments/list.html:60 +msgid "Link" +msgstr "" + +#: templates/comments/list.html:73 templates/comments/list.html:80 +msgid "Reply" +msgstr "" + +#: templates/comments/list.html:86 +msgid "Hide" +msgstr "" + +#: templates/comments/list.html:101 +#, 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:120 +msgid "There are no comments at the moment." +msgstr "" + +#: templates/comments/list.html:126 +msgid "New comment" +msgstr "" + +#: templates/comments/list.html:140 +msgid "Invalid comment body." +msgstr "" + +#: templates/comments/list.html:148 +msgid "Post!" +msgstr "" + +#: templates/comments/list.html:156 +msgid "Comments are disabled on this page." +msgstr "" + +#: templates/comments/media-js.html:72 +#, python-brace-format +msgid "edit {edits}" +msgstr "" + +#: templates/comments/media-js.html:75 +msgid "original" +msgstr "" + +#: templates/contest/access_code.html:26 +msgid "Invalid access code." +msgstr "" + +#: templates/contest/access_code.html:29 +msgid "Please enter your access code:" +msgstr "" + +#: templates/contest/access_code.html:32 +msgid "Join Contest" +msgstr "" + +#: templates/contest/calendar.html:12 +msgid "Sunday" +msgstr "星期日" + +#: templates/contest/calendar.html:13 +msgid "Monday" +msgstr "星期一" + +#: templates/contest/calendar.html:14 +msgid "Tuesday" +msgstr "星期二" + +#: templates/contest/calendar.html:15 +msgid "Wednesday" +msgstr "星期三" + +#: templates/contest/calendar.html:16 +msgid "Thursday" +msgstr "星期四" + +#: templates/contest/calendar.html:17 +msgid "Friday" +msgstr "星期五" + +#: templates/contest/calendar.html:18 +msgid "Saturday" +msgstr "星期六" + +#: 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 +msgid "Today" +msgstr "" + +#: templates/contest/contest-list-tabs.html:13 +msgid "Next" +msgstr "" + +#: templates/contest/contest-list-tabs.html:21 +#: templates/problem/problem-list-tabs.html:5 +msgid "List" +msgstr "" + +#: templates/contest/contest-list-tabs.html:22 +msgid "Calendar" +msgstr "" + +#: templates/contest/contest-tabs.html:4 +msgid "Info" +msgstr "" + +#: templates/contest/contest-tabs.html:8 +msgid "Rankings" +msgstr "" + +#: templates/contest/contest-tabs.html:10 +msgid "Hidden Rankings" +msgstr "" + +#: templates/contest/contest-tabs.html:18 +msgid "MOSS" +msgstr "" + +#: templates/contest/contest-tabs.html:23 +msgid "Clone" +msgstr "" + +#: templates/contest/contest-tabs.html:34 +#: templates/contest/contest-tabs.html:54 +msgid "Leave contest" +msgstr "" + +#: templates/contest/contest-tabs.html:41 templates/contest/list.html:293 +msgid "Virtual join" +msgstr "" + +#: templates/contest/contest-tabs.html:52 +msgid "Stop spectating" +msgstr "" + +#: templates/contest/contest-tabs.html:61 +msgid "Spectate contest" +msgstr "" + +#: templates/contest/contest-tabs.html:67 +#: templates/contest/contest-tabs.html:73 +msgid "Join contest" +msgstr "" + +#: templates/contest/contest-tabs.html:82 +msgid "Login to participate" +msgstr "" + +#: templates/contest/contest.html:37 +msgid "Participating virtually." +msgstr "" + +#: templates/contest/contest.html:43 +msgid "Contest is over." +msgstr "" + +#: templates/contest/contest.html:59 templates/contest/contest.html:63 +msgid "F j, Y, G:i T" +msgstr "" + +#: 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 +#, python-format +msgid "%(length)s long starting on %(start_time)s" +msgstr "" + +#: templates/contest/contest.html:85 +msgid "AC Rate" +msgstr "" + +#: templates/contest/contest.html:86 templates/contest/list.html:153 +#: templates/contest/list.html:195 templates/contest/list.html:271 +#: templates/problem/list.html:212 templates/problem/list.html:238 +msgid "Users" +msgstr "" + +#: templates/contest/contest.html:111 +msgid "Editorial" +msgstr "" + +#: templates/contest/list.html:31 templates/contest/media-js.html:9 +msgid "Are you sure you want to join?" +msgstr "" + +#: 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:65 +msgid "hidden" +msgstr "" + +#: templates/contest/list.html:70 +msgid "private" +msgstr "" + +#: templates/contest/list.html:84 +msgid "rated" +msgstr "" + +#: templates/contest/list.html:132 +msgid "Spectate" +msgstr "" + +#: templates/contest/list.html:138 +msgid "Join" +msgstr "" + +#: templates/contest/list.html:148 +msgid "Active Contests" +msgstr "" + +#: templates/contest/list.html:152 templates/contest/list.html:194 +#: templates/contest/list.html:232 templates/contest/list.html:270 +msgid "Contest" +msgstr "" + +#: templates/contest/list.html:190 +msgid "Ongoing Contests" +msgstr "" + +#: templates/contest/list.html:227 +msgid "Upcoming Contests" +msgstr "" + +#: templates/contest/list.html:255 +msgid "There are no scheduled contests at this time." +msgstr "" + +#: templates/contest/list.html:261 +msgid "Past Contests" +msgstr "" + +#: templates/contest/media-js.html:4 +msgid "Are you sure you want to leave?" +msgstr "" + +#: 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 +msgid "Joining a contest starts your timer, after which it becomes unstoppable." +msgstr "" + +#: 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:7 +msgid "Organization" +msgstr "組織" + +#: templates/contest/ranking-table.html:27 +#, python-brace-format +msgid "Started on {time}" +msgstr "" + +#: templates/contest/ranking-table.html:30 +msgid "Participation ended." +msgstr "" + +#: templates/contest/ranking.html:232 +msgid "View user participation" +msgstr "" + +#: templates/contest/ranking.html:236 +msgid "Show organizations" +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 +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 +msgid "activate" +msgstr "" + +#: 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 +msgid "Newsletter unsubscribe" +msgstr "" + +#: 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 +msgid "Do you want to unsubscribe from this newsletter?" +msgstr "" + +#: 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 +msgid "Newsletter update" +msgstr "" + +#: 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 +msgid "Update subscription" +msgstr "" + +#: templates/newsletter/subscription_update_activated.html:8 +msgid "Your subscription has successfully been updated." +msgstr "" + +#: 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:34 +#: templates/ticket/edit-notes.html:4 +msgid "Update" +msgstr "" + +#: 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:29 +msgid "Join organization" +msgstr "" + +#: templates/organization/home.html:33 +msgid "Request membership" +msgstr "" + +#: templates/organization/home.html:39 +msgid "Edit organization" +msgstr "" + +#: templates/organization/home.html:43 +msgid "View requests" +msgstr "" + +#: templates/organization/home.html:50 +msgid "Admin organization" +msgstr "" + +#: templates/organization/home.html:55 +msgid "View members" +msgstr "" + +#: templates/organization/list.html:23 templates/status/language-list.html:34 +msgid "Name" +msgstr "" + +#: templates/organization/list.html:24 +msgid "Members" +msgstr "" + +#: templates/organization/new.html:10 templates/ticket/new.html:38 +msgid "Create" +msgstr "" + +#: templates/organization/requests/detail.html:13 +msgid "User:" +msgstr "" + +#: templates/organization/requests/detail.html:17 +msgid "Organization:" +msgstr "" + +#: templates/organization/requests/detail.html:25 +msgid "Time:" +msgstr "" + +#: templates/organization/requests/detail.html:29 +msgid "Reason:" +msgstr "" + +#: 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:15 +msgid "Reason" +msgstr "" + +#: 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:17 +#: templates/problem/data.html:401 +msgid "Delete?" +msgstr "" + +#: templates/organization/requests/request.html:18 +msgid "Your reason for joining:" +msgstr "" + +#: templates/organization/requests/request.html:20 +msgid "Request" +msgstr "" + +#: templates/organization/requests/tabs.html:4 +msgid "Pending" +msgstr "" + +#: templates/organization/requests/tabs.html:7 +msgid "Log" +msgstr "" + +#: templates/organization/requests/tabs.html:10 +msgid "Approved" +msgstr "" + +#: templates/organization/requests/tabs.html:13 +msgid "Rejected" +msgstr "" + +#: templates/organization/users-table.html:15 +msgid "Kick" +msgstr "" + +#: templates/problem/clone.html:37 +msgid "Enter a new code for the cloned problem:" +msgstr "" + +#: templates/problem/data.html:353 +msgid "View YAML" +msgstr "" + +#: templates/problem/data.html:369 +msgid "Show columns:" +msgstr "" + +#: templates/problem/data.html:372 templates/problem/data.html:396 +msgid "Output prefix" +msgstr "" + +#: templates/problem/data.html:376 templates/problem/data.html:397 +msgid "Output limit" +msgstr "" + +#: templates/problem/data.html:380 templates/problem/data.html:398 +msgid "Checker" +msgstr "" + +#: templates/problem/data.html:384 templates/problem/data.html:399 +msgid "Generator args" +msgstr "" + +#: templates/problem/data.html:391 +msgid "Type" +msgstr "" + +#: templates/problem/data.html:392 +msgid "Input file" +msgstr "" + +#: templates/problem/data.html:393 +msgid "Output file" +msgstr "" + +#: templates/problem/data.html:395 +msgid "Pretest?" +msgstr "" + +#: templates/problem/data.html:447 templates/problem/submit.html:252 +msgid "Submit!" +msgstr "" + +#: templates/problem/data.html:448 +msgid "Add new case" +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 editorialist.

Submitting an official solution before solving the problem yourself is a bannable offence." +msgstr "" + +#: templates/problem/list.html:62 +msgid "Filter by type..." +msgstr "" + +#: templates/problem/list.html:185 +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:57 +msgid "Category" +msgstr "" + +#: templates/problem/list.html:209 templates/problem/list.html:228 +msgid "Types" +msgstr "" + +#: templates/problem/list.html:235 +#, python-format +msgid "AC %%" +msgstr "" + +#: 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:142 +msgid "Filter by result:" +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:101 templates/problem/problem.html:111 +#: templates/problem/problem.html:116 +msgid "Submit solution" +msgstr "" + +#: templates/problem/problem.html:104 +#, python-format +msgid "%(counter)s submission left" +msgid_plural "%(counter)s submissions left" +msgstr[0] "" + +#: templates/problem/problem.html:112 +msgid "0 submissions left" +msgstr "" + +#: templates/problem/problem.html:124 +msgid "My submissions" +msgstr "" + +#: templates/problem/problem.html:128 +msgid "Best submissions" +msgstr "" + +#: templates/problem/problem.html:132 +msgid "Read editorial" +msgstr "" + +#: templates/problem/problem.html:137 +msgid "Manage tickets" +msgstr "" + +#: templates/problem/problem.html:141 +msgid "Edit problem" +msgstr "" + +#: templates/problem/problem.html:143 +msgid "Edit test data" +msgstr "" + +#: templates/problem/problem.html:148 +msgid "My tickets" +msgstr "" + +#: templates/problem/problem.html:156 +msgid "Manage submissions" +msgstr "" + +#: templates/problem/problem.html:162 +msgid "Clone problem" +msgstr "" + +#: templates/problem/problem.html:169 +msgid "Points:" +msgstr "" + +#: templates/problem/problem.html:172 templates/problem/problem.html:174 +msgid "(partial)" +msgstr "" + +#: templates/problem/problem.html:179 +msgid "Time limit:" +msgstr "時間限制:" + +#: templates/problem/problem.html:191 +msgid "Memory limit:" +msgstr "記憶體限制:" + +#: templates/problem/problem.html:210 +msgid "Author:" +msgid_plural "Authors:" +msgstr[0] "作者:" + +#: templates/problem/problem.html:225 +msgid "Problem type" +msgid_plural "Problem types" +msgstr[0] "題目類型" + +#: templates/problem/problem.html:238 +msgid "Allowed languages" +msgstr "允許的語言" + +#: templates/problem/problem.html:246 +#, python-format +msgid "No %(lang)s judge online" +msgstr "" + +#: templates/problem/problem.html:257 +msgid "Judge:" +msgid_plural "Judges:" +msgstr[0] "" + +#: templates/problem/problem.html:274 +msgid "none available" +msgstr "" + +#: templates/problem/problem.html:299 +msgid "Request clarification" +msgstr "" + +#: templates/problem/problem.html:301 +msgid "Report an issue" +msgstr "" + +#: 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 +msgid "Search problems..." +msgstr "" + +#: templates/problem/search-form.html:14 +msgid "Full text search" +msgstr "" + +#: templates/problem/search-form.html:21 +msgid "Hide solved problems" +msgstr "" + +#: 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 +msgid "All" +msgstr "" + +#: templates/problem/search-form.html:46 +msgid "Problem types" +msgstr "" + +#: templates/problem/search-form.html:57 +msgid "Point range" +msgstr "" + +#: templates/problem/search-form.html:63 templates/submission/list.html:337 +#: templates/ticket/list.html:248 +msgid "Go" +msgstr "" + +#: templates/problem/search-form.html:64 +msgid "Random" +msgstr "" + +#: templates/problem/submit.html:192 +#, python-format +msgid "Warning! Your default language, %(default_language)s, is unavailable for this problem and has been deselected." +msgstr "" + +#: templates/problem/submit.html:203 +#, python-format +msgid "\n" +" You have %(left)s submission left\n" +" " +msgid_plural "\n" +" You have %(left)s submissions left\n" +" " +msgstr[0] "" + +#: templates/problem/submit.html:212 +msgid "You have 0 submissions left" +msgstr "" + +#: templates/problem/submit.html:250 +msgid "No judge is available for this problem." +msgstr "" + +#: templates/registration/activate.html:3 +#, python-format +msgid "%(key)s is an invalid activation key." +msgstr "" + +#: templates/registration/activation_complete.html:3 +msgid "Your account has been successfully activated." +msgstr "" + +#: templates/registration/login.html:43 +msgid "Invalid username or password." +msgstr "" + +#: templates/registration/login.html:61 +#: templates/registration/totp_auth.html:39 +msgid "Login!" +msgstr "" + +#: templates/registration/login.html:64 +msgid "Forgot your password?" +msgstr "" + +#: templates/registration/login.html:67 +msgid "Or log in with..." +msgstr "" + +#: templates/registration/logout.html:3 +msgid "See you later!" +msgstr "" + +#: templates/registration/password_change_done.html:3 +msgid "Your password was sucessfully changed." +msgstr "" + +#: templates/registration/password_change_form.html:8 +msgid "Change Password" +msgstr "" + +#: templates/registration/password_reset.html:7 +msgid "Send Reset Email" +msgstr "" + +#: 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_confirm.html:9 +msgid "Reset Password" +msgstr "" + +#: 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 +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 +#, 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 +msgid "Please go to the following page and choose a new password:" +msgstr "" + +#: templates/registration/password_reset_email.txt:7 +msgid "Your username, in case you've forgotten:" +msgstr "" + +#: templates/registration/password_reset_email.txt:9 +msgid "Thanks for using our site!" +msgstr "" + +#: templates/registration/password_reset_email.txt:11 +#, python-format +msgid "The %(site_name)s team" +msgstr "" + +#: 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 +msgid "Continue >" +msgstr "" + +#: 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:166 +msgid "(again, for confirmation)" +msgstr "" + +#: templates/registration/registration_form.html:173 +msgid "(select your closest major city)" +msgstr "" + +#: templates/registration/registration_form.html:178 +msgid "pick from map" +msgstr "" + +#: templates/registration/registration_form.html:183 +msgid "Default language" +msgstr "" + +#: templates/registration/registration_form.html:186 +#: templates/user/edit-profile.html:162 +msgid "Affiliated organizations" +msgstr "" + +#: templates/registration/registration_form.html:192 +#: templates/user/edit-profile.html:121 +msgid "Notify me about upcoming contests" +msgstr "" + +#: templates/registration/registration_form.html:206 +msgid "By registering, you agree to our" +msgstr "" + +#: templates/registration/registration_form.html:207 +msgid "Terms & Conditions" +msgstr "" + +#: templates/registration/registration_form.html:210 +msgid "Register!" +msgstr "" + +#: templates/registration/totp_auth.html:36 +#: templates/registration/totp_disable.html:45 +#: templates/registration/totp_enable.html:83 +msgid "Enter the 6-digit code generated by your app:" +msgstr "" + +#: templates/registration/totp_auth.html:41 +#, python-format +msgid "If you lost your authentication device, please contact us at %(email)s." +msgstr "" + +#: templates/registration/totp_disable.html:38 +msgid "To protect your account, you must first authenticate before you can disable Two Factor Authentication." +msgstr "" + +#: templates/registration/totp_enable.html:71 +msgid "Scan this code with your authenticator app:" +msgstr "" + +#: templates/registration/totp_enable.html:72 +msgid "QR code" +msgstr "" + +#: templates/registration/totp_enable.html:73 +msgid "Or enter this code manually:" +msgstr "" + +#: templates/stats/base.html:9 templates/submission/list.html:345 +msgid "Statistics" +msgstr "" + +#: templates/stats/language.html:11 +msgid "Submission Statistics" +msgstr "" + +#: templates/stats/language.html:16 +msgid "Submissions by Language" +msgstr "" + +#: templates/stats/language.html:21 +msgid "AC Submissions by Language" +msgstr "" + +#: templates/stats/language.html:26 +msgid "Language AC Rate" +msgstr "" + +#: templates/status/judge-status-table.html:2 +msgid "Judge" +msgstr "" + +#: templates/status/judge-status-table.html:4 +msgid "Online" +msgstr "" + +#: templates/status/judge-status-table.html:6 +msgid "Uptime" +msgstr "" + +#: templates/status/judge-status-table.html:7 +msgid "Ping" +msgstr "" + +#: 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 +msgid "N/A" +msgstr "" + +#: templates/status/judge-status-table.html:64 +msgid "There are no judges available at this time." +msgstr "" + +#: templates/status/language-list.html:33 templates/ticket/list.html:261 +msgid "ID" +msgstr "" + +#: templates/status/language-list.html:35 +msgid "Runtime Info" +msgstr "" + +#: templates/status/status-tabs.html:4 +msgid "Judges" +msgstr "" + +#: templates/status/status-tabs.html:6 +msgid "Version Matrix" +msgstr "" + +#: templates/submission/internal-error-message.html:8 +msgid "An internal error occurred while grading." +msgstr "" + +#: templates/submission/internal-error-message.html:15 +msgid "Error information" +msgstr "" + +#: templates/submission/list.html:76 +msgid "Filter by status..." +msgstr "" + +#: templates/submission/list.html:82 +msgid "Filter by language..." +msgstr "" + +#: templates/submission/list.html:315 +msgid "Filter submissions" +msgstr "" + +#: templates/submission/list.html:351 +msgid "Total:" +msgstr "" + +#: templates/submission/list.html:361 +msgid "You were disconnected. Refresh to show latest updates." +msgstr "" + +#: templates/submission/row.html:39 +#, python-format +msgid "Case #%(case)s" +msgstr "" + +#: templates/submission/row.html:49 +msgid "view" +msgstr "" + +#: templates/submission/row.html:53 +msgid "rejudge" +msgstr "" + +#: templates/submission/row.html:58 +msgid "admin" +msgstr "" + +#: templates/submission/source.html:25 +msgid "View status" +msgstr "" + +#: templates/submission/source.html:26 +msgid "View raw source" +msgstr "" + +#: templates/submission/source.html:28 templates/submission/status.html:61 +msgid "Resubmit" +msgstr "" + +#: 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 +msgid "Your submission is being processed..." +msgstr "" + +#: templates/submission/status-testcases.html:14 +msgid "Compilation Error" +msgstr "" + +#: templates/submission/status-testcases.html:18 +msgid "Compilation Warnings" +msgstr "" + +#: templates/submission/status-testcases.html:23 +msgid "Pretest Execution Results" +msgstr "" + +#: templates/submission/status-testcases.html:25 +msgid "Execution Results" +msgstr "" + +#: templates/submission/status-testcases.html:31 +msgid "Batch " +msgstr "" + +#: templates/submission/status-testcases.html:43 +msgid "Case" +msgstr "" + +#: templates/submission/status-testcases.html:45 +msgid "Pretest" +msgstr "" + +#: templates/submission/status-testcases.html:47 +msgid "Test case" +msgstr "" + +#: templates/submission/status-testcases.html:79 +msgid "Your output (clipped)" +msgstr "" + +#: templates/submission/status-testcases.html:90 +msgid "Judge feedback" +msgstr "" + +#: templates/submission/status-testcases.html:106 +msgid "Resources:" +msgstr "" + +#: templates/submission/status-testcases.html:115 +msgid "Final pretest score:" +msgstr "" + +#: templates/submission/status-testcases.html:117 +msgid "Final score:" +msgstr "" + +#: templates/submission/status-testcases.html:131 +msgid "Passing pretests does not guarantee a full score on system tests." +msgstr "" + +#: templates/submission/status-testcases.html:134 +msgid "Submission aborted!" +msgstr "" + +#: templates/submission/status.html:59 +msgid "View source" +msgstr "" + +#: templates/submission/status.html:88 +msgid "Abort" +msgstr "" + +#: templates/submission/submission-list-tabs.html:6 +msgid "Mine" +msgstr "" + +#: templates/submission/submission-list-tabs.html:9 +msgid "Best" +msgstr "" + +#: templates/submission/submission-list-tabs.html:12 +#, python-format +msgid "%(user)s's" +msgstr "" + +#: templates/ticket/list.html:135 templates/ticket/ticket.html:257 +msgid "Reopened: " +msgstr "" + +#: templates/ticket/list.html:138 templates/ticket/ticket.html:258 +msgid "Closed: " +msgstr "" + +#: templates/ticket/list.html:221 +msgid "Use desktop notification" +msgstr "" + +#: templates/ticket/list.html:227 +msgid "Show my tickets only" +msgstr "" + +#: templates/ticket/list.html:231 +msgid "Filing user" +msgstr "" + +#: templates/ticket/list.html:240 +msgid "Assignee" +msgstr "" + +#: templates/ticket/list.html:262 +msgid "Title" +msgstr "" + +#: templates/ticket/list.html:264 templates/ticket/ticket.html:304 +msgid "Assignees" +msgstr "" + +#: templates/ticket/new_problem.html:7 +msgid "Thanks for opening a ticket!" +msgstr "" + +#: 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 +msgid "Associated object" +msgstr "" + +#: templates/ticket/ticket.html:309 +msgid "No one is assigned." +msgstr "" + +#: templates/ticket/ticket.html:315 +msgid "Close ticket" +msgstr "" + +#: templates/ticket/ticket.html:317 +msgid "Reopen ticket" +msgstr "" + +#: templates/ticket/ticket.html:321 +msgid "Assignee notes" +msgstr "" + +#: templates/ticket/ticket.html:328 templates/widgets/select_all.html:4 +msgid "Nothing here." +msgstr "" + +#: templates/ticket/ticket.html:378 +msgid "Post" +msgstr "" + +#: templates/user/base-users-table.html:3 +msgid "Rank" +msgstr "" + +#: templates/user/base-users.html:14 templates/user/base-users.html:69 +msgid "Search by handle..." +msgstr "" + +#: templates/user/edit-profile.html:90 +msgid "Self-description" +msgstr "" + +#: templates/user/edit-profile.html:98 +msgid "Select your closest major city" +msgstr "" + +#: templates/user/edit-profile.html:107 +msgid "Editor theme" +msgstr "" + +#: templates/user/edit-profile.html:112 +msgid "Math engine" +msgstr "" + +#: templates/user/edit-profile.html:136 templates/user/edit-profile.html:137 +msgid "Change your avatar" +msgstr "" + +#: templates/user/edit-profile.html:143 +msgid "Change your password" +msgstr "" + +#: templates/user/edit-profile.html:150 +msgid "Two Factor Authentication is enabled." +msgstr "" + +#: templates/user/edit-profile.html:153 +msgid "Two Factor Authentication is disabled." +msgstr "" + +#: templates/user/edit-profile.html:170 +msgid "User-script" +msgstr "" + +#: templates/user/edit-profile.html:174 +msgid "Update profile" +msgstr "" + +#: templates/user/pp-row.html:22 +#, python-format +msgid "\n" +" weighted %(weight)s%%\n" +" " +msgstr "" + +#: templates/user/pp-row.html:27 +#, python-format +msgid "%(pp).1fpp" +msgstr "" + +#: templates/user/pp-row.html:29 +#, python-format +msgid "%(pp).0fpp" +msgstr "" + +#: templates/user/user-about.html:14 +msgid "From" +msgstr "" + +#: 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:40 +msgid "You have not shared any information." +msgstr "" + +#: templates/user/user-about.html:42 +msgid "This user has not shared any information." +msgstr "" + +#: templates/user/user-base.html:42 +#, python-format +msgid "%(counter)s problem solved" +msgid_plural "%(counter)s problems solved" +msgstr[0] "" + +#: templates/user/user-base.html:50 +msgid "Rank by points:" +msgstr "" + +#: templates/user/user-base.html:53 +msgid "Total points:" +msgstr "" + +#: templates/user/user-base.html:68 +msgid "Rank by rating:" +msgstr "" + +#: templates/user/user-base.html:70 +msgid "Rating:" +msgstr "" + +#: templates/user/user-base.html:71 +msgid "Volatility:" +msgstr "" + +#: templates/user/user-base.html:72 +msgid "Min. rating:" +msgstr "" + +#: templates/user/user-base.html:73 +msgid "Max rating:" +msgstr "" + +#: templates/user/user-problems.html:35 +msgid "Points Breakdown" +msgstr "" + +#: templates/user/user-problems.html:41 +msgid "Load more..." +msgstr "" + +#: templates/user/user-problems.html:45 +msgid "This user has not yet solved any problems." +msgstr "" + +#: templates/user/user-problems.html:51 +msgid "Authored Problems" +msgstr "" + +#: templates/user/user-problems.html:83 +msgid "Hide problems I've solved" +msgstr "" + +#: templates/user/user-problems.html:93 +#, python-format +msgid "%(points).1f points" +msgstr "" + +#: templates/user/user-problems.html:99 +msgid "Score" +msgstr "" + +#: templates/user/user-problems.html:110 +#, python-format +msgid "%(points)s / %(total)s" +msgstr "" + +#: templates/user/user-tabs.html:7 +msgid "Impersonate" +msgstr "" + +#: templates/user/user-tabs.html:13 +msgid "Admin User" +msgstr "" + +#: templates/user/user-tabs.html:16 +msgid "Admin Profile" +msgstr "" + +#: templates/widgets/select_all.html:8 +msgid "Check all" +msgstr "" + diff --git a/locale/zh_Hant/LC_MESSAGES/djangojs.po b/locale/zh_Hant/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000..42e679b --- /dev/null +++ b/locale/zh_Hant/LC_MESSAGES/djangojs.po @@ -0,0 +1,29 @@ +msgid "" +msgstr "" +"Project-Id-Version: dmoj\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-10-01 23:12+0000\n" +"PO-Revision-Date: 2019-11-11 22:05\n" +"Last-Translator: Icyene\n" +"Language-Team: Chinese Traditional\n" +"Language: zh_TW\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: crowdin.com\n" +"X-Crowdin-Project: dmoj\n" +"X-Crowdin-Language: zh-TW\n" +"X-Crowdin-File: djangojs.po\n" + +#: resources/common.js:207 +msgctxt "time format with day" +msgid "%d day %h:%m:%s" +msgid_plural "%d days %h:%m:%s" +msgstr[0] "%d 天 %h:%m:%s" + +#: resources/common.js:210 +msgctxt "time format without day" +msgid "%h:%m:%s" +msgstr "%h:%m:%s" + diff --git a/logo.png b/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..82ebdc8a478118b9f9f4dc3a3d30f5e681289684 GIT binary patch literal 124198 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 A0RR91 literal 0 HcmV?d00001 diff --git a/make_style.sh b/make_style.sh new file mode 100755 index 0000000..bc70d19 --- /dev/null +++ b/make_style.sh @@ -0,0 +1,23 @@ +#!/bin/bash +if ! [ -x "$(command -v sass)" ]; then + echo 'Error: sass is not installed.' >&2 + exit 1 +fi + +if ! [ -x "$(command -v postcss)" ]; then + echo 'Error: postcss is not installed.' >&2 + exit 1 +fi + +if ! [ -x "$(command -v autoprefixer)" ]; then + echo 'Error: autoprefixer is not installed.' >&2 + exit 1 +fi + +FILES=(sass_processed/style.css sass_processed/content-description.css sass_processed/table.css sass_processed/ranks.css) + +cd `dirname $0` +sass --update resources:sass_processed + +echo +postcss "${FILES[@]}" --verbose --use autoprefixer -d resources diff --git a/manage.py b/manage.py new file mode 100644 index 0000000..498e387 --- /dev/null +++ b/manage.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python +import os +import sys + +try: + import MySQLdb # noqa: F401, imported for side effect +except ImportError: + import dmoj_install_pymysql # noqa: F401, imported for side effect + +if __name__ == "__main__": + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "dmoj.settings") + + from django.core.management import execute_from_command_line + # noinspection PyUnresolvedReferences + import django_2_2_pymysql_patch # noqa: F401, imported for side effect + + execute_from_command_line(sys.argv) diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..e836e9f --- /dev/null +++ b/manifest.json @@ -0,0 +1,41 @@ +{ + "name": "DMOJ", + "icons": [ + { + "src": "\/android-chrome-36x36.png", + "sizes": "36x36", + "type": "image\/png", + "density": 0.75 + }, + { + "src": "\/android-chrome-48x48.png", + "sizes": "48x48", + "type": "image\/png", + "density": 1 + }, + { + "src": "\/android-chrome-72x72.png", + "sizes": "72x72", + "type": "image\/png", + "density": 1.5 + }, + { + "src": "\/android-chrome-96x96.png", + "sizes": "96x96", + "type": "image\/png", + "density": 2 + }, + { + "src": "\/android-chrome-144x144.png", + "sizes": "144x144", + "type": "image\/png", + "density": 3 + }, + { + "src": "\/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image\/png", + "density": 4 + } + ] +} diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..7df0c72 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,32 @@ +Django>=2.2,<3 +django_compressor +django-mptt +django-pagedown<2 +django-registration-redux +django-reversion +django-social-share +-e git://github.com/DMOJ/django-sortedm2m.git#egg=django-sortedm2m +django-impersonate +-e git://github.com/DMOJ/dmoj-wpadmin.git#egg=dmoj-wpadmin +lxml +Pygments +mistune +social-auth-app-django +pytz +django-statici18n +pika +ua-parser +pyyaml +jinja2 +django_jinja +llist +requests +django-fernet-fields +pyotp +qrcode[pil] +jsonfield +pymoss +packaging +celery +-e git://github.com/DMOJ/ansi2html.git#egg=ansi2html +sqlparse diff --git a/resources/admin/css/pagedown.css b/resources/admin/css/pagedown.css new file mode 100644 index 0000000..27732de --- /dev/null +++ b/resources/admin/css/pagedown.css @@ -0,0 +1,10 @@ +.wmd-wrapper { + padding-right: 15px !important; +} + + +.wmd-preview { + margin-top: 15px; + padding: 15px; + word-wrap: break-word; +} diff --git a/resources/admin/css/select2bootstrap.css b/resources/admin/css/select2bootstrap.css new file mode 100644 index 0000000..c72be7d --- /dev/null +++ b/resources/admin/css/select2bootstrap.css @@ -0,0 +1,3 @@ +.select2-container { + min-width: 220px !important; +} \ No newline at end of file diff --git a/resources/base.scss b/resources/base.scss new file mode 100644 index 0000000..f04b204 --- /dev/null +++ b/resources/base.scss @@ -0,0 +1,674 @@ +@charset "UTF-8"; + +@import "vars"; + +@-ms-viewport { + min-width: 480px; + max-width: device-width; +} + +@-o-viewport { + min-width: 480px; + max-width: device-width; +} + +@viewport { + min-width: 480px; + max-width: device-width; +} + +a { + color: #1958c1; + + &:hover { + color: #0645ad; + } + + &:active { + color: #faa700; + } +} + +img { + max-width: 100%; + + // height: auto +} + +.full { + width: 100%; +} + +table.sortable thead { + background-color: $background_gray; + color: #666; + font-weight: bold; + cursor: default; +} + +th { + &.tablesorter-headerAsc:after { + content: " ▴"; + } + + &.tablesorter-headerDesc:after { + content: " ▾"; + } +} + +div { + &.tablesorter-header-inner { + display: inline; + } +} + +pre { + white-space: pre-wrap; +} + +hr { + display: block; + height: 0; + border: 0; + font-style: italic; + border-bottom: 1px solid $border_gray; + padding: 0; +} + +.dashed { + border-bottom: 1px dashed $border_gray; +} + +th { + vertical-align: middle; +} + +.form-area { + display: inline-block; + background: $background_light_gray; + padding: 5px 10px 10px 15px; + border-radius: $widget_border_radius; + border: 1px solid $border_gray; +} + +div.info-float { + float: right; + padding: 10px; +} + +footer { + color: gray; + display: block; + width: 100%; + position: absolute; + bottom: 0; +} + +body { + position: relative; + min-height: 100%; + margin: 0 auto; + max-width: 107em; + font-size: $base_font_size; + line-height: 1.231; + background: $background_light_gray; + font-family: "Segoe UI", "Lucida Grande", Arial, sans-serif; + color: #000; + height: 100%; +} + +.unselectable { + cursor: default; +} + +h1 { + font-size: 5em; + letter-spacing: -2px; + margin: 0; + padding: 0; + line-height: 1em; +} + +b { + font-weight: bold; +} + +h2 { + font-weight: 400; + font-size: 2em; + border-radius: $widget_border_radius; + padding: 0; + margin: 0; +} + +h3 { + font-weight: 400; + font-size: 1.4em; + border-radius: $widget_border_radius; + padding: 0; + margin: 0; +} + +h4 { + font-size: 1.1em; + padding: 0; + margin: 0; +} + +header { + background: #111; + color: #aaa; + text-align: left; + display: block; + height: 60px; + margin-top: -10px; + padding: 10px 10px 10px 5%; +} + +#user-links { + top: 0; + right: 0; + position: absolute; + color: #5c5954; + + .anon { + padding-right: 10px; + display: inline-flex; + min-height: 100%; + align-items: center; + white-space: nowrap; + } + + a { + color: #FFF; + } + + li { + text-transform: none; + } + + & > ul { + display: block; + margin: 0; + + & > li > a > span { + font-size: 13px; + height: 36px; + padding-top: 8px; + display: block; + white-space: nowrap; + + & > img { + vertical-align: middle; + border-radius: $widget_border_radius; + display: inline; + margin: 2px 6px 0 5px; + } + + & > span { + color: #eee; + vertical-align: middle; + display: inline; + margin-top: 11px; + margin-right: 9px; + padding: 0; + } + } + } +} + +#nav-shadow { + height: 3px; + background: linear-gradient(rgba(0, 0, 0, 0.5), transparent); +} + +#nav-container { + background: $widget_black; + + // opacity: 0.77 + // filter: alpha(opacity=77) + height: 100%; +} + +#navigation { + position: fixed; + top: 0; + left: 0; + right: 0; +} + +nav { + position: relative; + position: -webkit-sticky; + position: sticky; + top: 0; + width: 100%; + margin: 0 auto; + z-index: 500; + text-align: left; + + ul { + margin: 0 0 0 -5px !important; + padding: 0 0 0 1%; + text-align: left; + display: inline; + list-style: none; + background: transparent; + + li { + display: inline-block; + color: #FFF; + text-transform: uppercase; + position: relative; + + &.home-nav-element a { + padding: 0; + height: 44px; + + &:hover { + border-bottom: none; + padding-top: 0; + padding-bottom: 0; + } + } + + a, button { + display: inline-block; + text-decoration: none; + vertical-align: middle; + color: #FFF; + padding: 13px 7px; + height: 18px; + + &:link { + color: #FFF; + } + + &:hover { + color: #FFF; + background: rgba(255, 255, 255, 0.25); + margin: 0; + } + + &.active { + color: #FFF; + background: $highlight_blue; + } + + .nav-expand { + display: none; + } + } + + ul { + padding: 0; + position: absolute; + left: 5px; + display: none; + color: #fff; + background: $widget_black; + margin: 0 !important; + box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4); + + li { + &:first-child { + a.active { + border-top: 1px solid $widget_black; + } + } + } + + li { + display: block; + + a, button { + padding: 8px 20px 8px 8px !important; + font-size: 0.8em; + line-height: 18px; + display: block; + border-left: 4px solid $highlight_blue; + white-space: nowrap; + } + } + } + + button { + background: none; + text-align: left; + border: none; + width: 100%; + border-radius: 0; + height: auto; + } + + &:hover > ul, &:active > ul, &:focus > ul { + display: block !important; + } + + &.home-nav-element a:hover { + border-bottom: 0; + padding-top: 0; + padding-bottom: 0; + background: transparent; + } + } + } + + .nav-divider { + width: 1px; + vertical-align: middle; + padding-left: 3px; + display: inline-block; + height: 32px; + margin-right: 1px; + border-right: 3px solid rgba(255, 255, 255, 0.15); + } +} + +hr { + color: rgba(0, 0, 0, 0.2); +} + +#content { + margin: 52px auto auto; + + // Header + width: 90%; + height: 100%; + min-height: 25em; + display: block; + + .title { + color: #393630; + } +} + +footer { + text-align: center; + height: 40px; + border-top: 1px solid $border_gray; + background: #ededed; +} + +html { + position: relative; + height: 100%; +} + +a { + text-decoration: none; + display: inline; +} + +noscript #noscript { + font-family: Arial, sans-serif; + font-size: 111%; + color: white; + font-weight: bold; + background: $announcement_red; + text-align: center; + padding: 5px 0; + left: 0; + right: 0; + position: fixed; + z-index: 100; +} + +#announcement { + font-family: Arial, sans-serif; + font-size: 111%; + color: white; + font-weight: bold; + background: $announcement_red; + text-align: center; + max-width: 30%; + position: fixed; + border-radius: $widget_border_radius; + z-index: 100; + bottom: -4px; + right: -4px; + padding: 5px 6px 6px 5px; + + a { + color: orange; + } +} + +.time { + color: #555; +} + +.toggle { + font-weight: bold; + + .fa { + transition: transform 0.4s; + } + + &.open .fa { + transform: rotate(90deg); + } +} + +#form-errors, .form-errors { + background: rgba(255, 0, 0, 0.3); + border: 3px solid red; + border-radius: $widget_border_radius; + padding: 0 1em 0.1em 1em; + margin: 0.3em 0 0.5em 0; +} + +#navicon { + display: none; +} + +#nav-placeholder { + height: 47px; + max-width: 107em; + background: white; + border-right: 1px solid $border_gray; + border-left: 1px solid $border_gray; +} + +#contest-info { + font-size: 1.25em; + border: 5px solid $highlight_blue; + border-left: 5px dotted white; + border-radius: 0 $widget_border_radius $widget_border_radius 0; + background: rgba(0, 0, 0, 0.77); + z-index: 100000; + padding: 10px 12px; + color: white; + cursor: move; + position: fixed; + left: 20px; + top: 90%; + display: none; + + a { + height: 1.4em; + padding: 0; + margin: 0; + color: white; + display: block; + } +} + +#contest-time-remaining { + display: inline-block; +} + +.spacer { + display: inline-block; + flex: 1 1 1px; +} + +#user-links { + height: 100%; + + ul { + margin: 0; + + li { + display: block; + height: 100%; + + a { + display: block; + padding: 0; + height: 100%; + } + } + } +} + +#page-container { + min-height: 100%; + position: relative; + margin: 0 auto; + border-right: 1px solid $border_gray; + border-left: 1px solid $border_gray; + background: white; +} + +// border-bottom: 1px solid rgb(204, 204, 204) +// border-bottom-left-radius: 4px +// border-bottom-right-radius: 4px + +#content-body { + padding-bottom: 4em; +} + +// Offset the footer + +.title-line-action { + float: right; + margin-top: 1.2em; +} + +math { + font-size: 1.155em; +} + +.MathJax { + &:focus { + outline: none; + } +} + +@media(max-width: 1498px) { + #page-container { + border-left: none; + border-right: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + } +} + +@media (max-width: 760px) { + #navigation { + height: 36px; + } + + #navicon { + transition-duration: 0.25s; + display: block; + line-height: 26px; + font-size: 2em; + color: #FFF; + padding: 0 0.25em; + margin: 4px 0.25em; + white-space: nowrap; + float: left; + + &.hover { + color: #4db7fe; + text-shadow: 0 0 5px $highlight_blue; + transition-duration: 0.25s; + } + } + + #nav-list { + display: none; + padding: 0; + margin-left: 0; + border-left: 4px solid $highlight_blue; + position: fixed; + top: 36px; + background: $widget_black; + bottom: 0; + width: 8em; + left: 0; + box-shadow: none; + + li { + display: block; + + a { + display: block; + + .nav-expand { + float: right; + display: block; + height: inherit; + margin: (-13px) -7px; + padding: inherit; + } + } + + ul { + left: 8em; + top: auto; + bottom: auto; + margin-top: -36px; + } + + &.home-nav-element { + display: none; + } + } + } + + #user-links { + bottom: 6px; + right: 6px; + position: absolute; + + & > ul > li { + & > a > span { + padding-top: 4px; + height: 32px; + } + + & > ul { + left: 0 !important; + margin-top: 0 !important; + } + } + } + + #content { + width: auto; + padding: 0 5px; + } +} + +@media not all and (max-width: 760px) { + #nav-list { + display: block !important; + + li { + &.home-menu-item { + display: none; + } + + &:not(:hover) > ul { + display: none !important; + } + + ul { + left: 0 !important; + } + } + } +} diff --git a/resources/blank.gif b/resources/blank.gif new file mode 100644 index 0000000000000000000000000000000000000000..2799b45c6591f1db05c8c00bd1fd0c5c01f57614 GIT binary patch literal 43 scmZ?wbhEHbWMp7uXkcLY|NlP&1B2pE79h#MpaUX6G7L;iE{qJ;0LYaF_y7O^ literal 0 HcmV?d00001 diff --git a/resources/blog.scss b/resources/blog.scss new file mode 100644 index 0000000..c5f0423 --- /dev/null +++ b/resources/blog.scss @@ -0,0 +1,122 @@ +@import "vars"; + +.blog-content { + padding-right: 0em; + flex: 73.5%; + vertical-align: top; + margin-right: 0; + + .post { + border-bottom: 2px solid $border_gray; + padding-top: 0.5em; + + .title { + font-weight: 600; + font-size: 1.7em; + + a { + color: #5b80b9 !important; + + &:hover { + color: #0645ad !important; + } + } + } + + &:last-child { + border-bottom: none; + } + } +} + +.blog-sidebar { + flex: 26.5%; +} + +.blog-sidebox { + h3 { + padding-bottom: 0.25em; + padding-left: 0.5em; + } + + ul { + list-style: none; + padding-left: 1em; + padding-right: 0.5em; + + li { + margin-bottom: 0.75em; + } + } + + .contest { + padding: 1.25em 0 1.5em 0; + text-align: center; + border-bottom: 1px solid $border_gray; + + &:last-child { + border-bottom: none; + } + + .name { + font-size: 1.25em; + font-weight: 500; + + a { + color: #5b80b9 !important; + + &:hover { + color: #0645ad !important; + } + } + } + } +} + +@media (min-width: 800px) { + .blog-content, .blog-sidebar { + display: block !important; + } + + .blog-content { + margin-right: 1em !important; + } + + #mobile.tabs { + display: none; + } + + #blog-container { + display: flex; + } +} + +#mobile.tabs { + margin: 0; + margin-bottom: 1em; +} + +.rssatom { + text-align: right; + padding: 0.25em; + display: block; + + span { + width: 1em; + height: 1em; + padding: 0.1em; + font-size: 0.8em; + color: white; + border-radius: 0.2em; + display: inline-block; + margin-right: 0.2em; + border: 1px solid rgb(201, 90, 18); + background: #fb9e39; + background: linear-gradient(135deg, #e46d27 0, #fb9e39 47%, #e46d27 100%); + + i { + text-align: center; + display: block; + } + } +} diff --git a/resources/comments.scss b/resources/comments.scss new file mode 100644 index 0000000..2febe54 --- /dev/null +++ b/resources/comments.scss @@ -0,0 +1,136 @@ +@import "vars"; + +.comment-score { + font-weight: bold; + text-align: center; +} + +a { + &.upvote-link, &.downvote-link { + color: black; + } + + &.voted { + text-shadow: 0 0 4px black, 0 0 9px blue; + } +} + +.comment-area { + margin-right: 30px; + + h2 { + margin-bottom: 20px; + } +} + +.no-comments-message { + margin-top: -15px; + margin-left: 2.75em; +} + +.comment-author { + font-weight: bold; + color: #333; +} + +.comment-header { + color: rgba(1, 1, 1, 1); + background: rgba(0, 0, 0, 0.1); + padding: 5px 10px 5px 5px; + margin-left: 30px; + border: 1px solid $border_gray; + border-radius: $widget_border_radius; + display: flex; +} + +.comment-lock { + width: 100%; + padding-left: 14px; +} + +.comment-spacer { + flex: 1; +} + +.comment-edits:not(:empty) { + padding-right: 2px; + color: #444; +} + +.comment-operation { + float: right; + + .fa { + color: #444; + } + + a + a { + padding-left: 2px; + } +} + +.comments.top-level-comments { + margin-right: -26px; +} + +.comment-submit { + width: 100%; +} + +.comment-post-wrapper { + div { + padding-bottom: 2px; + padding-right: 10px; + } + + input, textarea { + min-width: 100%; + max-width: 100%; + + // Hack for 4k on Chrome + font-size: $base_font_size; + } +} + +.comment-box { + border-radius: $widget_border_radius; + padding: 5px 10px 10px 15px; + border: 1px solid $border_gray; + background: rgba(0, 0, 0, 0.01); +} + +.comment { + list-style: none none; + border-radius: $widget_border_radius; + margin: (-50px) -4px 10px -40px; + padding-top: 50px; + + &:target > .comment-box { + border-left: 10px solid $highlight_blue; + padding-left: 5px; + } + + &:before { + display: block; + content: " "; + margin-top: -50px; + height: 50px; + visibility: hidden; + } +} + +.comment-author { + margin-bottom: 1em; + + img { + width: 1.25em; + height: 1.25em; + border-radius: 0.2em; + vertical-align: bottom; + margin-right: 0.3em; + } +} + +.comment-body { + word-wrap: break-word; +} diff --git a/resources/common.js b/resources/common.js new file mode 100644 index 0000000..40c07a2 --- /dev/null +++ b/resources/common.js @@ -0,0 +1,355 @@ +// IE 8 +if (!Array.prototype.indexOf) { + Array.prototype.indexOf = function (obj) { + for (var i = 0; i < this.length; i++) { + if (this[i] == obj) { + return i; + } + } + return -1; + } +} + +if (!String.prototype.startsWith) { + String.prototype.startsWith = function (searchString, position) { + return this.substr(position || 0, searchString.length) === searchString; + }; +} + +if (!String.prototype.endsWith) { + String.prototype.endsWith = function (searchString, position) { + var subjectString = this.toString(); + if (typeof position !== 'number' || !isFinite(position) || Math.floor(position) !== position || position > subjectString.length) { + position = subjectString.length; + } + position -= searchString.length; + var lastIndex = subjectString.lastIndexOf(searchString, position); + return lastIndex !== -1 && lastIndex === position; + }; +} + +// http://stackoverflow.com/a/1060034/1090657 +$(function () { + var hidden = 'hidden'; + + // Standards: + if (hidden in document) + document.addEventListener('visibilitychange', onchange); + else if ((hidden = 'mozHidden') in document) + document.addEventListener('mozvisibilitychange', onchange); + else if ((hidden = 'webkitHidden') in document) + document.addEventListener('webkitvisibilitychange', onchange); + else if ((hidden = 'msHidden') in document) + document.addEventListener('msvisibilitychange', onchange); + // IE 9 and lower: + else if ('onfocusin' in document) + document.onfocusin = document.onfocusout = onchange; + // All others: + else + window.onpageshow = window.onpagehide + = window.onfocus = window.onblur = onchange; + + function onchange(evt) { + var v = 'window-visible', h = 'window-hidden', evtMap = { + focus: v, focusin: v, pageshow: v, blur: h, focusout: h, pagehide: h + }; + + evt = evt || window.event; + if (evt.type in evtMap) + document.body.className = evtMap[evt.type]; + else + document.body.className = this[hidden] ? 'window-hidden' : 'window-visible'; + + if ('$' in window) + $(window).trigger('dmoj:' + document.body.className); + } + + // set the initial state (but only if browser supports the Page Visibility API) + if (document[hidden] !== undefined) + onchange({type: document[hidden] ? 'blur' : 'focus'}); +}); + +function register_toggle(link) { + link.click(function () { + var toggled = link.next('.toggled'); + if (toggled.is(':visible')) { + toggled.hide(400); + link.removeClass('open'); + link.addClass('closed'); + } else { + toggled.show(400); + link.addClass('open'); + link.removeClass('closed'); + } + }); +} + +$(function register_all_toggles() { + $('.toggle').each(function () { + register_toggle($(this)); + }); +}); + +function featureTest(property, value, noPrefixes) { + var prop = property + ':', + el = document.createElement('test'), + mStyle = el.style; + + if (!noPrefixes) { + mStyle.cssText = prop + ['-webkit-', '-moz-', '-ms-', '-o-', ''].join(value + ';' + prop) + value + ';'; + } else { + mStyle.cssText = prop + value; + } + return !!mStyle[property]; +} + +window.fix_div = function (div, height) { + var div_offset = div.offset().top - $('html').offset().top; + var is_moving; + var moving = function () { + div.css('position', 'absolute').css('top', div_offset); + is_moving = true; + }; + var fix = function () { + div.css('position', 'fixed').css('top', height); + is_moving = false; + }; + ($(window).scrollTop() - div_offset > -height) ? fix() : moving(); + $(window).scroll(function () { + if (($(window).scrollTop() - div_offset > -height) == is_moving) + is_moving ? fix() : moving(); + }); +}; + +$(function () { + if (typeof window.orientation !== 'undefined') { + $(window).resize(function () { + var width = Math.max(document.documentElement.clientWidth, window.innerWidth || 0); + $('#viewport').attr('content', width > 480 ? 'initial-scale=1' : 'width=480'); + }); + } + + var $nav_list = $('#nav-list'); + $('#navicon').click(function (event) { + event.stopPropagation(); + $nav_list.toggle(); + if ($nav_list.is(':hidden')) + $(this).blur().removeClass('hover'); + else { + $(this).addClass('hover'); + $nav_list.find('li ul').css('left', $('#nav-list').width()).hide(); + } + }).hover(function () { + $(this).addClass('hover'); + }, function () { + $(this).removeClass('hover'); + }); + + $nav_list.find('li a .nav-expand').click(function (event) { + event.preventDefault(); + $(this).parent().siblings('ul').css('display', 'block'); + }); + + $nav_list.find('li a').each(function () { + if (!$(this).siblings('ul').length) + return; + $(this).on('contextmenu', function (event) { + event.preventDefault(); + }).on('taphold', function () { + $(this).siblings('ul').css('display', 'block'); + }); + }); + + $nav_list.click(function (event) { + event.stopPropagation(); + }); + + $('html').click(function () { + $nav_list.hide(); + }); + + $.ajaxSetup({ + beforeSend: function (xhr, settings) { + if (!(/^(GET|HEAD|OPTIONS|TRACE)$/.test(settings.type)) && !this.crossDomain) + xhr.setRequestHeader('X-CSRFToken', $.cookie('csrftoken')); + } + }); +}); + +if (!Date.now) { + Date.now = function () { + return new Date().getTime(); + }; +} + +function count_down(label) { + var initial = parseInt(label.attr('data-secs')); + var start = Date.now(); + + function format(num) { + var s = "0" + num; + return s.substr(s.length - 2); + } + + var timer = setInterval(function () { + var time = Math.round(initial - (Date.now() - start) / 1000); + if (time <= 0) { + clearInterval(timer); + setTimeout(function() { + window.location.reload(); + }, 2000); + } + var d = Math.floor(time / 86400); + var h = Math.floor(time % 86400 / 3600); + var m = Math.floor(time % 3600 / 60); + var s = time % 60; + if (d > 0) + label.text(npgettext('time format with day', '%d day %h:%m:%s', '%d days %h:%m:%s', d) + .replace('%d', d).replace('%h', format(h)).replace('%m', format(m)).replace('%s', format(s))); + else + label.text(pgettext('time format without day', '%h:%m:%s') + .replace('%h', format(h)).replace('%m', format(m)).replace('%s', format(s))); + }, 1000); +} + +function register_time(elems, limit) { + limit = limit || 300; + elems.each(function () { + var outdated = false; + var $this = $(this); + var time = moment($this.attr('data-iso')); + var rel_format = $this.attr('data-format'); + var abs = $this.text(); + + function update() { + if ($('body').hasClass('window-hidden')) + return outdated = true; + outdated = false; + if (moment().diff(time, 'days') > limit) { + $this.text(abs); + return; + } + $this.text(rel_format.replace('{time}', time.fromNow())); + setTimeout(update, 10000); + } + + $(window).on('dmoj:window-visible', function () { + if (outdated) + update(); + }); + + update(); + }); +} + +$(function () { + register_time($('.time-with-rel')); + + $('form').submit(function (evt) { + // Prevent multiple submissions of forms, see #565 + $("input[type='submit']").prop('disabled', true); + }); +}); + +window.notification_template = { + icon: '/logo.png' +}; +window.notification_timeout = 5000; + +window.notify = function (type, title, data, timeout) { + if (localStorage[type + '_notification'] != 'true') return; + var template = window[type + '_notification_template'] || window.notification_template; + var data = (typeof data !== 'undefined' ? $.extend({}, template, data) : template); + var object = new Notification(title, data); + if (typeof timeout === 'undefined') + timeout = window.notification_timeout; + if (timeout) + setTimeout(function () { + object.close(); + }, timeout); + return object; +}; + +window.register_notify = function (type, options) { + if (typeof options === 'undefined') + options = {}; + + function status_change() { + if ('change' in options) + options.change(localStorage[key] == 'true'); + } + + var key = type + '_notification'; + if ('Notification' in window) { + if (!(key in localStorage) || Notification.permission !== 'granted') + localStorage[key] = 'false'; + + if ('$checkbox' in options) { + options.$checkbox.change(function () { + var status = $(this).is(':checked'); + if (status) { + if (Notification.permission === 'granted') { + localStorage[key] = 'true'; + notify(type, 'Notification enabled!'); + status_change(); + } else + Notification.requestPermission(function (permission) { + if (permission === 'granted') { + localStorage[key] = 'true'; + notify(type, 'Notification enabled!'); + } else localStorage[key] = 'false'; + status_change(); + }); + } else { + localStorage[key] = 'false'; + status_change(); + } + }).prop('checked', localStorage[key] == 'true'); + } + + $(window).on('storage', function (e) { + e = e.originalEvent; + if (e.key === key) { + if ('$checkbox' in options) + options.$checkbox.prop('checked', e.newValue == 'true'); + status_change(); + } + }); + } else { + if ('$checkbox' in options) options.$checkbox.hide(); + localStorage[key] = 'false'; + } + status_change(); +}; + + +$(function () { + // Close dismissable boxes + $("a.close").click(function () { + var $closer = $(this); + $closer.parent().fadeOut(200); + }); +}); + +$.fn.textWidth = function () { + var html_org = $(this).html(); + var html_calc = '' + html_org + ''; + $(this).html(html_calc); + var width = $(this).find('span:first').width(); + $(this).html(html_org); + return width; +}; + +$(function () { + $('.tabs').each(function () { + var $this = $(this), $h2 = $(this).find('h2'), $ul = $(this).find('ul'); + var cutoff = ($h2.textWidth() || 400) + 20, handler; + $ul.children().each(function () { + cutoff += $(this).width(); + }); + $(window).resize(handler = function () { + $this.toggleClass('tabs-no-flex', $this.width() < cutoff); + }); + handler(); + }); +}); diff --git a/resources/content-description.scss b/resources/content-description.scss new file mode 100644 index 0000000..44ef8d2 --- /dev/null +++ b/resources/content-description.scss @@ -0,0 +1,258 @@ +@import "vars"; + +.content-description { + line-height: 1.5em; + font-size: 1em; + font-family: "Segoe UI", "Lucida Grande", Arial, sans-serif; + + p { + margin: 1em 0 !important; + padding: 0 !important; + } + + img { + max-width: 100%; + height: auto; + } + + h1, h2, h3, h4, h5, h6 { + font-weight: normal; + color: #111; + margin-bottom: 0.75em; + padding: 0; + background: 0; + } + + h3, h4, h5, h6 { + font-weight: bold; + } + + h1 { + font-size: 2.5em; + } + + h2 { + font-size: 2em; + } + + h3 { + font-size: 1.6em; + margin: 0; + padding: 0; + } + + h4 { + font-size: 1.4em; + border-bottom: 1px solid #EEE; + line-height: 1.225; + padding-bottom: 0.3em; + padding-top: 0.5em; + } + + h5 { + font-size: 1.15em; + margin-top: 0; + } + + h6 { + font-size: 0.9em; + } + + blockquote { + color: #666; + margin: 0; + padding-left: 1.5em; + border-left: 0.5em #EEE solid; + } + + hr { + display: block; + height: 0; + border: 0; + font-style: italic; + border-bottom: 1px solid $border_gray; + margin: 25px 0 20px 0; + padding: 0; + } + + pre, code, kbd, samp, span.code { + color: #000; + page-break-inside: avoid; + font-family: $monospace-fonts; + font-size: 0.98em; + } + + code, span.code { + font-family: $monospace-fonts !important; + margin: 0 2px; + padding: 0 5px; + border: 1px solid $border_gray; + background-color: #f8f8f8; + border-radius: $widget_border_radius; + font-size: 0.95em; + color: #444; + } + + pre { + code, div.code { + border: 0; + line-height: 1em; + margin: 0; + padding: 0; + background: transparent; + font-size: 1em; + color: black; + } + + white-space: pre-wrap; + word-wrap: break-word; + margin: 1.5em 0 1.5em 0; + padding: 1em; + border: 1px solid $border_gray; + background-color: #f8f8f8; + color: black; + border-radius: $widget_border_radius; + } + + b, strong { + font-weight: bold; + } + + dfn { + font-style: italic; + } + + ins { + background: #ff9; + color: #000; + text-decoration: none; + } + + mark { + background: #ff0; + color: #000; + font-style: italic; + font-weight: bold; + } + + sub { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; + } + + sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; + top: -0.5em; + } + + sub { + bottom: -0.25em; + } + + ul, ol { + padding: 0 0 0 2em !important; + } + + li p:last-child { + margin: 0; + } + + dd { + margin: 0 0 0 2em; + } + + img { + border: 0; + -ms-interpolation-mode: bicubic; + vertical-align: middle; + } + + td { + vertical-align: top; + } +} + +.display-math { + display: block; + text-align: center; + margin-left: auto; + margin-right: auto; +} + +@media (min-width: 700px) { + #common-content { + display: flex; + flex-direction: row-reverse; + } + + #content-left { + flex: 86%; + width: 100%; + + &.split-common-content { + max-width: 86%; + } + + .content-description { + width: 100%; + } + } + + #content-right { + flex: 14%; + max-width: 12.5em; + min-width: 8em; + padding-left: 1.5em; + padding-top: 1em; + + .info-float { + float: none; + padding: 0; + position: sticky; + top: 70px; + width: 100%; + } + } +} + +@media not all and (min-width: 700px) { + #content-right .info-float { + float: none; + width: 100% !important; + position: static !important; + box-sizing: border-box; + } +} + +a.view-pdf { + padding-top: 0.6em; + display: inline-block; +} + +.problem-title { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + + .spacer { + display: inline-block; + flex: 1 1 1px; + } +} + +.info-float .fa { + color: #000; + padding-right: 0.2em; +} + +#problem-types, #allowed-langs { + .toggled { + margin-left: 1.3em; + } +} diff --git a/resources/contest.scss b/resources/contest.scss new file mode 100644 index 0000000..a48bfb8 --- /dev/null +++ b/resources/contest.scss @@ -0,0 +1,215 @@ +@import "vars"; + +#contest-calendar { + border-collapse: collapse; + width: 100%; + + th { + border-bottom: 1px solid $border_gray; + + &.sun { + border-left: 1px solid $border_gray; + } + + &.sun, &.mon, &.tue, &.wed, &.thu, &.fri, &.sat { + font-size: 0.95em; + border-right: 1px solid $border_gray; + background: $background_light_gray; + } + } + + td { + height: 110px; + width: 170px; + color: #000; + vertical-align: top; + text-align: right; + font-size: 0.75em; + border-right: 1px solid $border_gray; + border-bottom: 1px solid $border_gray; + transition-duration: 0.2s; + + .num { + font-size: 1.1em; + font-weight: bold; + display: block; + border-bottom: 1px dashed $border_gray; + padding-right: 0.2em; + margin-bottom: 0.4em; + } + + ul { + text-decoration: none; + text-align: left; + padding: 0; + margin: 0; + + li { + margin-left: 17px; + margin-bottom: 0.2em; + + i.fa { + color: orange; + } + + a { + text-decoration: none; + color: #222; + + &:hover { + text-decoration: underline; + } + } + } + } + + &:hover { + background: rgba(0, 0, 255, 0.3); + color: white; + + .num { + font-weight: bold; + } + + ul li a { + font-weight: normal; + } + } + } + + .noday { + background: #f1f1f1; + } + + .today { + background: rgba(255, 255, 100, 0.5); + } + + tr td:first-child { + border-left: 1px solid #aaa; + } +} + +#banner { + border-bottom: 1px solid rgba(0, 0, 0, 0.2); + padding-bottom: 1em; + + a.date { + display: block; + text-decoration: none; + text-align: center; + line-height: 1.3; + font-size: 2.3em; + padding-bottom: 0.15em; + + &:link, &:visited { + color: #5B80B9; + } + + &:hover { + color: #0645AD; + } + } + + #time { + text-align: center; + display: block; + color: rgb(85, 85, 85); + font-size: $base_font_size; + } +} + +.contest-list { + td { + vertical-align: middle !important; + + &:nth-child(2) { + min-width: 4em; + } + + &:nth-child(3) { + min-width: 6em; + } + } + + tbody tr { + height: 4em; + } + + .floating-time-left { + position: absolute; + left: 0; + } + + .floating-time-right { + position: absolute; + right: 0; + line-height: 1.2em; + } + + .floating-time { + position: absolute; + right: 0; + bottom: 0; + } + + .contest-tags { + padding-left: 0.75em; + vertical-align: top; + } + + .participate-button { + display: inline-block; + width: 90px; + } + + .contest-block { + text-align: left; + padding: 0.5em 0.5em 0.5em 1em; + } +} + +.contest-tag { + box-shadow: inset 0 -0.1em 0 rgba(0, 0, 0, 0.12); + padding: 0.15em 0.3em; + border-radius: 0.15em; + font-weight: 600; + margin-right: 0.45em; + position: relative; +} + +.contest-list-title { + font-size: 18px; + font-weight: 600; +} + +form.contest-join-pseudotab { + display: inline; + padding: 6px 8px !important; + line-height: 1.7em; + margin-left: 0.5em; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + + input { + display: inline; + border: none; + padding: 0; + background: none; + font-weight: 600; + } +} + +.contest-participation-operation { + float: right; + + .fa { + color: #444; + } + + a + a { + padding-left: 1px; + } + + padding: 0 5px; +} diff --git a/resources/django_select2.js b/resources/django_select2.js new file mode 100644 index 0000000..ca0172e --- /dev/null +++ b/resources/django_select2.js @@ -0,0 +1,58 @@ +(function ($) { + var init = function ($element, options) { + $element.select2(options); + }; + + var initHeavy = function ($element, options) { + var settings = $.extend({ + ajax: { + data: function (params) { + return { + term: params.term, + page: params.page, + field_id: $element.data('field_id') + }; + }, + processResults: function (data, page) { + return { + results: data.results, + pagination: { + more: data.more + } + }; + } + } + }, options); + + $element.select2(settings); + }; + + $.fn.djangoSelect2 = function (options) { + var settings = $.extend({}, options); + $.each(this, function (i, element) { + var $element = $(element); + if ($element.hasClass('django-select2-heavy')) { + initHeavy($element, settings); + } else { + init($element, settings); + } + }); + return this; + }; + + $(function () { + $('.django-select2:not([id*=__prefix__])').djangoSelect2({ + dropdownAutoWidth: true + }); + }); + + if ('django' in window && 'jQuery' in window.django) + django.jQuery(document).on('formset:added', function(event, $row) { + $row.find('.django-select2').each(function () { + // Notice how we are passing it into a different jQuery. + $(this).djangoSelect2({ + dropdownAutoWidth: true + }) + }); + }); +}(jQuery)); diff --git a/resources/dmmd-preview.css b/resources/dmmd-preview.css new file mode 100644 index 0000000..a3236b7 --- /dev/null +++ b/resources/dmmd-preview.css @@ -0,0 +1,41 @@ +div.dmmd-preview { + padding: 0; +} + +div.dmmd-preview-update { + background: #ccc; + color: #333; + text-align: center; + cursor: pointer; + border-radius: 4px; + height: 2em; + line-height: 2em; +} + +div.dmmd-preview-content { + padding: 0 7px; +} + +div.dmmd-preview.dmmd-preview-has-content div.dmmd-preview-update { + border-radius: 4px 4px 0 0; +} + +div.dmmd-preview-has-content div.dmmd-preview-content { + padding-bottom: 7px; +} + +div.dmmd-no-button div.dmmd-preview-update { + display: none; +} + +div.dmmd-no-button div.dmmd-preview-content { + padding-bottom: 0; +} + +div.dmmd-no-button:not(.dmmd-preview-has-content) { + display: none; +} + +div.dmmd-preview-stale { + background: repeating-linear-gradient(-45deg, #fff, #fff 10px, #f8f8f8 10px, #f8f8f8 20px); +} diff --git a/resources/dmmd-preview.js b/resources/dmmd-preview.js new file mode 100644 index 0000000..fa6dc87 --- /dev/null +++ b/resources/dmmd-preview.js @@ -0,0 +1,99 @@ +$(function () { + window.register_dmmd_preview = function ($preview) { + var $form = $preview.parents('form').first(); + var $update = $preview.find('.dmmd-preview-update'); + var $content = $preview.find('.dmmd-preview-content'); + var preview_url = $preview.attr('data-preview-url'); + var $textarea = $('#' + $preview.attr('data-textarea-id')); + + // Submit the form if Ctrl+Enter is pressed in pagedown textarea. + $textarea.keydown(function (ev) { + // Ctrl+Enter pressed (metaKey used to support command key on mac). + if ((ev.metaKey || ev.ctrlKey) && ev.which == 13) { + $form.submit(); + } + }); + + $update.click(function () { + var text = $textarea.val(); + if (text) { + $preview.addClass('dmmd-preview-stale'); + $.post(preview_url, { + preview: text, + csrfmiddlewaretoken: $.cookie('csrftoken') + }, function (result) { + $content.html(result); + $preview.addClass('dmmd-preview-has-content').removeClass('dmmd-preview-stale'); + + var $jax = $content.find('.require-mathjax-support'); + if ($jax.length) { + if (!('MathJax' in window)) { + $.ajax({ + type: 'GET', + url: $jax.attr('data-config'), + dataType: 'script', + cache: true, + success: function () { + $.ajax({ + type: 'GET', + url: 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS_HTML', + dataType: 'script', + cache: true, + success: function () { + MathJax.Hub.Queue(function () { + $content.find('.tex-image').hide(); + $content.find('.tex-text').show(); + }); + } + }); + } + }); + } else { + MathJax.Hub.Queue(['Typeset', MathJax.Hub, $content[0]], function () { + $content.find('.tex-image').hide(); + $content.find('.tex-text').show(); + }); + } + } + }); + } else { + $content.empty(); + $preview.removeClass('dmmd-preview-has-content').removeClass('dmmd-preview-stale'); + } + }).click(); + + var timeout = $preview.attr('data-timeout'); + var last_event = null; + var last_text = $textarea.val(); + if (timeout) { + $textarea.on('keyup paste', function () { + var text = $textarea.val(); + if (last_text == text) return; + last_text = text; + + $preview.addClass('dmmd-preview-stale'); + if (last_event) + clearTimeout(last_event); + last_event = setTimeout(function () { + $update.click(); + last_event = null; + }, timeout); + }); + } + }; + + $('.dmmd-preview').each(function () { + register_dmmd_preview($(this)); + }); + + if ('django' in window && 'jQuery' in window.django) + django.jQuery(document).on('formset:added', function(event, $row) { + var $preview = $row.find('.dmmd-preview'); + if ($preview.length) { + var id = $row.attr('id'); + id = id.substr(id.lastIndexOf('-') + 1); + $preview.attr('data-textarea-id', $preview.attr('data-textarea-id').replace('__prefix__', id)); + register_dmmd_preview($preview); + } + }); +}); diff --git a/resources/event.js b/resources/event.js new file mode 100644 index 0000000..170940b --- /dev/null +++ b/resources/event.js @@ -0,0 +1,68 @@ +function EventReceiver(websocket, poller, channels, last_msg, onmessage) { + this.websocket_path = websocket; + this.channels = channels; + this.last_msg = last_msg; + this.poller_base = poller; + this.poller_path = poller + channels.join('|'); + if (onmessage) + this.onmessage = onmessage; + var receiver = this; + + function init_poll() { + function long_poll() { + $.ajax({ + url: receiver.poller_path, + data: {last: receiver.last_msg}, + success: function (data, status, jqXHR) { + receiver.onmessage(data.message); + receiver.last_msg = data.id; + long_poll(); + }, + error: function (jqXHR, status, error) { + if (jqXHR.status == 504) + long_poll(); + else { + console.log('Long poll failure: ' + status); + console.log(jqXHR); + setTimeout(long_poll, 2000); + } + }, + dataType: "json" + }); + } + long_poll(); + } + + this.onwsclose = null; + if (window.WebSocket) { + this.websocket = new WebSocket(websocket); + var timeout = setTimeout(function () { + receiver.websocket.close(); + receiver.websocket = null; + init_poll(); + }, 2000); + this.websocket.onopen = function (event) { + clearTimeout(timeout); + this.send(JSON.stringify({ + command: 'start-msg', + start: last_msg + })); + this.send(JSON.stringify({ + command: 'set-filter', + filter: channels + })); + }; + this.websocket.onmessage = function (event) { + var data = JSON.parse(event.data); + receiver.onmessage(data.message); + receiver.last_msg = data.id; + }; + this.websocket.onclose = function (event) { + if (event.code != 1000 && receiver.onwsclose !== null) + receiver.onwsclose(event); + } + } else { + this.websocket = null; + init_poll(); + } +} diff --git a/resources/favicon.ico b/resources/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..b0b57f960f2d6a09442f0d9c523330de1d8df423 GIT binary patch literal 1150 zcmZQzU<5(|0R|wcz>vYhz#zuJz@P!dKp~(AL>x#lFaYJy!TMAopVnKbRdL`_b)$$$@B4_~D8_kUU5~^M+R_b|UKs#UCgQ;7UKB zFvk||ATwa;2c)0U^b1SNxZHv4W^DNfrXNI;nty-DGcY`0XJ9zM%)rpV2*K!O1dI=p L2dM?=0qF$*DtPSO literal 0 HcmV?d00001 diff --git a/resources/icons/android-chrome-144x144.png b/resources/icons/android-chrome-144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..44149809c586a535a09518767ec72735e1ee1074 GIT binary patch literal 2841 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 literal 0 HcmV?d00001 diff --git a/resources/icons/android-chrome-36x36.png b/resources/icons/android-chrome-36x36.png new file mode 100644 index 0000000000000000000000000000000000000000..f9ab9a91081fd9eaa80f73b7e7ffd9d8d1d213e7 GIT binary patch literal 797 zcmV+&1LFLNP)Px#PEbr#MNDaN0RsX91qA{F0{{U60t5pC1q22N2LJ*B z0RjR60s;Qs0N1<#78U_fNdYJ&0Xj7S$*=)uTLF7*0p!O3sgwb_qXG8U0GfyajeP+u zz1gY&000VfQchC)XmhgLP?jLK1$_F zSSi7}Oiy7hhQKoDqQhRScup_yu7CR4NH9^Uo~f?GsSEI$R!AfLtRk0!P^k*!^G6N) zmHkZ;oQKVX`XtYw5|Et^gG@ZhNf0x(rPW}3{TWB35tI=Vv)w^D<90c~(UlG|Xy5=b zbJiEvfiVSbHnKWM9H5?J2VK}~?qHI1=@A`AL|1l^1XGa1sl}M!RAb?&Q)UWY?X|gY z*SS~bb10_DWIl!6f}-4F=5uP<`8{sUW#IznVcf>e&v9tp9C3lURWy#)wONf*P%-R= zeD6ALy0m3O)oK74o@ literal 0 HcmV?d00001 diff --git a/resources/icons/android-chrome-48x48.png b/resources/icons/android-chrome-48x48.png new file mode 100644 index 0000000000000000000000000000000000000000..17b3d6d578c8f264c74ec44e52aa3543896f41fe GIT binary patch literal 1043 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 literal 0 HcmV?d00001 diff --git a/resources/icons/apple-touch-icon-144x144.png b/resources/icons/apple-touch-icon-144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..aff4d3bcc76be96fe29c057761f4a6f8a049e5fc GIT binary patch literal 2713 zcmV;K3TE|*P)Px#QBX`&MF9cP>R@bU29!vZ!qHmRwpRaaJWb92JN!r9u{ii?ZQ zzFA%LUG4w?34=*QK~#9!?OfZUtEvuF1l*{I_tyXa(IcoBl$*Bm?EO&Q*6M5>BqJf@ zV)D;_Y$ZQHKR`b~KR`b~Uj)>?U&B0&eUH`Z`+l6};obflfZF#kk3CK-3oo#qqk06W zeNA>O5Y+DV99X)Y|{0P~|m8<}UizmjIo_Lq(M-G>a&*x>Cg177_)o z>Wr*lS>6@&wvfVr-UfSUQIi!-)^TB>Fvh9iU8W>OSjkg^N$<}A8OF81Q7U0sRiqx5 zw1BEgB`1~{kow_MKr?tO777j_HBW;M5~syNGzqEXKyi3(KLONE;1Q@&y2>j-Bb_u_ z*d`&>0^ko2DT&2Hc}5f*bmR2EsL9kWsx%f+5{W16l(sr?^Dx7!Tv-XeIJVCK0X$fg zME+_)@1JBF^YVs9Axfg~@cbaE@q^W}MN$?xdAgL4NQoj4IROnO zec=8ctW+|IWJ3SPd>7D5iz8LLYiRP(TD6`R`rpGnK=1y*Bdvtvrn*FuE8Rt3vjU!J=X3 zpjeO#_n~$L^a5Wcb;uv0uI{=@t*)*+6h7EG0)BP~1JW)?NE;14pkZWL>Pkjp1iE;( z#nf1XUCtc!SO8zu;h$wLgND4Nr zu!Td$-IYc82&J^bA)>@#Vhf|Awwq?gH5$d){vy_$*JndZ?1zSQL1j$DK}!fIiwl|z ze!jebro-gp#E(0uvobPj666rk38BO05|5{t&9 zhO^j926RL>0Hr_)gA>rCDIL!S=!n>j*h$*4u-I8*v9ZEIX-Wf*hzV<=)+Je1S&on7 zN+FlVP+2zD)CaA-fN0Ux$WCjmGb2t*t`u@V6BvIE*959#WVUB%cb5Tp$+3p)5 ziIU6pS?a*HCtyx217xxSqGC-jdb|O64)jFH<)mL8Y}L9EiUBf#m~r1n%GcbnKH{h= z*hCjrCl^jjd*n6>nPmh`CID1DSmqVksoa2EBq}bfPA>Puf?1VrMq-*w7yy!oJrz}c zhU3s#dVDZj0Rc{@p=e%{sY1sGq(g5Th_P)Y~2nB?}D^ke+>8cU|D_RLXOQ*U=JW=^?_La!9otZ z_W{z@WDzi}ZNvENV8 zn9P~Z&0UQ>`bt;nqoenPA2PCx+oW*0pUBb?c#=K*n9fIDMB&1|;x4e@7@vG0EN4-f zxwVdFUvcFTV9)l5@#VdiS@Pe2$-FR~QH-g9i5?Dsl1ky&qD;&hV?xTAwY$;+RxlJ^c@%Jb}i>fV;JUYX@jds--D zP3dvwNLW}M(D7V!_D4QZ{jLuAc>Q5tFA~u(CsA7i*mlpOO z6lXE$tT7_IF|E@Xp<^%J;>&Jl$dy9bdgI(GF@i{ElaEXl>^q)f3V84f*TOjSm=Q?Z zczUuB(5AnDw`XG2H(Z9+__8dT*UVkSR}A7&B~D#`X_z|*S$p;zkhQ<&)EkUjD=)S( zIjAYR{o1NFyHdrfF5x>hj_(G`L0` zqRihyC%`cm(Q2WaQ9`{RDRO^;y|)A4pCX!3^!X9j9dmoBY~_B&MYZeb%4=Nz(A}k? z-%VkW4Nbb`>n}R21U!)E*rvD90tULLjz{PfwyCzLNbY&Z5CcCi*1+-3N<{Z z7#;~UXS&L5)UOfV5)?(eCKotg83{Cqw6!S72a&R}7cVhQi>A)mrHv*$eHT4eYRpa2 zZPag(lPvFYImAiT+Qv9#SyrKuql4g!DG~0*9^3sSd{{K74o T@0{{R3FC5Sl00004XF*Lt006O% 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 KMNUMnLSTYh%C~R; literal 0 HcmV?d00001 diff --git a/resources/icons/apple-touch-icon-180x180.png b/resources/icons/apple-touch-icon-180x180.png new file mode 100644 index 0000000000000000000000000000000000000000..ae819ae071e74d301dc72be6cbcac7600ea6a3b3 GIT binary patch literal 3294 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 literal 0 HcmV?d00001 diff --git a/resources/icons/apple-touch-icon-57x57.png b/resources/icons/apple-touch-icon-57x57.png new file mode 100644 index 0000000000000000000000000000000000000000..b6efba11874dfa9d529d7741b802f29ee89128b6 GIT binary patch literal 1146 zcmV-=1cm#FP)Px#W>8F2MF9cssZHW7+?y6hOIEegrejPQ}RD`>ZmqbD?jhnsX>3SgBZG0`$ zQ;dqqSUbnU^i$btB*jZp)y`obH4KS-fU&bjRntg;w|E959qTy2L)~OSrttMlB)Vy*h6+Fe!XgE-ZiQ>cAL=>s6}VL4FaiQ>^lHvfh(p7EA|m8O4dp zuPSg&^2OTJjIT)5+nNMFbFzHhlxyvqS9lt^xe|4#ET6=!TMV;W%ZT)5PFQEMd_G>K zk@q2r^_bG8U-^lh@yP3z=ACF65>XX&w7Jc?h{$$ov$lv7w{ zqHumahj8}U7DmhccfGO5gGyiWb_Mz~xi!4f}fn zqFvZ~?hR}Y_+k&Ab`wIKdu=hvK~Lp)-TU2S+K0SwEQ(4SLSPN6Xk@O{U+hDWoB>xN zV_|<{PD<$*>{Ql#y@M@#AJLVil-f#@@9lkmvun=#?X$!v@!#5S|I5DsegbcfPz)b- zlLG(%09SfcSaechcOY6Cgx@G{a;ABePT>%h=S&#LUDT#0SfONT5nC0O}VJbn-$ql>h($ M07*qoM6N<$f~heQ`~Uy| literal 0 HcmV?d00001 diff --git a/resources/icons/apple-touch-icon-60x60.png b/resources/icons/apple-touch-icon-60x60.png new file mode 100644 index 0000000000000000000000000000000000000000..82d7a2429ab8fac3b9216b4c81047d506bfb5d1d GIT binary patch literal 1198 zcmV;f1X25mP)Px#T2M?>MF0T-a%BPT(Eu(nF#q2G_t*d%8Uz3T|NPtl z3k?R^z5vUz0VyT{T~Yy-g#oRY0p!O3g?0fuH33RP0llUIv$VA7>FM_N_L7v7R901? zqM>GJXV=%)f`fyTmLxj>00WOnL_t(Y$K97}m!lvIh6RP?A{Rw#Yuo?-H#Y$H% zc~6`dzC*kozl5hdE;mZ32+XyFNbEAP`eJiXyt?wBXM`Y=wEaPUg`o=#!(+v~XG z%vvW@K;LKZh^%6rtiCcry#adugkLqX)KnK{CEQme8kTaT_k z4lk}uaaT)m1-7O-xTUtaf=#mp4t5IxW0d0tzu^fBTaty2{UZ3s{Yom7zc96k=tw9+Jl6QOo{KcqtL~h*? zzJS4b8;C>EOvb2kooTc3BjO16tSCd-+I6dasVzs(5^`+I;#8~Wj{?O#%j~GQFS@7I zTh?hPU@3 zM(uSh(<`#aNi5Ih4h_xD0|xzZ(Zwq^U1Jxl!|Uwx zicOb$$A$~v?I5gNimMze=18mX6&rM9@8{DH4kgA@dm1|LC?&->beO|t!1@6uDSkE# zX&h(f>2ipZuuj>K@jO^~)bYz94s-s*Sq!cS2C7F)2*z|yF%~Z%`FwpdxW)-mhAzn` z{J;!qgZ#6Cgx@G{a;ABePT>%h=S&#LUDT#0SfONT5nC0O}VJbn-$ql>h($ M07*qoM6N<$g5`lFU;qFB literal 0 HcmV?d00001 diff --git a/resources/icons/apple-touch-icon-72x72.png b/resources/icons/apple-touch-icon-72x72.png new file mode 100644 index 0000000000000000000000000000000000000000..e34f93af108d959b86dc5f3cc0c938971bfe97e2 GIT binary patch literal 1425 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 literal 0 HcmV?d00001 diff --git a/resources/icons/browserconfig.xml b/resources/icons/browserconfig.xml new file mode 100644 index 0000000..81ec113 --- /dev/null +++ b/resources/icons/browserconfig.xml @@ -0,0 +1,12 @@ + + + + + + + + + #00aba9 + + + diff --git a/resources/icons/favicon-16x16.png b/resources/icons/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..67dac1b47973234b9f20e67d01f1886966a5543b GIT binary patch literal 830 zcmb7ATTD^`82$(m70G+2SeLVr#YEYW#0>2Lg9H^&qOyk?2w1clNT*WQgSEDdw%W4W z)U~#h%~dM7+0{!$W#Q6AH%nSKx8~BV%iN%dj*mU`(7*lvx9|J+?Y|tY(3S8L1PK86 z8nx2EVDenXv6(8$N!q|b%yxxV0eDaFewjH8CoO7&7HC)jG#&=RjMVrU*h>LZCP01; zAe?PCD~p)MY(=?I#o+(OG6JBAk=RzpJ=PnE!M_eq@ z=3{LRY~}cV4Sh{;8u958?l+@$BOaZFOoZ1L@x2eBTZr`I=WWbf#gi7O^1z7!k%Gc( z_?i*Di|8Gk-v=>?R6f}Azyhpgcz6au59DHK@-f|uDKFNDv0aPE5XgndTZv;kz+xeF zKCZjb-hd?wz)wIl8jamqw}&}9nKtM)Aa;Gn`!I20y8Ab$8u~_y_{^C6&c{NIfabduwf1Wx|ktptQ z4zunAgVO~Q!BDjOprlB#t)<3eFIHNqmc!%O@+h18kJ7j IRct!+2b)_3$^ZZW literal 0 HcmV?d00001 diff --git a/resources/icons/favicon-32x32.png b/resources/icons/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..589913ee3eabccb035de9fcd22877e70e5f9ee44 GIT binary patch literal 1364 zcmb_aSx{346g^3V07;Y`!Jx5VL=+4W5HrL=OoTu{j0{UlY#v>ao+Pqz5DRE5i|!(dY~tg8|BDj4W0{9{lfNWeNMauw%lO2?_-%Qv6nfUr%A68qLK}MZ$a?W+S>! zf@zJg0K7K9+yQeJ^xuF+1(gE7C3w*ab0@yfLd8z3P+ltC!6$4);(w z2sc?Rstb`97rELO-d8_%9vCQ(C)EsH9w(yiyx+ZWUp1ZTFb&90X!J*McVerYe zwgS%h3Z`6ne`Ld`xc^fQFI=%Y$kSh@h+oaF3n?vP$-=~@rm87@nBp;sKo_lRs#dqw+vka=qw5%!pscWUuI_F2KlA}(0GQq8yGM$>3ba~z5B-(rLOq@0} zd1H(3-J0X_2CcG0V9)IBjgonLXAhmz+oi~PnbgpzW`k5wP-57TpmInmvv7_X7`WqO zGMJhN)^Fz;p1W6HG~Qw|GM--8AymvPJU!DMlKXNd@8n+9K?# zbjf{5NBzA5&C1XAZzVNfLP!#b)MO$}pxT*60{A??Kp$R!k6%D6-%r2~5(KPT&f^Ps zyv&Xt`u|1Po|&4i-u>T%h2slJiy=NgHi3{Q=W;YVGu7$a(m2F!O&TX%L#Ti}-5=9T ztE@OLuig!Px22PE&^#EvDu#oHL*xlZngd6y^}mry^Y}TI)A##ekMXvVZKU^U!%s)} X!sKE{Op5|ek}n{YM2jzol*Ru5uRY9p literal 0 HcmV?d00001 diff --git a/resources/icons/favicon-96x96.png b/resources/icons/favicon-96x96.png new file mode 100644 index 0000000000000000000000000000000000000000..7a485527c975ad40fec20d7b558f1b92d4307cca GIT binary patch literal 1915 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 + \ No newline at end of file diff --git a/resources/icons/logo.png b/resources/icons/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..2ac6656922b99423df930b81e5396bdc2baecab1 GIT binary patch literal 9689 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 literal 0 HcmV?d00001 diff --git a/resources/icons/logo.svg b/resources/icons/logo.svg new file mode 100644 index 0000000..3a3e1ab --- /dev/null +++ b/resources/icons/logo.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/resources/icons/manifest.json b/resources/icons/manifest.json new file mode 100644 index 0000000..e836e9f --- /dev/null +++ b/resources/icons/manifest.json @@ -0,0 +1,41 @@ +{ + "name": "DMOJ", + "icons": [ + { + "src": "\/android-chrome-36x36.png", + "sizes": "36x36", + "type": "image\/png", + "density": 0.75 + }, + { + "src": "\/android-chrome-48x48.png", + "sizes": "48x48", + "type": "image\/png", + "density": 1 + }, + { + "src": "\/android-chrome-72x72.png", + "sizes": "72x72", + "type": "image\/png", + "density": 1.5 + }, + { + "src": "\/android-chrome-96x96.png", + "sizes": "96x96", + "type": "image\/png", + "density": 2 + }, + { + "src": "\/android-chrome-144x144.png", + "sizes": "144x144", + "type": "image\/png", + "density": 3 + }, + { + "src": "\/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image\/png", + "density": 4 + } + ] +} diff --git a/resources/icons/mstile-144x144.png b/resources/icons/mstile-144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..44149809c586a535a09518767ec72735e1ee1074 GIT binary patch literal 2841 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 W!haRFqpgzsZyuNq0$Q$ZL;N2mIkZFo literal 0 HcmV?d00001 diff --git a/resources/icons/mstile-310x310.png b/resources/icons/mstile-310x310.png new file mode 100644 index 0000000000000000000000000000000000000000..a1145ee4128a3571aa6e6cdc75b0221bf6d3c97f GIT binary patch literal 4489 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 M07*qoM6N<$f>|kBR{#J2 literal 0 HcmV?d00001 diff --git a/resources/icons/safari-pinned-tab.svg b/resources/icons/safari-pinned-tab.svg new file mode 100644 index 0000000..6eb3669 --- /dev/null +++ b/resources/icons/safari-pinned-tab.svg @@ -0,0 +1,19 @@ + + + + +Created by potrace 1.11, written by Peter Selinger 2001-2013 + + + + + diff --git a/resources/math.scss b/resources/math.scss new file mode 100644 index 0000000..f3dae2d --- /dev/null +++ b/resources/math.scss @@ -0,0 +1,49 @@ +.mwe-math-mathml-inline { + display: inline !important; +} + +.mwe-math-mathml-display { + display: block !important; + margin-left: auto; + margin-right: auto; +} + +.mwe-math-mathml-a11y { + clip: rect(1px, 1px, 1px, 1px); + overflow: hidden; + position: absolute; + width: 1px; + height: 1px; + opacity: 0; +} + +.mwe-math-fallback-image-inline { + display: inline-block; + vertical-align: middle; +} + +.mwe-math-fallback-image-display { + display: block; + margin-left: auto !important; + margin-right: auto !important; +} + +@font-face { + font-family: 'Latin Modern Math'; + src: url('libs/latinmodernmath/latinmodern-math.eot'); /* IE9 Compat Modes */ + src: local('Latin Modern Math'), local('LatinModernMath-Regular'), + url('libs/latinmodernmath/latinmodern-math.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('libs/latinmodernmath/latinmodern-math.woff2') format('woff2'), /* Modern Browsers */ + url('libs/latinmodernmath/latinmodern-math.woff') format('woff'), /* Modern Browsers */ + url('libs/latinmodernmath/latinmodern-math.ttf') format('truetype'); /* Safari, Android, iOS */ + font-weight: normal; + font-style: normal; +} + +math { + font-family: "Latin Modern Math"; +} + +img.inline-math { + display: inline; +} \ No newline at end of file diff --git a/resources/mathjax_config.js b/resources/mathjax_config.js new file mode 100644 index 0000000..a4e7570 --- /dev/null +++ b/resources/mathjax_config.js @@ -0,0 +1,10 @@ +window.MathJax = { + messageStyle: 'none', + tex2jax: { + inlineMath: [ + ['~', '~'], + ['\\(', '\\)'] + ] + }, + showMathMenu: false +}; \ No newline at end of file diff --git a/resources/misc.scss b/resources/misc.scss new file mode 100644 index 0000000..e4cfd8f --- /dev/null +++ b/resources/misc.scss @@ -0,0 +1,55 @@ +@import "vars"; + +#judge-versions { + display: block; + + .version { + font-family: $monospace-fonts; + } + + .version-blank { + background: #eee; + } + + .version-latest { + background: #b3ff3fe6; + } + + .version-outdated { + background: #f00c; + color: white; + } + + tbody { + display: block; + } + + tr { + display: flex; + flex-direction: row; + padding: 0; + + &:first-child { + position: sticky; + top: 42px; + line-height: 1.8em; + } + } + + td, th { + display: block; + flex: 1 0 110px; + overflow-x: hidden; + height: auto; + padding: 7px 5px; + } +} + +.django-as-table { + text-align: left; + + th { + vertical-align: top; + padding-top: 4px; + } +} diff --git a/resources/pagedown_math.js b/resources/pagedown_math.js new file mode 100644 index 0000000..dfdd963 --- /dev/null +++ b/resources/pagedown_math.js @@ -0,0 +1,17 @@ +function mathjax_pagedown($) { + if ('MathJax' in window) { + $.each(window.editors, function (id, editor) { + var preview = $('div.wmd-preview#' + id + '_wmd_preview')[0]; + editor.hooks.chain('onPreviewRefresh', function () { + MathJax.Hub.Queue(["Typeset", MathJax.Hub, preview]); + }); + MathJax.Hub.Queue(["Typeset", MathJax.Hub, preview]); + }); + } +} + +window.mathjax_pagedown = mathjax_pagedown; + +$(window).load(function () { + (mathjax_pagedown)('$' in window ? $ : django.jQuery); +}); \ No newline at end of file diff --git a/resources/pagedown_widget.css b/resources/pagedown_widget.css new file mode 100644 index 0000000..7d00ff7 --- /dev/null +++ b/resources/pagedown_widget.css @@ -0,0 +1,138 @@ +.wmd-panel { + margin: 0; + width: 100%; + min-width: 0; +} + +.wmd-button-bar { + width: 100%; + background-color: Silver; +} + +.wmd-input { + height: 300px; + width: 100%; + background: #fff; + border: 1px solid DarkGray; + font-family: Consolas, "Liberation Mono", Monaco, "Courier New", monospace !important; +} + +.wmd-preview { + background: none; + word-wrap: break-word; +} + +.wmd-button-row { + position: relative; + margin: 10px 5px 5px; + padding: 0; + height: 20px; + overflow-x: auto; +} + +.wmd-spacer { + width: 1px; + height: 20px; + margin-left: 14px; + position: absolute; + display: inline-block; + list-style: none; +} + +.wmd-button { + width: 20px; + height: 20px; + padding-left: 2px; + padding-right: 3px; + position: absolute; + display: inline-block; + list-style: none; + cursor: pointer; +} + +.wmd-button > span { + background: url(pagedown/wmd-buttons.png) no-repeat 0 0; + width: 20px; + height: 20px; + display: inline-block; +} + +.wmd-spacer1 { + left: 50px; +} + +.wmd-spacer2 { + left: 175px; +} + +.wmd-spacer3 { + left: 300px; +} + +.wmd-prompt-background { + background-color: Black; +} + +.wmd-prompt-dialog { + border: 1px solid #999999; + background-color: #F5F5F5; +} + +.wmd-prompt-dialog > div { + font-size: 0.8em; + font-family: arial, helvetica, sans-serif; +} + +.wmd-prompt-dialog > form > input[type="text"] { + border: 1px solid #999999; + color: black; +} + +.wmd-prompt-dialog > form > input[type="button"] { + border: 1px solid #888888; + font-family: trebuchet MS, helvetica, sans-serif; + font-size: 0.8em; + font-weight: bold; +} + +.wmd-wrapper { + padding-right: 0 !important; +} + +.wmd-preview { + margin-top: 15px; + padding: 7px; + background: white; + line-height: 1.5em; + font-size: 1em; + border: 1px solid #a9a9a9; + border-radius: 5px; + box-sizing: border-box; +} + +.wmd-preview:empty { + display: none; +} + +.wmd-preview h1, .wmd-preview h2, .wmd-preview h3, .wmd-preview h4, .wmd-preview h5, .wmd-preview h6 { + font-weight: bold !important; + margin-left: 0 !important; +} + +.wmd-preview:not(.dmmd-preview) h1 { + font-size: 1.6em !important; + margin: 0 !important; + padding: 0 !important; +} + +.wmd-preview:not(.dmmd-preview) h2 { + font-size: 1.4em !important +} + +.wmd-preview:not(.dmmd-preview) h3 { + font-size: 1em !important +} + +.wmd-preview:not(.dmmd-preview) h4, .wmd-preview:not(.dmmd-preview) h5, .wmd-preview:not(.dmmd-preview) h6 { + font-size: .9em !important +} diff --git a/resources/problem.scss b/resources/problem.scss new file mode 100644 index 0000000..158b58f --- /dev/null +++ b/resources/problem.scss @@ -0,0 +1,292 @@ +#problem-table { + td { + &.category { + text-align: left; + padding: 0 1em; + } + + &.problem { + text-align: left; + padding-left: 1em; + width: 100%; + } + + &.pp { + text-align: left; + padding-left: 1em; + width: 100%; + } + + &.users { + text-align: left; + padding: 0 1em; + white-space: nowrap; + } + + &.types { + text-align: left; + padding: 0 1em; + } + + &.ac-rate { + white-space: nowrap; + } + + &.points { + white-space: nowrap; + } + } + + tr { + transition: background-color linear 0.2s; + + &:hover { + background: #eaeaea; + } + } +} + +#filter-form { + vertical-align: top; + margin-bottom: 0.5em; + margin-top: 0.75em; + + a { + margin-right: 5px; + display: inline-block; + padding: 3px 10px; + vertical-align: middle; + } + + input { + vertical-align: middle; + margin-bottom: 0.5em; + } + + label { + vertical-align: middle; + } + + .filter-form-group { + margin-top: 5px; + } +} + +#content-right { + &.problems { + flex: 26.5%; + max-width: unset; + padding-top: 0; + } +} + +#content-left { + &.problems { + flex: 73.5%; + } +} + +#search { + width: 100%; + height: 2.3em; +} + +label[for="category"], label[for="type"] { + padding-bottom: 0.25em; + display: block; +} + +#category { + margin-top: 0.5em; + width: 100%; +} + +#types { + width: 100%; +} + +span.type-tag { + white-space: nowrap; +} + +ul.problem-list { + list-style: none; + padding-left: 1em; + padding-right: 0.5em; + + li { + margin-bottom: 0.5em; + } +} + +.pi-name { + font-weight: bold; +} + +.pi-name:after { + content: " "; +} + +.authors-value, .judges-value { + padding-left: 1.5em; +} + +.lang-name:after { + content: ": "; +} + +.lang-limit { + margin-left: 1.5em; +} + +.solved-problem-color { + color: #44AD41; +} + +.unsolved-problem-color { + color: #DE2121; +} + +.attempted-problem-color { + color: orange; +} + +.submissions-left { + color: black; + font-weight: 600; + text-align: center; + margin-top: 0.5em; +} + +.no-submissions-left { + color: red; +} + +.organization-tags { + padding-left: 0.75em; + vertical-align: middle; +} + +.organization-tag { + box-shadow: inset 0 -0.1em 0 rgba(0, 0, 0, 0.12); + padding: 0.15em 0.3em; + border-radius: 0.15em; + font-weight: 600; + margin-right: 0.45em; + position: relative; + background-color: #ccc; + transform: translateY(+35%); + display: inline-block; +} + +.organization-tag a { + color: #000; +} + +.pdf-icon { + position: relative; + display: inline-block; + font-size: 1.5em; + + .pdf-icon-logo { + color: #d40e13; + } + + .pdf-icon-bar { + height: 0.2em; + display: block; + position: absolute; + top: 0.3em; + background: #d40e13; + width: 0.6em; + margin-left: -0.15em; + } +} + +.license { + float: left; + font-size: 0.85em; + + a { + color: gray; + text-decoration: none; + } +} + +.clarify { + float: right; +} + +#problem_submit { + width: 100%; + box-sizing: border-box; + + .button { + float: right; + padding: 6px 12px; + } +} + +@media (max-width: 550px) { + #problem-table tr :nth-child(6) { + display: none; + } +} + +@media (max-width: 450px) { + #problem-table tr :nth-child(4) { + display: none; + } +} + +@media (max-width: 350px) { + #problem-table tr :nth-child(3) { + display: none; + } +} + +#problem-table th a { + color: inherit; + display: block; + padding: 4px 10px; +} + +#category, #types { + visibility: hidden; +} + +#filter-form .form-label { + margin-top: 0.5em; + font-style: italic; +} + +#point-slider { + margin: 30px 15px 10px; + height: 10px; + + .noUi-handle { + height: 20px; + width: 16px; + left: -8px; + } + + .noUi-handle:before, .noUi-handle:after { + top: 3px; + height: 12px; + } + + .noUi-handle:before { + left: 5px; + } + + .noUi-handle:after { + left: 8px; + } + + .noUi-tooltip { + height: 17px; + line-height: 13px; + padding: 0 3px; + font-size: 13px; + } +} diff --git a/resources/problem_edit.css b/resources/problem_edit.css new file mode 100644 index 0000000..5fe128b --- /dev/null +++ b/resources/problem_edit.css @@ -0,0 +1,102 @@ +.selector { + width: 840px; + float: left; +} + +.selector select { + width: 400px; + height: 17.2em; +} + +.selector-available, .selector-chosen { + float: left; + width: 400px; + text-align: center; + margin-bottom: 5px; +} + +.selector-chosen select { + border-top: none; +} + +.selector-available h2, .selector-chosen h2 { + border: 1px solid #ccc; + background: white bottom left repeat-x; + color: #666; +} + +.selector .selector-filter { + background: white; + border: 1px solid #ccc; + border-width: 0 1px; + padding: 3px; + color: #999; + font-size: 10px; + margin: 0; + text-align: left; +} + +.selector .selector-filter label, +.inline-group .aligned .selector .selector-filter label { + width: 16px; + padding: 2px; +} + +.selector .selector-available input { + width: 360px; +} + +.selector ul.selector-chooser { + float: left; + width: 22px; + height: 50px; + background-color: #eee; + margin: 10em 5px 0 5px; + padding: 0; +} + +.selector-chooser li { + margin: 0; + padding: 3px; + list-style-type: none; +} + +.selector select { + margin-bottom: 10px; + margin-top: 0; +} + +.selector-add, .selector-remove { + width: 16px; + height: 16px; + display: block; + text-indent: -3000px; + overflow: hidden; +} + +a.selector-chooseall, a.selector-clearall { + display: inline-block; + text-align: left; + margin-left: auto; + margin-right: auto; + font-weight: bold; + color: #666; +} + +a.selector-chooseall { + padding: 3px 18px 3px 0; +} + +a.selector-clearall { + padding: 3px 0 3px 18px; +} + +a.active.selector-chooseall:hover, a.active.selector-clearall:hover { + color: #036; +} + +.selector h2 { + font-size: 16px; + font-weight: bold; + margin: 1em 0 0 0; +} diff --git a/resources/pygment-github.css b/resources/pygment-github.css new file mode 100644 index 0000000..567fe1d --- /dev/null +++ b/resources/pygment-github.css @@ -0,0 +1,61 @@ +code .hll { background-color: #ffffcc } +code .c { color: #999988; font-style: italic } /* Comment */ +code .err { color: #a61717; background-color: #e3d2d2 } /* Error */ +code .k { color: #000000; font-weight: bold } /* Keyword */ +code .o { color: #000000; font-weight: bold } /* Operator */ +code .cm { color: #999988; font-style: italic } /* Comment.Multiline */ +code .cp { color: #999999; font-weight: bold; font-style: italic } /* Comment.Preproc */ +code .c1 { color: #999988; font-style: italic } /* Comment.Single */ +code .cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */ +code .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ +code .ge { color: #000000; font-style: italic } /* Generic.Emph */ +code .gr { color: #aa0000 } /* Generic.Error */ +code .gh { color: #999999 } /* Generic.Heading */ +code .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ +code .go { color: #888888 } /* Generic.Output */ +code .gp { color: #555555 } /* Generic.Prompt */ +code .gs { font-weight: bold } /* Generic.Strong */ +code .gu { color: #aaaaaa } /* Generic.Subheading */ +code .gt { color: #aa0000 } /* Generic.Traceback */ +code .kc { color: #000000; font-weight: bold } /* Keyword.Constant */ +code .kd { color: #000000; font-weight: bold } /* Keyword.Declaration */ +code .kn { color: #000000; font-weight: bold } /* Keyword.Namespace */ +code .kp { color: #000000; font-weight: bold } /* Keyword.Pseudo */ +code .kr { color: #000000; font-weight: bold } /* Keyword.Reserved */ +code .kt { color: #445588; font-weight: bold } /* Keyword.Type */ +code .m { color: #009999 } /* Literal.Number */ +code .s { color: #d01040 } /* Literal.String */ +code .na { color: #008080 } /* Name.Attribute */ +code .nb { color: #0086B3 } /* Name.Builtin */ +code .nc { color: #445588; font-weight: bold } /* Name.Class */ +code .no { color: #008080 } /* Name.Constant */ +code .nd { color: #3c5d5d; font-weight: bold } /* Name.Decorator */ +code .ni { color: #800080 } /* Name.Entity */ +code .ne { color: #990000; font-weight: bold } /* Name.Exception */ +code .nf { color: #990000; font-weight: bold } /* Name.Function */ +code .nl { color: #990000; font-weight: bold } /* Name.Label */ +code .nn { color: #555555 } /* Name.Namespace */ +code .nt { color: #000080 } /* Name.Tag */ +code .nv { color: #008080 } /* Name.Variable */ +code .ow { color: #000000; font-weight: bold } /* Operator.Word */ +code .w { color: #bbbbbb } /* Text.Whitespace */ +code .mf { color: #009999 } /* Literal.Number.Float */ +code .mh { color: #009999 } /* Literal.Number.Hex */ +code .mi { color: #009999 } /* Literal.Number.Integer */ +code .mo { color: #009999 } /* Literal.Number.Oct */ +code .sb { color: #d01040 } /* Literal.String.Backtick */ +code .sc { color: #d01040 } /* Literal.String.Char */ +code .sd { color: #d01040 } /* Literal.String.Doc */ +code .s2 { color: #d01040 } /* Literal.String.Double */ +code .se { color: #d01040 } /* Literal.String.Escape */ +code .sh { color: #d01040 } /* Literal.String.Heredoc */ +code .si { color: #d01040 } /* Literal.String.Interpol */ +code .sx { color: #d01040 } /* Literal.String.Other */ +code .sr { color: #009926 } /* Literal.String.Regex */ +code .s1 { color: #d01040 } /* Literal.String.Single */ +code .ss { color: #990073 } /* Literal.String.Symbol */ +code .bp { color: #999999 } /* Name.Builtin.Pseudo */ +code .vc { color: #008080 } /* Name.Variable.Class */ +code .vg { color: #008080 } /* Name.Variable.Global */ +code .vi { color: #008080 } /* Name.Variable.Instance */ +code .il { color: #009999 } /* Literal.Number.Integer.Long */ diff --git a/resources/ranks.scss b/resources/ranks.scss new file mode 100644 index 0000000..3c78175 --- /dev/null +++ b/resources/ranks.scss @@ -0,0 +1,105 @@ +.admin a, .admin { + color: black !important; + font-weight: bold !important; +} + +@mixin rate-svg-color($color) { + circle { + stroke: $color; + } + path { + fill: $color; + } +} + +svg.rate-box { + width: 1.2em; + + circle { + fill: none; + stroke-width: 2px; + } + + &.rate-none { + visibility: hidden; + } + + &.rate-newbie { + @include rate-svg-color(#999); + } + + &.rate-amateur { + @include rate-svg-color(#00a900); + } + + &.rate-expert { + @include rate-svg-color(#66f); + } + + &.rate-candidate-master { + @include rate-svg-color(#f6f); + } + + &.rate-master { + @include rate-svg-color(#dc0); + } + + &.rate-grandmaster, &.rate-target { + @include rate-svg-color(#e00); + } + + &.rate-target { + circle:last-child { + stroke: none; + fill: #e00; + } + } +} + +.rating { + font-weight: bold; +} + +.rate-none, .rate-none a { + color: black; + font-weight: normal; +} + +.rate-newbie, .rate-newbie a { + color: #999; +} + +.rate-amateur, .rate-amateur a { + color: #00a900; +} + +.rate-expert, .rate-expert a { + color: blue; +} + +.rate-candidate-master, .rate-candidate-master a { + color: purple; +} + +.rate-master, .rate-master a { + color: #ffb100; +} + +.rate-grandmaster, .rate-grandmaster a, .rate-target, .rate-target a { + color: #e00; +} + +.rate-group { + white-space: nowrap; + display: inline-block; + color: black; + + .rating { + display: inline-block; + } + + .rate-box { + margin-right: 0.2em; + vertical-align: bottom; + } +} diff --git a/resources/status.scss b/resources/status.scss new file mode 100644 index 0000000..8530416 --- /dev/null +++ b/resources/status.scss @@ -0,0 +1,44 @@ +.AB { + background-color: #CCC; + color: black; +} + +.AC { + background-color: #53f23f; + color: green; +} + +._AC { + background-color: #DFFF00; + color: green; +} + +.WA { + background-color: #CCC; + color: #ef1b53; +} + +.TLE, .MLE { + background-color: #CCC; + color: black; +} + +.OLE, .IR, .RTE, .OTH { + background-color: #FAB623; + color: black; +} + +.CE { + background-color: #CCC; + color: black; +} + +.IE { + background-color: red; + color: black; +} + +.QU, .G { + background: white; + color: black; +} diff --git a/resources/style.scss b/resources/style.scss new file mode 100644 index 0000000..9d52085 --- /dev/null +++ b/resources/style.scss @@ -0,0 +1,14 @@ +@import "base"; +@import "table"; +@import "math"; +@import "status"; +@import "blog"; +@import "problem"; +@import "ranks"; +@import "users"; +@import "content-description"; +@import "widgets"; +@import "comments"; +@import "submission"; +@import "contest"; +@import "misc"; diff --git a/resources/submission.scss b/resources/submission.scss new file mode 100644 index 0000000..5d3e54b --- /dev/null +++ b/resources/submission.scss @@ -0,0 +1,325 @@ +.info-float { + position: sticky; + top: 60px; + width: 20%; +} + +#submissions-table { + background: rgba(0, 0, 0, .01); +} + +.submission-row { + display: flex; + border-left: #ccc 1px solid; + border-right: #ccc 1px solid; + transition: background-color linear 0.2s; + + &:hover { + background: #F2F2F2; + } + + &:first-of-type { + border-top: #ccc 1px solid; + } + + > div { + padding: 7px 5px; + vertical-align: middle; + border-bottom: #ccc 1px solid; + display: flex; + flex-direction: column; + justify-content: center; + } + + .sub-result { + min-width: 80px; + width: 80px; + text-align: center; + border-bottom-color: white; + border-right: #ccc 1px solid; + + .state { + font-size: 0.7em; + font-weight: bold; + padding-top: 0.5em; + } + + .score { + font-size: 1.3em; + color: #000; + } + } + + .sub-info { + flex: 1; + padding-left: 20px !important; + + .name { + font-weight: 700; + font-size: 1.2em; + } + } + + .sub-testcase { + color: #555; + white-space: nowrap; + } + + .sub-prop { + a { + white-space: nowrap; + } + } + + .sub-usage { + min-width: 70px; + width: 70px; + white-space: nowrap; + text-align: center; + border-left: #ccc 1px solid; + + .time { + font-weight: bold; + } + } +} + +.sub-prop .fa { + display: none; +} + +label[for="language"], label[for="status"] { + padding-bottom: 0.25em; + display: block; +} + +#language { + margin-top: 0.5em; + width: 100%; +} + +#status { + width: 100%; +} + +#statistics-table tr:not(:first-child) td { + border-top: 1px solid white !important; +} + +#statistics-table tr:not(:last-child) td:not(:last-child) { + border-right: 1px solid white; +} + +#content-left.submission { + flex: 70%; +} + +#content-right.submission { + flex: 12%; + min-width: initial; + max-width: 100%; + padding-top: 0; +} + +@media(max-width: 700px) { + .sub-prop { + .label { + display: none; + } + + .fa { + display: inline-block; + } + } + + #fake-info-float { + display: none; + } + + #statistics-table { + display: none; + } + + #content-left.submission { + flex: 100%; + } + + #content-right.submission { + display: none; + } +} + +.submission-contest { + color: #555; +} + +.source-ln { + color: gray; + border-right: 1px solid gray; + padding-right: 5px; + text-align: right; + + a { + color: gray; + display: block; + + &:hover { + text-decoration: underline; + } + + &::before { + display: block; + content: " "; + margin-top: -50px; + height: 50px; + visibility: hidden; + } + } +} + +.source-code pre, .source-ln pre { + margin: 0; + padding: 0; + white-space: pre; +} + +.source-code { + padding-left: 15px; +} + +.source-wrap { + overflow-x: auto; +} + +.statistics-table { + .status { + font-weight: bold; + text-align: left; + } + + .count { + color: black; + } +} + +#test-cases { + .toggle .fa { + margin-left: -1.28571em; + } + + .batch-cases { + margin: 0; + padding-left: 1em; + padding-bottom: 3px; + padding-top: 3px; + display: inline-block; + } + + .batch-cases .case-row td b { + font-weight: 500; + } + + .case-row td:nth-child(3) { + padding-right: 0; + text-align: right; + } + + .case-row td:nth-child(3) span { + float: right; + } + + .case-row td:nth-child(4) { + text-align: right; + } + + .case-info { + margin: 0; + padding-left: 1em; + padding-bottom: 3px; + padding-top: 3px; + border: 1px solid #2980b9; + border-left-width: .5em; + border-radius: 4px; + color: #222; + } + + .case-output { + margin: 0; + margin-right: 1em; + } + + table td { + margin: 0; + padding: 0 5px 0 0; + } + + .toggle { + font-weight: normal; + } + + .case-feedback { + vertical-align: top; + } + + .case-ext-feedback { + width: 50%; + } +} + +.case-AC { + color: green; + font-weight: bold; +} + +.case-_AC { + color: red; + font-weight: bold; +} + +.case-WA { + color: red; + font-weight: bold; +} + +.case-TLE, .case-SC { + color: gray; + font-weight: bold; +} + +.case-MLE, .case-OLE, .case-RTE, .case-IR { + color: orange; + font-weight: bold; +} + +.half-hr { + float: left; + width: 30%; +} + +.source-wrap { + .line { + position: relative; + } + + .highlighter { + position: absolute; + width: 9999px; + top: 0; + bottom: 0; + left: 0; + right: 0; + } + + a:active .line .highlighter { + background: rgba(255, 212, 0, 0.48); + } +} + +.submission-info { + text-align: right; + float: right; + + .submission-date { + color: gray; + } +} diff --git a/resources/table.scss b/resources/table.scss new file mode 100644 index 0000000..0abb0be --- /dev/null +++ b/resources/table.scss @@ -0,0 +1,87 @@ +@import "vars"; + +$table_header_rounding: 6px; + +.table { + border-spacing: 0; + width: 100%; + margin-left: auto; + margin-right: auto; + margin-bottom: 0.5em; + background: rgba(0, 0, 0, 0.01); + + &.striped tr:nth-child(even) { + background: #f7f7f7; + } + + td:first-child { + border-color: $border_gray; + border-width: 1px 1px 0 1px; + } + + tr:last-child td { + &:first-child { + border: 1px solid $border_gray; + } + + border-color: $border_gray; + border-width: 1px 1px 1px 0; + } + + thead th { + vertical-align: middle; + + &:first-child { + border-top-left-radius: $table_header_rounding; + } + + &:last-child { + border-top-right-radius: $table_header_rounding; + } + } + + th { + height: 2em; + color: #FFF; + background-color: $widget_black; + border-color: #555; + border-width: 1px 1px 0 0; + border-style: solid; + padding: 4px 10px; + vertical-align: middle; + text-align: center; + white-space: nowrap; + font-weight: 600; + font-size: 1.1em; + + &:first-child { + border-top-left-radius: $table_header_rounding; + } + + &:last-child { + border-top-right-radius: $table_header_rounding; + } + } + + td { + border-color: $border_gray; + border-width: 1px 1px 0 0; + border-style: solid; + padding: 7px 5px; + vertical-align: middle; + text-align: center; + } + + // Monkey-patches for awkward table rounding + tr:not(:first-child) th { + border-radius: 0; + } + + tr:last-child th { + border-bottom-left-radius: $table_header_rounding; + } + + thead tr th { + border-bottom-left-radius: 0 !important; + } +} diff --git a/resources/task_status.css b/resources/task_status.css new file mode 100644 index 0000000..dac8ac1 --- /dev/null +++ b/resources/task_status.css @@ -0,0 +1,169 @@ +.container { + width: 100%; + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} + +@media (min-width: 576px) { + .container { + max-width: 540px; + } +} + +@media (min-width: 768px) { + .container { + max-width: 720px; + } +} + +@media (min-width: 992px) { + .container { + max-width: 960px; + } +} + +@media (min-width: 1200px) { + .container { + max-width: 1140px; + } +} + +.jumbotron { + padding: 2rem 1rem; + margin-bottom: 2rem; + background-color: #e9ecef; + border-radius: 0.3rem; +} + +@media (min-width: 576px) { + .jumbotron { + padding: 4rem 2rem; + } +} + +.jumbotron-fluid { + padding-right: 0; + padding-left: 0; + border-radius: 0; +} + +@keyframes progress-bar-stripes { + from { + background-position: 1rem 0; + } + to { + background-position: 0 0; + } +} + +.progress { + display: flex; + height: 1rem; + overflow: hidden; + font-size: 0.75rem; + background-color: #e9ecef; + border-radius: 0.25rem; +} + +.progress-bar { + display: flex; + flex-direction: column; + justify-content: center; + color: #fff; + text-align: center; + white-space: nowrap; + background-color: #007bff; + transition: width 0.6s ease; +} + +@media screen and (prefers-reduced-motion: reduce) { + .progress-bar { + transition: none; + } +} + +.progress-bar-striped, .jumbotron .progress.progress-unknown .progress-bar { + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-size: 1rem 1rem; +} + +.progress-bar-animated { + animation: progress-bar-stripes 1s linear infinite; +} + +html, body { + margin: 0; + padding: 0; +} + +body { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #212529; + text-align: left; + background-color: #fff; + display: flex; + flex-direction: column; + min-height: 100%; + min-height: 100vh; + justify-content: center; +} + +.jumbotron .icon { + display: block; + margin: 0 auto 3rem; + max-width: 15rem; +} + +.jumbotron .action { + text-align: center; + font-size: 1.25rem; + font-weight: 300; +} + +.jumbotron .stage { + text-align: center; + font-weight: 300; +} + +.jumbotron .progress { + background: #007bff; + position: relative; + height: 2rem; +} + +.jumbotron .progress .progress-bar { + background: #28a745; + font-size: 1.25rem; + height: 2rem; +} + +.jumbotron .progress .progress-text { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 2rem; + line-height: 2rem; + font-size: 1.25rem; + text-align: center; + color: #fff; +} + +.jumbotron .progress.progress-unknown .progress-bar { + width: 100%; + background-color: #007bff; +} + +.jumbotron .progress.progress-complete .progress-bar { + width: 100%; +} + +.jumbotron .progress.progress-failed .progress-bar { + width: 100%; + background: #dc3545; +} diff --git a/resources/unselectable.htc b/resources/unselectable.htc new file mode 100644 index 0000000..29ed8a9 --- /dev/null +++ b/resources/unselectable.htc @@ -0,0 +1,11 @@ + + + + \ No newline at end of file diff --git a/resources/users.scss b/resources/users.scss new file mode 100644 index 0000000..b8e1a8c --- /dev/null +++ b/resources/users.scss @@ -0,0 +1,281 @@ +@media(min-width: 400px) { + #content-right { + &.users { + padding-left: 1.5em; + } + } +} + +#content-right { + &.users { + flex: 40%; + max-width: 17em; + } +} + +#content-left { + &.users { + flex: 60%; + } +} + +td.user-name { + padding-left: 2em; + text-align: left; +} + +tr { + padding-bottom: 96px; + + &:target { + background: #fff897; + } +} + +th.header.rank { + padding-left: 5px; +} + +#search-handle { + width: 100%; + height: 2.3em; +} + +.user-search-image, .user-search-name { + vertical-align: middle; +} + +.user-search-name { + padding-left: 0.5em; +} + +#users-table { + .username { + width: 100%; + } + + .header { + vertical-align: middle; + } + + .rank, .points, .problems, .username { + white-space: nowrap; + } + + tr { + transition: background-color linear .2s; + + &:hover { + background: #EAEAEA; + } + + &.highlight { + background: #fff897; + } + } +} + +#search-form { + display: inline-block; + vertical-align: top; + width: 225px; + float: right; + + .select2-selection__arrow { + display: none; + } + + .select2-selection__rendered { + cursor: text; + } + + .select2-results__option { + position: relative; + } + + .select2-results__option--highlighted { + background-color: #DEDEDE !important; + } + + li.select2-results__option--highlighted a.user-redirect { + display: inline-block; + } +} + +a.user-redirect { + color: #2980b9; + vertical-align: middle; + font-size: 1.2em; + position: absolute; + right: 0.8em; + display: none; + + &:hover { + text-shadow: 0 0 2px blue; + } +} + +a.edit-profile { + float: right; + padding-top: 1em; +} + +.user-problem-group { + h3 { + font-weight: 600; + font-size: 1.25em; + margin-bottom: -10px; + max-height: 20%; + line-height: 2.5em; + } + ul { + -webkit-columns: 300px 4; + -moz-columns: 300px 4; + columns: 300px 4; + list-style-type: none; + margin-top: 0; + margin-left: -20px; + margin-bottom: 0; + } + a img { + max-width: 1em; + margin-right: 3px; + padding-bottom: 1px; + vertical-align: middle; + } +} + +.user-info-cell { + padding-left: 15px; + border-left: 1px solid #CCC; +} + +.contest-history-cell { + border-left: 1px solid #CCC; + padding: 0 0.5em; +} + +.hide-solved-problems { + text-align: right; + overflow: hidden; +} + +.hide-solved-problems > span { + position: relative; + display: inline-block; +} + +.hide-solved-problems > span:before { + content: ""; + position: absolute; + top: 50%; + width: 100000px; + height: 1px; + background: rgba(0, 0, 0, 0.2); + right: 100%; + margin-right: 5px; +} + +.user-info-page { + display: flex; + max-width: 100%; + min-height: 0; +} + +.user-sidebar { + flex: 0 0 150px; + padding-left: 1em; +} + +.user-content { + flex: 1 1; + overflow: hidden; + word-wrap: break-word; +} + +@media not all and (min-width: 600px) { + .user-info-page { + display: block; + } + + .user-sidebar { + width: 150px; + margin: 0 auto; + } + + .user-content { + overflow: visible; + } +} + +.pp-table { + .pp { + font-weight: 600; + font-size: 1.4em; + } + + .pp-scaled { + font-size: 0.8em; + } + + .pp-weighted { + color: #777; + } + + div.sub-pp { + text-align: right; + min-width: unset; + width: unset; + border-left: none; + } + + td.problem-name { + text-align: left; + padding-left: 1em; + } + + td.problem-score { + width: 80px; + } + + td.problem-category { + width: 100px; + } +} + +#pp-load-link-wrapper { + text-align: center; + border: 1px solid #ccc; +} + +#pp-load-more-link { + display: block; + padding: 0.5em 0; +} + +.pp-breakdown-header { + font-weight: 600; + font-size: 1.25em; + margin-bottom: 0.2em; +} + +#rating-chart { + height: 400px; + margin-top: 1em; +} + +#rating-tooltip { + display: none; + position: absolute; + background: rgba(0, 0, 0, 0.7); + color: white; + padding: 3px; + border-radius: 3px; + transition: all .1s ease; + pointer-events: none; + transform: translate(-50%, 0); + + &.rate-group { + color: white; + } +} \ No newline at end of file diff --git a/resources/vars.scss b/resources/vars.scss new file mode 100644 index 0000000..3f157ea --- /dev/null +++ b/resources/vars.scss @@ -0,0 +1,11 @@ +$highlight_blue: #2980B9; +$widget_black: #3b3b3b; +$border_gray: #ccc; +$background_gray: #ededed; +$background_light_gray: #fafafa; +$announcement_red: #ae0000; + +$base_font_size: 14px; +$widget_border_radius: 4px; + +$monospace-fonts: Consolas, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", Monaco, "Courier New", Courier, monospace; diff --git a/resources/widgets.scss b/resources/widgets.scss new file mode 100644 index 0000000..fb8787b --- /dev/null +++ b/resources/widgets.scss @@ -0,0 +1,518 @@ +@import "vars"; + +.social i { + display: inline; + font-size: 1.9em; +} + +.facebook-this, .tweet-this, .gplus-this { + display: inline; +} + +.tweet-this i { + color: #55ACEE; +} + +.facebook-this it { + color: #133783; +} + +.gplus-this i { + color: #DD4B38; +} + +.social { + font-size: 1.3em; + float: right; +} + +// Bootstrap-y buttons +.button, button, input[type=submit] { + color: white !important; + text-decoration: none !important; + cursor: pointer; + vertical-align: middle; + white-space: nowrap; + font-weight: 400; + line-height: 1.4; + background: rgb(51, 122, 183) none repeat scroll 0 (0% / auto) padding-box border-box; + background: -webkit-linear-gradient(top, #337ab7 0, #265a88 100%) repeat-x; + background: linear-gradient(to bottom, #337ab7 0, #265a88 100%) repeat-x; + border-radius: $widget_border_radius; + padding: 6px 12px; + display: block; + border: 1px solid #245580; + text-align: center; + + // 4k hack + font-size: $base_font_size; + + &:hover { + background: #265a88; + } + + &.disabled { + background: linear-gradient(to bottom, darkgray 0, gray 100%) repeat-x !important; + border-color: grey !important; + cursor: not-allowed; + } +} + +.button.full, input[type=submit].full, button.full { + padding: 6px 0; +} + +button:hover, button:hover, input[type=submit]:hover { + background: #265a88; +} + +.button:active, button:active, input[type=submit]:hover { + border-color: #245580; + background: #265a88; +} + +.inline-button { + display: inline; + vertical-align: top; + padding: 3px 6px; +} + +input { + &[type=text], &[type=password], &[type=email], &[type=number] { + padding: 4px 8px; + color: #555; + background: #FFF none; + border: 1px solid $border_gray; + border-radius: $widget_border_radius; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075) inset; + transition: border-color 0.15s ease-in-out 0s, box-shadow 0.15s ease-in-out 0s; + box-sizing: border-box; + + // Need this explicitly because UA stylesheet for Chrome on 4k makes + // everything look bad otherwise (forces it to 9.3px) + font-size: $base_font_size; + } + + &[type=number] { + padding: 2px 0 2px 5px; + } +} + +textarea { + padding: 4px 8px; + color: #555; + background: #FFF none; + border: 1px solid $border_gray; + border-radius: $widget_border_radius; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075) inset; + transition: border-color 0.15s ease-in-out 0s, box-shadow 0.15s ease-in-out 0s; + box-sizing: border-box; +} + +textarea:hover { + border-color: rgba(82, 168, 236, 0.8); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 4px rgba(82, 168, 236, 0.6); +} + +input { + &[type="text"]:hover, &[type="password"]:hover { + border-color: rgba(82, 168, 236, 0.8); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 4px rgba(82, 168, 236, 0.6); + } +} + +textarea:focus { + border-color: rgba(82, 168, 236, 0.8); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + outline: 0; +} + +input { + &[type="text"]:focus, &[type="password"]:focus { + border-color: rgba(82, 168, 236, 0.8); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + outline: 0; + } +} + +// Bootstrap-y copy button +.btn-clipboard { + top: 0; + right: 0; + display: block; + font-size: 12px; + color: #767676; + cursor: pointer; + background-color: #FFF; + border: 1px solid #E1E1E8; + border-radius: 0 $widget_border_radius; + position: absolute; + padding: 5px 8px; +} + +.copy-clipboard { + position: relative; + margin-top: 1.5em; +} + +// Bootstrap-y tabs +.ul_tab_a_active { + color: black; + cursor: default; + background-color: #fff; + border: 1px solid $border_gray; + border-bottom-color: transparent; + border-image: none; +} + +.tabs { + border-bottom: 1px solid $border_gray; + margin: 0 0 8px; + width: 100%; + display: flex; + + &.tabs-no-flex { + display: block; + } + + .tab { + .tab-icon { + padding-right: 0.3em; + color: gray; + } + + a, span { + border-top-width: 3px !important; + } + + &.active { + a, span { + border-top-color: $highlight_blue !important; + } + + .tab-icon { + color: black; + } + } + } + + h2 { + color: #393630; + } + + > ul { + margin: 0; + padding: 0; + list-style: outside none none; + display: flex; + overflow-x: auto; + overflow-y: hidden; + + > li { + margin-bottom: -1px; + position: relative; + display: block; + + &.active > a, &.active > span { + @extend .ul_tab_a_active; + + &:hover { + @extend .ul_tab_a_active; + } + + &:focus { + @extend .ul_tab_a_active; + } + } + + > a, > span { + margin-right: 2px; + line-height: 1.42857; + border: 1px solid transparent; + border-radius: $widget_border_radius $widget_border_radius 0 0; + position: relative; + display: block; + padding: 10px 15px; + color: #555; + text-decoration: none; + white-space: nowrap; + } + } + } +} + +// Bootstrap-y pagination +ul.pagination a:hover { + color: #FFF; + background: rgba(0, 0, 0, 0.55); +} + +ul.pagination { + display: inline-block; + padding-left: 0; + margin: 0; + border-radius: $widget_border_radius; + + > { + li { + display: inline; + + &:first-child > { + a, span { + margin-left: 0; + border-top-left-radius: $widget_border_radius; + border-bottom-left-radius: $widget_border_radius; + } + } + + &:last-child > { + a, span { + margin-left: 0; + border-top-right-radius: $widget_border_radius; + border-bottom-right-radius: $widget_border_radius; + } + } + + > { + a, span { + position: relative; + float: left; + padding: 4px 12px; + line-height: 1.42857; + text-decoration: none; + color: #FFF; + background-color: $widget_black; + border: 1px solid #505050; + margin-left: -1px; + } + } + } + + .disabled-page > { + a { + color: #888; + background-color: $widget_black; + border-color: #282828; + } + + span { + color: #888; + background-color: $widget_black; + border-color: #505050; + } + } + + .active-page > { + a { + z-index: 2; + color: #FFF; + background-color: $highlight_blue; + border-color: transparent; + cursor: default; + } + + span { + z-index: 2; + color: #FFF; + background-color: $highlight_blue; + border-color: transparent; + cursor: default; + } + } + } +} + +.alert { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: $widget_border_radius; +} + +.alert-info { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} + +.alert-warning { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} + +.alert-danger { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} + +.alert-dismissable, .alert-dismissible { + padding-right: 35px; +} + +.alert-dismissable .close, .alert-dismissible .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; +} + +.close { + float: right; + font-size: 21px; + font-weight: 700; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + filter: alpha(opacity=20); + opacity: 0.2; +} + +a.close { + text-decoration: none !important; + font-size: 18px !important; + line-height: 1; + + &:hover { + color: black !important; + } +} + +.close { + &:focus, &:hover { + color: #000; + text-decoration: none; + cursor: pointer; + filter: alpha(opacity=50); + opacity: 0.5; + } +} + +.badge { + min-width: 10px; + padding: 0 7px; + font-size: 12px; + font-weight: 700; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: middle; + background-color: #e84848; + border-radius: 10px; + box-sizing: border-box; +} + +.form-submit-group { + border-top: 1px solid #EEE; + margin-top: 0.8em; + padding-top: 0.5em; + text-align: right; +} + +ul.select2-selection__rendered { + padding: 0 5px !important; +} + +.sidebox h3 { + margin: 0 -5px; + background: $widget_black; + border-radius: $widget_border_radius $widget_border_radius 0 0; + color: white; + padding-top: 5px; + padding-bottom: 5px; + padding-left: 7px; + font-size: 1.3em; +} + +.sidebox h3 .fa { + color: white; + float: right; + margin: 0.2em 0.4em 0 0; +} + +.sidebox-content { + border: 1px solid $border_gray; + border-top: none; + margin: 0 -5px; + padding: 1px 0.5em 3px; + + &.sidebox-table { + border: none; + padding: 0; + + .table { + margin: 0 !important; + } + } +} + +.sidebox { + border-top-left-radius: $widget_border_radius; + border-top-right-radius: $widget_border_radius; + padding: 0 5px !important; + padding-bottom: 1.5em !important; +} + +.ws-closed { + position: sticky; + top: 42px; + background: $announcement_red; + border-radius: 5px 5px 0 0; + display: none; +} + +.ws-closed a { + display: block; + padding: 7px 0; + text-align: center; + color: white; + font-weight: 600; +} + +.semibold { + font-weight: 600; +} + +.messages { + list-style-type: none; + padding: 0; + + li { + padding: 1em 1.5em; + margin-bottom: 1em; + border: 1px solid transparent; + border-radius: 5px; + + &.debug { + color: #383d41; + background-color: #e2e3e5; + border-color: #d6d8db; + } + + &.info { + color: #0c5460; + background-color: #d1ecf1; + border-color: #bee5eb; + } + + &.success { + color: #155724; + background-color: #d4edda; + border-color: #c3e6cb; + } + + &.warning { + color: #856404; + background-color: #fff3cd; + border-color: #ffeeba; + } + + &.error { + color: #721c24; + background-color: #f8d7da; + border-color: #f5c6cb; + } + } +} diff --git a/resources/wpadmin/css/wpadmin.site.css b/resources/wpadmin/css/wpadmin.site.css new file mode 100644 index 0000000..af6b4c6 --- /dev/null +++ b/resources/wpadmin/css/wpadmin.site.css @@ -0,0 +1,68 @@ +.select2-selection ul li { + list-style-type: inherit; +} + +.select2-container--default .select2-selection--multiple .select2-selection__choice { + line-height: unset !important; +} + +.wmd-wrapper { + padding-top: 2em; +} + +.wmd-wrapper ul.wmd-button-row { + margin-left: 0; +} + +.wmd-input { + width: 100% !important; +} + +#content .content-description h1, +#content .content-description h2, +#content .content-description h3, +#content .content-description h4, +#content .content-description h5, +#content .content-description h6 { + padding: 0; +} + +#content .content-description h5 { + letter-spacing: initial; + text-transform: initial; +} + +#content input.select2-search__field { + border: none; + box-shadow: none !important; +} + +#content .content-description ul, +#content .content-description ol { + margin: 0; +} + +#content .content-description li { + list-style-type: inherit; +} + +select[id^=id_contest_problems] { + width: 20em !important; +} + +select#id_organizers.django-select2, +select#id_organizations.django-select2, +select#id_tags.django-select2 { + width: 20em; +} + +@media (max-width: 780px) { + #content .vLargeTextField { + max-width: unset; + } +} + +.dmmd-preview-update { + position: sticky; + top: 38px; +} diff --git a/robots.txt b/robots.txt new file mode 100644 index 0000000..aca189f --- /dev/null +++ b/robots.txt @@ -0,0 +1,21 @@ +User-agent: * +Disallow: /admin/ +Disallow: /accounts/ +Disallow: /problem/*/pdf +Disallow: /problem/*/raw +Disallow: /problem/*/submit +Disallow: /problem/*/resubmit/ +Disallow: /problem/*/submissions/ +Disallow: /user/*/submissions/ +Disallow: /submission/ +Disallow: /submissions/ +Disallow: /single_submission +Disallow: /edit/profile/ +Disallow: /src/ +Disallow: /comments/ +Disallow: /api/ +Disallow: /contest/*/submissions/*/*/ +Disallow: /contest/*/join +Disallow: /contest/*/leave +Disallow: /contests/*/*/ +Disallow: /tickets/* diff --git a/templates/admin/auth/user/change_form.html b/templates/admin/auth/user/change_form.html new file mode 100644 index 0000000..207ab84 --- /dev/null +++ b/templates/admin/auth/user/change_form.html @@ -0,0 +1,20 @@ +{% extends "admin/change_form.html" %} +{% load i18n %} + +{% block extrahead %}{{ block.super }} + +{% endblock extrahead %} + +{% block after_field_sets %}{{ block.super }} + {% if original %} + + {% endif %} +{% endblock %} diff --git a/templates/admin/judge/contest/change_form.html b/templates/admin/judge/contest/change_form.html new file mode 100644 index 0000000..beb2122 --- /dev/null +++ b/templates/admin/judge/contest/change_form.html @@ -0,0 +1,23 @@ +{% extends "admin/change_form.html" %} +{% load i18n %} + +{% block extrahead %}{{ block.super }} + +{% endblock extrahead %} + +{% block after_field_sets %}{{ block.super }} + {% if original and original.is_rated and perms.judge.contest_rating %} + + {% endif %} +{% endblock %} diff --git a/templates/admin/judge/contest/change_list.html b/templates/admin/judge/contest/change_list.html new file mode 100644 index 0000000..ae409fc --- /dev/null +++ b/templates/admin/judge/contest/change_list.html @@ -0,0 +1,13 @@ +{% extends "reversion/change_list.html" %} +{% load i18n %} + +{% block object-tools-items %} + {{ block.super }} + {% if not is_popup and perms.judge.contest_rating %} +
  • + + {% trans "Rate all ratable contests" %} + +
  • + {% endif %} +{% endblock %} diff --git a/templates/admin/judge/judge/change_form.html b/templates/admin/judge/judge/change_form.html new file mode 100644 index 0000000..f477768 --- /dev/null +++ b/templates/admin/judge/judge/change_form.html @@ -0,0 +1,26 @@ +{% extends "admin/change_form.html" %} +{% load i18n %} + +{% block extrahead %}{{ block.super }} + +{% endblock extrahead %} + +{% block after_field_sets %}{{ block.super }} + {% if original %} + + + {% endif %} +{% endblock %} diff --git a/templates/admin/judge/problem/change_form.html b/templates/admin/judge/problem/change_form.html new file mode 100644 index 0000000..4d118f0 --- /dev/null +++ b/templates/admin/judge/problem/change_form.html @@ -0,0 +1,20 @@ +{% extends "admin/change_form.html" %} +{% load i18n %} + +{% block extrahead %}{{ block.super }} + +{% endblock extrahead %} + +{% block after_field_sets %}{{ block.super }} + {% if original %} + + {% endif %} +{% endblock %} diff --git a/templates/admin/judge/profile/change_form.html b/templates/admin/judge/profile/change_form.html new file mode 100644 index 0000000..9372383 --- /dev/null +++ b/templates/admin/judge/profile/change_form.html @@ -0,0 +1,20 @@ +{% extends "admin/change_form.html" %} +{% load i18n %} + +{% block extrahead %}{{ block.super }} + +{% endblock extrahead %} + +{% block after_field_sets %}{{ block.super }} + {% if original %} + + {% endif %} +{% endblock %} diff --git a/templates/admin/judge/submission/change_form.html b/templates/admin/judge/submission/change_form.html new file mode 100644 index 0000000..6f3c5b7 --- /dev/null +++ b/templates/admin/judge/submission/change_form.html @@ -0,0 +1,20 @@ +{% extends "admin/change_form.html" %} +{% load i18n %} + +{% block extrahead %}{{ block.super }} + +{% endblock extrahead %} + +{% block after_field_sets %}{{ block.super }} + {% if original %} + + {% endif %} +{% endblock %} \ No newline at end of file diff --git a/templates/base.html b/templates/base.html new file mode 100644 index 0000000..22e8885 --- /dev/null +++ b/templates/base.html @@ -0,0 +1,313 @@ + + + + {% block title %}{{ title }} - {{ SITE_LONG_NAME }}{% endblock %} + + {% if misc_config.meta_keywords %} + + {% endif %} + {% if meta_description %} + + {% endif %} + + + + + + + + + + + + + + + + + + + {# Chrome 39 for Android colour #} + + {% if og_image %} + + {% endif %} + {% block og_title %}{% endblock %} + + + {% if meta_description %} + + {% endif %} + + {% block meta %}{% endblock %} + {% if not INLINE_FONTAWESOME %} + + {% endif %} + {% compress css %} + + {% if PYGMENT_THEME %} + + {% endif %}{% if INLINE_FONTAWESOME %} + {% endif %} + + + + {% endcompress %} + + {% if request.user.is_impersonate %} + + {% endif %} + {% block media %}{% endblock %} + {% if not INLINE_JQUERY %} + + {% endif %} + + {% compress js %} + + {% if INLINE_JQUERY %} + + {% endif %} + + + + + + {% include "extra_js.html" %} + + + {% endcompress %} + {% block js_media %}{% endblock %} + {% if request.in_contest %} + + {% endif %} + + {% if request.user.is_authenticated %} + + {% else %} + + {% endif %} + + {% if misc_config.analytics %} + {{ misc_config.analytics|safe }} + {% endif %} + + {# Don't run userscript since it may be malicious #} + {% if request.user.is_authenticated and request.profile.user_script and not request.user.is_impersonate %} + + {% endif %} + + + + + + + + + + +{% if request.in_contest %} + +{% endif %} +
    + +
    +
    + {% block title_row %} +

    + {% block content_title %} + {% if content_title %}{{ content_title }}{% else %}{{ title }}{% endif %} + {% endblock %} +

    + {% endblock %} + {% block header %}{% endblock %} + {% block title_ruler %} +
    + {% endblock %} +
    {% block body %}{% endblock %}
    +
    + + {% if i18n_config.announcement %} +
    {{ i18n_config.announcement|safe }}
    + {% endif %} + + {% block bodyend %}{% endblock %} + +
    + +
    + proudly powered by DMOJ | + {% if i18n_config.footer %} + {{ i18n_config.footer|safe }} | + {% endif %} +
    + {% csrf_token %} + + +
    +
    +
    +
    + + diff --git a/templates/blog/content.html b/templates/blog/content.html new file mode 100644 index 0000000..1ce27f8 --- /dev/null +++ b/templates/blog/content.html @@ -0,0 +1,53 @@ +{% extends "base.html" %} + +{% block js_media %} + {% include "comments/media-js.html" %} +{% endblock %} + +{% block media %} + {% include "comments/media-css.html" %} +{% endblock %} + +{% block header %} + {% if perms.judge.change_blogpost %} + + {% endif %} +{% endblock %} + +{% block body %} +
    +
    + {% with authors=post.authors.all() %} + {% if authors %} + + {% endif %} + {% endwith %} + + {% trans time=post.publish_on|date(_("N j, Y, g:i a")) %} + posted on {{ time }} + {% endtrans %} + +
    +
    + {% cache 86400 'post_content' post.id MATH_ENGINE %} + {{ post.content|markdown('blog', MATH_ENGINE)|reference|str|safe}} + {% endcache %} +
    +
    +
    + + {% include "comments/list.html" %} +{% endblock %} + +{% block bodyend %} + {{ super() }} + {% if REQUIRE_JAX %} + {% include "mathjax-load.html" %} + {% endif %} + {% include "comments/math.html" %} +{% endblock %} diff --git a/templates/blog/dashboard.html b/templates/blog/dashboard.html new file mode 100644 index 0000000..7ec50e4 --- /dev/null +++ b/templates/blog/dashboard.html @@ -0,0 +1,34 @@ + diff --git a/templates/blog/list.html b/templates/blog/list.html new file mode 100644 index 0000000..c5976d0 --- /dev/null +++ b/templates/blog/list.html @@ -0,0 +1,268 @@ +{% extends "base.html" %} +{% block title_row %}{% endblock %} +{% block title_ruler %}{% endblock %} + +{% block media %} + + + + + + + {% include "blog/media-css.html" %} + +{% endblock %} + +{% block js_media %} + +{% endblock %} + +{% block body %} + {% block before_posts %}{% endblock %} + +
    + + +
    + {% if request.in_contest and request.participation.contest.use_clarifications %} + + {% endif %} + {% if current_contests %} + + {% endif %} + + {% if future_contests %} + + {% endif %} + + + + {% if perms.judge.test_site and own_open_tickets %} + + {% endif %} + + {% if perms.judge.test_site and open_tickets %} + + {% endif %} +
    +
    + {% block after_posts %}{% endblock %} +{% endblock %} diff --git a/templates/blog/media-css.html b/templates/blog/media-css.html new file mode 100644 index 0000000..a4a3d32 --- /dev/null +++ b/templates/blog/media-css.html @@ -0,0 +1,30 @@ + \ No newline at end of file diff --git a/templates/blog/preview.html b/templates/blog/preview.html new file mode 100644 index 0000000..802f8b3 --- /dev/null +++ b/templates/blog/preview.html @@ -0,0 +1 @@ +{{ preview_data|markdown('blog', MATH_ENGINE)|reference|str|safe }} \ No newline at end of file diff --git a/templates/comments/content.html b/templates/comments/content.html new file mode 100644 index 0000000..7adbf60 --- /dev/null +++ b/templates/comments/content.html @@ -0,0 +1 @@ +{{ comment.body|markdown('comment', MATH_ENGINE)|reference|str|safe }} \ No newline at end of file diff --git a/templates/comments/edit-ajax.html b/templates/comments/edit-ajax.html new file mode 100644 index 0000000..c854133 --- /dev/null +++ b/templates/comments/edit-ajax.html @@ -0,0 +1,17 @@ +
    +
    + + + {% csrf_token %} +
    + {{ form.non_field_errors() }} + {{ form.body.errors }} + +
    +
    +
    {{ form.body }}
    +
    +
    + +
    +
    diff --git a/templates/comments/edit.html b/templates/comments/edit.html new file mode 100644 index 0000000..76e6577 --- /dev/null +++ b/templates/comments/edit.html @@ -0,0 +1,13 @@ +{% extends "base.html" %} +{% block media %} + {% compress css %} + {{ form.media.css }} + {% endcompress %} +{% endblock %} + +{% block js_media %} + {{ form.media.js }} +{% endblock %} +{% block body %} +
    {% include "comments/edit-ajax.html" %}
    +{% endblock %} \ No newline at end of file diff --git a/templates/comments/list.html b/templates/comments/list.html new file mode 100644 index 0000000..565de8d --- /dev/null +++ b/templates/comments/list.html @@ -0,0 +1,159 @@ +
    +

    {{ _('Comments') }}

    + {% if has_comments %} +
      + {% set logged_in = request.user.is_authenticated %} + {% set profile = request.profile if logged_in else None %} + {% for node in mptt_tree(comment_list) recursive %} +
    • +
      +
      +
      + {% if logged_in %} + + {% else %} + + {% endif %} +
      +
      {{ node.score }}
      + {% if logged_in %} + + {% else %} + + {% endif %} +
      + {% with author=node.author, user=node.author.user %} + + + + {% endwith %} +
      +
      +
      + {{ link_user(node.author) }}  + {{ relative_time(node.time, abs=_('commented on {time}'), rel=_('commented {time}')) }} + + + {% if node.revisions > 1 %} + + + + {% if node.revisions > 2 %} + {% trans edits=node.revisions - 1 %}edit {{ edits }}{% endtrans %} + {% else %} + {{ _('edited') }} + {% endif %} + + + + {% else %} + + {% endif %} + + + + {% if logged_in and not comment_lock %} + {% set can_edit = node.author.id == profile.id and not profile.mute %} + {% if can_edit %} + + + + {% else %} + + + + {% endif %} + {% if perms.judge.change_comment %} + {% if can_edit %} + + {% else %} + + {% endif %} + + + {% endif %} + {% endif %} + +
      +
      + + {% if node.score <= vote_hide_threshold %} +
      +

      + {% trans id=node.id %} + This comment is hidden due to too much negative feedback. + Click here to view it. + {% endtrans %} +

      +
      + {% endif %} +
      +
      +
      +
    • + {% with children=node.get_children() %} + {% if children %} +
        {{ loop(children) }}
      + {% endif %} + {% endwith %} + {% endfor %} +
    + {% elif not comment_lock %} +

    {{ _('There are no comments at the moment.') }}

    + {% endif %} + + {% if request.user.is_authenticated and comment_form and not comment_lock %} +
    + {% block comment_submit_title %} +

    {{ _('New comment') }}

    +
    + {% endblock %} + {% if is_new_user %} +
    + {{ _('You need to have solved at least one problem before your voice can be heard.') }} +
    + {% else %} +
    + {% csrf_token %} + {% if comment_form.errors %} +
    + {{ comment_form.non_field_errors() }} + {{ comment_form.parent.errors }} + {% if comment_form.body.errors %}{{ _('Invalid comment body.') }}{% endif %} +
    + {% endif %} + {{ comment_form.parent }} +
    +
    {{ comment_form.body }}
    +
    +
    + +
    + {% endif %} +
    + {% endif %} + + {% if comment_lock %} +
    + {{ _('Comments are disabled on this page.') }} +
    + {% endif %} +
    diff --git a/templates/comments/math.html b/templates/comments/math.html new file mode 100644 index 0000000..8bf58d1 --- /dev/null +++ b/templates/comments/math.html @@ -0,0 +1,3 @@ +{% compress js, inline %} + +{% endcompress %} diff --git a/templates/comments/media-css.html b/templates/comments/media-css.html new file mode 100644 index 0000000..85d8337 --- /dev/null +++ b/templates/comments/media-css.html @@ -0,0 +1,103 @@ +{% compress css %} + {{ comment_form.media.css }} + +{% endcompress %} diff --git a/templates/comments/media-js.html b/templates/comments/media-js.html new file mode 100644 index 0000000..d938fb7 --- /dev/null +++ b/templates/comments/media-js.html @@ -0,0 +1,206 @@ + +{% compress js %} + {{ comment_form.media.js }} + {% if not REQUIRE_JAX %} + + {% endif %} + +{% endcompress %} diff --git a/templates/comments/preview.html b/templates/comments/preview.html new file mode 100644 index 0000000..9d61008 --- /dev/null +++ b/templates/comments/preview.html @@ -0,0 +1,4 @@ +{{ preview_data|markdown('comment', MATH_ENGINE)|reference|str|safe }} +{% if REQUIRE_JAX %} +
    +{% endif %} \ No newline at end of file diff --git a/templates/comments/revision-ajax.html b/templates/comments/revision-ajax.html new file mode 100644 index 0000000..4dd2c1b --- /dev/null +++ b/templates/comments/revision-ajax.html @@ -0,0 +1,3 @@ +{% with node=revision.field_dict %} +
    {{ node.body|markdown('comment', MATH_ENGINE)|reference|str|safe }}
    +{% endwith %} diff --git a/templates/comments/votes.html b/templates/comments/votes.html new file mode 100644 index 0000000..395b18e --- /dev/null +++ b/templates/comments/votes.html @@ -0,0 +1,17 @@ +

    Votes

    + + + + + + + + + {% for vote in votes %} + + + + + {% endfor %} + +
    VoterScore
    {{ link_user(vote.voter) }}{{ vote.score }}
    \ No newline at end of file diff --git a/templates/common-content.html b/templates/common-content.html new file mode 100644 index 0000000..5d68048 --- /dev/null +++ b/templates/common-content.html @@ -0,0 +1,81 @@ +{% extends "base.html" %} + +{% block media %} + {% block content_media %}{% endblock %} +{% endblock %} + +{% block js_media %} + {% compress js %} + + + + {% endcompress %} + {% block content_js_media %}{% endblock %} +{% endblock %} + +{% block body %} +
    +
    +
    {% block info_float %}{% endblock %}
    +
    +
    +
    + {% block description %}{% endblock %} + {% block description_end %} +
    + {% endblock %} + {% block post_description_end %}{% endblock %} +
    + {% block comments %}{% endblock %} +
    +
    +{% endblock %} + +{% block bodyend %} + {% if REQUIRE_JAX %} + {% include "mathjax-load.html" %} + {% endif %} +{% endblock %} diff --git a/templates/contest/access_code.html b/templates/contest/access_code.html new file mode 100644 index 0000000..7013c62 --- /dev/null +++ b/templates/contest/access_code.html @@ -0,0 +1,35 @@ +{% extends "base.html" %} + +{% block media %} + +{% endblock %} + +{% block body %} +
    + {% csrf_token %} + {% if form.errors or wrong_code %} +
    +

    {{ _('Invalid access code.') }}

    +
    + {% endif %} +

    {{ _('Please enter your access code:') }}

    +

    {{ form.access_code }}

    +

    + +

    +
    +{% endblock %} diff --git a/templates/contest/calendar.html b/templates/contest/calendar.html new file mode 100644 index 0000000..f79b3e2 --- /dev/null +++ b/templates/contest/calendar.html @@ -0,0 +1,46 @@ +{% extends "base.html" %} +{% block title_ruler %}{% endblock %} + +{% block title_row %} + {% set tab = 'calendar' %} + {% include "contest/contest-list-tabs.html" %} +{% endblock %} + +{% block body %} + + + + + + + + + + + {% for week in calendar %} + {% for day in week %} + + {% endfor %} + {% endfor %} +
    {{ _('Sunday') }}{{ _('Monday') }}{{ _('Tuesday') }}{{ _('Wednesday') }}{{ _('Thursday') }}{{ _('Friday') }}{{ _('Saturday') }}
    + {{ day.date.day }} + +
    +{% endblock %} diff --git a/templates/contest/clone.html b/templates/contest/clone.html new file mode 100644 index 0000000..15739d2 --- /dev/null +++ b/templates/contest/clone.html @@ -0,0 +1,42 @@ +{% extends "base.html" %} + +{% block media %} + +{% endblock %} + +{% block body %} +
    + {% csrf_token %} + {% if form.errors %} +
    + {{ form.key.errors }} +
    + {% endif %} + +
    +
    {{ form.key }}
    +
    + +
    +{% endblock %} diff --git a/templates/contest/contest-list-tabs.html b/templates/contest/contest-list-tabs.html new file mode 100644 index 0000000..1687831 --- /dev/null +++ b/templates/contest/contest-list-tabs.html @@ -0,0 +1,26 @@ +{% extends "tabs-base.html" %} + +{% block post_tab_spacer %} + {% if tab == 'calendar' %} +
    + {% if prev_month %} + « {{ _('Prev') }} + {% endif %} + {% if not (curr_month.year == now.year and curr_month.month == now.month) %} + {{ _('Today') }} + {% endif %} + {% if next_month %} + {{ _('Next') }} » + {% endif %} +
    + + {% endif %} +{% endblock %} + +{% block tabs %} + {{ make_tab('list', 'fa-list', url('contest_list'), _('List')) }} + {{ make_tab('calendar', 'fa-calendar', url('contest_calendar', now.year, now.month), _('Calendar')) }} + {% if perms.judge.change_contest %} + {{ make_tab('admin', 'fa-edit', url('admin:judge_contest_changelist'), _('Admin')) }} + {% endif %} +{% endblock %} diff --git a/templates/contest/contest-tabs.html b/templates/contest/contest-tabs.html new file mode 100644 index 0000000..6743433 --- /dev/null +++ b/templates/contest/contest-tabs.html @@ -0,0 +1,88 @@ +{% extends "tabs-base.html" %} + +{% block tabs %} + {{ make_tab('detail', 'fa-info-circle', url('contest_view', contest.key), _('Info')) }} + {% if contest.ended or contest.is_editable_by(request.user) %} + {{ make_tab('stats', 'fa-pie-chart', url('contest_stats', contest.key), _('Statistics')) }} + {% endif %} + + {% if contest.start_time <= now or perms.judge.see_private_contest %} + {% if contest.show_scoreboard or contest.can_see_scoreboard(request.user) %} + {{ make_tab('ranking', 'fa-bar-chart', url('contest_ranking', contest.key), _('Rankings')) }} + {% else %} + {{ make_tab('ranking', 'fa-bar-chart', None, _('Hidden Rankings')) }} + {% endif %} + {% if contest.show_scoreboard and request.user.is_authenticated %} + {{ make_tab('participation', 'fa-users', url('contest_participation_own', contest.key), _('Participation')) }} + {% endif %} + {% endif %} + {% if contest.is_editable_by(request.user) %} + {% if perms.judge.moss_contest and has_moss_api_key %} + {{ make_tab('moss', 'fa-gavel', url('contest_moss', contest.key), _('MOSS')) }} + {% endif %} + {{ make_tab('edit', 'fa-edit', url('admin:judge_contest_change', contest.id), _('Edit')) }} + {% endif %} + {% if perms.judge.clone_contest %} + {{ make_tab('clone', 'fa-copy', url('contest_clone', contest.key), _('Clone')) }} + {% endif %} + + {% if request.user.is_authenticated %} + {% if contest.can_join or participating or is_organizer %} + {% if contest.ended %} + {% if in_contest %} + {# They're in the contest because they're participating virtually #} +
    + {% csrf_token %} + +
    + {% else %} + {# They're in the contest because they're participating virtually #} +
    + {% csrf_token %} + +
    + {% endif %} + {% else %} + {% if in_contest %} + {# Allow people with ended participations to continue spectating #} +
    + {% csrf_token %} + +
    + {% elif participating and participation.ended or is_organizer %} +
    + {% csrf_token %} + +
    + {% elif participating %} +
    + {% csrf_token %} + +
    + {% else %} +
    + {% csrf_token %} + +
    + {% endif %} + {% endif %} + {% endif %} + {% elif contest.can_join %} +
    + + +
    + {% endif %} +{% endblock %} diff --git a/templates/contest/contest.html b/templates/contest/contest.html new file mode 100644 index 0000000..9d15cc6 --- /dev/null +++ b/templates/contest/contest.html @@ -0,0 +1,137 @@ +{% extends "common-content.html" %} + +{% block title_ruler %}{% endblock %} + +{% block title_row %} + {% set tab = 'detail' %} + {% set title = contest.name %} + {% include "contest/contest-tabs.html" %} +{% endblock %} + +{% block content_js_media %} + + {% include "contest/media-js.html" %} + {% include "comments/media-js.html" %} +{% endblock %} + +{% block content_media %} + {% include "comments/media-css.html" %} +{% endblock %} + +{% block body %} + + +
    + {% cache 3600 'contest_html' contest.id MATH_ENGINE %} + {{ contest.description|markdown('contest', MATH_ENGINE)|reference|str|safe }} + {% endcache %} +
    + + {% if contest.ended or request.user.is_superuser or is_organizer %} +
    +
    +

    {{ _('Problems') }}

    + + + + + + + + + + + + {% for problem in contest_problems %} + + + + + + + + {% endfor %} + +
    {{ _('Problem') }}{{ _('Points') }}{{ _('AC Rate') }}{{ _('Users') }}
    + {% if problem.is_public %} + {{ problem.i18n_name }} + {% else %} + {{ problem.i18n_name }} + {% endif %} + {{ problem.points|floatformat }}{% if problem.partial %}p{% endif %}{{ problem.ac_rate|floatformat(1) }}% + {% if problem.is_public %} + {{ problem.user_count }} + {% else %} + {{ problem.user_count }} + {% endif %} + + {% if problem.is_public and problem.has_public_editorial %} + {{ _('Editorial') }} + {% endif %} +
    +
    + {% endif %} + +
    + + + {% include "comments/list.html" %} +{% endblock %} + +{% block description_end %}{% endblock %} + +{% block bodyend %} + {{ super() }} + {% include "comments/math.html" %} +{% endblock %} +k diff --git a/templates/contest/list.html b/templates/contest/list.html new file mode 100644 index 0000000..51117a6 --- /dev/null +++ b/templates/contest/list.html @@ -0,0 +1,307 @@ +{% extends "common-content.html" %} +{% block meta %} + +{% endblock %} + +{% block media %} + +{% endblock %} + +{% block js_media %} + + +{% endblock %} + +{% block title_ruler %}{% endblock %} + +{% block title_row %} + {% set tab = 'list' %} + {% set title = 'Contests' %} + {% include "contest/contest-list-tabs.html" %} +{% endblock %} + +{% macro contest_head(contest) %} + {% spaceless %} + + {{- contest.name -}} + + + {% if not contest.is_visible %} + + {{ _('hidden') }} + + {% endif %} + {% if contest.is_private %} + + {{ _('private') }} + + {% endif %} + {% if contest.is_organization_private %} + {% for org in contest.organizations.all() %} + + + {{ org.name }} + + + {% endfor %} + {% endif %} + {% if contest.is_rated %} + + {{ _('rated') }} + + {% endif %} + {% for tag in contest.tags.all() %} + + + {{- tag.name -}} + + + {% endfor %} + + {% endspaceless %} +{% endmacro %} + +{% macro time_left(contest) %} +
    + {% if contest.time_limit %} + {{ contest.start_time|date(_("M j, Y, G:i")) }} - + {{ contest.end_time|date(_("M j, Y, G:i")) }} + {% else %} + {{ contest.start_time|date(_("M j, Y, G:i")) }} + {% endif %} +
    + {% if contest.time_limit %} + {{ _('%(time_limit)s window', time_limit=contest.time_limit|timedelta('localized-no-seconds')) }} + {% else %} + {{ _('%(duration)s long', duration=contest.contest_window_length|timedelta('localized-no-seconds')) }} + {% endif %} +
    +{% endmacro %} + +{% macro user_count(contest, user) %} + {% if contest.show_scoreboard or contest.can_see_scoreboard(user) %} + {{ contest.user_count }} + {% else %} + {{ contest.user_count }} + {% endif %} +{% endmacro %} + +{% macro contest_join(contest, request) %} + {% if not request.in_contest %} + + {% if request.profile in contest.organizers.all() %} +
    + {% csrf_token %} + +
    + {% else %} +
    + {% csrf_token %} + +
    + {% endif %} + + {% endif %} +{% endmacro %} + +{% block body %} +
    + {% if active_participations %} +

    {{ _('Active Contests') }}

    + + + + + + {% if not request.in_contest %} + + {% endif %} + + + + {% for participation in active_participations %} + {% with contest=participation.contest %} + + + + {{ contest_join(contest, request) }} + + {% endwith %} + {% endfor %} + +
    {{ _('Contest') }}{{ _('Users') }}
    +
    + {{ contest_head(contest) }} + {% if contest.start_time %} +
    + {% if contest.time_limit %} + {{ _('Window ends in %(countdown)s', countdown=participation.time_remaining|as_countdown)}} + {% elif contest.time_before_end %} + {{ _('Ends in %(countdown)s', countdown=contest.time_before_end|as_countdown) }} + {% endif %} + {{ time_left(contest) }} + {% endif %} +
    +
    + {{ user_count(contest, request.user) }} +
    +
    + {% endif %} + + {% if current_contests %} +

    {{ _('Ongoing Contests') }}

    + + + + + + {% if not request.in_contest %} + + {% endif %} + + + + {% for contest in current_contests %} + + + + {{ contest_join(contest, request) }} + + {% endfor %} + +
    {{ _('Contest') }}{{ _('Users') }}
    +
    + {{ contest_head(contest) }} + {% if contest.start_time %} +
    + {% if contest.time_before_end %} + {{ _('Ends in %(countdown)s', countdown=contest.time_before_end|as_countdown) }} + {% endif %} + {{ time_left(contest) }} + {% endif %} +
    +
    + {{ user_count(contest, request.user) }} +
    +
    + {% endif %} + +

    {{ _('Upcoming Contests') }}

    + {% if future_contests %} + + + + + + + + {% for contest in future_contests %} + + + + {% endfor %} + +
    {{ _('Contest') }}
    +
    + {{ contest_head(contest) }} + {% if contest.start_time %} +
    + {% if contest.time_before_start %} + {{ _('Starting in %(countdown)s.', countdown=contest.time_before_start|as_countdown) }} + {% endif %} + {{ time_left(contest) }} + {% endif %} +
    +
    + {% else %} + {{ _('There are no scheduled contests at this time.') }} +
    + {% endif %} +
    + + {% if past_contests %} +

    {{ _('Past Contests') }}

    + {% if page_obj and page_obj.num_pages > 1 %} +
    + {% include "list-pages.html" %} +
    + {% endif %} + + + + + + {% if not request.in_contest %} + + {% endif %} + + + + {% for contest in past_contests %} + + + + {% if not request.in_contest %} + + {% endif %} + + {% endfor %} + +
    {{ _('Contest') }}{{ _('Users') }}
    +
    + {{ contest_head(contest) }} + {{ time_left(contest) }} +
    +
    + {{ user_count(contest, request.user) }} +
    + {% csrf_token %} + +
    + {% if page_obj and page_obj.num_pages > 1 %} +
    + {% include "list-pages.html" %} +
    + {% endif %} + {% endif %} +
    +{% endblock %} diff --git a/templates/contest/media-js.html b/templates/contest/media-js.html new file mode 100644 index 0000000..3e0ac48 --- /dev/null +++ b/templates/contest/media-js.html @@ -0,0 +1,13 @@ + \ No newline at end of file diff --git a/templates/contest/moss.html b/templates/contest/moss.html new file mode 100644 index 0000000..143bcd3 --- /dev/null +++ b/templates/contest/moss.html @@ -0,0 +1,87 @@ +{% extends "common-content.html" %} + +{% block title_ruler %}{% endblock %} + +{% block title_row %} + {% set tab = 'moss' %} + {% set title = contest.name %} + {% include "contest/contest-tabs.html" %} +{% endblock %} + +{% block content_media %} + +{% endblock %} + +{% block content_js_media %} + +{% endblock %} +{% block body %} + {% if has_results %} + + + + + {% for lang in languages %} + + {% endfor %} + + + + {% for problem, results in moss_results %} + + + {% for result in results %} + + {% endfor %} + + {% endfor %} + +
    {{ _('Problem') }}{{ lang }}
    + {{ problem.name }} + + {% if result.submission_count %} + {{ result.submission_count }} {{_('submissions')}} + {% else %} + {{ _('No submissions') }} + {% endif %} +
    + {% endif %} +
    +
    +
    + {% csrf_token %} + +
    +
    + {% if has_results %} +
    +
    + {% csrf_token %} + +
    +
    + {% endif %} +
    +{% endblock %} diff --git a/templates/contest/preview.html b/templates/contest/preview.html new file mode 100644 index 0000000..fca7ab2 --- /dev/null +++ b/templates/contest/preview.html @@ -0,0 +1,4 @@ +{{ preview_data|markdown('contest', MATH_ENGINE)|reference|str|safe }} +{% if REQUIRE_JAX %} +
    +{% endif %} \ No newline at end of file diff --git a/templates/contest/private.html b/templates/contest/private.html new file mode 100644 index 0000000..fbb9c13 --- /dev/null +++ b/templates/contest/private.html @@ -0,0 +1,20 @@ +{% extends "base.html" %} + +{% block body %} + {% if error.is_private %} +

    {{ _('This contest is private to specific users.') }}

    + {% endif %} + + {% if error.is_organization_private %} + {% if error.is_private %} +

    {{ _('Additionally, only the following organizations may access this contest:') }}

    + {% else %} +

    {{ _('Only the following organizations may access this contest:') }}

    + {% endif %} + + {% endif %} +{% endblock %} diff --git a/templates/contest/ranking-table.html b/templates/contest/ranking-table.html new file mode 100644 index 0000000..966640c --- /dev/null +++ b/templates/contest/ranking-table.html @@ -0,0 +1,68 @@ +{% extends "user/base-users-table.html" %} + +{% block after_rank_head %} + {% if has_rating %} + {{ _('Rating') }} + {% endif %} + {{ _('Organization') }} +{% endblock %} + +{% block after_rank %} + {% if has_rating %} + {% if user.participation_rating %}{{ rating_number(user.participation_rating) }}{% endif %} + {% endif %} + + {% if user.organization %} + + {{- user.organization.short_name -}} + + {% endif %} + +{% endblock %} + +{% block user_data %} + {% if is_organizer %} + +
    + {% csrf_token %} + + {% if user.participation.is_disqualified %} + + {% else %} + + {% endif %} +
    + {% if perms.judge.change_contestparticipation %} + + {% endif %} +
    + {% endif %} +{% endblock %} + +{% block before_point_head %} + {% for problem in problems %} + + {{- loop.index }} +
    {{ problem.points }}
    +
    + {% endfor %} +{% endblock %} + +{% block row_extra %} + {% if user.participation.is_disqualified %} + class="disqualified" + {% endif %} +{% endblock %} + +{% block before_point %} + {% for cell in user.problem_cells %} + {{ cell }} + {% endfor %} +{% endblock %} + +{% block point %} + {{ user.result_cell }} +{% endblock %} diff --git a/templates/contest/ranking.html b/templates/contest/ranking.html new file mode 100644 index 0000000..00677b2 --- /dev/null +++ b/templates/contest/ranking.html @@ -0,0 +1,259 @@ +{% extends "user/base-users.html" %} + +{% block title_ruler %}{% endblock %} + +{% block title_row %} + {% set title = contest.name %} + {% include "contest/contest-tabs.html" %} +{% endblock %} + +{% block users_media %} + + + {% if has_rating %} + + {% endif %} + + +{% endblock %} + +{% block users_js_media %} + {% if is_organizer %} + + {% endif %} + {% if perms.judge.change_contestparticipation %} + + {% endif %} + {% if not contest.ended %} + + {% endif %} + + {% include "contest/media-js.html" %} +{% endblock %} + +{% block users_table %} +
    + {% if tab == 'participation' %} + {% if contest.start_time <= now or perms.judge.see_private_contest %} + + {% endif %} + {% endif %} + + +
    + {% include "contest/ranking-table.html" %} +{% endblock %} diff --git a/templates/contest/stats.html b/templates/contest/stats.html new file mode 100644 index 0000000..85a6259 --- /dev/null +++ b/templates/contest/stats.html @@ -0,0 +1,58 @@ +{% extends "common-content.html" %} + +{% block title_ruler %}{% endblock %} + +{% block title_row %} + {% set tab = 'stats' %} + {% set title = contest.name %} + {% include "contest/contest-tabs.html" %} +{% endblock %} + +{% block content_js_media %} + + {% compress js %} + {% include "stats/media-js.html" %} + + {% endcompress %} + {% include "contest/media-js.html" %} +{% endblock %} + +{% block content_media %} + +{% endblock %} + +{% block body %} +

    {{ _('Problem Status Distribution') }}

    +
    + +
    + +

    {{ _('Problem AC Rate') }}

    +
    + +
    + +

    {{ _('Submissions by Language') }}

    +
    + +
      +
      + +

      {{ _('Language AC Rate') }}

      +
      + +
      +{% endblock %} diff --git a/templates/contest/tag-ajax.html b/templates/contest/tag-ajax.html new file mode 100644 index 0000000..96dbaa8 --- /dev/null +++ b/templates/contest/tag-ajax.html @@ -0,0 +1,7 @@ +{% if not title %} + {% include "contest/tag-title.html" %} +

      +
      +{% endif %} + +{{ tag.description|markdown('contest_tag') }} diff --git a/templates/contest/tag-title.html b/templates/contest/tag-title.html new file mode 100644 index 0000000..d3309fa --- /dev/null +++ b/templates/contest/tag-title.html @@ -0,0 +1,11 @@ +

      + + {{- tag.name -}} + +

      + +{% if perms.judge.change_contesttag %} + +{% endif %} diff --git a/templates/contest/tag.html b/templates/contest/tag.html new file mode 100644 index 0000000..955c092 --- /dev/null +++ b/templates/contest/tag.html @@ -0,0 +1,9 @@ +{% extends "base.html" %} + +{% block content_title %} + {% include "contest/tag-title.html" %} +{% endblock %} + +{% block body %} + {% include "contest/tag-ajax.html" %} +{% endblock %} \ No newline at end of file diff --git a/templates/error.html b/templates/error.html new file mode 100644 index 0000000..7690e7c --- /dev/null +++ b/templates/error.html @@ -0,0 +1,39 @@ + + + {{ code }} - {{ id }} + + + +

      SIGSEGV: {{ id }}

      +
      {{ description }}
      +site: fatal signal: Segmentation fault
      +site died (signal {{ code }}, exit -11)

      panic: go back
      +{% if request.user.is_superuser and traceback %} +
      {{ traceback }}
      +{% endif %} + + diff --git a/templates/extra_js.html b/templates/extra_js.html new file mode 100644 index 0000000..e69de29 diff --git a/templates/flatpages/admin_link.html b/templates/flatpages/admin_link.html new file mode 100644 index 0000000..521300e --- /dev/null +++ b/templates/flatpages/admin_link.html @@ -0,0 +1,5 @@ +{% if perms.flatpages.change_flatpage %} + +{% endif %} \ No newline at end of file diff --git a/templates/flatpages/default.html b/templates/flatpages/default.html new file mode 100644 index 0000000..15c4113 --- /dev/null +++ b/templates/flatpages/default.html @@ -0,0 +1,15 @@ +{% extends "base.html" %} +{% block title %}{{ flatpage.title }} - {{ SITE_LONG_NAME }}{% endblock %} +{% block og_title %} + +{% endblock %} + +{% block content_title %}{{ flatpage.title }}{% endblock %} + +{% block header %} + {% include "flatpages/admin_link.html" %} +{% endblock %} + +{% block body %} + {{ render_django(flatpage.content) }} +{% endblock %} \ No newline at end of file diff --git a/templates/flatpages/markdown.html b/templates/flatpages/markdown.html new file mode 100644 index 0000000..ab7867f --- /dev/null +++ b/templates/flatpages/markdown.html @@ -0,0 +1,14 @@ +{% extends "base.html" %} +{% block title %}{{ flatpage.title }} - {{ SITE_LONG_NAME }}{% endblock %} + +{% block og_title %} + +{% endblock %} + +{% block content_title %}{{ flatpage.title }}{% endblock %} + +{% block header %}{% include "flatpages/admin_link.html" %}{% endblock %} + +{% block body %} +
      {{ flatpage.content|markdown('solution')|reference|str|safe }}
      +{% endblock %} \ No newline at end of file diff --git a/templates/flatpages/markdown_math.html b/templates/flatpages/markdown_math.html new file mode 100644 index 0000000..01bb593 --- /dev/null +++ b/templates/flatpages/markdown_math.html @@ -0,0 +1,9 @@ +{% extends "flatpages/markdown.html" %} + +{% block body %} +
      {{ flatpage.content|markdown('solution', MATH_ENGINE)|reference }}
      +{% endblock %} + +{% block bodyend %} + {% if REQUIRE_JAX %}{% include "mathjax-load.html" %}{% endif %} +{% endblock %} \ No newline at end of file diff --git a/templates/generic-message.html b/templates/generic-message.html new file mode 100644 index 0000000..2c125ab --- /dev/null +++ b/templates/generic-message.html @@ -0,0 +1,5 @@ +{% extends "base.html" %} + +{% block body %} +

      {{ message }}

      +{% endblock %} \ No newline at end of file diff --git a/templates/home.html b/templates/home.html new file mode 100644 index 0000000..059328c --- /dev/null +++ b/templates/home.html @@ -0,0 +1,23 @@ +{% extends "blog/list.html" %} +{% block before_posts %} + {% if i18n_config.home_page_top %} + {{ render_django(i18n_config.home_page_top, request=request, user_count=user_count, problem_count=problem_count, submission_count=submission_count, language_count=language_count, perms=perms) }} + {% endif %} +{% endblock %} +{% block meta %} + {% if i18n_config.meta_description %} + + {% endif %} + +{% endblock %} diff --git a/templates/license-preview.html b/templates/license-preview.html new file mode 100644 index 0000000..b3f8b89 --- /dev/null +++ b/templates/license-preview.html @@ -0,0 +1 @@ +{{ preview_data|markdown('license') }} \ No newline at end of file diff --git a/templates/license.html b/templates/license.html new file mode 100644 index 0000000..04e1e54 --- /dev/null +++ b/templates/license.html @@ -0,0 +1,13 @@ +{% extends "common-content.html" %} +{% block description %} + {% cache 3600 'license_html' license.id %} + {{ license.text|markdown('license') }} + {% endcache %} +{% endblock %} + +{% block info_float %} + {% if perms.judge.change_license %} + + {% endif %} +
      {{ _('Source:') }} {{ license.link }}
      +{% endblock %} \ No newline at end of file diff --git a/templates/list-pages.html b/templates/list-pages.html new file mode 100644 index 0000000..463797c --- /dev/null +++ b/templates/list-pages.html @@ -0,0 +1,31 @@ +
        + {% if page_obj.has_previous() %} + {% if page_obj.previous_page_number() == 1 and first_page_href != None %} +
      • «
      • + {% else %} +
      • «
      • + {% endif %} + {% else %} +
      • «
      • + {% endif %} + + {% for page in page_obj.page_range %} + {% if not page %} +
      • ...
      • + {% else %} + {{ page }} + {% endif %} + {% endfor %} + + {% if page_obj.has_next() %} +
      • »
      • + {% else %} +
      • »
      • + {% endif %} +
      diff --git a/templates/mathjax-load.html b/templates/mathjax-load.html new file mode 100644 index 0000000..19415ed --- /dev/null +++ b/templates/mathjax-load.html @@ -0,0 +1,12 @@ + + + diff --git a/templates/messages.html b/templates/messages.html new file mode 100644 index 0000000..1c4a5d0 --- /dev/null +++ b/templates/messages.html @@ -0,0 +1,7 @@ +{% if messages %} +
        + {% for message in messages %} +
      • {{ message }}
      • + {% endfor %} +
      +{% endif %} diff --git a/templates/newsletter/common.html b/templates/newsletter/common.html new file mode 100644 index 0000000..8b97e39 --- /dev/null +++ b/templates/newsletter/common.html @@ -0,0 +1,16 @@ + + + + + {% block title %}{{ _('Newsletter') }}{% endblock title %} + + {% block header %} + {% endblock header %} + + + + {% block body %} + {% endblock body %} + + diff --git a/templates/newsletter/message/message.html b/templates/newsletter/message/message.html new file mode 100644 index 0000000..c23708f --- /dev/null +++ b/templates/newsletter/message/message.html @@ -0,0 +1,22 @@ + + + + + + {{ newsletter.title }}: {{ message.title }} + + + {% for article in message.articles.all() %} +
      {{ article.text|safe }}
      + + {% if article.url %} + + {% endif %} + {% endfor %} + + Unsubscribe + {% if submission and submission.publish %} + Read message online + {% endif %} + + diff --git a/templates/newsletter/message/message.txt b/templates/newsletter/message/message.txt new file mode 100644 index 0000000..d348e53 --- /dev/null +++ b/templates/newsletter/message/message.txt @@ -0,0 +1,15 @@ +++++++++++++++++++++ + +{{ newsletter.title|safe }}: {{ message.title|safe }} + +++++++++++++++++++++ + +{% for article in message.articles.all() %} +{{ article.title|safe }} +{{ article.text|striptags|safe }} + +{% endfor %} + +++++++++++++++++++++ + +Unsubscribe: http://{{ site }}{{ url('newsletter_unsubscribe_request', newsletter.slug) }} \ No newline at end of file diff --git a/templates/newsletter/message/message_subject.txt b/templates/newsletter/message/message_subject.txt new file mode 100644 index 0000000..b770ecb --- /dev/null +++ b/templates/newsletter/message/message_subject.txt @@ -0,0 +1 @@ +{{ message.title|safe }} \ No newline at end of file diff --git a/templates/newsletter/message/subscribe.html b/templates/newsletter/message/subscribe.html new file mode 100644 index 0000000..11a8c36 --- /dev/null +++ b/templates/newsletter/message/subscribe.html @@ -0,0 +1,20 @@ + + + + + + Subscription to {{ newsletter.title }} + + +Dear {{ subscription.name }}, + +you, or someone in your name requested a subscription to {{ newsletter.title }}. + +If you would like to confirm your subscription, please follow this activation link: +http://{{ site.domain }}{{ subscription.subscribe_activate_url }} + +Kind regards, +{{ newsletter.sender }} + + diff --git a/templates/newsletter/message/subscribe.txt b/templates/newsletter/message/subscribe.txt new file mode 100644 index 0000000..a2bd3c8 --- /dev/null +++ b/templates/newsletter/message/subscribe.txt @@ -0,0 +1,9 @@ +Dear {{ subscription.name|safe }}, + +you, or someone in your name requested a subscription to {{ newsletter.title|safe }}. + +If you would like to confirm your subscription, please follow this activation link: +http://{{ site.domain }}{{ subscription.subscribe_activate_url }} + +Kind regards, +{{ newsletter.sender|safe }} \ No newline at end of file diff --git a/templates/newsletter/message/subscribe_subject.txt b/templates/newsletter/message/subscribe_subject.txt new file mode 100644 index 0000000..05dd618 --- /dev/null +++ b/templates/newsletter/message/subscribe_subject.txt @@ -0,0 +1 @@ +{{ newsletter.title|safe }} - Confirm subscription \ No newline at end of file diff --git a/templates/newsletter/message/unsubscribe.html b/templates/newsletter/message/unsubscribe.html new file mode 100644 index 0000000..8780eca --- /dev/null +++ b/templates/newsletter/message/unsubscribe.html @@ -0,0 +1,20 @@ + + + + + + Unsubscription from {{ newsletter.title }} + + +Dear {{ subscription.name }}, + +you, or someone in your name requested unsubscription from {{ newsletter.title }}. + +If you would like to confirm your unsubscription, please follow this activation link: +http://{{ site.domain }}{{ subscription.unsubscribe_activate_url }} + +Kind regards, +{{ newsletter.sender }} + + diff --git a/templates/newsletter/message/unsubscribe.txt b/templates/newsletter/message/unsubscribe.txt new file mode 100644 index 0000000..9ca0d34 --- /dev/null +++ b/templates/newsletter/message/unsubscribe.txt @@ -0,0 +1,9 @@ +Dear {{ subscription.name|safe }}, + +you, or someone in your name requested unsubscription from {{ newsletter.title|safe }}. + +If you would like to confirm your unsubscription, please follow this activation link: +http://{{ site.domain }}{{ subscription.unsubscribe_activate_url }} + +Kind regards, +{{ newsletter.sender|safe }} diff --git a/templates/newsletter/message/unsubscribe_subject.txt b/templates/newsletter/message/unsubscribe_subject.txt new file mode 100644 index 0000000..5b824c2 --- /dev/null +++ b/templates/newsletter/message/unsubscribe_subject.txt @@ -0,0 +1 @@ +{{ newsletter.title|safe }} - Confirm unsubscription \ No newline at end of file diff --git a/templates/newsletter/message/update.html b/templates/newsletter/message/update.html new file mode 100644 index 0000000..a0838c4 --- /dev/null +++ b/templates/newsletter/message/update.html @@ -0,0 +1,20 @@ + + + + + + Update of subscription to {{ newsletter.title }} + + +Dear {{ subscription.name }}, + +you, or someone in your name requested updating your personal information for {{ newsletter.title }}. + +To make changes to your information in our database, please follow this activation link: +http://{{ site.domain }}{{ subscription.update_activate_url }} + +Kind regards, +{{ newsletter.sender }} + + diff --git a/templates/newsletter/message/update.txt b/templates/newsletter/message/update.txt new file mode 100644 index 0000000..d46d828 --- /dev/null +++ b/templates/newsletter/message/update.txt @@ -0,0 +1,9 @@ +Dear {{ subscription.name|safe }}, + +you, or someone in your name requested updating your personal information for {{ newsletter.title|safe }}. + +To make changes to your information in our database, please follow this activation link: +http://{{ site.domain }}{{ subscription.update_activate_url }} + +Kind regards, +{{ newsletter.sender|safe }} \ No newline at end of file diff --git a/templates/newsletter/message/update_subject.txt b/templates/newsletter/message/update_subject.txt new file mode 100644 index 0000000..9002b7e --- /dev/null +++ b/templates/newsletter/message/update_subject.txt @@ -0,0 +1 @@ +{{ newsletter.title|safe }} - Update information \ No newline at end of file diff --git a/templates/newsletter/newsletter_detail.html b/templates/newsletter/newsletter_detail.html new file mode 100644 index 0000000..4b84ec3 --- /dev/null +++ b/templates/newsletter/newsletter_detail.html @@ -0,0 +1,13 @@ +{% extends "base.html" %} + +{% block title %}{{ object.title }} - Newsletter - {{ SITE_LONG_NAME }}{% endblock %} +{% block content_title %}Newsletter: {{ object.title }}{% endblock %} + +{% block body %} + +{% endblock %} \ No newline at end of file diff --git a/templates/newsletter/newsletter_list.html b/templates/newsletter/newsletter_list.html new file mode 100644 index 0000000..86b200c --- /dev/null +++ b/templates/newsletter/newsletter_list.html @@ -0,0 +1,42 @@ +{% extends "base.html" %} +{% block title %}Newsletter list - {{ SITE_LONG_NAME }}{% endblock %} +{% block content_title %}Newsletter list{% endblock %} + +{% block body %} + {% if request.user.is_authenticated %} +
      + {% csrf_token %} + {{ formset.management_form }} + + + + + + {% for form in formset.forms %} + + + + + {% endfor %} +
      NewsletterSubscribe
      {{ form.id }}{{ form.newsletter }} + + {{ form.instance.newsletter.title }} + {{ form.subscribed }}
      +
      +

      + +

      +
      + {% else %} + + + + + {% for newsletter in object_list %} + + + + {% endfor %} +
      Newsletter
      {{ newsletter.title }}
      + {% endif %} +{% endblock %} \ No newline at end of file diff --git a/templates/newsletter/submission_archive.html b/templates/newsletter/submission_archive.html new file mode 100644 index 0000000..49bdeda --- /dev/null +++ b/templates/newsletter/submission_archive.html @@ -0,0 +1,13 @@ +{% extends "base.html" %} +{% block title %}{{ object.title }} - Newsletter Archive - {{ SITE_LONG_NAME }}{% endblock %} +{% block content_title %}Newsletter Archive: {{ object.title }}{% endblock %} + +{% block body %} + +
      +

      Back to list

      +{% endblock %} \ No newline at end of file diff --git a/templates/newsletter/subscription_activate.html b/templates/newsletter/subscription_activate.html new file mode 100644 index 0000000..40d9cac --- /dev/null +++ b/templates/newsletter/subscription_activate.html @@ -0,0 +1,12 @@ +{% extends "base.html" %} + +{% block title %}Newsletter {{ newsletter.title }} {{ action }} activate{% endblock %} + +{% block body %} +

      Newsletter {{ newsletter.title }} {{ action }} activate

      +
      + {% csrf_token %} + {{ form.as_p() }} +

      +
      +{% endblock %} \ No newline at end of file diff --git a/templates/newsletter/subscription_subscribe.html b/templates/newsletter/subscription_subscribe.html new file mode 100644 index 0000000..97c22b2 --- /dev/null +++ b/templates/newsletter/subscription_subscribe.html @@ -0,0 +1,19 @@ +{% extends "base.html" %} + +{% block title %}Newsletter subscribe{% endblock %} + +{% block body %} +

      Newsletter subscribe {{ newsletter.title }}

      + {% if error %} +

      + Due to a technical error we were not able to submit your confirmation email. + This could be because your email address is invalid. +

      + {% else %} +
      + {% csrf_token %} + {{ form.as_p() }} +

      +
      + {% endif %} +{% endblock %} \ No newline at end of file diff --git a/templates/newsletter/subscription_subscribe_activated.html b/templates/newsletter/subscription_subscribe_activated.html new file mode 100644 index 0000000..4b9f50b --- /dev/null +++ b/templates/newsletter/subscription_subscribe_activated.html @@ -0,0 +1,7 @@ +{% extends "base.html" %} + +{% block title %}Newsletter {{ newsletter.title }} {{ action }} activate{% endblock %} +{% block body %} +

      Newsletter {{ newsletter.title }} {{ action }} activate

      +

      Your subscription has successfully been activated.

      +{% endblock %} \ No newline at end of file diff --git a/templates/newsletter/subscription_subscribe_email_sent.html b/templates/newsletter/subscription_subscribe_email_sent.html new file mode 100644 index 0000000..84e5ca5 --- /dev/null +++ b/templates/newsletter/subscription_subscribe_email_sent.html @@ -0,0 +1,8 @@ +{% extends "base.html" %} +{% block title %}Newsletter subscribe{% endblock %} + +{% block body %} +

      Newsletter subscribe {{ newsletter.title }}

      +

      Your subscription 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 activate your subscription.

      +{% endblock %} \ No newline at end of file diff --git a/templates/newsletter/subscription_subscribe_user.html b/templates/newsletter/subscription_subscribe_user.html new file mode 100644 index 0000000..5f13a79 --- /dev/null +++ b/templates/newsletter/subscription_subscribe_user.html @@ -0,0 +1,22 @@ +{% extends "base.html" %} + +{% block title %}Newsletter subscribe{% endblock %} + +{% block body %} +

      Newsletter subscribe {{ newsletter.title }}

      +

      Welcome, {{ request.user }}!

      + {% if messages %} +
        + {% for message in messages %} +
      • {{ message }}
      • + {% endfor %} +
      + {% else %} + Do you want to subscribe to this newsletter? +
      + {% csrf_token %} +

      +
      + {% endif %} +{% endblock %} \ No newline at end of file diff --git a/templates/newsletter/subscription_unsubscribe.html b/templates/newsletter/subscription_unsubscribe.html new file mode 100644 index 0000000..3647d27 --- /dev/null +++ b/templates/newsletter/subscription_unsubscribe.html @@ -0,0 +1,17 @@ +{% extends "base.html" %} + +{% block title %}Newsletter unsubscribe{% endblock %} + +{% block body %} +

      Newsletter unsubscribe {{ newsletter.title }}

      + {% if error %} +

      Due to a technical error we were not able to submit your confirmation email. + This could be because your email address is invalid.

      + {% else %} +
      + {% csrf_token %} + {{ form.as_p() }} +

      +
      + {% endif %} +{% endblock %} \ No newline at end of file diff --git a/templates/newsletter/subscription_unsubscribe_activated.html b/templates/newsletter/subscription_unsubscribe_activated.html new file mode 100644 index 0000000..baafefd --- /dev/null +++ b/templates/newsletter/subscription_unsubscribe_activated.html @@ -0,0 +1,9 @@ +{% extends "newsletter/common.html" %} + +{% block title %}{{ _('Newsletter') }} {{ newsletter.title }} {{ action }} {{ _('activate') }}{% endblock title %} + +{% block body %} +

      {{ _('Newsletter') }} {{ newsletter.title }} {{ action }} {{ _('activate') }}

      + +

      {{ _('You have successfully been unsubscribed.') }}

      +{% endblock body %} diff --git a/templates/newsletter/subscription_unsubscribe_email_sent.html b/templates/newsletter/subscription_unsubscribe_email_sent.html new file mode 100644 index 0000000..4a1d4c8 --- /dev/null +++ b/templates/newsletter/subscription_unsubscribe_email_sent.html @@ -0,0 +1,9 @@ +{% extends "newsletter/common.html" %} + +{% block title %}{{ _('Newsletter unsubscribe') }}{% endblock title %} + +{% block body %} +

      {{ _('Newsletter unsubscribe') }} {{ newsletter.title }}

      + +

      {{ _('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.') }}

      +{% endblock body %} diff --git a/templates/newsletter/subscription_unsubscribe_user.html b/templates/newsletter/subscription_unsubscribe_user.html new file mode 100644 index 0000000..ee905b7 --- /dev/null +++ b/templates/newsletter/subscription_unsubscribe_user.html @@ -0,0 +1,25 @@ +{% extends "newsletter/common.html" %} + +{% block title %}{{ _('Newsletter unsubscribe') }}{% endblock title %} + +{% block body %} +

      {{ _('Newsletter unsubscribe') }} {{ newsletter.title }}

      + +

      Welcome, {{ request.user }}!

      + + {% if messages %} +
        + {% for message in messages %} +
      • {{ message }}
      • + {% endfor %} +
      + {% else %} + {{ _('Do you want to unsubscribe from this newsletter?') }} +
      + {% csrf_token %} +

      +
      + {% endif %} + +{% endblock body %} diff --git a/templates/newsletter/subscription_update.html b/templates/newsletter/subscription_update.html new file mode 100644 index 0000000..8150646 --- /dev/null +++ b/templates/newsletter/subscription_update.html @@ -0,0 +1,17 @@ +{% extends "newsletter/common.html" %} + +{% block title %}{{ _('Newsletter update') }}{% endblock title %} + +{% block body %} +

      {{ _('Newsletter update') }} {{ newsletter.title }}

      + + {% if error %} +

      {{ _('Due to a technical error we were not able to submit your confirmation email. This could be because your email address is invalid.') }}

      + {% else %} +
      + {% csrf_token %} + {{ form.as_p() }} +

      +
      + {% endif %} +{% endblock body %} diff --git a/templates/newsletter/subscription_update_activated.html b/templates/newsletter/subscription_update_activated.html new file mode 100644 index 0000000..5707711 --- /dev/null +++ b/templates/newsletter/subscription_update_activated.html @@ -0,0 +1,9 @@ +{% extends "newsletter/common.html" %} + +{% block title %}{{ _('Newsletter') }} {{ newsletter.title }} {{ action }} {{ _('activate') }}{% endblock title %} + +{% block body %} +

      {{ _('Newsletter') }} {{ newsletter.title }} {{ action }} {{ _('activate') }}

      + +

      {{ _('Your subscription has successfully been updated.') }}

      +{% endblock body %} diff --git a/templates/newsletter/subscription_update_email_sent.html b/templates/newsletter/subscription_update_email_sent.html new file mode 100644 index 0000000..ea03d6b --- /dev/null +++ b/templates/newsletter/subscription_update_email_sent.html @@ -0,0 +1,9 @@ +{% extends "newsletter/common.html" %} + +{% block title %}{{ _('Newsletter update') }}{% endblock title %} + +{% block body %} +

      {{ _('Newsletter update') }} {{ newsletter.title }}

      + +

      {{ _('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.') }}

      +{% endblock body %} diff --git a/templates/organization/edit.html b/templates/organization/edit.html new file mode 100644 index 0000000..5336f73 --- /dev/null +++ b/templates/organization/edit.html @@ -0,0 +1,48 @@ +{% extends "base.html" %} + +{% block js_media %} + {{ form.media.js }} + +{% endblock %} + +{% block media %} + {{ form.media.css }} + + + + +{% endblock %} + +{% block body %} +
      + {% csrf_token %} + {{ form.as_table() }}
      + +
      +{% endblock %} \ No newline at end of file diff --git a/templates/organization/home.html b/templates/organization/home.html new file mode 100644 index 0000000..3df7ac7 --- /dev/null +++ b/templates/organization/home.html @@ -0,0 +1,63 @@ +{% extends "common-content.html" %} + +{% block content_js_media %} + +{% endblock %} + +{% block info_float %} + {% if request.user.is_authenticated %} + {% if request.profile in organization %} +
      + {% csrf_token %} + +
      + {% elif organization.is_open %} +
      + {% csrf_token %} + +
      + {% else %} + {{ _('Request membership') }} + {% endif %} +
      + {% endif %} + + {% if can_edit %} + + + {% if not organization.is_open %} + + {% endif %} + {% endif %} + + {% if perms.judge.change_organization %} + + {% endif %} + + +{% endblock %} + +{% block description %} + {% cache 3600 'organization_html' organization.id MATH_ENGINE %} + {{ organization.about|markdown('organization-about', MATH_ENGINE)|reference|str|safe }} + {% endcache %} +{% endblock %} diff --git a/templates/organization/list.html b/templates/organization/list.html new file mode 100644 index 0000000..402fdaf --- /dev/null +++ b/templates/organization/list.html @@ -0,0 +1,36 @@ +{% extends "base.html" %} +{% block js_media %} + + +{% endblock %} + +{% block title_ruler %}{% endblock %} + +{% block title_row %} + {% set tab = 'organizations' %} + {% set title = _('Organizations') %} + {% include "user/user-list-tabs.html" %} +{% endblock %} + +{% block body %} + + + + + + + + + {% for org in organizations %} + + + + + {% endfor %} + +
      {{ _('Name') }}{{ _('Members') }}
      {{ org.name }}{{ org.member_count }}
      +{% endblock %} diff --git a/templates/organization/new.html b/templates/organization/new.html new file mode 100644 index 0000000..916c173 --- /dev/null +++ b/templates/organization/new.html @@ -0,0 +1,12 @@ +{% extends "base.html" %} + +{% block js_media %}{{ form.media.js }}{% endblock %} +{% block media %}{{ form.media.css }}{% endblock %} + +{% block body %} +
      + {% csrf_token %} + {{ form.as_table() }}
      + +
      +{% endblock %} \ No newline at end of file diff --git a/templates/organization/preview.html b/templates/organization/preview.html new file mode 100644 index 0000000..abb14a6 --- /dev/null +++ b/templates/organization/preview.html @@ -0,0 +1,4 @@ +{{ preview_data|markdown('organization-about', MATH_ENGINE)|reference|str|safe }} +{% if REQUIRE_JAX %} +
      +{% endif %} \ No newline at end of file diff --git a/templates/organization/requests/detail.html b/templates/organization/requests/detail.html new file mode 100644 index 0000000..562be13 --- /dev/null +++ b/templates/organization/requests/detail.html @@ -0,0 +1,35 @@ +{% extends "base.html" %} +{% block media %} + +{% endblock %} + +{% block body %} + + + + + + + + + + + + + + + + + + + +
      {{ _('User:') }}{{ link_user(object.user) }}
      {{ _('Organization:') }} + {% with org=object.organization %} + {{ org.name }} + {% endwith %} +
      {{ _('Time:') }}{{ object.time|date(_("N j, Y, g:i a")) }}
      {{ _('Reason:') }}
      {{ object.reason }}
      +{% endblock %} \ No newline at end of file diff --git a/templates/organization/requests/log.html b/templates/organization/requests/log.html new file mode 100644 index 0000000..c05651b --- /dev/null +++ b/templates/organization/requests/log.html @@ -0,0 +1,30 @@ +{% extends "base.html" %} + +{% block body %} + {% include "organization/requests/tabs.html" %} + + {% if requests %} + + + + + + + + {% for r in requests %} + + + + + + + {% endfor %} +
      {{ _('User') }}{{ _('Time') }}{{ _('State') }}{{ _('Reason') }}
      {{ link_user(r.user) }} + + {{- r.time|date(_("N j, Y, H:i")) -}} + + {{ r.state }}{{ r.reason|truncatechars(50) }}
      + {% else %} +

      {{ _('There are no requests to approve.') }}

      + {% endif %} +{% endblock %} diff --git a/templates/organization/requests/pending.html b/templates/organization/requests/pending.html new file mode 100644 index 0000000..302ba62 --- /dev/null +++ b/templates/organization/requests/pending.html @@ -0,0 +1,39 @@ +{% extends "base.html" %} +{% block body %} + {% include "messages.html" %} + {% include "organization/requests/tabs.html" %} + + {% if formset.forms %} +
      + {% csrf_token %} + {{ formset.management_form }} + + + + + + + {% if formset.can_delete %} + + {% endif %} + + {% for form in formset %} + + + + + + {% if formset.can_delete %} + + {% endif %} + + {% endfor %} +
      {{ _('User') }}{{ _('Time') }}{{ _('State') }}{{ _('Reason') }}{{ _('Delete?') }}
      {{ form.id }}{{ link_user(form.instance.user) }} + {{ form.instance.time|date(_("N j, Y, H:i")) }} + {{ form.state }}{{ form.instance.reason|truncatechars(50) }}{{ form.DELETE }}
      + +
      + {% else %} +

      {{ _('There are no requests to approve.') }}

      + {% endif %} +{% endblock %} \ No newline at end of file diff --git a/templates/organization/requests/request.html b/templates/organization/requests/request.html new file mode 100644 index 0000000..dff6e8d --- /dev/null +++ b/templates/organization/requests/request.html @@ -0,0 +1,22 @@ +{% extends "base.html" %} + +{% block js_media %} + +{% endblock %} + +{% block body %} +
      + {% csrf_token %} +

      +

      {{ form.reason }}

      + +
      +{% endblock %} diff --git a/templates/organization/requests/tabs.html b/templates/organization/requests/tabs.html new file mode 100644 index 0000000..569f75a --- /dev/null +++ b/templates/organization/requests/tabs.html @@ -0,0 +1,16 @@ + \ No newline at end of file diff --git a/templates/organization/users-table.html b/templates/organization/users-table.html new file mode 100644 index 0000000..873e985 --- /dev/null +++ b/templates/organization/users-table.html @@ -0,0 +1,19 @@ +{% extends "user/users-table.html" %} + +{% block before_point_head %} + {% if is_admin %} + + {% endif %} +{% endblock %} + +{% block before_point %} + {% if is_admin %} + +
      + {% csrf_token %} + + {{ _('Kick') }} +
      + + {% endif %} +{% endblock %} diff --git a/templates/organization/users.html b/templates/organization/users.html new file mode 100644 index 0000000..fee0c5f --- /dev/null +++ b/templates/organization/users.html @@ -0,0 +1,33 @@ +{% extends "user/base-users.html" %} +{% block users_media %} + + + {% if is_admin %} + + {% endif %} +{% endblock %} + +{% block users_js_media %} + +{% endblock %} + +{% block users_table %}{% include "organization/users-table.html" %}{% endblock %} diff --git a/templates/pagedown.html b/templates/pagedown.html new file mode 100644 index 0000000..74a038d --- /dev/null +++ b/templates/pagedown.html @@ -0,0 +1,14 @@ +
      +
      +
      + {{ body }} +
      + + {% if show_preview %} +
      +
      Update Preview
      +
      +
      + {% endif %} +
      diff --git a/templates/pagedown/widgets/default.html b/templates/pagedown/widgets/default.html new file mode 100644 index 0000000..607e4f1 --- /dev/null +++ b/templates/pagedown/widgets/default.html @@ -0,0 +1,9 @@ +
      +
      +
      + {{ body }} +
      + {% if show_preview %} +
      + {% endif %} +
      \ No newline at end of file diff --git a/templates/problem/clone.html b/templates/problem/clone.html new file mode 100644 index 0000000..dfd5fe7 --- /dev/null +++ b/templates/problem/clone.html @@ -0,0 +1,42 @@ +{% extends "base.html" %} + +{% block media %} + +{% endblock %} + +{% block body %} +
      + {% csrf_token %} + {% if form.errors %} +
      + {{ form.code.errors }} +
      + {% endif %} + +
      +
      {{ form.code }}
      +
      + +
      +{% endblock %} diff --git a/templates/problem/data.html b/templates/problem/data.html new file mode 100644 index 0000000..83d16ed --- /dev/null +++ b/templates/problem/data.html @@ -0,0 +1,451 @@ +{% extends "base.html" %} + +{% block js_media %} + + + + +{% endblock %} + +{% block media %} + +{% endblock %} + +{% block header %} + {% if data_form.instance.has_yml %} + + {% endif %} +{% endblock %} + +{% block body %} + {% if data_form.instance.feedback %} +
        +
      • {{ data_form.instance.feedback }}
      • +
      + {% endif %} +
      + {% csrf_token %} + {{ cases_formset.management_form }} + {{ data_form.as_table() }}
      +
      + {{ _('Show columns:') }} + + + + +
      + + + + + + + + + + + + + + {% if cases_formset.can_delete %} + + {% endif %} + + + + {% for form in all_case_forms %} + {% if form.non_field_errors() %} + + + + {% endif %} + {% if form.prefix and '__prefix__' in form.prefix %} + + + {% endif %} + + + + + {{ form.input_file.errors }}{{ form.input_file }} + + + {{ form.output_file.errors }}{{ form.output_file }} + + + + + + + + {% if cases_formset.can_delete %} + + {% endif %} + + {% endfor %} + +
      {{ _('Type') }}{{ _('Input file') }}{{ _('Output file') }}{{ _('Points') }}{{ _('Pretest?') }}{{ _('Output prefix') }}{{ _('Output limit') }}{{ _('Checker') }}{{ _('Generator args') }}{{ _('Delete?') }}
      {{ form.non_field_errors() }}
      + + {{ _('Add new case') }} +
      + +{% endblock %} diff --git a/templates/problem/editorial.html b/templates/problem/editorial.html new file mode 100644 index 0000000..afcebc6 --- /dev/null +++ b/templates/problem/editorial.html @@ -0,0 +1,40 @@ +{% extends "common-content.html" %} + +{% block content_js_media %} + {% include "comments/media-js.html" %} +{% endblock %} + +{% block content_media %} + {% include "comments/media-css.html" %} +{% endblock %} + +{% block header %} +
      + {% if perms.judge.change_problem %} + [{{ _('Edit') }}] + {% endif %} +
      +{% endblock %} + +{% block body %} +
      + {% if not has_solved_problem %} +
      {{ _('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.') }}
      + {% endif %} + {% with authors=solution.authors.all() %} + {% if authors %} +

      Authors: {{ link_users(authors) }}

      + {% endif %} + {% endwith %} + {{ solution.content|markdown('solution', MATH_ENGINE)|reference|str|safe }} +
      +
      + {% include "comments/list.html" %} +{% endblock %} + +{% block bodyend %} + {% if REQUIRE_JAX %} + {% include "mathjax-load.html" %} + {% endif %} + {% include "comments/math.html" %} +{% endblock %} diff --git a/templates/problem/list.html b/templates/problem/list.html new file mode 100644 index 0000000..0a8e1ac --- /dev/null +++ b/templates/problem/list.html @@ -0,0 +1,311 @@ +{% extends "common-content.html" %} + +{% block media %} + + + {% if not request.in_contest %} + + {% endif %} +{% endblock %} + +{% block js_media %} + + {% compress js %} + + + {% endcompress %} + {% if request.in_contest %} + {% compress js %} + + + {% endcompress %} + {% endif %} +{% endblock %} + +{% block title_ruler %}{% endblock %} + +{% block title_row %} + {% set tab = 'list' %} + {% set title = 'Problems' %} + {% include "problem/problem-list-tabs.html" %} +{% endblock %} + +{% block body %} + {% if page_obj.num_pages > 1 %} +
      + {% include "list-pages.html" %} +
      + {% endif %} + +
      + {% block before_table %}{% endblock %} + {% if not request.in_contest %} +
      +
      + {% include "problem/search-form.html" %} + {% if hot_problems %} + + {% endif %} +
      +
      + {% endif %} +
      + + + + {% if request.in_contest %} + {% if request.user.is_authenticated %} + + {% endif %} + + + {% if show_types %} + + {% endif %} + + + {% else %} + {% if request.user.is_authenticated %} + + {% endif %} + + + {% if show_types %} + + {% endif %} + + + + {% endif %} + + + + {% for problem in problems %} + + {% if request.user.is_authenticated %} + {% if problem.id in completed_problem_ids %} + + {% elif problem.id in attempted_problems %} + + {% else %} + + {% endif %} + {% endif %} + + + {% if show_types %} + + {% endif %} + + {% if not request.in_contest %} + + {% endif %} + + + {% endfor %} + +
      {{ _('Problem') }}{{ _('Category') }}{{ _('Types') }}{{ _('Points') }}{{ _('Users') }} + {{ sort_order.solved }} + + + {{ _('Problem') }}{{ sort_order.name }} + + {{ _('Category') }}{{ sort_order.group }} + + {{ _('Types') }}{{ sort_order.type }} + + {{ _('Points') }}{{ sort_order.points }} + + {{ _('AC %%') }}{{ sort_order.ac_rate }} + + {{ _('Users') }}{{ sort_order.user_count }} +
      + + {% if problem.is_public or request.in_contest %} + + {% else %} + + {% endif %} + + + + {% if problem.is_public or request.in_contest %} + + {% else %} + + {% endif %} + + + {% if problem.is_public or request.in_contest %} + + {% else %} + + {% endif %} + + {{ problem.i18n_name }} + {{ problem.group.full_name }} + {% for type in problem.types_list %} + {{ type }}{% if not loop.last %}, {% endif %} + {% endfor %} + {{ problem.points|floatformat }}{% if problem.partial %}p{% endif %}{{ problem.ac_rate|floatformat(1) }}% + + {% if not request.in_contest or not hide_contest_scoreboard %} + {{ problem.user_count }} + {% else %} + ??? + {% endif %} + +
      + {% if page_obj.num_pages > 1 %} +
      {% include "list-pages.html" %}
      + {% endif %} +
      +
      +
      +{% endblock %} diff --git a/templates/problem/manage_submission.html b/templates/problem/manage_submission.html new file mode 100644 index 0000000..9bc0a3c --- /dev/null +++ b/templates/problem/manage_submission.html @@ -0,0 +1,168 @@ +{% extends "base.html" %} + +{% block media %} + +{% endblock %} + +{% block js_media %} + +{% endblock %} + +{% block body %} + {% include "messages.html" %} + +
      + {% if request.user.has_perm('judge.rejudge_submission_lot') %} +
      +

      {{ _('Rejudge Submissions') }}

      +
      + {% csrf_token %} +
      + + + + + + + + + + +
      +

      {{ _('This range includes both endpoints.') }}

      +
      +
      + + +
      +
      + + +
      + + {{ _('Rejudge selected submissions') }} + +
      +
      + {% endif %} + +
      +

      {{ _('Rescore Everything') }}

      +

      {{ _('This will rescore %(count)d submissions.', count=submission_count) }}

      +
      + {% csrf_token %} + + {{ _('Rescore all submissions') }} + +
      +
      +
      +{% endblock %} diff --git a/templates/problem/preview.html b/templates/problem/preview.html new file mode 100644 index 0000000..cd6a093 --- /dev/null +++ b/templates/problem/preview.html @@ -0,0 +1,4 @@ +{{ preview_data|markdown('problem', MATH_ENGINE)|reference|str|safe }} +{% if REQUIRE_JAX %} +
      +{% endif %} \ No newline at end of file diff --git a/templates/problem/problem-list-tabs.html b/templates/problem/problem-list-tabs.html new file mode 100644 index 0000000..a3e5dfc --- /dev/null +++ b/templates/problem/problem-list-tabs.html @@ -0,0 +1,8 @@ +{% extends "tabs-base.html" %} + +{% block tabs %} + {% if perms.judge.edit_all_problem or perms.judge.edit_public_problem or perms.judge.edit_own_problem %} + {{ make_tab('list', 'fa-list', url('problem_list'), _('List')) }} + {{ make_tab('admin', 'fa-edit', url('admin:judge_problem_changelist'), _('Admin')) }} + {% endif %} +{% endblock %} diff --git a/templates/problem/problem.html b/templates/problem/problem.html new file mode 100644 index 0000000..65bd6a3 --- /dev/null +++ b/templates/problem/problem.html @@ -0,0 +1,332 @@ +{% extends "common-content.html" %} +{% block content_media %} + {% include "comments/media-css.html" %} + +{% endblock %} + +{% block content_js_media %} + {% include "comments/media-js.html" %} +{% endblock %} + +{% block title_row %} +
      + {% if request.user.is_authenticated %} + {% if problem.id in completed_problem_ids %} + + {% if problem.is_public or request.in_contest %} + + {% else %} + + {% endif %} + + {% elif problem.id in attempted_problems %} + + {% if problem.is_public or request.in_contest %} + + {% else %} + + {% endif %} + + {% endif %} + {% endif %} +

      {{ title }}

      + {% if problem.is_organization_private %} + + {% for org in problem.organizations.all() %} + + + {{ org.name }} + + + {% endfor %} + + {% endif %} + {% if has_pdf_render %} + + + + + + + {{ _('View as PDF') }} + + {% endif %} +
      +{% endblock %} + +{% block info_float %} + {% if request.user.is_authenticated and request.in_contest and submission_limit %} + {% if submissions_left > 0 %} + + {{ _('Submit solution') }} + +
      + {% trans trimmed counter=submissions_left %} + {{ counter }} submission left + {% pluralize %} + {{ counter }} submissions left + {% endtrans %} +
      + {% else %} + {{ _('Submit solution') }} +
      {{ _('0 submissions left') }}
      + {% endif %} + {% else %} + + {{ _('Submit solution') }} + + {% endif %} + +
      + + {% if request.user.is_authenticated and has_submissions %} + + {% endif %} + + + {% if editorial and editorial.is_public and + not (request.user.is_authenticated and request.profile.current_contest) %} +
      + + {% endif %} + {% if can_edit_problem %} +
      + + + {% if not problem.is_manually_managed %} + + {% endif %} + {% elif request.user.is_authenticated and has_tickets %} +
      + + {% endif %} + + {% if problem.is_subs_manageable_by(request.user) %} + + {% endif %} + + {% if perms.judge.clone_problem %} + + {% endif %} + +
      + +
      + {{ _('Points:') }} + + {% if contest_problem %} + {{ contest_problem.points }}{% if contest_problem.partial %} {{ _('(partial)') }}{% endif %} + {% else %} + {{ problem.points|floatformat }}{% if problem.partial %} {{ _('(partial)') }}{% endif %} + {% endif %} + +
      +
      + {{ _('Time limit:') }} + {{ problem.time_limit }}s +
      +
      + {% for name, limit in problem.language_time_limit %} +
      + {{ name }} + {{ limit }}s +
      + {% endfor %} +
      +
      + {{ _('Memory limit:') }} + {{ problem.memory_limit|kbsimpleformat }} +
      +
      + {% for name, limit in problem.language_memory_limit %} +
      + {{ name }} + {{ limit|kbsimpleformat }} +
      + {% endfor %} +
      + +
      + + {% cache 86400 'problem_authors' problem.id LANGUAGE_CODE %} + {% with authors=problem.authors.all() %} + {% if authors %} +
      + {% trans trimmed count=authors|length %} + Author: + {% pluralize count %} + Authors: + {% endtrans %} +
      {{ link_users(authors) }}
      +
      + {% endif %} + {% endwith %} + {% endcache %} + + {% if not contest_problem or not contest_problem.contest.hide_problem_tags %} +
      + {% with types=problem.types_list %} +
      + {% trans trimmed count=problem.types_list|length %} + Problem type + {% pluralize count %} + Problem types + {% endtrans %} +
      + + {% endwith %} +
      + {% endif %} + {% if show_languages %} +
      +
      + {{ _('Allowed languages') }} +
      +
      + {% with usable=problem.usable_common_names, langs=problem.languages_list() %} + {% for lang in langs %} + {%- if lang in usable -%} + {{ lang }} + {%- else -%} + {{ lang }} + {%- endif -%} + {% if not loop.last %}, {% endif -%} + {% endfor %} + {% endwith %} +
      +
      + {% endif %} + {% if problem.is_editable_by(request.user) %} +
      + {% trans trimmed count=available_judges|length %} + Judge: + {% pluralize count %} + Judges: + {% endtrans %} + +
      + {% if available_judges %} + {% if perms.judge.change_judge %} + {% for judge in available_judges %} + {{ judge.name }} + {%- if not loop.last %}, {% endif %} + {% endfor %} + {% else %} + {{ available_judges|join(", ") }} + {% endif %} + {% else %} + {{ _('none available') }} + {% endif %} +
      +
      + {% endif %} +{% endblock %} + +{% block description %} + {% cache 86400 'problem_html' problem.id MATH_ENGINE LANGUAGE_CODE %} + {{ description|markdown("problem", MATH_ENGINE)|reference|str|safe }} + {% endcache %} + + {% with license=problem.license %} + {% if license %} + + {{ license.display or license.name }} + + {% endif %} + {% endwith %} +{% endblock %} + +{% block post_description_end %} + {% if request.user.is_authenticated and not request.profile.mute %} + + {%- if contest_problem and contest_problem.contest.use_clarifications and request.profile.current_contest.live -%} + {{ _('Request clarification') }} + {%- else -%} + {{ _('Report an issue') }} + {%- endif -%} + + {% endif %} +{% endblock %} + +{% block comments %} + {% if contest_problem and contest_problem.contest.use_clarifications %} +
      +

      {{ _('Clarifications') }}

      + {% if has_clarifications %} + {% for clarification in clarifications %} +
      +
      {{ relative_time(clarification.date) }}
      + + {{ clarification.description|markdown('problem', MATH_ENGINE)|reference }} + +
      + {% endfor %} + {% else %} +

      {{ _('No clarifications have been made at this time.') }}

      + {% endif %} +
      + {% else %} + {% include "comments/list.html" %} + {% endif %} +{% endblock %} + +{% block bodyend %} + {{ super() }} + {% include "comments/math.html" %} +{% endblock %} diff --git a/templates/problem/raw.html b/templates/problem/raw.html new file mode 100644 index 0000000..573db37 --- /dev/null +++ b/templates/problem/raw.html @@ -0,0 +1,96 @@ + + + + + + + + + + +

      {{ problem_name }}

      +
      +
      +
      + {{ _('Time Limit:') }} {{ problem.time_limit }}s + {% for name, limit in problem.language_time_limit %} +
      + {{ name }} + {{ limit }}s +
      + {% endfor %} +
      +
      + {{ _('Memory Limit:') }} {{ problem.memory_limit|kbsimpleformat}} + {% for name, limit in problem.language_memory_limit %} +
      + {{ name }} + {{ limit|kbsimpleformat }} +
      + {% endfor %} +
      +
      +
      +
      + {{ description|markdown('problem', 'tex' if math_engine == 'jax' else math_engine)|reference|absolutify(url)|str|safe }} +
      +{% if math_engine == 'jax' %} + + + +{% endif %} + + diff --git a/templates/problem/search-form.html b/templates/problem/search-form.html new file mode 100644 index 0000000..e818630 --- /dev/null +++ b/templates/problem/search-form.html @@ -0,0 +1,68 @@ + \ No newline at end of file diff --git a/templates/problem/submission-diff.html b/templates/problem/submission-diff.html new file mode 100644 index 0000000..55dbd35 --- /dev/null +++ b/templates/problem/submission-diff.html @@ -0,0 +1,100 @@ +{% extends "common-content.html" %} + +{% block js_media %} + + + +{% endblock %} + +{% block media %} + +{% endblock %} + +{% block body %} + + + + + + + + + {% for case in range(num_cases) %} + + {% endfor %} + + + + {% for sub in submissions %} + + + + + + + {% for case in sub.test_cases.all() %} + + {% endfor %} + + {% endfor %} + +
      IDUsernameResultLanguageDate{{ loop.index }}
      {{ sub.id }}{{ link_user(sub.user) }}{{ sub.result }}{{ sub.language.name }}{{ relative_time(sub.date) }} + {% if case.status == 'SC' %} + --- + {% else %} + + {% if case.status == 'AC' %} + {{ case.time|floatformat(2) }} + {% else %} + {{ case.status }} + {% endif %} + + {% endif %} +
      + +{% endblock %} \ No newline at end of file diff --git a/templates/problem/submit.html b/templates/problem/submit.html new file mode 100644 index 0000000..cf24c3c --- /dev/null +++ b/templates/problem/submit.html @@ -0,0 +1,256 @@ +{% extends "base.html" %} + +{% block js_media %} + + {% compress js %} + {{ form.media.js }} + + {% endcompress %} +{% endblock %} + +{% block media %} + {% compress css %} + {{ form.media.css }} + + {% endcompress %} +{% endblock %} + +{% block body %} +
      + {% if not no_judges %} + {% if default_lang not in form.fields.language.queryset %} +
      + x + {% trans trimmed default_language=default_lang.name %} + Warning! Your default language, {{ default_language }}, + is unavailable for this problem and has been deselected. + {% endtrans %} +
      + {% endif %} + + {% if request.in_contest and submission_limit %} + {% if submissions_left > 0 %} +
      + x + {% trans left=submissions_left %} + You have {{ left }} submission left + {% pluralize %} + You have {{ left }} submissions left + {% endtrans %} +
      + {% else %} +
      + x + {{ _('You have 0 submissions left') }} +
      + {% endif %} + {% endif %} + {% endif %} + +
      + {% csrf_token %} + {{ form.non_field_errors() }} +
      +
      + {{ form.problem.errors }} + {{ form.problem }} +
      +
      + {{ form.source.errors }} + {{ form.source }} +
      + {% if not no_judges %} +
      + {{ form.language.errors }} +
      + +
      +
      + {% endif %} +
      + +
      + + {% if no_judges %} + {{ _('No judge is available for this problem.') }} + {% else %} + + {% endif %} +
      +{% endblock %} diff --git a/templates/problem/yaml.html b/templates/problem/yaml.html new file mode 100644 index 0000000..8dee21c --- /dev/null +++ b/templates/problem/yaml.html @@ -0,0 +1,20 @@ +{% extends "base.html" %} + +{% block body %} +
      + + + + + +
      +
      + {% for line in raw_source.split('\n') %} + +
      {{ loop.index }}
      +
      + {% endfor %} +
      +
      {{ highlighted_source }}
      +
      +{% endblock %} \ No newline at end of file diff --git a/templates/registration/activate.html b/templates/registration/activate.html new file mode 100644 index 0000000..8cee082 --- /dev/null +++ b/templates/registration/activate.html @@ -0,0 +1,4 @@ +{% extends "base.html" %} +{% block body %} +

      {{ _('%(key)s is an invalid activation key.', key=activation_key) }}

      +{% endblock %} \ No newline at end of file diff --git a/templates/registration/activation_complete.html b/templates/registration/activation_complete.html new file mode 100644 index 0000000..6140ad7 --- /dev/null +++ b/templates/registration/activation_complete.html @@ -0,0 +1,4 @@ +{% extends "base.html" %} +{% block body %} +

      {{ _('Your account has been successfully activated.') }}

      +{% endblock %} \ No newline at end of file diff --git a/templates/registration/activation_email.html b/templates/registration/activation_email.html new file mode 100644 index 0000000..a90b9fc --- /dev/null +++ b/templates/registration/activation_email.html @@ -0,0 +1,23 @@ +Thanks for registering on the {{ site.name }}! We're glad to have you. +

      +The last step is activating your account. Please activate your {{ SITE_NAME }} account in the next {{ expiration_days }} days. +

      +Please click on the following link to activate your account: +

      + http://{{ site.domain }}/accounts/activate/{{ activation_key }} +

      + +Alternatively, you can reply to this message to activate your account. +Your reply must keep the following text intact for this to work: + +
      +{{ activation_key }}
      +
      + +{% if SITE_ADMIN_EMAIL %} +See you soon! +
      +If you have problems activating your account, feel free to send us an email at {{ SITE_ADMIN_EMAIL }}. +{% else %} +See you soon! +{% endif %} diff --git a/templates/registration/activation_email.txt b/templates/registration/activation_email.txt new file mode 100644 index 0000000..c13dc6e --- /dev/null +++ b/templates/registration/activation_email.txt @@ -0,0 +1,9 @@ +Please activate your {{ site.name }} account in {{ expiration_days }} days. + +Please click on the following link to activate your account: + http://{{ site.domain }}/accounts/activate/{{ activation_key }}/ + +Alternatively, you can reply to this message to activate your account. +Your reply must keep the following text intact for this to work: + +{{ activation_key }} diff --git a/templates/registration/activation_email_subject.txt b/templates/registration/activation_email_subject.txt new file mode 100644 index 0000000..b0888c8 --- /dev/null +++ b/templates/registration/activation_email_subject.txt @@ -0,0 +1 @@ +Activate your {{ SITE_NAME }} account \ No newline at end of file diff --git a/templates/registration/login.html b/templates/registration/login.html new file mode 100644 index 0000000..dafb087 --- /dev/null +++ b/templates/registration/login.html @@ -0,0 +1,85 @@ +{% extends "base.html" %} + +{% block media %} + +{% endblock %} + +{% block body %} +
      +
      + {% csrf_token %} + {% if form.errors %} +
      +

      {{ _('Invalid username or password.') }}

      +
      + {% endif %} + + + + + + + + + +
      + {{ form.username }} +
      + {{ form.password }} +
      +
      + + +
      +
      {{ _('Forgot your password?') }} + + {% if form.has_google_auth or form.has_facebook_auth or form.has_github_auth %} +

      {{ _('Or log in with...') }}

      + {% if form.has_google_auth %} + + {% endif %} + {% if form.has_facebook_auth %} + + {% endif %} + {% if form.has_github_auth %} + + {% endif %} + {% endif %} +
      +{% endblock %} diff --git a/templates/registration/logout.html b/templates/registration/logout.html new file mode 100644 index 0000000..176a230 --- /dev/null +++ b/templates/registration/logout.html @@ -0,0 +1,4 @@ +{% extends "base.html" %} +{% block body %} +

      {{ _('See you later!') }}

      +{% endblock %} \ No newline at end of file diff --git a/templates/registration/password_change_done.html b/templates/registration/password_change_done.html new file mode 100644 index 0000000..78a146c --- /dev/null +++ b/templates/registration/password_change_done.html @@ -0,0 +1,4 @@ +{% extends "base.html" %} +{% block body %} +

      {{ _('Your password was sucessfully changed.') }}

      +{% endblock %} \ No newline at end of file diff --git a/templates/registration/password_change_form.html b/templates/registration/password_change_form.html new file mode 100644 index 0000000..a8f56ae --- /dev/null +++ b/templates/registration/password_change_form.html @@ -0,0 +1,10 @@ +{% extends "base.html" %} + +{% block body %} +
      + {% csrf_token %} + {{ form.as_table() }}
      +
      + +
      +{% endblock %} diff --git a/templates/registration/password_reset.html b/templates/registration/password_reset.html new file mode 100644 index 0000000..4f5d738 --- /dev/null +++ b/templates/registration/password_reset.html @@ -0,0 +1,9 @@ +{% extends "base.html" %} + +{% block body %} +
      {% csrf_token %} + {{ form.as_table() }}
      +
      + +
      +{% endblock %} \ No newline at end of file diff --git a/templates/registration/password_reset_complete.html b/templates/registration/password_reset_complete.html new file mode 100644 index 0000000..5727282 --- /dev/null +++ b/templates/registration/password_reset_complete.html @@ -0,0 +1,5 @@ +{% extends "base.html" %} +{% block body %} +

      {{ _('Your password has been set. You may go ahead and log in now') }}

      + {{ _('Log in') }} +{% endblock %} \ No newline at end of file diff --git a/templates/registration/password_reset_confirm.html b/templates/registration/password_reset_confirm.html new file mode 100644 index 0000000..6f65215 --- /dev/null +++ b/templates/registration/password_reset_confirm.html @@ -0,0 +1,14 @@ +{% extends "base.html" %} + +{% block body %} + {% if validlink %} +
      + {% csrf_token %} + {{ form.as_table() }}
      +
      + +
      + {% else %} +

      Invalid password reset link.

      + {% endif %} +{% endblock %} diff --git a/templates/registration/password_reset_done.html b/templates/registration/password_reset_done.html new file mode 100644 index 0000000..8e415d1 --- /dev/null +++ b/templates/registration/password_reset_done.html @@ -0,0 +1,6 @@ +{% extends "base.html" %} + +{% block body %} +

      {{ _("We've emailed you instructions for setting your password. You should be receiving them shortly.") }}

      +

      {{ _("If you don't receive an email, please make sure you've entered the address you registered with, and check your spam folder.") }}

      +{% endblock %} \ No newline at end of file diff --git a/templates/registration/password_reset_email.html b/templates/registration/password_reset_email.html new file mode 100644 index 0000000..8aeb454 --- /dev/null +++ b/templates/registration/password_reset_email.html @@ -0,0 +1,19 @@ + +
      +

      DM::OJ +

      +
      +
      +
      + +Forgot your password on the {{ site_name }}? Don't worry!

      +To reset the password for your account "{{ user.get_username() }}", click the below button. +

      +Reset password +

      +{% if SITE_ADMIN_EMAIL %} +See you soon! If you have problems resetting your email, feel free to shoot us an email at {{ SITE_ADMIN_EMAIL }} +{% else %} +See you soon! +{% endif %} +
      diff --git a/templates/registration/password_reset_email.txt b/templates/registration/password_reset_email.txt new file mode 100644 index 0000000..dd46144 --- /dev/null +++ b/templates/registration/password_reset_email.txt @@ -0,0 +1,11 @@ +{% trans %}You're receiving this email because you requested a password reset for your user account at {{ site_name }}.{% endtrans %} + +{{ _('Please go to the following page and choose a new password:') }} +{% block reset_link %} +{{ protocol }}://{{ domain }}{{ url('password_reset_confirm', uidb64=uid, token=token) }} +{% endblock %} +{{ _("Your username, in case you've forgotten:") }} {{ user.get_username() }} + +{{ _('Thanks for using our site!') }} + +{% trans %}The {{ site_name }} team{% endtrans %} diff --git a/templates/registration/password_reset_subject.txt b/templates/registration/password_reset_subject.txt new file mode 100644 index 0000000..9a9dfb3 --- /dev/null +++ b/templates/registration/password_reset_subject.txt @@ -0,0 +1 @@ +{% trans %}Password reset on {{ site_name }}{% endtrans %} diff --git a/templates/registration/profile_creation.html b/templates/registration/profile_creation.html new file mode 100644 index 0000000..7641b65 --- /dev/null +++ b/templates/registration/profile_creation.html @@ -0,0 +1,58 @@ +{% extends "base.html" %} +{% block media %} + + {{ form.media.css }} + +{% endblock %} + +{% block js_media %}{{ form.media.js }}{% endblock %} + +{% block body %} +
      + {% csrf_token %} + {{ form.as_table() }}
      + +
      + +
      +
      +
      +
      +
      +
      +{% endblock %} + +{% block bodyend %} + + +{% endblock %} \ No newline at end of file diff --git a/templates/registration/registration_closed.html b/templates/registration/registration_closed.html new file mode 100644 index 0000000..7c732b0 --- /dev/null +++ b/templates/registration/registration_closed.html @@ -0,0 +1,4 @@ +{% extends "base.html" %} +{% block body %} +

      {{ _('Registration is currently closed. Please contact an administrator.') }}

      +{% endblock %} diff --git a/templates/registration/registration_complete.html b/templates/registration/registration_complete.html new file mode 100644 index 0000000..25903d7 --- /dev/null +++ b/templates/registration/registration_complete.html @@ -0,0 +1,4 @@ +{% extends "base.html" %} +{% block body %} +

      {{ _('You have successfully been registered. An email has been sent to the email address you provided to confirm your registration.') }}

      +{% endblock %} \ No newline at end of file diff --git a/templates/registration/registration_form.html b/templates/registration/registration_form.html new file mode 100644 index 0000000..220aa43 --- /dev/null +++ b/templates/registration/registration_form.html @@ -0,0 +1,220 @@ +{% extends "base.html" %} + +{% block media %} + {% include "timezone/media-css.html" %} + {{ form.media.css }} + +{% endblock %} + +{% block js_media %} + {% include "timezone/media-js.html" %} + {{ form.media.js }} + + {% if form.captcha %} + {{ recaptcha_init(LANGUAGE_CODE) }} + {% endif %} +{% endblock %} + +{% block body %} +
      +
      + {% csrf_token %} + +
      {{ _('Username') }}
      + {{ form.username }} + {% if form.username.errors %} +
      {{ form.username.errors }}
      + {% endif %} + +
      {{ _('Email') }}
      + {{ form.email }} + {% if form.email.errors %} +
      {{ form.email.errors }}
      + {% endif %} + +
      {{ _('Password') -}} + (?) +
      + + {{ form.password1 }} + {% if form.password1.errors %} +
      {{ form.password1.errors }}
      + {% endif %} +
      {{ _('Password') }}2{# -#} + {{ _('(again, for confirmation)') }} +
      + {{ form.password2 }} + {% if form.password2.errors %} +
      {{ form.password2.errors }}
      + {% endif %} + +
      {{ _('Timezone') }}{{ _('(select your closest major city)') }}
      +
      +
      {{ form.timezone }} +
      + {{ _('or') }} + {{ _('pick from map') }} +
      +
      +
      + +
      {{ _('Default language') }}
      + {{ form.language }} + +
      {{ _('Affiliated organizations') }}
      + {{ form.organizations }} + + {% if form.newsletter %} +
      {{ form.newsletter }} + +
      + {% endif %} + + {% if form.captcha %} +
      {{ form.captcha }}
      + {% if form.captcha.errors %} +
      {{ form.captcha.errors }}
      + {% endif %} + {% endif %} + +
      + {% if tos_url %} + + {{ _('By registering, you agree to our') }} + {{ _('Terms & Conditions') }}. + + {% endif %} + +
      +
      + +
      +
      +
      +
      +
      +
      +{% endblock %} diff --git a/templates/registration/totp_auth.html b/templates/registration/totp_auth.html new file mode 100644 index 0000000..2c6ac4e --- /dev/null +++ b/templates/registration/totp_auth.html @@ -0,0 +1,43 @@ +{% extends "base.html" %} + +{% block media %} + +{% endblock %} + +{% block body %} +
      +
      + {% csrf_token %} + {% if form.errors %} +
      +

      {{ _('Invalid Two Factor Authentication token.') }}

      +
      + {% endif %} + +
      +
      {{ form.totp_token }}
      +
      + +
      +

      {{ _('If you lost your authentication device, please contact us at %(email)s.', email=SITE_ADMIN_EMAIL)|urlize }}

      +
      +{% endblock %} diff --git a/templates/registration/totp_disable.html b/templates/registration/totp_disable.html new file mode 100644 index 0000000..9919bb6 --- /dev/null +++ b/templates/registration/totp_disable.html @@ -0,0 +1,51 @@ +{% extends "base.html" %} + +{% block media %} + +{% endblock %} + +{% block body %} +
      +
      + {% csrf_token %} +
      {{ _('To protect your account, you must first authenticate before you can disable Two Factor Authentication.') }}
      + {% if form.totp_token.errors %} +
      + {{ form.totp_token.errors }} +
      + {% endif %} +
      + + {{ form.totp_token }} +
      + +
      +
      +{% endblock %} diff --git a/templates/registration/totp_enable.html b/templates/registration/totp_enable.html new file mode 100644 index 0000000..c291353 --- /dev/null +++ b/templates/registration/totp_enable.html @@ -0,0 +1,89 @@ +{% extends "base.html" %} + +{% block media %} + +{% endblock %} + +{% block js_media %} + +{% endblock %} + +{% block body %} +
      +
      + {% csrf_token %} + +
      {{ _('Scan this code with your authenticator app:') }}
      +
      {{ _('QR code') }}
      +
      {{ _('Or enter this code manually:') }} + {{ totp_key }} +
      +
      + {% if form.totp_token.errors %} +
      + {{ form.totp_token.errors }} +
      + {% endif %} +
      + + {{ form.totp_token }} +
      + +
      +
      +{% endblock %} diff --git a/templates/registration/username_select.html b/templates/registration/username_select.html new file mode 100644 index 0000000..c3df4d4 --- /dev/null +++ b/templates/registration/username_select.html @@ -0,0 +1,9 @@ +{% extends "base.html" %} + +{% block body %} +
      + {% csrf_token %} + {{ form.as_table() }}
      + +
      +{% endblock %} diff --git a/templates/runtime-version-fragment.html b/templates/runtime-version-fragment.html new file mode 100644 index 0000000..0457b83 --- /dev/null +++ b/templates/runtime-version-fragment.html @@ -0,0 +1,12 @@ +{% for name, versions in runtime_versions -%} + {%- if versions -%} + {%- if versions[0] != versions|last -%} + {{ name }} {{ versions[0] }} - {{ versions|last }} + {%- else -%} + {{ name }} {{ versions[0] }} + {%- endif -%} + {%- else -%} + {{ name }} + {%- endif -%} + {%- if not loop.last %}, {% endif -%} +{%- endfor -%} diff --git a/templates/site-logo-fragment.html b/templates/site-logo-fragment.html new file mode 100644 index 0000000..9c14046 --- /dev/null +++ b/templates/site-logo-fragment.html @@ -0,0 +1,8 @@ +{% if request.in_contest and request.participation.contest.logo_override_image %} + {{ SITE_NAME }} +{% elif logo_override_image is defined and logo_override_image %} + {{ SITE_NAME }} +{% else %} + {{ SITE_NAME }} +{% endif %} diff --git a/templates/solution-preview.html b/templates/solution-preview.html new file mode 100644 index 0000000..90004b6 --- /dev/null +++ b/templates/solution-preview.html @@ -0,0 +1,4 @@ +{{ preview_data|markdown('solution', MATH_ENGINE)|reference|str|safe }} +{% if REQUIRE_JAX %} +
      +{% endif %} \ No newline at end of file diff --git a/templates/stats/base.html b/templates/stats/base.html new file mode 100644 index 0000000..d83ac96 --- /dev/null +++ b/templates/stats/base.html @@ -0,0 +1,18 @@ +{% extends "base.html" %} + +{% block js_media %} + {% compress js %} + {% include "stats/media-js.html" %} + {% endcompress %} +{% endblock %} + +{% block content_title %}{{ _('Statistics') }}{% endblock %} + +{% block body %} + + {% block chart_body %}{% endblock %} +{% endblock %} diff --git a/templates/stats/language.html b/templates/stats/language.html new file mode 100644 index 0000000..d142c62 --- /dev/null +++ b/templates/stats/language.html @@ -0,0 +1,55 @@ +{% extends "stats/base.html" %} +{% block media %} + +{% endblock %} + +{% block chart_body %} +

      {{ _('Submission Statistics') }}

      +
      + +
      + +

      {{ _('Submissions by Language') }}

      +
      + +
      + +

      {{ _('AC Submissions by Language') }}

      +
      + +
      + +

      {{ _('Language AC Rate') }}

      +
      + +
      +{% endblock %} + +{% block bodyend %} + +{% endblock %} diff --git a/templates/stats/media-js.html b/templates/stats/media-js.html new file mode 100644 index 0000000..981ddff --- /dev/null +++ b/templates/stats/media-js.html @@ -0,0 +1,68 @@ + + diff --git a/templates/status/judge-status-table.html b/templates/status/judge-status-table.html new file mode 100644 index 0000000..5968819 --- /dev/null +++ b/templates/status/judge-status-table.html @@ -0,0 +1,67 @@ + + {{ _('Judge') }} + {% if see_all_judges %} + {{ _('Online') }} + {% endif %} + {{ _('Uptime') }} + {{ _('Ping') }} + {{ _('Load') }} + {{ _('Runtimes') }} + + +{% for judge in judges %} + + + {% if perms.judge.change_judge %} + {{ judge.name }} + {% else %} + {{ judge.name }} + {% endif %} + + {% if see_all_judges %} + + {% if judge.online %} + + {% else %} + + {% endif %} + + {% endif %} + + {% if judge.online %} + {{ judge.uptime|timedelta("simple") }} + {% else %} + {{ _('N/A') }} + {% endif %} + + + {% if judge.online and judge.ping_ms %} + {{ judge.ping_ms|floatformat(3) }} ms + {% else %} + {{ _('N/A') }} + {% endif %} + + + {% if judge.online %} + {{ judge.load|floatformat(3) }} + {% else %} + {{ _('N/A') }} + {% endif %} + + + {% if judge.online %} + {% for key, info in judge.runtime_versions -%} + {{ info.name }} + {%- if not loop.last %}, {% endif %} + {%- endfor %} + {% else %}{{ _('N/A') }}{% endif %} + + +{% else %} + + {{ _('There are no judges available at this time.') }} + + +{% endfor %} diff --git a/templates/status/judge-status.html b/templates/status/judge-status.html new file mode 100644 index 0000000..dac5cb1 --- /dev/null +++ b/templates/status/judge-status.html @@ -0,0 +1,23 @@ +{% extends "base.html" %} + +{% block js_media %} + {% include "status/media-js.html" %} +{% endblock %} + +{% block media %} + {% include "status/media-css.html" %} + {% block content_media %}{% endblock %} +{% endblock %} + +{% block title_ruler %}{% endblock %} + +{% block title_row %} + {% set tab = 'judges' %} + {% include "status/status-tabs.html" %} +{% endblock %} + +{% block body %} + + {% include "status/judge-status-table.html" %} +
      +{% endblock %} \ No newline at end of file diff --git a/templates/status/language-list.html b/templates/status/language-list.html new file mode 100644 index 0000000..298633b --- /dev/null +++ b/templates/status/language-list.html @@ -0,0 +1,60 @@ +{% extends "base.html" %} +{% block media %} + +{% endblock %} + +{% block title_ruler %}{% endblock %} + +{% block title_row %} + {% set tab = 'runtimes' %} + {% include "status/status-tabs.html" %} +{% endblock %} + +{% block body %} + + + + + + + + + + {% for language in languages %} + {# All online languages have runtime_versions, even if we're not going to display them #} + {% if language.runtime_versions %} + + + + + + {% endif %} + {% endfor %} + +
      {{ _('ID') }}{{ _('Name') }}{{ _('Runtime Info') }}
      {{ language.short_display_name }}{{ language.name }} + {{ runtime_versions(language.runtime_versions()) }} + {% if language.description %} +
      + {% cache 86400 'language_html' language.id %} + {{ language.description|markdown('language') }} + {% endcache %} +
      + {% endif %} +
      +{% endblock %} \ No newline at end of file diff --git a/templates/status/media-css.html b/templates/status/media-css.html new file mode 100644 index 0000000..49658bf --- /dev/null +++ b/templates/status/media-css.html @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/templates/status/media-js.html b/templates/status/media-js.html new file mode 100644 index 0000000..a5b1cb1 --- /dev/null +++ b/templates/status/media-js.html @@ -0,0 +1,62 @@ + + \ No newline at end of file diff --git a/templates/status/status-tabs.html b/templates/status/status-tabs.html new file mode 100644 index 0000000..1dd737e --- /dev/null +++ b/templates/status/status-tabs.html @@ -0,0 +1,7 @@ +{% extends "tabs-base.html" %} + +{% block tabs %} + {{ make_tab('judges', 'fa-server', url('status_all'), _('Judges')) }} + {{ make_tab('runtimes', 'fa-code', url('runtime_list'), _('Runtimes')) }} + {{ make_tab('matrix', 'fa-table', url('version_matrix'), _('Version Matrix')) }} +{% endblock %} diff --git a/templates/status/versions.html b/templates/status/versions.html new file mode 100644 index 0000000..1c0a991 --- /dev/null +++ b/templates/status/versions.html @@ -0,0 +1,42 @@ +{% extends "base.html" %} + +{% block title_ruler %}{% endblock %} + +{% block title_row %} + {% set tab = 'matrix' %} + {% include "status/status-tabs.html" %} +{% endblock %} + +{% block body %} + + + + {% for judge in judges %} + + {% endfor %} + + {% for language in languages %} + + + {% for judge in judges %} + {% set versions = matrix[judge][language.id] %} + + {% endfor %} + + {% endfor %} +
      {{ judge }}
      {{ language.name }} + {%- for version in versions -%} + {{ version.name }}{% if version.version %} {{ version.version }}{% endif %} + {% if not loop.last %}
      {% endif %} + {%- else -%} + — + {%- endfor -%} +
      +{% endblock %} diff --git a/templates/submission/info-base.html b/templates/submission/info-base.html new file mode 100644 index 0000000..53a5a4e --- /dev/null +++ b/templates/submission/info-base.html @@ -0,0 +1,16 @@ +{% extends "base.html" %} + +{% block header %} + + {{ submission.date|date(_("N j, Y, g:i a")) }} + {%- if perms.judge.change_submission and submission.judged_on %} + on {{ submission.judged_on.name }} + {% endif %} +
      + {{ submission.language }} + {% if perms.judge.change_submission %} + [{{ _('Admin') }}] + {% endif %} +
      +
      +{% endblock %} diff --git a/templates/submission/internal-error-message.html b/templates/submission/internal-error-message.html new file mode 100644 index 0000000..2b2e5b0 --- /dev/null +++ b/templates/submission/internal-error-message.html @@ -0,0 +1,18 @@ +

      + {% if request.user == submission.user.user %} + {% trans trimmed %} + An internal error occurred while grading, and the {{ SITE_NAME }} administrators have been notified.
      + In the meantime, try resubmitting in a few seconds. + {% endtrans %} + {% else %} + {{ _('An internal error occurred while grading.') }} + {% endif %} +

      + +{% if submission.error and request.user.is_authenticated %} + {% if request.profile.id in submission.problem.editor_ids or perms.judge.edit_all_problem %} +

      +

      {{ _('Error information') }}

      +
      {{ submission.error|highlight('pytb') }}
      + {% endif %} +{% endif %} \ No newline at end of file diff --git a/templates/submission/list.html b/templates/submission/list.html new file mode 100644 index 0000000..c1f52a0 --- /dev/null +++ b/templates/submission/list.html @@ -0,0 +1,377 @@ +{% extends "common-content.html" %} +{% block js_media %} + + + {% compress js %} + + {% if request.user.is_authenticated and perms.judge.rejudge_submission %} + + {% endif %} + + + + {% endcompress %} + + {% if dynamic_update and last_msg %} + + {% endif %} +{% endblock %} + +{% block title_ruler %}{% endblock %} + +{% block title_row %} + {% include "submission/submission-list-tabs.html" %} +{% endblock %} + +{% block media %} + {% if perms.judge.change_submission and perms.judge.rejudge_submission %} + + {% endif %} + + +{% endblock %} + +{% block body %} + {% if page_obj.num_pages > 1 %} +
      + {% include "list-pages.html" %} +
      + {% endif %} + +
      +
      +
      + + + +
      +
      + +
      + + +
      + {% set profile_id = request.profile.id if request.user.is_authenticated else 0 %} + {% for submission in submissions %} +
      + {% with problem_name=show_problem and submission.problem.i18n_name %} + {% include "submission/row.html" %} + {% endwith %} +
      + {% endfor %} +
      + {% if page_obj.num_pages > 1 %} +
      {% include "list-pages.html" %}
      + {% endif %} +
      +
      +{% endblock %} + +{% block bodyend %} + {# Don't load MathJax from common-content! #} +{% endblock %} diff --git a/templates/submission/row.html b/templates/submission/row.html new file mode 100644 index 0000000..44b11b8 --- /dev/null +++ b/templates/submission/row.html @@ -0,0 +1,79 @@ +{% set can_view = submission_layout(submission, profile_id, request.user, editable_problem_ids, completed_problem_ids) %} +
      +
      + {%- if submission.is_graded -%} + {%- if submission.status in ('IE', 'CE', 'AB') -%} + --- + {%- else -%} + {{ submission.case_points|floatformat(0) }} / {{ submission.case_total|floatformat(0) }} + {%- endif -%} + {%- else -%} + + {%- endif -%} +
      + +
      + {{ submission.short_status }} | + {{ submission.language.short_display_name }} +
      +
      +
      + {% if show_problem %} + + {% endif %} +
      + {{ link_user(submission.user) }} + {{ relative_time(submission.date) }} + {% if not request.in_contest and submission.contest_object_id %} + + + + {% endif %} +
      +
      + +{% if submission.status == 'G' %} +
      + {%- if submission.current_testcase > 0 -%} + {{ _('Case #%(case)s', case=submission.current_testcase) }} + {%- else -%} + ... + {%- endif -%} +
      +{% endif %} + +{% if can_view %} +
      + + {{ _('view') }} + + {% if perms.judge.rejudge_submission %} · + + {{ _('rejudge') }} + + {% endif %} + {% if perms.judge.change_submission %} · + + {{ _('admin') }} + + {% endif %} +
      +{% endif %} + +
      + {% if submission.status in ('QU', 'P', 'G', 'CE', 'IE', 'AB') %} +
      ---
      +
      ---
      + {% else %} + {% if "TLE" != submission.result %} +
      + {{ (submission.time or 0)|floatformat(2) }}s +
      + {% else %} +
      ---
      + {% endif %} + {# No one actually like IEC prefixes, Jinja2. #} +
      {{ (submission.memory_bytes|filesizeformat(True)).replace('i', '') }}
      + {% endif %} +
      diff --git a/templates/submission/source.html b/templates/submission/source.html new file mode 100644 index 0000000..6abd01e --- /dev/null +++ b/templates/submission/source.html @@ -0,0 +1,59 @@ +{% extends "submission/info-base.html" %} +{% block media %} + +{% endblock %} + +{% block body %} +
      + + + {% if request.user == submission.user.user or perms.judge.resubmit_other %} + + {% endif %} + {% if perms.judge.rejudge_submission %} +
      +
      + {% csrf_token %} + {{ _('Rejudge') }} + + +
      +
      + {% endif %} +
      +
      +
      +
      + + + + + +
      +
      + {% for line in raw_source.split('\n') %} + +
      {{ loop.index }}
      +
      + {% endfor %} +
      +
      {{ highlighted_source }}
      +
      +{% endblock %} diff --git a/templates/submission/status-testcases.html b/templates/submission/status-testcases.html new file mode 100644 index 0000000..2c5740b --- /dev/null +++ b/templates/submission/status-testcases.html @@ -0,0 +1,141 @@ +{% if submission.contest_or_none %} + {% set prefix_length = submission.contest_or_none.problem.output_prefix_override %} +{% else %} + {% set prefix_length = None %} +{% endif %} +{% set is_pretest = submission.is_pretested %} + +{% if submission.status != 'IE' %} + {% if submission.status == 'QU' %} +

      {{ _('We are waiting for a suitable judge to process your submission...') }}

      + {% elif submission.status == 'P' %} +

      {{ _('Your submission is being processed...') }}

      + {% elif submission.status == 'CE' %} +

      {{ _('Compilation Error') }}

      +
      {{ submission.error|ansi2html }}
      + {% else %} + {% if submission.error %} +

      {{ _('Compilation Warnings') }}

      +
      {{ submission.error|ansi2html }}
      +

      + {% endif %} + {% if is_pretest %} +

      {{ _('Pretest Execution Results') }}

      + {% else %} +

      {{ _('Execution Results') }}

      + {% endif %} +
      + {% set test_case_id = counter() %} + {% for batch in batches %} + {% if batch.id %} + {{ _('Batch ') }}#{{ test_case_id() }} + ({{ _('%(points)s/%(total)s points', points=batch.points|floatformat(0), total=batch.total|floatformat(0)) }}) +
      +
      + {% endif %} + {% for case in batch.cases %} + + + + + + + + + + {% if not batch.id %} + + {% endif %} + + + {% if case.status != 'AC' and case.output and (prefix_length is none or prefix_length > 0) %} + + + {% if case.extended_feedback %} + + {% endif %} + + {% endif %} + {% endfor %} +
      + {%- if case.status != 'AC' and case.output and (prefix_length is none or prefix_length > 0) -%} + + {%- endif -%} + {%- if batch.id -%} + {{ _('Case') }} #{{ loop.index }}: + {%- elif is_pretest -%} + {{ _('Pretest') }} #{{ test_case_id() }}: + {%- else -%} + {{ _('Test case') }} #{{ test_case_id() }}: + {%- endif -%} + + + {%- if case.status == 'SC' %}—{% else %}{{ case.status }}{% endif -%} + + {%- if case.feedback %} ({{ case.feedback }}){% endif -%} + + {%- if case.status != 'SC' -%} + {%- if case.status == 'TLE' -%} + [>{{ time_limit|floatformat(3) }}s, + {%- else -%} + [{{ case.time|floatformat(3) }}s, + {%- endif -%} + {%- endif -%} + {% if case.status != 'SC' %}{{ case.memory|kbdetailformat }}]{% endif %}({{ case.points|floatformat(0) }}/{{ case.total|floatformat(0) }})
      + + {% if batch.id %}
      {% endif %} +
      + {% endfor %} + {% if submission.is_graded %} +
      + {% if submission.result != "AB" %} + {{ _('Resources:') }} + {% if submission.result == "TLE" %} + ---, + {% else %} + {{ submission.time|floatformat(3) }}s, + {% endif %} + {{ submission.memory|kbdetailformat }} +
      + {% if is_pretest %} + {{ _('Final pretest score:') }} + {% else %} + {{ _('Final score:') }} + {% endif %} + {{ submission.case_points|floatformat(0) }}/{{ submission.case_total|floatformat(0) }} + {% if request.in_contest and submission.contest_or_none %} + {% with contest=submission.contest_or_none %} + ({{ _('%(points)s/%(total)s points', points=contest.points|roundfloat(3), + total=contest.problem.points|floatformat(-1)) }}) + {% endwith %} + {% else %} + ({{ _('%(points)s/%(total)s points', points=submission.points|roundfloat(3), + total=submission.problem.points|floatformat(-1)) }}) + {% endif %} + {% if is_pretest and submission.result == "AC" %} +
      + {{ _('Passing pretests does not guarantee a full score on system tests.') }} + {% endif %} + {% else %} + {{ _('Submission aborted!') }} + {% endif %} +
      + {% endif %} + {% endif %} +{% else %} + {% include "submission/internal-error-message.html" %} +{% endif %} diff --git a/templates/submission/status.html b/templates/submission/status.html new file mode 100644 index 0000000..c8cc294 --- /dev/null +++ b/templates/submission/status.html @@ -0,0 +1,94 @@ +{% extends "submission/info-base.html" %} +{% block js_media %} + + {% if not submission.is_graded and last_msg %} + + {% endif %} +{% endblock %} + +{% block body %} +
      + + {% if request.user == submission.user.user or perms.judge.resubmit_other %} + + {% endif %} + {% if perms.judge.rejudge_submission %} +
      +
      + {% csrf_token %} + {{ _('Rejudge') }} + + +
      +
      + {% endif %} + +
      +
      +
      + +
      {% include "submission/status-testcases.html" %}
      + + {% if not submission.is_graded %} + {% if request.user == submission.user.user or perms.judge.abort_any_submission %} +
      +
      +
      +
      +
      + {% csrf_token %} + +

      +
      +
      + {% endif %} + {% endif %} +{% endblock %} \ No newline at end of file diff --git a/templates/submission/submission-list-tabs.html b/templates/submission/submission-list-tabs.html new file mode 100644 index 0000000..8b3d881 --- /dev/null +++ b/templates/submission/submission-list-tabs.html @@ -0,0 +1,17 @@ +{% extends "tabs-base.html" %} + +{% block tabs %} + {{ make_tab('all_submissions_list', 'fa-list', all_submissions_link, _('All')) }} + {% if my_submissions_link or tab == 'my_submissions_tab' %} + {{ make_tab('my_submissions_tab', 'fa-user', my_submissions_link, _('Mine')) }} + {% endif %} + {% if best_submissions_link %} + {{ make_tab('best_submissions_list', 'fa-bar-chart', best_submissions_link, _('Best')) }} + {% endif %} + {% if tab == 'user_submissions_tab' %} + {{ make_tab('user_submissions_tab', 'fa-user', None, _("%(user)s's", user=tab_username)) }} + {% endif %} + {% if perms.judge.change_submission %} + {{ make_tab('admin', 'fa-edit', url('admin:judge_submission_changelist'), _('Admin')) }} + {% endif %} +{% endblock %} diff --git a/templates/tabs-base.html b/templates/tabs-base.html new file mode 100644 index 0000000..ae3a845 --- /dev/null +++ b/templates/tabs-base.html @@ -0,0 +1,18 @@ +{% macro make_tab(name, fa, url, text) %} +
    • + {%- if url %}{% else %}{% endif -%} + {{ text }} + {%- if url %}{% else %}{% endif -%} +
    • +{% endmacro %} + +
      +
      +

      {{ content_title or title }}

      + + {% block post_tab_spacer %}{% endblock %} +
        + {% block tabs %}{% endblock %} +
      +
      +
      \ No newline at end of file diff --git a/templates/task_status.html b/templates/task_status.html new file mode 100644 index 0000000..19111b1 --- /dev/null +++ b/templates/task_status.html @@ -0,0 +1,100 @@ + + + + + Task Progress - {{ SITE_LONG_NAME }} + + + + + +
      +
      + DMOJ Icon +

      {{ message }}

      +

      + +
      +
      +
      +
      +
      +
      +
      +
      +
      Completed!
      +
      +
      +
      Failed!
      +
      +
      +
      + + diff --git a/templates/ticket/edit-notes.html b/templates/ticket/edit-notes.html new file mode 100644 index 0000000..89923e7 --- /dev/null +++ b/templates/ticket/edit-notes.html @@ -0,0 +1,5 @@ +
      + {% csrf_token %} + {{ form.notes }} + +
      diff --git a/templates/ticket/list.html b/templates/ticket/list.html new file mode 100644 index 0000000..8f77ba6 --- /dev/null +++ b/templates/ticket/list.html @@ -0,0 +1,278 @@ +{% extends "base.html" %} +{% block media %} + +{% endblock %} + +{% block js_media %} + + + + + {% if last_msg %} + + {% endif %} +{% endblock %} + +{% block body %} +
      + + +
      + {% if page_obj.num_pages > 1 %} +
      {% include "list-pages.html" %}
      + {% endif %} + + + + + + + + + + + + {% for ticket in tickets %} + {% include "ticket/row.html" %} + {% endfor %} + +
      {{ _('ID') }}{{ _('Title') }}{{ _('User') }}{{ _('Assignees') }}
      + {% if page_obj.num_pages > 1 %} +
      {% include "list-pages.html" %}
      + {% endif %} +
      +
      +{% endblock %} \ No newline at end of file diff --git a/templates/ticket/message.html b/templates/ticket/message.html new file mode 100644 index 0000000..0638e08 --- /dev/null +++ b/templates/ticket/message.html @@ -0,0 +1,18 @@ +
      + +
      +
      +
      +
      {{ message.time|date('DATE_FORMAT') }}
      +
      {{ message.time|time('TIME_FORMAT') }}
      +
      +
      + {{ message.body|markdown('ticket', MATH_ENGINE)|reference|str|safe }} +
      +
      +
      diff --git a/templates/ticket/new.html b/templates/ticket/new.html new file mode 100644 index 0000000..e719a6c --- /dev/null +++ b/templates/ticket/new.html @@ -0,0 +1,40 @@ +{% extends "base.html" %} + +{% block media %} + {{ form.media.css }} + +{% endblock %} + +{% block js_media %}{{ form.media.js }}{% endblock %} + +{% block body %} +
      + {% block guideline_message %}{% endblock %} + {% csrf_token %} +
      {{ form.title }}
      + {% if form.title.errors or form.body.errors %} +
      + {{ form.title.errors }} + {{ form.body.errors }} +
      + {% endif %} +
      {{ form.body }}
      + +
      +{% endblock %} diff --git a/templates/ticket/new_problem.html b/templates/ticket/new_problem.html new file mode 100644 index 0000000..ad94dac --- /dev/null +++ b/templates/ticket/new_problem.html @@ -0,0 +1,12 @@ +{% extends "ticket/new.html" %} + +{% block guideline_message %} + {% if not request.in_contest %} +
      + x + {{ _('Thanks for opening a ticket!') }} +

      + {{ _('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.') }} +
      + {% endif %} +{% endblock %} \ No newline at end of file diff --git a/templates/ticket/preview.html b/templates/ticket/preview.html new file mode 100644 index 0000000..995e4ba --- /dev/null +++ b/templates/ticket/preview.html @@ -0,0 +1,4 @@ +{{ preview_data|markdown('ticket', MATH_ENGINE)|reference|str|safe }} +{% if REQUIRE_JAX %} +
      +{% endif %} \ No newline at end of file diff --git a/templates/ticket/row.html b/templates/ticket/row.html new file mode 100644 index 0000000..cd64ddf --- /dev/null +++ b/templates/ticket/row.html @@ -0,0 +1,7 @@ + + + {{ ticket.id }} + {{ ticket.title }} + {{ link_user(ticket.user) }} + {{ link_users(ticket.assignees.all()) }} + \ No newline at end of file diff --git a/templates/ticket/ticket.html b/templates/ticket/ticket.html new file mode 100644 index 0000000..833809c --- /dev/null +++ b/templates/ticket/ticket.html @@ -0,0 +1,391 @@ +{% extends "base.html" %} +{% block media %} + {{ form.media.css }} + +{% endblock %} + +{% block js_media %} + {{ form.media.js }} + + + + + {% if last_msg %} + + {% endif %} +{% endblock %} + +{% block content_title %} +
      + +
      +
      {{ ticket.title }}
      #{{ ticket.id }} +{% endblock %} + +{% block body %} +
      +
      + + +
      +
      + {% for message in ticket_messages %} + {% include "ticket/message.html" %} + {% endfor %} +
      +
      +
      + +
      +
      + {% csrf_token %} + {% if form.non_field_errors() or form.body.errors %} +
      + {{ form.non_field_errors() }} + {{ form.body.errors }} +
      + {% endif %} +
      {{ form.body }}
      + +
      +
      +
      +
      + +{% endblock %} diff --git a/templates/time-remaining-fragment.html b/templates/time-remaining-fragment.html new file mode 100644 index 0000000..eb73d10 --- /dev/null +++ b/templates/time-remaining-fragment.html @@ -0,0 +1,3 @@ + + {{ countdown|timedelta("localized") }} + \ No newline at end of file diff --git a/templates/timezone/media-css.html b/templates/timezone/media-css.html new file mode 100644 index 0000000..d17de5f --- /dev/null +++ b/templates/timezone/media-css.html @@ -0,0 +1,27 @@ +{% compress css %} + {% if TIMEZONE_BG %} + + {% endif %} + + +{% endcompress %} \ No newline at end of file diff --git a/templates/timezone/media-js.html b/templates/timezone/media-js.html new file mode 100644 index 0000000..9d11c75 --- /dev/null +++ b/templates/timezone/media-js.html @@ -0,0 +1,45 @@ +{% compress js %} + + + +{% endcompress %} \ No newline at end of file diff --git a/templates/user/base-users-table.html b/templates/user/base-users-table.html new file mode 100644 index 0000000..bace862 --- /dev/null +++ b/templates/user/base-users-table.html @@ -0,0 +1,32 @@ + + + {{ rank_header or _("Rank") }} + {% block after_rank_head %}{% endblock %} + {{ _('Username') }} + {% block before_point_head %}{% endblock %} + + + {% if sort_links %}{% endif %} + {{ _('Points') }} + {%- if sort_links %}{{ sort_order.performance_points }}{% endif %} + + {% block after_point_head %}{% endblock %} + + + + +{% for rank, user in users %} + + {{ rank }} + {% block after_rank scoped %}{% endblock %} + {{ link_user(user) }} {% block user_data scoped %}{% endblock %} + {% block before_point scoped %}{% endblock %} + {% block point scoped %} + + {{ user.performance_points|floatformat(0) }} + + {% endblock %} + {% block after_point scoped %}{% endblock %} + +{% endfor %} + diff --git a/templates/user/base-users.html b/templates/user/base-users.html new file mode 100644 index 0000000..8048cf3 --- /dev/null +++ b/templates/user/base-users.html @@ -0,0 +1,83 @@ +{% extends "common-content.html" %} + +{% block js_media %} + {% block users_js_media %}{% endblock %} + +{% endblock %} + +{% block media %} + {% block users_media %}{% endblock %} +{% endblock %} + +{% block body %} +
      +
      + {% if page_obj and page_obj.num_pages > 1 %} +
      + {% include "list-pages.html" %} +
      + +
      +
      + {% endif %} + + + {% block users_table %}{% endblock %} +
      + + {% if page_obj and page_obj.num_pages > 1 %} +
      {% include "list-pages.html" %}
      + {% endif %} +
      +
      +{% endblock %} diff --git a/templates/user/edit-profile.html b/templates/user/edit-profile.html new file mode 100644 index 0000000..44defe3 --- /dev/null +++ b/templates/user/edit-profile.html @@ -0,0 +1,188 @@ +{% extends "user/user-base.html" %} + +{% block user_media %} + {% include "timezone/media-css.html" %} + {{ form.media.css }} + +{% endblock %} + +{% block js_media %} + {% include "timezone/media-js.html" %} + {{ form.media.js }} + + +{% endblock %} + +{% block title_ruler %}{% endblock %} + +{% block title_row %} + {% set tab = 'edit' %} + {% set user = request.profile %} + {% include "user/user-tabs.html" %} +{% endblock %} + +{% block body %} +
      +
      + {% if form.errors %} +
      + x + {{ form.non_field_errors() }} +
      + {% endif %} + + {% csrf_token %} + +
      {{ _('Self-description') }}:
      + {{ form.about }} +
      + + + + + + +
      + + + + + + + + + + + + + + {% if has_math_config %} + + + + + {% endif %} + {% if form.newsletter %} + + + + {% endif %} + + + + + + + + + + + + +
      {{ form.timezone }}
      {{ form.language }}
      {{ form.ace_theme }}
      {{ form.math_engine }}
      + {{ form.newsletter }} + +
      + {{ form.test_site }} + +
      + {{ _('Change your avatar') }} +
      + + {{ _('Change your password') }} + +
      + {% if profile.is_totp_enabled %} + {{ _('Two Factor Authentication is enabled.') }} + {% if require_staff_2fa and request.user.is_staff %} + Disable + {% else %} + Disable + {% endif %} + {% else %} + {{ _('Two Factor Authentication is disabled.') }} + Enable + {% endif %} +
      +
      +
      + {{ _('Affiliated organizations') }}: +
      + {{ form.organizations }} +
      + +
      +
      {{ _('User-script') }}:
      + {{ form.user_script }} +
      + + +
      +
      +{% endblock %} diff --git a/templates/user/link-list.html b/templates/user/link-list.html new file mode 100644 index 0000000..0b6f9e4 --- /dev/null +++ b/templates/user/link-list.html @@ -0,0 +1,3 @@ +{% for user in users -%} + {{ link_user(user) }}{% if not loop.last %}, {% endif %} +{%- endfor %} diff --git a/templates/user/link.html b/templates/user/link.html new file mode 100644 index 0000000..f0a73bb --- /dev/null +++ b/templates/user/link.html @@ -0,0 +1 @@ +{{ user.username }} diff --git a/templates/user/list.html b/templates/user/list.html new file mode 100644 index 0000000..cd9cd4b --- /dev/null +++ b/templates/user/list.html @@ -0,0 +1,26 @@ +{% extends "user/base-users.html" %} + +{% block users_media %} + +{% endblock %} + +{% block title_ruler %}{% endblock %} + +{% block title_row %} + {% set tab = 'list' %} + {% set title = 'Leaderboard' %} + {% include "user/user-list-tabs.html" %} +{% endblock %} + +{% block users_table %} + {% include "user/users-table.html" %} +{% endblock %} \ No newline at end of file diff --git a/templates/user/pp-row.html b/templates/user/pp-row.html new file mode 100644 index 0000000..9730f5a --- /dev/null +++ b/templates/user/pp-row.html @@ -0,0 +1,32 @@ +
      +
      {{ breakdown.sub_points|floatformat(0) }} / {{ breakdown.sub_total|floatformat(0) }}
      +
      + {{ breakdown.sub_short_status }} + | + {{ breakdown.sub_lang }} +
      +
      + +
      + +
      {{ relative_time(breakdown.sub_date) }}
      +
      + +
      + +
      + {% trans weight=breakdown.weight|floatformat(0) %} + weighted {{ weight }}% + {% endtrans %} + + {% if breakdown.scaled_points < 10 %} + ({{ _('%(pp).1fpp', pp=breakdown.scaled_points) }}) + {% else %} + ({{ _('%(pp).0fpp', pp=breakdown.scaled_points) }}) + {% endif %} +
      +
      diff --git a/templates/user/pp-table-body.html b/templates/user/pp-table-body.html new file mode 100644 index 0000000..3f47e56 --- /dev/null +++ b/templates/user/pp-table-body.html @@ -0,0 +1,3 @@ +{% for breakdown in pp_breakdown %} +
      {% include "user/pp-row.html" %}
      +{% endfor %} \ No newline at end of file diff --git a/templates/user/preview.html b/templates/user/preview.html new file mode 100644 index 0000000..00b86d7 --- /dev/null +++ b/templates/user/preview.html @@ -0,0 +1,4 @@ +{{ preview_data|markdown('self-description', MATH_ENGINE)|reference|str|safe }} +{% if REQUIRE_JAX %} +
      +{% endif %} \ No newline at end of file diff --git a/templates/user/rating.html b/templates/user/rating.html new file mode 100644 index 0000000..8394b26 --- /dev/null +++ b/templates/user/rating.html @@ -0,0 +1,17 @@ +{% spaceless %} + + {% if rating_class(rating) == 'rate-target' %} + + + + + {% else %} + + + + + {% endif %} + {{ rating.rating|default(rating) }} + +{% endspaceless %} \ No newline at end of file diff --git a/templates/user/user-about.html b/templates/user/user-about.html new file mode 100644 index 0000000..16df95e --- /dev/null +++ b/templates/user/user-about.html @@ -0,0 +1,186 @@ +{% extends "user/user-base.html" %} + +{% block title_ruler %}{% endblock %} + +{% block title_row %} + {% set tab = 'about' %} + {% include "user/user-tabs.html" %} +{% endblock %} + +{% block user_content %} +
      + {% with orgs=user.organizations.all() %} + {% if orgs %} +

      {{ _('From') }} + {% for org in orgs -%} + {{ org.name }} + {%- if not loop.last %}, {% endif %} + {% endfor %} +

      + {% endif %} + {% endwith %} + {% if perms.judge.change_profile %} + {% with notes=user.notes %} + {% if notes %} +

      {{ _('Admin Notes') }}: + {{ notes }} +

      + {% endif %} + {% endwith %} + {% endif%} + + {% if user.about %} +

      {{ _('About') }}

      + {% cache 86400 'user_about' user.id MATH_ENGINE %} + {{ user.about|markdown('self-description', MATH_ENGINE)|reference|str|safe }} + {% endcache %} + {% else %} + + {% if user.user == request.user %} + {{ _('You have not shared any information.') }} + {% else %} + {{ _('This user has not shared any information.') }} + {% endif %} + +
      + {% endif %} + + {% if rating %} +

      Rating History

      +
      + +
      +
      +
      +
      +
      + + , # +
      +
      + {% endif %} +
      +{% endblock %} + +{% block bodyend %} + {% if REQUIRE_JAX %} + {% include "mathjax-load.html" %} + {% endif %} + + {% if ratings %} + + + {% endif %} +{% endblock %} diff --git a/templates/user/user-base.html b/templates/user/user-base.html new file mode 100644 index 0000000..5f273f2 --- /dev/null +++ b/templates/user/user-base.html @@ -0,0 +1,78 @@ +{% extends "base.html" %} + +{% block media %} + {% block user_media %}{% endblock %} + + +{% endblock %} + +{% block js_media %} + {% block user_js_media %}{% endblock %} +{% endblock %} + +{% block body %} + +{% endblock %} diff --git a/templates/user/user-list-tabs.html b/templates/user/user-list-tabs.html new file mode 100644 index 0000000..e6112c6 --- /dev/null +++ b/templates/user/user-list-tabs.html @@ -0,0 +1,6 @@ +{% extends "tabs-base.html" %} + +{% block tabs %} + {{ make_tab('list', 'fa-users', url('user_list'), _('Leaderboard')) }} + {{ make_tab('organizations', 'fa-university', url('organization_list'), _('Organizations')) }} +{% endblock %} diff --git a/templates/user/user-problems.html b/templates/user/user-problems.html new file mode 100644 index 0000000..e2b61e3 --- /dev/null +++ b/templates/user/user-problems.html @@ -0,0 +1,119 @@ +{% extends "user/user-base.html" %} + +{% block user_js_media %} + +{% endblock %} + +{% block title_ruler %}{% endblock %} + +{% block title_row %} + {% set tab = 'problems' %} + {% include "user/user-tabs.html" %} +{% endblock %} + +{% block user_content %} + {% if pp_breakdown %} +

      {{ _('Points Breakdown') }}

      +
      + {% include "user/pp-table-body.html" %} +
      + {% if pp_has_more %} + + {% endif %} + {% else %} + {{ _('This user has not yet solved any problems.') }} + {% endif %} + + {% if authored %} +
      +

      + {{ _('Authored Problems') }} ({{ authored|length }}) +

      + + + + + + + + + + {% for problem in authored %} + + + + + + {% endfor %} + + +
      + {% endif %} + + {% if request.user.is_authenticated and request.user != user.user %} +
      +
      + + +
      +
      + {% else %} +
      + {% endif %} + + {% for group in best_submissions %} +
      +

      + {{ group.name }} ({{ _('%(points).1f points', points=group.points) }}) +

      + + + + + + + + + {% for entry in group.problems %} + + + + + {% endfor %} + + +
      + {% endfor %} +{% endblock %} diff --git a/templates/user/user-tabs.html b/templates/user/user-tabs.html new file mode 100644 index 0000000..1fab2e6 --- /dev/null +++ b/templates/user/user-tabs.html @@ -0,0 +1,19 @@ +{% extends "tabs-base.html" %} + +{% block tabs %} + {{ make_tab('about', 'fa-info-circle', url('user_page', user.user.username), _('About')) }} + {{ make_tab('problems', 'fa-puzzle-piece', url('user_problems', user.user.username), _('Problems')) }} + {% if request.user.is_superuser and user.user != request.user and not user.user.is_superuser %} + {{ make_tab('impersonate', 'fa-eye', url('impersonate-start', user.user.id), _('Impersonate')) }} + {% endif %} + {% if user.user == request.user %} + {{ make_tab('edit', 'fa-edit', url('user_edit_profile'), _('Edit profile')) }} + {% else %} + {% if perms.auth.change_user %} + {{ make_tab('edit', 'fa-edit', url('admin:auth_user_change', user.user.id), _('Admin User')) }} + {% endif %} + {% if perms.judge.change_profile %} + {{ make_tab('edit', 'fa-edit', url('admin:judge_profile_change', user.id), _('Admin Profile')) }} + {% endif %} + {% endif %} +{% endblock %} diff --git a/templates/user/users-table.html b/templates/user/users-table.html new file mode 100644 index 0000000..b6b6484 --- /dev/null +++ b/templates/user/users-table.html @@ -0,0 +1,30 @@ +{% extends "user/base-users-table.html" %} + +{% block after_rank_head %} + + {% if sort_links %}{% endif %} + + + + + + + {%- if sort_links %}{{ sort_order.rating }}{% endif %} + +{% endblock %} + +{% block after_rank %} + {% if user.rating %}{{ rating_number(user) }}{% endif %} +{% endblock %} + +{% block after_point_head %} + + {% if sort_links %}{% endif %} + {{ _('Problems') }} + {%- if sort_links %}{{ sort_order.problem_count }}{% endif %} + +{% endblock %} + +{% block after_point %} + {{ user.problem_count }} +{% endblock %} diff --git a/templates/widgets/relative-time.html b/templates/widgets/relative-time.html new file mode 100644 index 0000000..a8c4656 --- /dev/null +++ b/templates/widgets/relative-time.html @@ -0,0 +1,6 @@ +{% spaceless %} + + {{ abs_format.replace('{time}', time|date(format)) }} + +{% endspaceless %} diff --git a/templates/widgets/select_all.html b/templates/widgets/select_all.html new file mode 100644 index 0000000..b986449 --- /dev/null +++ b/templates/widgets/select_all.html @@ -0,0 +1,34 @@ +
      +
      {{ original_widget }}
      + {% if empty %} + {{ _('Nothing here.') }} + {% else %} + + {% endif %} +
      + + \ No newline at end of file diff --git a/websocket/daemon.js b/websocket/daemon.js new file mode 100644 index 0000000..05b9940 --- /dev/null +++ b/websocket/daemon.js @@ -0,0 +1,206 @@ +var config = require('./config'); +var set = require('simplesets').Set; +var queue = require('qu'); +var WebSocketServer = require('ws').Server; +var wss_receiver = new WebSocketServer({host: config.get_host, port: config.get_port}); +var wss_sender = new WebSocketServer({host: config.post_host, port: config.post_port}); +var messages = new queue(); +var followers = new set(); +var pollers = new set(); +var max_queue = config.max_queue || 50; +var long_poll_timeout = config.long_poll_timeout || 60000; +var message_id = Date.now(); + +if (typeof String.prototype.startsWith != 'function') { + String.prototype.startsWith = function (str){ + return this.slice(0, str.length) == str; + }; +} + +messages.catch_up = function (client) { + this.each(function (message) { + if (message.id > client.last_msg) + client.got_message(message); + }); +}; + +messages.post = function (channel, message) { + message = { + id: ++message_id, + channel: channel, + message: message + }; + this.push(message); + if (this.length > max_queue) + this.shift(); + followers.each(function (client) { + client.got_message(message); + }); + pollers.each(function (request) { + request.got_message(message); + }); + return message.id; +}; + +messages.last = function () { + return this.tail().id; +}; + +wss_receiver.on('connection', function (socket) { + socket.channel = null; + socket.last_msg = 0; + + var commands = { + start_msg: function (request) { + socket.last_msg = request.start; + }, + set_filter: function (request) { + var filter = {}; + if (Array.isArray(request.filter) && request.filter.length > 0 && + request.filter.every(function (channel, index, array) { + if (typeof channel != 'string') + return false; + filter[channel] = true; + return true; + })) { + socket.filter = filter; + followers.add(socket); + messages.catch_up(socket); + } else { + socket.send(JSON.stringify({ + status: 'error', + code: 'invalid-filter', + message: 'invalid filter: ' + request.filter + })); + } + }, + }; + + socket.got_message = function (message) { + if (message.channel in socket.filter) + socket.send(JSON.stringify(message)); + socket.last_msg = message.id; + }; + + socket.on('message', function (request) { + try { + request = JSON.parse(request); + } catch (err) { + socket.send(JSON.stringify({ + status: 'error', + code: 'syntax-error', + message: err.message + })); + return; + } + request.command = request.command.replace(/-/g, '_'); + if (request.command in commands) + commands[request.command](request); + else + socket.send(JSON.stringify({ + status: 'error', + code: 'bad-command', + message: 'bad command: ' + request.command + })); + }); + + socket.on('close', function(code, message) { + followers.remove(socket); + }); +}); + +wss_sender.on('connection', function (socket) { + var commands = { + post: function (request) { + if (typeof request.channel != 'string') + return { + status: 'error', + code: 'invalid-channel' + }; + return { + status: 'success', + id: messages.post(request.channel, request.message) + }; + }, + last_msg: function (request) { + return { + status: 'success', + id: message_id, + }; + } + }; + socket.on('message', function (request) { + try { + request = JSON.parse(request); + } catch (err) { + socket.send(JSON.stringify({ + status: 'error', + code: 'syntax-error', + message: err.message + })); + return; + } + request.command = request.command.replace(/-/g, '_'); + if (request.command in commands) + socket.send(JSON.stringify(commands[request.command](request))); + else + socket.send(JSON.stringify({ + status: 'error', + code: 'bad-command', + message: 'bad command: ' + request.command + })); + }); +}); + +var url = require('url'); +require('http').createServer(function (req, res) { + var parts = url.parse(req.url, true); + + if (!parts.pathname.startsWith('/channels/')) { + res.writeHead(404, {'Content-Type': 'text/plain'}); + res.end('404 Not Found'); + return; + } + + var channels = parts.pathname.slice(10).split('|'); + if (channels.length == 1 && !channels[0].length) { + res.writeHead(400, {'Content-Type': 'text/plain'}); + res.end('400 Bad Request'); + return; + } + + req.channels = {}; + req.last_msg = parseInt(parts.query.last); + if (isNaN(req.last_msg)) req.last_msg = 0; + + channels.forEach(function (channel) { + req.channels[channel] = true; + }); + + req.on('close', function () { + pollers.remove(req); + }); + + req.got_message = function (message) { + if (message.channel in req.channels) { + res.writeHead(200, {'Content-Type': 'application/json'}); + res.end(JSON.stringify(message)); + pollers.remove(req); + return true; + } + return false; + }; + var got = false; + messages.each(function (message) { + if (!got && message.id > req.last_msg) + got = req.got_message(message); + }); + if (!got) { + pollers.add(req); + res.setTimeout(long_poll_timeout, function () { + pollers.remove(req); + res.writeHead(504, {'Content-Type': 'application/json'}); + res.end('{"error": "timeout"}'); + }); + } +}).listen(config.http_port, config.http_host); diff --git a/websocket/wscat.js b/websocket/wscat.js new file mode 100644 index 0000000..a4e952d --- /dev/null +++ b/websocket/wscat.js @@ -0,0 +1,223 @@ +#!/usr/bin/env node + +/*! + * ws: a node.js websocket client + * Copyright(c) 2011 Einar Otto Stangvik + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var WebSocket = require('ws') + , fs = require('fs') + , program = require('commander') + , util = require('util') + , events = require('events') + , readline = require('readline'); + +/** + * InputReader - processes console input + */ + +function Console() { + this.stdin = process.stdin; + this.stdout = process.stdout; + + this.readlineInterface = readline.createInterface(this.stdin, this.stdout); + + var self = this; + this.readlineInterface.on('line', function(data) { + self.emit('line', data); + }); + this.readlineInterface.on('close', function() { + self.emit('close'); + }); + + this._resetInput = function() { + self.clear(); + } +} +util.inherits(Console, events.EventEmitter); + +Console.Colors = { + Red: '\033[31m', + Green: '\033[32m', + Yellow: '\033[33m', + Cyan: '\033[36m', + Blue: '\033[34m', + Default: '\033[39m' +}; + +Console.prototype.prompt = function() { + this.readlineInterface.prompt(); +} + +Console.prototype.print = function(msg, color) { + this.clear(); + color = color || Console.Colors.Default; + this.stdout.write(color + msg + Console.Colors.Default + '\n'); + this.prompt(); +} + +Console.prototype.clear = function() { + this.stdout.write('\033[2K\033[E'); +} + +Console.prototype.pause = function() { + this.stdin.on('keypress', this._resetInput); +} + +Console.prototype.resume = function() { + this.stdin.removeListener('keypress', this._resetInput); +} + +function appender(xs) { + xs = xs || []; + return function (x) { + xs.push(x); + return xs; + } +} + +function into(obj, kvals) { + kvals.forEach(function (kv) { + obj[kv[0]] = kv[1]; + }); + return obj; +} + +function splitOnce(sep, str) { // sep can be either String or RegExp + var tokens = str.split(sep); + return [tokens[0], str.replace(sep, '').substr(tokens[0].length)]; +} + +/** + * The actual application + */ + +var version = '1.0';//JSON.parse(fs.readFileSync(__dirname + '/../package.json', 'utf8')).version; +program + .version(version) + .usage('[options] ') + .option('-l, --listen ', 'listen on port') + .option('-c, --connect ', 'connect to a websocket server') + .option('-p, --protocol ', 'optional protocol version') + .option('-o, --origin ', 'optional origin') + .option('--host ', 'optional host') + .option('-s, --subprotocol ', 'optional subprotocol') + .option('-n, --no-check', 'Do not check for unauthorized certificates') + .option('-H, --header ', 'Set an HTTP header. Repeat to set multiple. (--connect only)', appender(), []) + .option('--auth ', 'Add basic HTTP authentication header. (--connect only)') + .parse(process.argv); + +if (program.listen && program.connect) { + console.error('\033[33merror: use either --listen or --connect\033[39m'); + process.exit(-1); +} +else if (program.listen) { + var wsConsole = new Console(); + wsConsole.pause(); + var options = {}; + if (program.protocol) options.protocolVersion = program.protocol; + if (program.origin) options.origin = program.origin; + if (program.subprotocol) options.protocol = program.subprotocol; + if (!program.check) options.rejectUnauthorized = program.check; + var ws = null; + var wss = new WebSocket.Server({port: program.listen}, function() { + wsConsole.print('listening on port ' + program.listen + ' (press CTRL+C to quit)', Console.Colors.Green); + wsConsole.clear(); + }); + wsConsole.on('close', function() { + if (ws) { + try { + ws.close(); + } + catch (e) {} + } + process.exit(0); + }); + wsConsole.on('line', function(data) { + if (ws) { + ws.send(data, {mask: false}); + wsConsole.prompt(); + } + }); + wss.on('connection', function(newClient) { + if (ws) { + // limit to one client + newClient.terminate(); + return; + }; + ws = newClient; + wsConsole.resume(); + wsConsole.prompt(); + wsConsole.print('client connected', Console.Colors.Green); + ws.on('close', function() { + wsConsole.print('disconnected', Console.Colors.Green); + wsConsole.clear(); + wsConsole.pause(); + ws = null; + }); + ws.on('error', function(code, description) { + wsConsole.print('error: ' + code + (description ? ' ' + description : ''), Console.Colors.Yellow); + }); + ws.on('message', function(data, flags) { + wsConsole.print('< ' + data, Console.Colors.Blue); + }); + }); + wss.on('error', function(error) { + wsConsole.print('error: ' + error.toString(), Console.Colors.Yellow); + process.exit(-1); + }); +} +else if (program.connect) { + var wsConsole = new Console(); + var options = {}; + if (program.protocol) options.protocolVersion = program.protocol; + if (program.origin) options.origin = program.origin; + if (program.subprotocol) options.protocol = program.subprotocol; + if (program.host) options.host = program.host; + if (!program.check) options.rejectUnauthorized = program.check; + var headers = into({}, (program.header || []).map(function (s) { + return splitOnce(':', s) + })); + if (program.auth) { + headers['Authorization'] = 'Basic ' + new Buffer(program.auth).toString('base64'); + } + options.headers = headers; + var ws = new WebSocket(program.connect, options); + ws.on('open', function() { + wsConsole.print('connected (press CTRL+C to quit)', Console.Colors.Green); + wsConsole.on('line', function(data) { + ws.send(data, {mask: true}); + wsConsole.prompt(); + }); + }); + ws.on('close', function() { + wsConsole.print('disconnected', Console.Colors.Green); + wsConsole.clear(); + process.exit(); + }); + ws.on('error', function(code, description) { + wsConsole.print('error: ' + code + (description ? ' ' + description : ''), Console.Colors.Yellow); + process.exit(-1); + }); + ws.on('message', function(data, flags) { + wsConsole.print('< ' + data, Console.Colors.Cyan); + }); + wsConsole.on('close', function() { + if (ws) { + try { + ws.close(); + } + catch(e) {} + process.exit(); + } + }); +} +else { + console.error('\033[33merror: use either --listen or --connect\033[39m'); + process.exit(-1); +}