From 57136d96523118da83cc04db0909dc99185f4b47 Mon Sep 17 00:00:00 2001 From: cuom1999 Date: Wed, 23 Aug 2023 22:14:09 -0500 Subject: [PATCH] Add profile image --- dmoj/settings.py | 1 + judge/forms.py | 17 +- judge/jinja2/gravatar.py | 16 +- judge/migrations/0162_profile_image.py | 21 + judge/models/profile.py | 8 + judge/views/user.py | 8 +- judge/widgets/__init__.py | 1 + judge/widgets/image.py | 16 + locale/vi/LC_MESSAGES/django.po | 840 +++++++++++++------------ templates/base.html | 2 +- templates/blog/dashboard.html | 2 +- templates/chat/user_online_status.html | 2 +- templates/ticket/ticket.html | 2 +- templates/user/edit-profile.html | 18 +- templates/widgets/image.html | 13 + 15 files changed, 529 insertions(+), 438 deletions(-) create mode 100644 judge/migrations/0162_profile_image.py create mode 100644 judge/widgets/image.py create mode 100644 templates/widgets/image.html diff --git a/dmoj/settings.py b/dmoj/settings.py index d546ac3..e205e60 100644 --- a/dmoj/settings.py +++ b/dmoj/settings.py @@ -84,6 +84,7 @@ DMOJ_STATS_SUBMISSION_RESULT_COLORS = { "CE": "#42586d", "ERR": "#ffa71c", } +DMOJ_PROFILE_IMAGE_ROOT = "profile_images" MARKDOWN_STYLES = {} MARKDOWN_DEFAULT_STYLE = {} diff --git a/judge/forms.py b/judge/forms.py index 362c067..5bc43a9 100644 --- a/judge/forms.py +++ b/judge/forms.py @@ -50,6 +50,7 @@ from judge.widgets import ( HeavySelect2Widget, Select2MultipleWidget, DateTimePickerWidget, + ImageWidget, ) from judge.tasks import rescore_contest @@ -78,12 +79,14 @@ class ProfileForm(ModelForm): "language", "ace_theme", "user_script", + "profile_image", ] 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"}), + "profile_image": ImageWidget, } has_math_config = bool(settings.MATHOID_URL) @@ -100,12 +103,22 @@ class ProfileForm(ModelForm): def __init__(self, *args, **kwargs): user = kwargs.pop("user", None) super(ProfileForm, self).__init__(*args, **kwargs) + self.fields["profile_image"].required = False + + def clean_profile_image(self): + profile_image = self.cleaned_data.get("profile_image") + if profile_image: + if profile_image.size > 5 * 1024 * 1024: + raise ValidationError( + _("File size exceeds the maximum allowed limit of 5MB.") + ) + return profile_image def file_size_validator(file): - limit = 1 * 1024 * 1024 + limit = 10 * 1024 * 1024 if file.size > limit: - raise ValidationError("File too large. Size should not exceed 1MB.") + raise ValidationError("File too large. Size should not exceed 10MB.") class ProblemSubmitForm(ModelForm): diff --git a/judge/jinja2/gravatar.py b/judge/jinja2/gravatar.py index 2848d92..2231ab3 100644 --- a/judge/jinja2/gravatar.py +++ b/judge/jinja2/gravatar.py @@ -9,14 +9,14 @@ 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 - +def gravatar(profile, size=80, default=None): + assert isinstance(profile, Profile), "profile should be Profile" + profile_image = profile.profile_image + if profile_image: + return profile_image.url + if default is None: + default = profile.mute + email = profile.user.email gravatar_url = ( "//www.gravatar.com/avatar/" + hashlib.md5(utf8bytes(email.strip().lower())).hexdigest() diff --git a/judge/migrations/0162_profile_image.py b/judge/migrations/0162_profile_image.py new file mode 100644 index 0000000..b371f39 --- /dev/null +++ b/judge/migrations/0162_profile_image.py @@ -0,0 +1,21 @@ +# Generated by Django 3.2.18 on 2023-08-24 00:50 + +from django.db import migrations, models +import judge.models.profile + + +class Migration(migrations.Migration): + + dependencies = [ + ("judge", "0161_auto_20230803_1536"), + ] + + operations = [ + migrations.AddField( + model_name="profile", + name="profile_image", + field=models.ImageField( + null=True, upload_to=judge.models.profile.profile_image_path + ), + ), + ] diff --git a/judge/models/profile.py b/judge/models/profile.py index 63453e4..8c8a31d 100644 --- a/judge/models/profile.py +++ b/judge/models/profile.py @@ -1,4 +1,5 @@ from operator import mul +import os from django.conf import settings from django.contrib.auth.models import User @@ -27,6 +28,12 @@ class EncryptedNullCharField(EncryptedCharField): return super(EncryptedNullCharField, self).get_prep_value(value) +def profile_image_path(profile, filename): + tail = filename.split(".")[-1] + new_filename = f"user_{profile.id}.{tail}" + return os.path.join(settings.DMOJ_PROFILE_IMAGE_ROOT, new_filename) + + class Organization(models.Model): name = models.CharField(max_length=128, verbose_name=_("organization title")) slug = models.SlugField( @@ -229,6 +236,7 @@ class Profile(models.Model): blank=True, help_text=_("Notes for administrators regarding this user."), ) + profile_image = models.ImageField(upload_to=profile_image_path, null=True) @cached_property def organization(self): diff --git a/judge/views/user.py b/judge/views/user.py index 9796a90..db073f1 100644 --- a/judge/views/user.py +++ b/judge/views/user.py @@ -402,12 +402,12 @@ class UserPerformancePointsAjax(UserProblemsPage): @login_required def edit_profile(request): - profile = Profile.objects.get(user=request.user) - if profile.mute: - raise Http404() + profile = request.profile if request.method == "POST": form_user = UserForm(request.POST, instance=request.user) - form = ProfileForm(request.POST, instance=profile, user=request.user) + form = ProfileForm( + request.POST, request.FILES, instance=profile, user=request.user + ) if form_user.is_valid() and form.is_valid(): with transaction.atomic(), revisions.create_revision(): form_user.save() diff --git a/judge/widgets/__init__.py b/judge/widgets/__init__.py index cc25941..a9455a9 100644 --- a/judge/widgets/__init__.py +++ b/judge/widgets/__init__.py @@ -3,3 +3,4 @@ from judge.widgets.mixins import CompressorWidgetMixin from judge.widgets.pagedown import * from judge.widgets.select2 import * from judge.widgets.datetime import * +from judge.widgets.image import * diff --git a/judge/widgets/image.py b/judge/widgets/image.py new file mode 100644 index 0000000..89b4fb4 --- /dev/null +++ b/judge/widgets/image.py @@ -0,0 +1,16 @@ +from django import forms + + +class ImageWidget(forms.ClearableFileInput): + template_name = "widgets/image.html" + + def __init__(self, attrs=None, width=80, height=80): + self.width = width + self.height = height + super().__init__(attrs) + + def get_context(self, name, value, attrs=None): + context = super().get_context(name, value, attrs) + context["widget"]["height"] = self.height + context["widget"]["width"] = self.height + return context diff --git a/locale/vi/LC_MESSAGES/django.po b/locale/vi/LC_MESSAGES/django.po index 04bb140..dc1620d 100644 --- a/locale/vi/LC_MESSAGES/django.po +++ b/locale/vi/LC_MESSAGES/django.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: lqdoj2\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-01 12:22+0700\n" +"POT-Creation-Date: 2023-08-24 10:09+0700\n" "PO-Revision-Date: 2021-07-20 03:44\n" "Last-Translator: Icyene\n" "Language-Team: Vietnamese\n" @@ -19,9 +19,9 @@ msgstr "" "X-Crowdin-File-ID: 5\n" #: chat_box/models.py:31 chat_box/models.py:54 chat_box/models.py:68 -#: judge/admin/interface.py:150 judge/models/contest.py:635 -#: judge/models/contest.py:844 judge/models/course.py:115 -#: judge/models/profile.py:366 judge/models/profile.py:444 +#: judge/admin/interface.py:150 judge/models/contest.py:636 +#: judge/models/contest.py:845 judge/models/course.py:115 +#: judge/models/profile.py:374 judge/models/profile.py:452 msgid "user" msgstr "người dùng" @@ -41,11 +41,11 @@ msgstr "xem lần cuối" msgid "LQDOJ Chat" msgstr "" -#: dmoj/settings.py:363 +#: dmoj/settings.py:365 msgid "Vietnamese" msgstr "Tiếng Việt" -#: dmoj/settings.py:364 +#: dmoj/settings.py:366 msgid "English" msgstr "" @@ -140,7 +140,7 @@ msgstr[0] "%d kỳ thi đã được đánh dấu ẩn." msgid "Mark contests as hidden" msgstr "Ẩn các kỳ thi" -#: judge/admin/contest.py:377 judge/admin/submission.py:248 +#: judge/admin/contest.py:377 judge/admin/submission.py:241 #, python-format msgid "%d submission was successfully scheduled for rejudging." msgid_plural "%d submissions were successfully scheduled for rejudging." @@ -189,7 +189,7 @@ msgid "diff" msgstr "" #: judge/admin/organization.py:61 judge/admin/problem.py:275 -#: judge/admin/profile.py:116 +#: judge/admin/profile.py:117 msgid "View on site" msgstr "Xem trên trang" @@ -221,7 +221,7 @@ msgstr "Điểm" msgid "Limits" msgstr "Giới hạn" -#: judge/admin/problem.py:217 judge/admin/submission.py:358 +#: judge/admin/problem.py:217 judge/admin/submission.py:351 #: templates/base.html:245 templates/stats/tab.html:4 #: templates/submission/list.html:347 msgid "Language" @@ -255,12 +255,12 @@ msgstr[0] "%d bài tập đã được đánh dấu riêng tư." msgid "Mark problems as private" msgstr "Đánh dấu các bài tập là riêng tư" -#: judge/admin/problem.py:432 judge/admin/submission.py:321 +#: judge/admin/problem.py:432 judge/admin/submission.py:314 #: templates/problem/list.html:18 templates/problem/list.html:37 msgid "Problem code" msgstr "Mã bài" -#: judge/admin/problem.py:444 judge/admin/submission.py:327 +#: judge/admin/problem.py:444 judge/admin/submission.py:320 msgid "Problem name" msgstr "Tên bài" @@ -280,11 +280,11 @@ msgstr "Tổng điểm" msgid "Vote" msgstr "" -#: judge/admin/profile.py:40 +#: judge/admin/profile.py:41 msgid "timezone" msgstr "múi giờ" -#: judge/admin/profile.py:125 judge/admin/submission.py:334 +#: judge/admin/profile.py:126 judge/admin/submission.py:327 #: templates/notification/list.html:12 #: templates/organization/requests/log.html:9 #: templates/organization/requests/pending.html:19 @@ -292,28 +292,28 @@ msgstr "múi giờ" msgid "User" msgstr "Thành viên" -#: judge/admin/profile.py:131 templates/registration/registration_form.html:40 +#: judge/admin/profile.py:132 templates/registration/registration_form.html:40 #: templates/user/import/table_csv.html:8 msgid "Email" msgstr "Email" -#: judge/admin/profile.py:137 judge/views/register.py:36 +#: judge/admin/profile.py:138 judge/views/register.py:36 #: templates/registration/registration_form.html:68 -#: templates/user/edit-profile.html:113 +#: templates/user/edit-profile.html:119 msgid "Timezone" msgstr "Múi giờ" -#: judge/admin/profile.py:143 +#: judge/admin/profile.py:144 msgid "date joined" msgstr "ngày tham gia" -#: judge/admin/profile.py:153 +#: judge/admin/profile.py:154 #, 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 điểm lại." -#: judge/admin/profile.py:160 +#: judge/admin/profile.py:161 msgid "Recalculate scores" msgstr "Tính điểm lại" @@ -338,7 +338,7 @@ msgid "Capabilities" msgstr "Khả năng" #: judge/admin/submission.py:31 judge/admin/submission.py:53 -#: judge/admin/submission.py:345 +#: judge/admin/submission.py:338 msgid "None" msgstr "None" @@ -360,29 +360,29 @@ msgctxt "contest problem" msgid "%(problem)s in %(contest)s" msgstr "%(problem)s trong %(contest)s" -#: judge/admin/submission.py:220 judge/admin/submission.py:261 +#: judge/admin/submission.py:213 judge/admin/submission.py:254 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/submission.py:232 +#: judge/admin/submission.py:225 msgid "You do not have the permission to rejudge THAT many submissions." msgstr "Bạn không có quyền chấm lại nhiều bài nộp như vậy." -#: judge/admin/submission.py:255 +#: judge/admin/submission.py:248 msgid "Rejudge the selected submissions" msgstr "Chấm lại các bài nộp đã chọn" -#: judge/admin/submission.py:309 judge/views/problem_manage.py:226 +#: judge/admin/submission.py:302 judge/views/problem_manage.py:226 #, python-format msgid "%d submission were successfully rescored." msgid_plural "%d submissions were successfully rescored." msgstr[0] "%d bài nộp đã được tính điểm lại." -#: judge/admin/submission.py:316 +#: judge/admin/submission.py:309 msgid "Rescore the selected submissions" msgstr "Tính điểm lại cái bài nộp" -#: judge/admin/submission.py:339 templates/notification/list.html:15 +#: judge/admin/submission.py:332 templates/notification/list.html:15 #: templates/organization/requests/log.html:10 #: templates/organization/requests/pending.html:20 #: templates/problem/list.html:154 @@ -391,17 +391,17 @@ msgstr "Tính điểm lại cái bài nộp" msgid "Time" msgstr "Thời gian" -#: judge/admin/submission.py:347 +#: judge/admin/submission.py:340 #, python-format msgid "%d KB" msgstr "%d KB" -#: judge/admin/submission.py:349 +#: judge/admin/submission.py:342 #, python-format msgid "%.2f MB" msgstr "" -#: judge/admin/submission.py:352 templates/submission/status-testcases.html:151 +#: judge/admin/submission.py:345 templates/submission/status-testcases.html:151 msgid "Memory" msgstr "Bộ nhớ" @@ -439,7 +439,7 @@ msgid "" "You need to have solved at least one problem before your voice can be heard." msgstr "Bạn phải giải ít nhất một bài trước khi được phép bình luận." -#: judge/comments.py:128 +#: judge/comments.py:123 msgid "Posted comment" msgstr "Bình luận đã đăng" @@ -467,66 +467,78 @@ msgstr "" msgid "New IOI" msgstr "IOI mới" -#: judge/forms.py:107 judge/views/organization.py:513 -#: judge/views/register.py:62 -#, python-brace-format -msgid "You may not be part of more than {count} public groups." -msgstr "Bạn không thể tham gia nhiều hơn {count} nhóm công khai." +#: judge/forms.py:112 +msgid "File size exceeds the maximum allowed limit of 5MB." +msgstr "File tải lên không được quá 5MB." -#: judge/forms.py:149 +#: judge/forms.py:142 msgid "Any judge" msgstr "" -#: judge/forms.py:355 +#: judge/forms.py:348 msgid "Enter usernames separating by space" msgstr "Nhập các tên đăng nhập, cách nhau bởi dấu cách" -#: judge/forms.py:356 judge/views/stats.py:166 templates/stats/site.html:27 +#: judge/forms.py:349 judge/views/stats.py:166 templates/stats/site.html:27 msgid "New users" msgstr "Thành viên mới" -#: judge/forms.py:373 +#: judge/forms.py:366 #, python-brace-format msgid "These usernames don't exist: {usernames}" msgstr "Các tên đăng nhập này không tồn tại: {usernames}" -#: judge/forms.py:432 judge/views/register.py:30 +#: judge/forms.py:425 judge/views/register.py:30 #: templates/registration/registration_form.html:34 #: templates/user/base-users-table.html:5 #: templates/user/import/table_csv.html:4 msgid "Username" msgstr "Tên đăng nhập" -#: judge/forms.py:433 templates/registration/registration_form.html:46 +#: judge/forms.py:426 templates/registration/registration_form.html:46 #: templates/registration/registration_form.html:60 #: templates/user/import/table_csv.html:5 msgid "Password" msgstr "Mật khẩu" -#: judge/forms.py:459 +#: judge/forms.py:452 msgid "Two Factor Authentication tokens must be 6 decimal digits." msgstr "Two Factor Authentication phải chứa 6 chữ số." -#: judge/forms.py:472 templates/registration/totp_auth.html:32 +#: judge/forms.py:465 templates/registration/totp_auth.html:32 msgid "Invalid Two Factor Authentication token." msgstr "Token Two Factor Authentication không hợp lệ." -#: judge/forms.py:479 judge/models/problem.py:133 +#: judge/forms.py:472 judge/models/problem.py:133 msgid "Problem code must be ^[a-z0-9]+$" msgstr "Mã bài phải có dạng ^[a-z0-9]+$" -#: judge/forms.py:486 +#: judge/forms.py:479 msgid "Problem with code already exists." msgstr "Mã bài đã tồn tại." -#: judge/forms.py:493 judge/models/contest.py:91 +#: judge/forms.py:486 judge/models/contest.py:93 msgid "Contest id must be ^[a-z0-9]+$" msgstr "Mã kỳ thi phải có dạng ^[a-z0-9]+$" -#: judge/forms.py:499 +#: judge/forms.py:493 templates/problem/search-form.html:46 +msgid "Group" +msgstr "" + +#: judge/forms.py:501 msgid "Contest with key already exists." msgstr "Mã kỳ thi đã tồn tại." +#: judge/forms.py:509 +msgid "Group doesn't exist." +msgstr "" + +#: judge/forms.py:511 +#, fuzzy +#| msgid "You do not have the permission to rejudge submissions." +msgid "You don't have permission in this group." +msgstr "Bạn không có quyền chấm lại bài." + #: judge/jinja2/datetime.py:26 templates/blog/blog.html:28 #: templates/blog/dashboard.html:21 msgid "N j, Y, g:i a" @@ -555,30 +567,35 @@ msgstr "Bạn phải là thành viên của nhóm." msgid "No such group" msgstr "Nhóm không tồn tại" -#: judge/models/bookmark.py:14 judge/models/comment.py:171 -#: judge/models/pagevote.py:13 +#: judge/models/bookmark.py:16 judge/models/comment.py:171 +#: judge/models/pagevote.py:15 msgid "associated page" msgstr "trang tương ứng" -#: judge/models/bookmark.py:45 +#: judge/models/bookmark.py:19 judge/models/comment.py:48 +#: judge/models/pagevote.py:18 judge/models/problem.py:713 +msgid "votes" +msgstr "bình chọn" + +#: judge/models/bookmark.py:32 #, fuzzy #| msgid "Bookmark" msgid "bookmark" msgstr "Lưu" -#: judge/models/bookmark.py:46 +#: judge/models/bookmark.py:33 #, fuzzy #| msgid "Bookmark" msgid "bookmarks" msgstr "Lưu" -#: judge/models/bookmark.py:60 +#: judge/models/bookmark.py:54 #, fuzzy #| msgid "Bookmark" msgid "make bookmark" msgstr "Lưu" -#: judge/models/bookmark.py:61 +#: judge/models/bookmark.py:55 #, fuzzy #| msgid "Bookmark" msgid "make bookmarks" @@ -608,11 +625,6 @@ msgstr "" msgid "commenter" msgstr "người bình luận" -#: judge/models/comment.py:48 judge/models/pagevote.py:16 -#: judge/models/problem.py:721 -msgid "votes" -msgstr "bình chọn" - #: judge/models/comment.py:50 msgid "hide the comment" msgstr "ẩn bình luận" @@ -667,104 +679,104 @@ msgstr "" msgid "who trigger, used for non-comment" msgstr "" -#: judge/models/contest.py:38 +#: judge/models/contest.py:40 msgid "Invalid colour." msgstr "" -#: judge/models/contest.py:42 +#: judge/models/contest.py:44 msgid "tag name" msgstr "" -#: judge/models/contest.py:46 +#: judge/models/contest.py:48 msgid "Lowercase letters and hyphens only." msgstr "" -#: judge/models/contest.py:51 +#: judge/models/contest.py:53 msgid "tag colour" msgstr "" -#: judge/models/contest.py:53 +#: judge/models/contest.py:55 msgid "tag description" msgstr "" -#: judge/models/contest.py:74 +#: judge/models/contest.py:76 msgid "contest tag" msgstr "" -#: judge/models/contest.py:75 judge/models/contest.py:243 +#: judge/models/contest.py:77 judge/models/contest.py:245 msgid "contest tags" msgstr "nhãn kỳ thi" -#: judge/models/contest.py:83 +#: judge/models/contest.py:85 msgid "Visible" msgstr "Hiển thị" -#: judge/models/contest.py:84 +#: judge/models/contest.py:86 msgid "Hidden for duration of contest" msgstr "Ẩn trong thời gian kỳ thi" -#: judge/models/contest.py:85 +#: judge/models/contest.py:87 msgid "Hidden for duration of participation" msgstr "Ẩn trong thời gian tham gia" -#: judge/models/contest.py:89 +#: judge/models/contest.py:91 msgid "contest id" msgstr "ID kỳ thi" -#: judge/models/contest.py:94 +#: judge/models/contest.py:96 msgid "contest name" msgstr "tên kỳ thi" -#: judge/models/contest.py:98 +#: judge/models/contest.py:100 msgid "These users will be able to edit the contest." msgstr "Những người dùng này có quyền chỉnh sửa kỳ thi." -#: judge/models/contest.py:104 +#: judge/models/contest.py:106 msgid "" "These users will be able to edit the contest, but will not be listed as " "authors." msgstr "Những người dùng này là tác giả và có quyền chỉnh sửa kỳ thi." -#: judge/models/contest.py:113 +#: judge/models/contest.py:115 msgid "These users will be able to view the contest, but not edit it." msgstr "" "Những người dùng này có thể thấy kỳ thi nhưng không có quyền chỉnh sửa." -#: judge/models/contest.py:118 judge/models/course.py:158 +#: judge/models/contest.py:120 judge/models/course.py:158 #: judge/models/runtime.py:211 msgid "description" msgstr "mô tả" -#: judge/models/contest.py:120 judge/models/problem.py:593 +#: judge/models/contest.py:122 judge/models/problem.py:583 #: judge/models/runtime.py:216 msgid "problems" msgstr "bài tập" -#: judge/models/contest.py:122 judge/models/contest.py:640 +#: judge/models/contest.py:124 judge/models/contest.py:641 msgid "start time" msgstr "thời gian bắt đầu" -#: judge/models/contest.py:123 +#: judge/models/contest.py:125 msgid "end time" msgstr "thời gian kết thúc" -#: judge/models/contest.py:125 judge/models/problem.py:186 -#: judge/models/problem.py:628 +#: judge/models/contest.py:127 judge/models/problem.py:186 +#: judge/models/problem.py:618 msgid "time limit" msgstr "giới hạn thời gian" -#: judge/models/contest.py:129 +#: judge/models/contest.py:131 msgid "" "Format hh:mm:ss. For example, if you want a 2-hour contest, enter 02:00:00" msgstr "" "Định dạng hh:mm:ss (giờ:phút:giây). Ví dụ, nếu muốn tạo kỳ thi dài 2h, hãy " "nhập 02:00:00" -#: judge/models/contest.py:133 +#: judge/models/contest.py:135 msgid "freeze after" msgstr "đóng băng sau" -#: judge/models/contest.py:137 +#: judge/models/contest.py:139 msgid "" "Format hh:mm:ss. For example, if you want to freeze contest after 2 hours, " "enter 02:00:00" @@ -772,12 +784,12 @@ msgstr "" "Định dạng hh:mm:ss (giờ:phút:giây). Ví dụ, nếu muốn đóng băng kỳ thi sau 2h, " "hãy nhập 02:00:00" -#: judge/models/contest.py:141 judge/models/course.py:28 +#: judge/models/contest.py:143 judge/models/course.py:28 #: judge/models/course.py:164 judge/models/problem.py:225 msgid "publicly visible" msgstr "công khai" -#: judge/models/contest.py:144 +#: judge/models/contest.py:146 msgid "" "Should be set even for organization-private contests, where it determines " "whether the contest is visible to members of the specified organizations." @@ -785,84 +797,84 @@ msgstr "" "Đánh dấu ngay cả với các kỳ thi riêng tư của nhóm, quyết định việc kỳ thi có " "được hiển thị với các thành viên hay không." -#: judge/models/contest.py:150 +#: judge/models/contest.py:152 msgid "contest rated" msgstr "kỳ thi được xếp hạng" -#: judge/models/contest.py:151 +#: judge/models/contest.py:153 msgid "Whether this contest can be rated." msgstr "Quyết định kỳ thi có được xếp hạng không." -#: judge/models/contest.py:155 +#: judge/models/contest.py:157 msgid "scoreboard visibility" msgstr "khả năng hiển thị của bảng điểm" -#: judge/models/contest.py:158 +#: judge/models/contest.py:160 msgid "Scoreboard visibility through the duration of the contest" msgstr "Khả năng hiển thị của bảng điểm trong thời gian kỳ thi" -#: judge/models/contest.py:163 +#: judge/models/contest.py:165 msgid "view contest scoreboard" msgstr "xem bảng điểm kỳ thi" -#: judge/models/contest.py:166 +#: judge/models/contest.py:168 msgid "These users will be able to view the scoreboard." msgstr "Những người dùng này được phép xem bảng điểm." -#: judge/models/contest.py:169 +#: judge/models/contest.py:171 msgid "no comments" msgstr "không bình luận" -#: judge/models/contest.py:170 +#: judge/models/contest.py:172 msgid "Use clarification system instead of comments." msgstr "Dùng hệ thống thông báo thay vì bình luận." -#: judge/models/contest.py:175 +#: judge/models/contest.py:177 msgid "Rating floor for contest" msgstr "Cận dưới rating được xếp hạng trong kỳ thi" -#: judge/models/contest.py:181 +#: judge/models/contest.py:183 msgid "Rating ceiling for contest" msgstr "Cận trên rating được xếp hạng trong kỳ thi" -#: judge/models/contest.py:186 +#: judge/models/contest.py:188 msgid "rate all" msgstr "xếp hạng tất cả" -#: judge/models/contest.py:187 +#: judge/models/contest.py:189 msgid "Rate all users who joined." msgstr "Xếp hạng tất cả người dùng đã tham gia (kể cả không nộp)." -#: judge/models/contest.py:192 +#: judge/models/contest.py:194 msgid "exclude from ratings" msgstr "không xếp hạng" -#: judge/models/contest.py:197 +#: judge/models/contest.py:199 msgid "private to specific users" msgstr "riêng tư với các người dùng này" -#: judge/models/contest.py:202 +#: judge/models/contest.py:204 msgid "private contestants" msgstr "thí sinh riêng tư" -#: judge/models/contest.py:203 +#: judge/models/contest.py:205 msgid "If private, only these users may see the contest" msgstr "Nếu riêng tư, chỉ những người dùng này mới thấy kỳ thi" -#: judge/models/contest.py:207 +#: judge/models/contest.py:209 msgid "hide problem tags" msgstr "ẩn nhãn kỳ thi" -#: judge/models/contest.py:208 +#: judge/models/contest.py:210 msgid "Whether problem tags should be hidden by default." msgstr "" "Quyết định việc nhãn bài tập (DP, Tham lam, ...) được ẩn trong kỳ thi không." -#: judge/models/contest.py:212 +#: judge/models/contest.py:214 msgid "run pretests only" msgstr "chỉ chạy pretests" -#: judge/models/contest.py:214 +#: judge/models/contest.py:216 msgid "" "Whether judges should grade pretests only, versus all testcases. Commonly " "set during a contest, then unset prior to rejudging user submissions when " @@ -871,51 +883,51 @@ msgstr "" "Quyết định việc các máy chấm chỉ chấm pretests thay vì tất cả các test. Sau " "kỳ thi, hãy bỏ đánh dấu ô này và chấm lại tất cả các bài." -#: judge/models/contest.py:221 judge/models/interface.py:96 -#: judge/models/problem.py:283 +#: judge/models/contest.py:223 judge/models/interface.py:96 +#: judge/models/problem.py:285 msgid "private to organizations" msgstr "riêng tư với các tổ chức" -#: judge/models/contest.py:226 judge/models/course.py:34 -#: judge/models/interface.py:92 judge/models/problem.py:279 -#: judge/models/profile.py:130 +#: judge/models/contest.py:228 judge/models/course.py:34 +#: judge/models/interface.py:92 judge/models/problem.py:281 +#: judge/models/profile.py:137 msgid "organizations" msgstr "tổ chức" -#: judge/models/contest.py:227 +#: judge/models/contest.py:229 msgid "If private, only these organizations may see the contest" msgstr "Nếu riêng tư, chỉ những tổ chức này thấy được kỳ thi" -#: judge/models/contest.py:230 judge/models/problem.py:256 +#: judge/models/contest.py:232 judge/models/problem.py:256 msgid "OpenGraph image" msgstr "Hình ảnh OpenGraph" -#: judge/models/contest.py:233 judge/models/profile.py:85 +#: judge/models/contest.py:235 judge/models/profile.py:92 msgid "Logo override image" msgstr "Hình ảnh ghi đè logo" -#: judge/models/contest.py:238 +#: judge/models/contest.py:240 msgid "" "This image will replace the default site logo for users inside the contest." msgstr "Ảnh này sẽ thay thế cho logo mặc định trong kỳ thi." -#: judge/models/contest.py:246 +#: judge/models/contest.py:248 msgid "the amount of live participants" msgstr "số lượng thí sinh thi trực tiếp" -#: judge/models/contest.py:250 +#: judge/models/contest.py:252 msgid "contest summary" msgstr "tổng kết kỳ thi" -#: judge/models/contest.py:252 judge/models/problem.py:262 +#: judge/models/contest.py:254 judge/models/problem.py:262 msgid "Plain-text, shown in meta description tag, e.g. for social media." msgstr "" -#: judge/models/contest.py:256 judge/models/profile.py:80 +#: judge/models/contest.py:258 judge/models/profile.py:87 msgid "access code" msgstr "mật khẩu truy cập" -#: judge/models/contest.py:261 +#: judge/models/contest.py:263 msgid "" "An optional code to prompt contestants before they are allowed to join the " "contest. Leave it blank to disable." @@ -923,296 +935,296 @@ msgstr "" "Mật khẩu truy cập cho các thí sinh muốn tham gia kỳ thi. Để trống nếu không " "dùng." -#: judge/models/contest.py:267 judge/models/problem.py:244 +#: judge/models/contest.py:269 judge/models/problem.py:244 msgid "personae non gratae" msgstr "Chặn tham gia" -#: judge/models/contest.py:269 +#: judge/models/contest.py:271 msgid "Bans the selected users from joining this contest." msgstr "Cấm những người dùng được chọn tham gia kỳ thi." -#: judge/models/contest.py:272 +#: judge/models/contest.py:274 msgid "contest format" msgstr "format kỳ thi" -#: judge/models/contest.py:276 +#: judge/models/contest.py:278 msgid "The contest format module to use." msgstr "Format kỳ thi sử dụng." -#: judge/models/contest.py:279 +#: judge/models/contest.py:281 msgid "contest format configuration" msgstr "Tùy chỉnh format kỳ thi" -#: judge/models/contest.py:283 +#: judge/models/contest.py:285 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:296 +#: judge/models/contest.py:298 msgid "precision points" msgstr "Hiển thị điểm" -#: judge/models/contest.py:299 +#: judge/models/contest.py:301 msgid "Number of digits to round points to." msgstr "Số chữ số thập phân trên bảng điểm." -#: judge/models/contest.py:608 +#: judge/models/contest.py:609 msgid "See private contests" msgstr "" -#: judge/models/contest.py:609 +#: judge/models/contest.py:610 msgid "Edit own contests" msgstr "" -#: judge/models/contest.py:610 +#: judge/models/contest.py:611 msgid "Edit all contests" msgstr "" -#: judge/models/contest.py:611 +#: judge/models/contest.py:612 msgid "Clone contest" msgstr "" -#: judge/models/contest.py:612 templates/contest/moss.html:72 +#: judge/models/contest.py:613 templates/contest/moss.html:72 msgid "MOSS contest" msgstr "" -#: judge/models/contest.py:613 +#: judge/models/contest.py:614 msgid "Rate contests" msgstr "" -#: judge/models/contest.py:614 +#: judge/models/contest.py:615 msgid "Contest access codes" msgstr "" -#: judge/models/contest.py:615 +#: judge/models/contest.py:616 msgid "Create private contests" msgstr "" -#: judge/models/contest.py:616 +#: judge/models/contest.py:617 msgid "Change contest visibility" msgstr "" -#: judge/models/contest.py:617 +#: judge/models/contest.py:618 msgid "Edit contest problem label script" msgstr "Cách hiển thị thứ tự bài tập" -#: judge/models/contest.py:619 judge/models/contest.py:766 -#: judge/models/contest.py:847 judge/models/contest.py:877 +#: judge/models/contest.py:620 judge/models/contest.py:767 +#: judge/models/contest.py:848 judge/models/contest.py:878 #: judge/models/course.py:178 judge/models/submission.py:116 msgid "contest" msgstr "kỳ thi" -#: judge/models/contest.py:620 +#: judge/models/contest.py:621 msgid "contests" msgstr "kỳ thi" -#: judge/models/contest.py:629 +#: judge/models/contest.py:630 msgid "associated contest" msgstr "" -#: judge/models/contest.py:642 +#: judge/models/contest.py:643 msgid "score" msgstr "điểm" -#: judge/models/contest.py:643 +#: judge/models/contest.py:644 msgid "cumulative time" msgstr "tổng thời gian" -#: judge/models/contest.py:645 +#: judge/models/contest.py:646 msgid "is disqualified" msgstr "đã bị loại" -#: judge/models/contest.py:647 +#: judge/models/contest.py:648 msgid "Whether this participation is disqualified." msgstr "Quyết định thí sinh có bị loại không." -#: judge/models/contest.py:649 +#: judge/models/contest.py:650 msgid "tie-breaking field" msgstr "" -#: judge/models/contest.py:651 +#: judge/models/contest.py:652 msgid "virtual participation id" msgstr "id lần tham gia ảo" -#: judge/models/contest.py:653 +#: judge/models/contest.py:654 msgid "0 means non-virtual, otherwise the n-th virtual participation." msgstr "0 nghĩa là tham gia chính thức, ngược lại là lần tham gia ảo thứ n." -#: judge/models/contest.py:656 +#: judge/models/contest.py:657 msgid "contest format specific data" msgstr "" -#: judge/models/contest.py:659 +#: judge/models/contest.py:660 msgid "same as format_data, but including frozen results" msgstr "" -#: judge/models/contest.py:663 +#: judge/models/contest.py:664 #, fuzzy #| msgid "score" msgid "final score" msgstr "điểm" -#: judge/models/contest.py:665 +#: judge/models/contest.py:666 #, fuzzy #| msgid "cumulative time" msgid "final cumulative time" msgstr "tổng thời gian" -#: judge/models/contest.py:741 +#: judge/models/contest.py:742 #, python-format msgid "%s spectating in %s" msgstr "%s đang theo dõi trong %s" -#: judge/models/contest.py:746 +#: judge/models/contest.py:747 #, python-format msgid "%s in %s, v%d" msgstr "%s trong %s, v%d" -#: judge/models/contest.py:751 +#: judge/models/contest.py:752 #, python-format msgid "%s in %s" msgstr "%s trong %s" -#: judge/models/contest.py:754 +#: judge/models/contest.py:755 msgid "contest participation" msgstr "lần tham gia kỳ thi" -#: judge/models/contest.py:755 +#: judge/models/contest.py:756 msgid "contest participations" msgstr "lần tham gia kỳ thi" -#: judge/models/contest.py:762 judge/models/contest.py:818 -#: judge/models/contest.py:880 judge/models/problem.py:592 -#: judge/models/problem.py:599 judge/models/problem.py:620 -#: judge/models/problem.py:651 judge/models/problem_data.py:50 +#: judge/models/contest.py:763 judge/models/contest.py:819 +#: judge/models/contest.py:881 judge/models/problem.py:582 +#: judge/models/problem.py:589 judge/models/problem.py:610 +#: judge/models/problem.py:641 judge/models/problem_data.py:50 msgid "problem" msgstr "bài tập" -#: judge/models/contest.py:770 judge/models/contest.py:830 +#: judge/models/contest.py:771 judge/models/contest.py:831 #: judge/models/course.py:182 judge/models/problem.py:209 msgid "points" msgstr "điểm" -#: judge/models/contest.py:771 +#: judge/models/contest.py:772 msgid "partial" msgstr "thành phần" -#: judge/models/contest.py:772 judge/models/contest.py:832 +#: judge/models/contest.py:773 judge/models/contest.py:833 msgid "is pretested" msgstr "dùng pretest" -#: judge/models/contest.py:773 judge/models/interface.py:47 +#: judge/models/contest.py:774 judge/models/interface.py:47 msgid "order" msgstr "thứ tự" -#: judge/models/contest.py:775 +#: judge/models/contest.py:776 msgid "0 to not show testcases, 1 to show" msgstr "0 để ẩn test, 1 để hiện" -#: judge/models/contest.py:776 +#: judge/models/contest.py:777 msgid "visible testcases" msgstr "hiển thị test" -#: judge/models/contest.py:783 +#: judge/models/contest.py:784 msgid "Maximum number of submissions for this problem, or 0 for no limit." msgstr "Số lần nộp tối đa, đặt là 0 nếu không có giới hạn." -#: judge/models/contest.py:785 +#: judge/models/contest.py:786 msgid "max submissions" msgstr "số lần nộp tối đa" -#: judge/models/contest.py:788 +#: judge/models/contest.py:789 msgid "Why include a problem you can't submit to?" msgstr "" -#: judge/models/contest.py:792 +#: judge/models/contest.py:793 #, fuzzy #| msgid "Only for format new IOI. Separated by commas, e.g: 2, 3" msgid "Separated by commas, e.g: 2, 3" msgstr "" "Chỉ dùng với format IOI mới. Các sub cách nhau bởi dấu phẩy. Ví dụ: 2, 3" -#: judge/models/contest.py:793 +#: judge/models/contest.py:794 #, fuzzy #| msgid "frozen subtasks" msgid "hidden subtasks" msgstr "Đóng băng subtasks" -#: judge/models/contest.py:805 +#: judge/models/contest.py:806 msgid "contest problem" msgstr "bài trong kỳ thi" -#: judge/models/contest.py:806 +#: judge/models/contest.py:807 msgid "contest problems" msgstr "bài trong kỳ thi" -#: judge/models/contest.py:812 judge/models/submission.py:233 +#: judge/models/contest.py:813 judge/models/submission.py:233 msgid "submission" msgstr "bài nộp" -#: judge/models/contest.py:825 judge/models/contest.py:851 +#: judge/models/contest.py:826 judge/models/contest.py:852 msgid "participation" msgstr "lần tham gia" -#: judge/models/contest.py:833 +#: judge/models/contest.py:834 msgid "Whether this submission was ran only on pretests." msgstr "Quyết định bài nộp chỉ được chạy trên pretest không." -#: judge/models/contest.py:838 +#: judge/models/contest.py:839 msgid "contest submission" msgstr "bài nộp kỳ thi" -#: judge/models/contest.py:839 +#: judge/models/contest.py:840 msgid "contest submissions" msgstr "bài nộp kỳ thi" -#: judge/models/contest.py:855 +#: judge/models/contest.py:856 msgid "rank" msgstr "rank" -#: judge/models/contest.py:856 +#: judge/models/contest.py:857 msgid "rating" msgstr "rating" -#: judge/models/contest.py:857 +#: judge/models/contest.py:858 msgid "raw rating" msgstr "rating thật" -#: judge/models/contest.py:858 +#: judge/models/contest.py:859 msgid "contest performance" msgstr "" -#: judge/models/contest.py:859 +#: judge/models/contest.py:860 msgid "last rated" msgstr "lần cuối được xếp hạng" -#: judge/models/contest.py:863 +#: judge/models/contest.py:864 msgid "contest rating" msgstr "rating kỳ thi" -#: judge/models/contest.py:864 +#: judge/models/contest.py:865 msgid "contest ratings" msgstr "rating kỳ thi" -#: judge/models/contest.py:888 +#: judge/models/contest.py:889 msgid "contest moss result" msgstr "kết quả MOSS kỳ thi" -#: judge/models/contest.py:889 +#: judge/models/contest.py:890 msgid "contest moss results" msgstr "kết quả MOSS kỳ thi" -#: judge/models/contest.py:894 +#: judge/models/contest.py:895 msgid "clarified problem" msgstr "" -#: judge/models/contest.py:896 +#: judge/models/contest.py:897 msgid "clarification body" msgstr "" -#: judge/models/contest.py:898 +#: judge/models/contest.py:899 msgid "clarification timestamp" msgstr "" @@ -1222,7 +1234,7 @@ msgstr "" msgid "course name" msgstr "tên đăng nhập" -#: judge/models/course.py:23 judge/models/profile.py:46 +#: judge/models/course.py:23 judge/models/profile.py:53 msgid "organization description" msgstr "mô tả tổ chức" @@ -1248,7 +1260,7 @@ msgstr "" msgid "Course name shown in URL" msgstr "Tên được hiển thị trong đường dẫn" -#: judge/models/course.py:43 judge/models/profile.py:38 +#: judge/models/course.py:43 judge/models/profile.py:45 msgid "Only alphanumeric and hyphens" msgstr "" @@ -1325,7 +1337,7 @@ msgstr "mục cha" msgid "post title" msgstr "tiêu đề bài đăng" -#: judge/models/interface.py:79 judge/models/problem.py:677 +#: judge/models/interface.py:79 judge/models/problem.py:667 msgid "authors" msgstr "tác giả" @@ -1333,7 +1345,7 @@ msgstr "tác giả" msgid "slug" msgstr "slug" -#: judge/models/interface.py:81 judge/models/problem.py:675 +#: judge/models/interface.py:81 judge/models/problem.py:665 msgid "public visibility" msgstr "khả năng hiển thị công khai" @@ -1361,15 +1373,15 @@ msgstr "hình ảnh openGraph" msgid "If private, only these organizations may see the blog post." msgstr "Nếu riêng tư, chỉ những tổ chức này thấy được bài đăng." -#: judge/models/interface.py:146 +#: judge/models/interface.py:136 msgid "Edit all posts" msgstr "Chỉnh sửa tất cả bài đăng" -#: judge/models/interface.py:147 +#: judge/models/interface.py:137 msgid "blog post" msgstr "bài đăng" -#: judge/models/interface.py:148 +#: judge/models/interface.py:138 msgid "blog posts" msgstr "bài đăng" @@ -1397,25 +1409,25 @@ msgstr "thời gian gửi" msgid "messages in the thread" msgstr "tin nhắn trong chuỗi" -#: judge/models/pagevote.py:19 +#: judge/models/pagevote.py:24 #, fuzzy #| msgid "votes" msgid "pagevote" msgstr "bình chọn" -#: judge/models/pagevote.py:20 +#: judge/models/pagevote.py:25 #, fuzzy #| msgid "votes" msgid "pagevotes" msgstr "bình chọn" -#: judge/models/pagevote.py:40 +#: judge/models/pagevote.py:49 #, fuzzy #| msgid "volunteer vote" msgid "pagevote vote" msgstr "vote từ TNV" -#: judge/models/pagevote.py:41 +#: judge/models/pagevote.py:50 #, fuzzy #| msgid "volunteer votes" msgid "pagevote votes" @@ -1466,7 +1478,7 @@ msgstr "đường dẫn" msgid "full name" msgstr "tên đầy đủ" -#: judge/models/problem.py:86 judge/models/profile.py:43 +#: judge/models/problem.py:86 judge/models/profile.py:50 #: judge/models/runtime.py:34 msgid "short name" msgstr "tên ngắn" @@ -1562,7 +1574,7 @@ msgstr "" "Giới hạn thời gian cho bài tập này, theo đơn vị giây. Có thể nhập số thực " "(ví dụ 1.5)" -#: judge/models/problem.py:197 judge/models/problem.py:635 +#: judge/models/problem.py:197 judge/models/problem.py:625 msgid "memory limit" msgstr "Giới hạn bộ nhớ" @@ -1635,95 +1647,95 @@ msgstr "Số lượng người dùng đã giải được bài" msgid "solve rate" msgstr "Tỉ lệ giải đúng" -#: judge/models/problem.py:280 +#: judge/models/problem.py:282 msgid "If private, only these organizations may see the problem." msgstr "Nếu bài riêng tư, chỉ những tổ chức này thấy được" -#: judge/models/problem.py:286 +#: judge/models/problem.py:288 msgid "pdf statement" msgstr "Đề bài bằng file pdf" -#: judge/models/problem.py:604 judge/models/problem.py:625 -#: judge/models/problem.py:656 judge/models/runtime.py:161 +#: judge/models/problem.py:594 judge/models/problem.py:615 +#: judge/models/problem.py:646 judge/models/runtime.py:161 msgid "language" msgstr "" -#: judge/models/problem.py:607 +#: judge/models/problem.py:597 msgid "translated name" msgstr "" -#: judge/models/problem.py:609 +#: judge/models/problem.py:599 msgid "translated description" msgstr "" -#: judge/models/problem.py:613 +#: judge/models/problem.py:603 msgid "problem translation" msgstr "" -#: judge/models/problem.py:614 +#: judge/models/problem.py:604 msgid "problem translations" msgstr "" -#: judge/models/problem.py:644 +#: judge/models/problem.py:634 msgid "language-specific resource limit" msgstr "" -#: judge/models/problem.py:645 +#: judge/models/problem.py:635 msgid "language-specific resource limits" msgstr "" -#: judge/models/problem.py:658 judge/models/submission.py:249 +#: judge/models/problem.py:648 judge/models/submission.py:249 msgid "source code" msgstr "mã nguồn" -#: judge/models/problem.py:662 +#: judge/models/problem.py:652 msgid "language-specific template" msgstr "" -#: judge/models/problem.py:663 +#: judge/models/problem.py:653 msgid "language-specific templates" msgstr "" -#: judge/models/problem.py:670 +#: judge/models/problem.py:660 msgid "associated problem" msgstr "" -#: judge/models/problem.py:676 +#: judge/models/problem.py:666 msgid "publish date" msgstr "" -#: judge/models/problem.py:678 +#: judge/models/problem.py:668 msgid "editorial content" msgstr "nội dung lời giải" -#: judge/models/problem.py:689 +#: judge/models/problem.py:681 #, python-format msgid "Editorial for %s" msgstr "" -#: judge/models/problem.py:693 +#: judge/models/problem.py:685 msgid "solution" msgstr "lời giải" -#: judge/models/problem.py:694 +#: judge/models/problem.py:686 msgid "solutions" msgstr "lời giải" -#: judge/models/problem.py:699 +#: judge/models/problem.py:691 #, fuzzy #| msgid "point value" msgid "proposed point value" msgstr "điểm" -#: judge/models/problem.py:700 +#: judge/models/problem.py:692 msgid "The amount of points you think this problem deserves." msgstr "Bạn nghĩ bài này đáng bao nhiêu điểm?" -#: judge/models/problem.py:714 +#: judge/models/problem.py:706 msgid "The time this vote was cast" msgstr "" -#: judge/models/problem.py:720 +#: judge/models/problem.py:712 msgid "vote" msgstr "" @@ -1895,206 +1907,206 @@ msgstr "điểm" msgid "case is pretest?" msgstr "test là pretest?" -#: judge/models/profile.py:31 +#: judge/models/profile.py:38 msgid "organization title" msgstr "tiêu đề tổ chức" -#: judge/models/profile.py:34 +#: judge/models/profile.py:41 msgid "organization slug" msgstr "tên ngắn đường dẫn" -#: judge/models/profile.py:35 +#: judge/models/profile.py:42 msgid "Organization name shown in URL" msgstr "Tên được hiển thị trong đường dẫn" -#: judge/models/profile.py:44 +#: judge/models/profile.py:51 msgid "Displayed beside user name during contests" msgstr "Hiển thị bên cạnh tên người dùng trong kỳ thi" -#: judge/models/profile.py:49 +#: judge/models/profile.py:56 msgid "registrant" msgstr "người tạo" -#: judge/models/profile.py:52 +#: judge/models/profile.py:59 msgid "User who registered this organization" msgstr "Người tạo tổ chức" -#: judge/models/profile.py:56 +#: judge/models/profile.py:63 msgid "administrators" msgstr "người quản lý" -#: judge/models/profile.py:58 +#: judge/models/profile.py:65 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:61 +#: judge/models/profile.py:68 msgid "creation date" msgstr "ngày tạo" -#: judge/models/profile.py:64 +#: judge/models/profile.py:71 msgid "is open organization?" msgstr "tổ chức mở?" -#: judge/models/profile.py:65 +#: judge/models/profile.py:72 msgid "Allow joining organization" msgstr "Cho phép mọi người tham gia tổ chức" -#: judge/models/profile.py:69 +#: judge/models/profile.py:76 msgid "maximum size" msgstr "số lượng thành viên tối đa" -#: judge/models/profile.py:73 +#: judge/models/profile.py:80 msgid "" "Maximum amount of users in this organization, only applicable to private " "organizations" msgstr "Số người tối đa trong tổ chức, chỉ áp dụng với tổ chức riêng tư" -#: judge/models/profile.py:79 +#: judge/models/profile.py:86 msgid "Student access code" msgstr "Mã truy cập cho học sinh" -#: judge/models/profile.py:90 +#: judge/models/profile.py:97 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 khi ở trong tổ chức." -#: judge/models/profile.py:129 judge/models/profile.py:158 -#: judge/models/profile.py:372 judge/models/profile.py:451 +#: judge/models/profile.py:136 judge/models/profile.py:165 +#: judge/models/profile.py:380 judge/models/profile.py:459 msgid "organization" msgstr "" -#: judge/models/profile.py:135 +#: judge/models/profile.py:142 msgid "user associated" msgstr "" -#: judge/models/profile.py:137 +#: judge/models/profile.py:144 msgid "self-description" msgstr "" -#: judge/models/profile.py:140 +#: judge/models/profile.py:147 msgid "location" msgstr "" -#: judge/models/profile.py:146 +#: judge/models/profile.py:153 msgid "preferred language" msgstr "" -#: judge/models/profile.py:154 +#: judge/models/profile.py:161 msgid "last access time" msgstr "" -#: judge/models/profile.py:155 +#: judge/models/profile.py:162 msgid "last IP" msgstr "" -#: judge/models/profile.py:166 +#: judge/models/profile.py:173 msgid "display rank" msgstr "" -#: judge/models/profile.py:174 +#: judge/models/profile.py:181 msgid "comment mute" msgstr "" -#: judge/models/profile.py:175 +#: judge/models/profile.py:182 msgid "Some users are at their best when silent." msgstr "" -#: judge/models/profile.py:179 +#: judge/models/profile.py:186 msgid "unlisted user" msgstr "" -#: judge/models/profile.py:180 +#: judge/models/profile.py:187 msgid "User will not be ranked." msgstr "" -#: judge/models/profile.py:184 +#: judge/models/profile.py:191 #, fuzzy #| msgid "Banned from joining" msgid "banned from voting" msgstr "Bị cấm tham gia" -#: judge/models/profile.py:185 +#: judge/models/profile.py:192 msgid "User will not be able to vote on problems' point values." msgstr "" -#: judge/models/profile.py:190 +#: judge/models/profile.py:197 msgid "user script" msgstr "" -#: judge/models/profile.py:194 +#: judge/models/profile.py:201 msgid "User-defined JavaScript for site customization." msgstr "" -#: judge/models/profile.py:198 +#: judge/models/profile.py:205 msgid "current contest" msgstr "kỳ thi hiện tại" -#: judge/models/profile.py:205 +#: judge/models/profile.py:212 msgid "math engine" msgstr "" -#: judge/models/profile.py:209 +#: judge/models/profile.py:216 msgid "the rendering engine used to render math" msgstr "" -#: judge/models/profile.py:212 +#: judge/models/profile.py:219 msgid "2FA enabled" msgstr "" -#: judge/models/profile.py:214 +#: judge/models/profile.py:221 msgid "check to enable TOTP-based two factor authentication" msgstr "đánh dấu để sử dụng TOTP-based two factor authentication" -#: judge/models/profile.py:220 +#: judge/models/profile.py:227 msgid "TOTP key" msgstr "mã TOTP" -#: judge/models/profile.py:221 +#: judge/models/profile.py:228 msgid "32 character base32-encoded key for TOTP" msgstr "" -#: judge/models/profile.py:223 +#: judge/models/profile.py:230 msgid "TOTP key must be empty or base32" msgstr "" -#: judge/models/profile.py:227 +#: judge/models/profile.py:234 msgid "internal notes" msgstr "ghi chú nội bộ" -#: judge/models/profile.py:230 +#: judge/models/profile.py:237 msgid "Notes for administrators regarding this user." msgstr "Ghi chú riêng cho quản trị viên." -#: judge/models/profile.py:359 +#: judge/models/profile.py:367 msgid "user profile" msgstr "thông tin người dùng" -#: judge/models/profile.py:360 +#: judge/models/profile.py:368 msgid "user profiles" msgstr "thông tin người dùng" -#: judge/models/profile.py:376 +#: judge/models/profile.py:384 msgid "request time" msgstr "thời gian đăng ký" -#: judge/models/profile.py:379 +#: judge/models/profile.py:387 msgid "state" msgstr "trạng thái" -#: judge/models/profile.py:386 +#: judge/models/profile.py:394 msgid "reason" msgstr "lý do" -#: judge/models/profile.py:389 +#: judge/models/profile.py:397 msgid "organization join request" msgstr "đơn đăng ký tham gia" -#: judge/models/profile.py:390 +#: judge/models/profile.py:398 msgid "organization join requests" msgstr "đơn đăng ký tham gia" -#: judge/models/profile.py:456 +#: judge/models/profile.py:464 #, fuzzy #| msgid "last seen" msgid "last visit" @@ -2580,17 +2592,17 @@ msgstr "" msgid "How did you corrupt the generator path?" msgstr "" -#: judge/utils/problem_data.py:237 +#: judge/utils/problem_data.py:236 msgid "Invalid interactor judge" msgstr "" -#: judge/utils/problem_data.py:249 +#: judge/utils/problem_data.py:260 #, fuzzy #| msgid "Invalid Return" msgid "Invalid signature handler" msgstr "Invalid Return" -#: judge/utils/problem_data.py:254 +#: judge/utils/problem_data.py:263 msgid "Invalid signature header" msgstr "" @@ -2648,7 +2660,7 @@ msgstr "%h:%m" #: judge/views/about.py:10 templates/organization/home.html:47 #: templates/organization/org-right-sidebar.html:70 -#: templates/user/user-about.html:83 templates/user/user-tabs.html:4 +#: templates/user/user-about.html:72 templates/user/user-tabs.html:4 #: templates/user/users-table.html:22 msgid "About" msgstr "Giới thiệu" @@ -2662,11 +2674,11 @@ msgstr "Hướng dẫn viết trình chấm" msgid "Page %d of Posts" msgstr "Trang %d" -#: judge/views/blog.py:152 +#: judge/views/blog.py:149 msgid "Ticket feed" msgstr "Báo cáo" -#: judge/views/blog.py:169 +#: judge/views/blog.py:166 msgid "Comment feed" msgstr "Bình luận" @@ -2682,8 +2694,8 @@ msgstr "Bạn phải giải ít nhất 1 bài trước khi được vote." msgid "You already voted." msgstr "Bạn đã vote." -#: judge/views/comment.py:253 judge/views/organization.py:810 -#: judge/views/organization.py:956 judge/views/organization.py:1121 +#: judge/views/comment.py:253 judge/views/organization.py:807 +#: judge/views/organization.py:953 judge/views/organization.py:1118 msgid "Edited from site" msgstr "Chỉnh sửa từ web" @@ -2692,7 +2704,7 @@ msgid "Editing comment" msgstr "Chỉnh sửa bình luận" #: judge/views/contests.py:119 judge/views/contests.py:387 -#: judge/views/contests.py:392 judge/views/contests.py:649 +#: judge/views/contests.py:392 judge/views/contests.py:663 msgid "No such contest" msgstr "Không có contest nào như vậy" @@ -2703,7 +2715,7 @@ msgstr "Không tìm thấy kỳ thi với mã \"%s\"." #: judge/views/contests.py:139 judge/views/stats.py:178 #: templates/organization/org-left-sidebar.html:5 templates/stats/site.html:21 -#: templates/user/user-bookmarks.html:54 +#: templates/user/user-bookmarks.html:56 msgid "Contests" msgstr "Kỳ thi" @@ -2716,113 +2728,113 @@ msgstr "Không tìm thấy kỳ thi nào như vậy." msgid "Access to contest \"%s\" denied" msgstr "Truy cập tới kỳ thi \"%s\" bị từ chối" -#: judge/views/contests.py:454 +#: judge/views/contests.py:451 msgid "Clone Contest" msgstr "Nhân bản kỳ thi" -#: judge/views/contests.py:523 +#: judge/views/contests.py:537 msgid "Contest not ongoing" msgstr "Kỳ thi đang không diễn ra" -#: judge/views/contests.py:524 +#: judge/views/contests.py:538 #, python-format msgid "\"%s\" is not currently ongoing." msgstr "\"%s\" kỳ thi đang không diễn ra." -#: judge/views/contests.py:531 +#: judge/views/contests.py:545 msgid "Already in contest" msgstr "Đã ở trong kỳ thi" -#: judge/views/contests.py:532 +#: judge/views/contests.py:546 #, python-format msgid "You are already in a contest: \"%s\"." msgstr "Bạn đã ở trong kỳ thi: \"%s\"." -#: judge/views/contests.py:542 +#: judge/views/contests.py:556 msgid "Banned from joining" msgstr "Bị cấm tham gia" -#: judge/views/contests.py:544 +#: judge/views/contests.py:558 msgid "" "You have been declared persona non grata for this contest. You are " "permanently barred from joining this contest." msgstr "Bạn không được phép tham gia kỳ thi này." -#: judge/views/contests.py:633 +#: judge/views/contests.py:647 #, python-format msgid "Enter access code for \"%s\"" msgstr "Nhập mật khẩu truy cập cho \"%s\"" -#: judge/views/contests.py:650 +#: judge/views/contests.py:664 #, python-format msgid "You are not in contest \"%s\"." msgstr "Bạn không ở trong kỳ thi \"%s\"." -#: judge/views/contests.py:673 +#: judge/views/contests.py:687 msgid "ContestCalendar requires integer year and month" msgstr "Lịch thi yêu cầu giá trị cho năm và tháng là số nguyên" -#: judge/views/contests.py:731 +#: judge/views/contests.py:745 #, python-format msgid "Contests in %(month)s" msgstr "Các kỳ thi trong %(month)s" -#: judge/views/contests.py:732 +#: judge/views/contests.py:746 msgid "F Y" msgstr "F Y" -#: judge/views/contests.py:792 +#: judge/views/contests.py:806 #, python-format msgid "%s Statistics" msgstr "%s Thống kê" -#: judge/views/contests.py:1085 +#: judge/views/contests.py:1099 #, python-format msgid "%s Rankings" msgstr "%s Bảng điểm" -#: judge/views/contests.py:1096 +#: judge/views/contests.py:1110 msgid "???" msgstr "???" -#: judge/views/contests.py:1123 +#: judge/views/contests.py:1137 #, python-format msgid "Your participation in %s" msgstr "Lần tham gia trong %s" -#: judge/views/contests.py:1124 +#: judge/views/contests.py:1138 #, python-format msgid "%s's participation in %s" msgstr "Lần tham gia của %s trong %s" -#: judge/views/contests.py:1138 +#: judge/views/contests.py:1152 msgid "Live" msgstr "Trực tiếp" -#: judge/views/contests.py:1157 templates/contest/contest-tabs.html:19 +#: judge/views/contests.py:1171 templates/contest/contest-tabs.html:19 msgid "Participation" msgstr "Lần tham gia" -#: judge/views/contests.py:1206 +#: judge/views/contests.py:1220 #, python-format msgid "%s MOSS Results" msgstr "%s Kết quả MOSS" -#: judge/views/contests.py:1242 +#: judge/views/contests.py:1256 #, python-format msgid "Running MOSS for %s..." msgstr "Đang chạy MOSS cho %s..." -#: judge/views/contests.py:1265 +#: judge/views/contests.py:1279 #, python-format msgid "Contest tag: %s" msgstr "Nhãn kỳ thi: %s" -#: judge/views/contests.py:1280 judge/views/ticket.py:72 +#: judge/views/contests.py:1294 judge/views/ticket.py:72 msgid "Issue description" msgstr "Mô tả vấn đề" -#: judge/views/contests.py:1323 +#: judge/views/contests.py:1337 #, python-format msgid "New clarification for %s" msgstr "Thông báo mới cho %s" @@ -2889,13 +2901,13 @@ msgstr "Không thể chỉnh sửa tổ chức" msgid "You are not allowed to edit this organization." msgstr "Bạn không được phép chỉnh sửa tổ chức này." -#: judge/views/organization.py:193 judge/views/organization.py:340 +#: judge/views/organization.py:193 judge/views/organization.py:337 #, fuzzy #| msgid "Can't edit organization" msgid "Can't access organization" msgstr "Không thể chỉnh sửa tổ chức" -#: judge/views/organization.py:194 judge/views/organization.py:341 +#: judge/views/organization.py:194 judge/views/organization.py:338 msgid "You are not allowed to access this organization." msgstr "Bạn không được phép chỉnh sửa tổ chức này." @@ -2906,57 +2918,62 @@ msgstr "Bạn không được phép chỉnh sửa tổ chức này." msgid "Groups" msgstr "Nhóm" -#: judge/views/organization.py:347 +#: judge/views/organization.py:344 #, python-format msgid "%s Members" msgstr "%s Thành viên" -#: judge/views/organization.py:469 +#: judge/views/organization.py:466 #, python-brace-format msgid "All submissions in {0}" msgstr "Bài nộp trong {0}" -#: judge/views/organization.py:499 judge/views/organization.py:505 -#: judge/views/organization.py:512 +#: judge/views/organization.py:496 judge/views/organization.py:502 +#: judge/views/organization.py:509 msgid "Joining group" msgstr "Tham gia nhóm" -#: judge/views/organization.py:500 +#: judge/views/organization.py:497 msgid "You are already in the group." msgstr "Bạn đã ở trong nhóm." -#: judge/views/organization.py:505 +#: judge/views/organization.py:502 msgid "This group is not open." msgstr "Nhóm này là nhóm kín." -#: judge/views/organization.py:528 +#: judge/views/organization.py:510 judge/views/register.py:62 +#, python-brace-format +msgid "You may not be part of more than {count} public groups." +msgstr "Bạn không thể tham gia nhiều hơn {count} nhóm công khai." + +#: judge/views/organization.py:525 msgid "Leaving group" msgstr "Rời nhóm" -#: judge/views/organization.py:529 +#: judge/views/organization.py:526 #, python-format msgid "You are not in \"%s\"." msgstr "Bạn không ở trong \"%s\"." -#: judge/views/organization.py:554 +#: judge/views/organization.py:551 #, python-format msgid "Request to join %s" msgstr "Đăng ký tham gia %s" -#: judge/views/organization.py:584 +#: judge/views/organization.py:581 msgid "Join request detail" msgstr "Chi tiết đơn đăng ký" -#: judge/views/organization.py:626 +#: judge/views/organization.py:623 msgid "Manage join requests" msgstr "Quản lý đơn đăng ký" -#: judge/views/organization.py:630 +#: judge/views/organization.py:627 #, python-format msgid "Managing join requests for %s" msgstr "Quản lý đơn đăng ký cho %s" -#: judge/views/organization.py:670 +#: judge/views/organization.py:667 #, python-format msgid "" "Your organization can only receive %d more members. You cannot approve %d " @@ -2965,96 +2982,96 @@ msgstr "" "Tổ chức chỉ có thể chứa %d thành viên. Bạn không thể chấp thuận nhiều hơn %d " "người." -#: judge/views/organization.py:688 +#: judge/views/organization.py:685 #, python-format msgid "Approved %d user." msgid_plural "Approved %d users." msgstr[0] "Đã chấp thuận %d người." -#: judge/views/organization.py:691 +#: judge/views/organization.py:688 #, python-format msgid "Rejected %d user." msgid_plural "Rejected %d users." msgstr[0] "Đã từ chối %d người." -#: judge/views/organization.py:731 +#: judge/views/organization.py:728 #, python-format msgid "Add member for %s" msgstr "Thêm thành viên cho %s" -#: judge/views/organization.py:743 +#: judge/views/organization.py:740 #, fuzzy #| msgid "Edited from site" msgid "Added members from site" msgstr "Chỉnh sửa từ web" -#: judge/views/organization.py:763 judge/views/organization.py:771 +#: judge/views/organization.py:760 judge/views/organization.py:768 msgid "Can't kick user" msgstr "Không thể đuổi" -#: judge/views/organization.py:764 +#: judge/views/organization.py:761 msgid "The user you are trying to kick does not exist!" msgstr "" -#: judge/views/organization.py:772 +#: judge/views/organization.py:769 #, python-format msgid "The user you are trying to kick is not in organization: %s." msgstr "" -#: judge/views/organization.py:793 judge/views/organization.py:945 +#: judge/views/organization.py:790 judge/views/organization.py:942 #, fuzzy, python-format #| msgid "Editing %s" msgid "Edit %s" msgstr "Đang chỉnh sửa %s" -#: judge/views/organization.py:821 templates/organization/list.html:45 +#: judge/views/organization.py:818 templates/organization/list.html:45 msgid "Create group" msgstr "Tạo nhóm" -#: judge/views/organization.py:836 +#: judge/views/organization.py:833 msgid "Exceeded limit" msgstr "" -#: judge/views/organization.py:837 +#: judge/views/organization.py:834 #, python-format msgid "You created too many groups. You can only create at most %d groups" msgstr "" -#: judge/views/organization.py:842 judge/views/organization.py:867 -#: judge/views/organization.py:1011 +#: judge/views/organization.py:839 judge/views/organization.py:864 +#: judge/views/organization.py:1008 msgid "Added from site" msgstr "Thêm từ web" -#: judge/views/organization.py:858 +#: judge/views/organization.py:855 #: templates/organization/org-right-sidebar.html:55 msgid "Add contest" msgstr "Thêm kỳ thi" -#: judge/views/organization.py:901 judge/views/organization.py:1063 +#: judge/views/organization.py:898 judge/views/organization.py:1060 msgid "Permission denied" msgstr "Truy cập bị từ chối" -#: judge/views/organization.py:902 +#: judge/views/organization.py:899 #, fuzzy #| msgid "You are not allowed to edit this organization." msgid "You are not allowed to edit this contest" msgstr "Bạn không được phép chỉnh sửa tổ chức này." -#: judge/views/organization.py:1000 +#: judge/views/organization.py:997 #, python-format msgid "Add blog for %s" msgstr "Thêm bài đăng cho %s" -#: judge/views/organization.py:1064 +#: judge/views/organization.py:1061 msgid "Not allowed to edit this blog" msgstr "Bạn không được phép chỉnh sửa bài đăng này." -#: judge/views/organization.py:1096 +#: judge/views/organization.py:1093 #, python-format msgid "Edit blog %s" msgstr "Chỉnh sửa %s" -#: judge/views/organization.py:1147 +#: judge/views/organization.py:1144 #, python-format msgid "Pending blogs in %s" msgstr "Bài đang đợi duyệt trong %s" @@ -3078,41 +3095,41 @@ msgstr "Hướng dẫn cho {0}" msgid "Editorial for {0}" msgstr "Hướng dẫn cho {0}" -#: judge/views/problem.py:467 templates/contest/contest.html:96 +#: judge/views/problem.py:461 templates/contest/contest.html:96 #: templates/organization/org-left-sidebar.html:4 -#: templates/user/user-about.html:28 templates/user/user-bookmarks.html:34 +#: templates/user/user-about.html:28 templates/user/user-bookmarks.html:35 #: templates/user/user-tabs.html:5 templates/user/users-table.html:19 msgid "Problems" msgstr "Bài tập" -#: judge/views/problem.py:843 +#: judge/views/problem.py:837 msgid "Problem feed" msgstr "Bài tập" -#: judge/views/problem.py:1071 +#: judge/views/problem.py:1062 msgid "Banned from submitting" msgstr "Bị cấm nộp bài" -#: judge/views/problem.py:1073 +#: judge/views/problem.py:1064 msgid "" "You have been declared persona non grata for this problem. You are " "permanently barred from submitting this problem." msgstr "Bạn đã bị cấm nộp bài này." -#: judge/views/problem.py:1096 +#: judge/views/problem.py:1087 msgid "Too many submissions" msgstr "Quá nhiều lần nộp" -#: judge/views/problem.py:1098 +#: judge/views/problem.py:1089 msgid "You have exceeded the submission limit for this problem." msgstr "Bạn đã vượt quá số lần nộp cho bài này." -#: judge/views/problem.py:1177 judge/views/problem.py:1182 +#: judge/views/problem.py:1168 judge/views/problem.py:1173 #, python-format msgid "Submit to %(problem)s" msgstr "Nộp bài cho %(problem)s" -#: judge/views/problem.py:1208 +#: judge/views/problem.py:1199 msgid "Clone Problem" msgstr "Nhân bản bài tập" @@ -3188,7 +3205,7 @@ msgstr "Các bài nộp tốt nhất cho {0}" msgid "A username must contain letters, numbers, or underscores" msgstr "Tên đăng nhập phải chứa ký tự, chữ số, hoặc dấu gạch dưới" -#: judge/views/register.py:42 templates/user/edit-profile.html:117 +#: judge/views/register.py:42 templates/user/edit-profile.html:123 msgid "Preferred language" msgstr "Ngôn ngữ ưa thích" @@ -3413,22 +3430,22 @@ msgstr "j M, Y" msgid "M j, Y, G:i" msgstr "j M, Y, G:i" -#: judge/views/user.py:416 +#: judge/views/user.py:414 msgid "Updated on site" msgstr "Được cập nhật trên web" -#: judge/views/user.py:431 templates/admin/auth/user/change_form.html:14 +#: judge/views/user.py:429 templates/admin/auth/user/change_form.html:14 #: templates/admin/auth/user/change_form.html:17 templates/base.html:282 #: templates/user/user-tabs.html:11 msgid "Edit profile" msgstr "Chỉnh sửa thông tin" -#: judge/views/user.py:442 templates/user/user-left-sidebar.html:2 +#: judge/views/user.py:440 templates/user/user-left-sidebar.html:2 #: templates/user/user-list-tabs.html:4 msgid "Leaderboard" msgstr "Xếp hạng" -#: judge/views/user.py:543 +#: judge/views/user.py:541 msgid "Import Users" msgstr "" @@ -3509,7 +3526,7 @@ msgstr "Chỉnh sửa thông tin" msgid "Rejudge" msgstr "Chấm lại" -#: templates/base.html:227 templates/chat/chat.html:600 +#: templates/base.html:227 templates/chat/chat.html:610 msgid "Chat" msgstr "Chat" @@ -3646,7 +3663,7 @@ msgstr "Thêm mới" msgid "No clarifications have been made at this time." msgstr "Không có thông báo nào." -#: templates/chat/chat.html:5 templates/chat/chat.html:574 +#: templates/chat/chat.html:5 templates/chat/chat.html:584 msgid "Chat Box" msgstr "Chat Box" @@ -3670,21 +3687,21 @@ msgstr "Tin nhắn mới" msgid "Mute this user and delete all messages?" msgstr "Mute người dùng này và xóa tất cả tin nhắn chung?" -#: templates/chat/chat.html:536 templates/chat/chat.html:617 +#: templates/chat/chat.html:546 templates/chat/chat.html:627 #: templates/user/base-users-js.html:10 #: templates/user/base-users-two-col.html:19 msgid "Search by handle..." msgstr "Tìm kiếm theo tên..." -#: templates/chat/chat.html:602 templates/chat/chat.html:609 +#: templates/chat/chat.html:612 templates/chat/chat.html:619 msgid "Online Users" msgstr "Trực tuyến" -#: templates/chat/chat.html:638 +#: templates/chat/chat.html:648 msgid "Emoji" msgstr "" -#: templates/chat/chat.html:639 +#: templates/chat/chat.html:649 msgid "Enter your message" msgstr "Nhập tin nhắn" @@ -3753,9 +3770,7 @@ msgid "Hide" msgstr "Ẩn" #: templates/comments/content-list.html:94 -#| msgid "" -#| "This comment is hidden due to too much negative feedback. Click here to view it." +#, python-format msgid "" "This comment is hidden due to too much negative feedback. Click here " @@ -3868,11 +3883,17 @@ msgstr "Thứ bảy" msgid "Create" msgstr "Tạo mới" -#: templates/contest/clone.html:37 +#: templates/contest/clone.html:45 msgid "Enter a new key for the cloned contest:" msgstr "Nhập mã kỳ thi cho kỳ thi nhân bản:" -#: templates/contest/clone.html:40 templates/problem/clone.html:40 +#: templates/contest/clone.html:47 +#, fuzzy +#| msgid "Groups" +msgid "Group:" +msgstr "Nhóm" + +#: templates/contest/clone.html:55 templates/problem/clone.html:40 msgid "Clone!" msgstr "Nhân bản!" @@ -4164,11 +4185,11 @@ msgstr "Khôi phục kết quả" msgid "Disqualify" msgstr "Hủy kết quả" -#: templates/contest/ranking-table.html:54 templates/user/edit-profile.html:94 +#: templates/contest/ranking-table.html:54 templates/user/edit-profile.html:96 msgid "Fullname" msgstr "Tên đầy đủ" -#: templates/contest/ranking-table.html:55 templates/user/edit-profile.html:98 +#: templates/contest/ranking-table.html:55 templates/user/edit-profile.html:100 #: templates/user/import/table_csv.html:7 msgid "School" msgstr "Trường" @@ -4893,10 +4914,6 @@ msgstr "Hiển thị hướng dẫn" msgid "Have editorial" msgstr "Có hướng dẫn" -#: templates/problem/search-form.html:46 -msgid "Group" -msgstr "" - #: templates/problem/search-form.html:70 templates/problem/search-form.html:72 #: templates/submission/list.html:381 #: templates/submission/submission-list-tabs.html:4 @@ -5092,7 +5109,6 @@ msgid "Default language" msgstr "Ngôn ngữ ưa thích" #: templates/registration/registration_form.html:81 -#: templates/user/edit-profile.html:147 msgid "Affiliated organizations" msgstr "Tổ chức bạn muốn tham gia" @@ -5501,42 +5517,42 @@ msgid "Rank" msgstr "Rank" #: templates/user/edit-profile.html:104 +msgid "Avatar" +msgstr "Ảnh đại diện" + +#: templates/user/edit-profile.html:110 msgid "Self-description" msgstr "Tự giới thiệu" -#: templates/user/edit-profile.html:112 +#: templates/user/edit-profile.html:118 msgid "Select your closest major city" msgstr "Chọn thành phố gần nhất" -#: templates/user/edit-profile.html:121 +#: templates/user/edit-profile.html:127 msgid "Editor theme" msgstr "Giao diện cho code editor" -#: templates/user/edit-profile.html:126 +#: templates/user/edit-profile.html:132 msgid "Math engine" msgstr "" -#: templates/user/edit-profile.html:132 templates/user/edit-profile.html:133 -msgid "Change your avatar" -msgstr "Đổi ảnh đại diện" - #: templates/user/edit-profile.html:139 msgid "Change your password" msgstr "Đổi mật khẩu" -#: templates/user/edit-profile.html:156 +#: templates/user/edit-profile.html:150 msgid "Two Factor Authentication is enabled." msgstr "Two Factor Authentication đã được kích hoạt." -#: templates/user/edit-profile.html:163 +#: templates/user/edit-profile.html:157 msgid "Two Factor Authentication is disabled." msgstr "Two Factor Authentication đã được hủy kích hoạt." -#: templates/user/edit-profile.html:168 +#: templates/user/edit-profile.html:162 msgid "User-script" msgstr "" -#: templates/user/edit-profile.html:172 +#: templates/user/edit-profile.html:166 msgid "Update profile" msgstr "Cập nhật thông tin" @@ -5597,80 +5613,76 @@ msgstr "Rank theo rating" msgid "Rank by points" msgstr "Rank theo điểm" -#: templates/user/user-about.html:64 -msgid "From" -msgstr "Đến từ" - -#: templates/user/user-about.html:75 +#: templates/user/user-about.html:65 msgid "Admin Notes" msgstr "Lưu ý của admin" -#: templates/user/user-about.html:90 +#: templates/user/user-about.html:79 msgid "You have not shared any information." msgstr "Bạn chưa chia sẻ thông tin nào." -#: templates/user/user-about.html:92 +#: templates/user/user-about.html:81 msgid "This user has not shared any information." msgstr "Người dùng này chưa chia sẻ thông tin nào." -#: templates/user/user-about.html:101 +#: templates/user/user-about.html:90 msgid "Awards" msgstr "Thành tích" -#: templates/user/user-about.html:112 +#: templates/user/user-about.html:101 #, python-format msgid "%(label)s (%(date)s)" msgstr "%(label)s (%(date)s)" -#: templates/user/user-about.html:130 +#: templates/user/user-about.html:119 msgid "Mon" msgstr "Thứ 2" -#: templates/user/user-about.html:135 +#: templates/user/user-about.html:124 msgid "Tues" msgstr "Thứ 3" -#: templates/user/user-about.html:140 +#: templates/user/user-about.html:129 msgid "Wed" msgstr "Thứ 4" -#: templates/user/user-about.html:145 +#: templates/user/user-about.html:134 msgid "Thurs" msgstr "Thứ 5" -#: templates/user/user-about.html:150 +#: templates/user/user-about.html:139 msgid "Fri" msgstr "Thứ 6" -#: templates/user/user-about.html:155 +#: templates/user/user-about.html:144 msgid "Sat" msgstr "Thứ 7" -#: templates/user/user-about.html:160 +#: templates/user/user-about.html:149 msgid "Sun" msgstr "CN" -#: templates/user/user-about.html:169 +#: templates/user/user-about.html:158 msgid "Less" msgstr "Ít" -#: templates/user/user-about.html:175 +#: templates/user/user-about.html:164 msgid "More" msgstr "Nhiều" -#: templates/user/user-about.html:184 +#: templates/user/user-about.html:173 msgid "Rating History" msgstr "Các lần thi" -#: templates/user/user-about.html:255 +#: templates/user/user-about.html:244 msgid "past year" msgstr "năm ngoái" -#: templates/user/user-about.html:272 +#: templates/user/user-about.html:261 msgid "total submission(s)" msgstr "bài nộp" -#: templates/user/user-about.html:276 +#: templates/user/user-about.html:265 msgid "submissions in the last year" msgstr "bài nộp trong năm qua" @@ -5702,7 +5714,7 @@ msgstr "Max rating:" msgid "Posts" msgstr "Bài đăng" -#: templates/user/user-bookmarks.html:75 +#: templates/user/user-bookmarks.html:78 msgid "Editorials" msgstr "Lời giải" @@ -5756,6 +5768,12 @@ msgstr "Thông tin" msgid "Check all" msgstr "Chọn tất cả" +#~ msgid "Change your avatar" +#~ msgstr "Đổi ảnh đại diện" + +#~ msgid "From" +#~ msgstr "Đến từ" + #, fuzzy #~| msgid "How did you corrupt the custom checker path?" #~ msgid "How did you corrupt the interactor path?" diff --git a/templates/base.html b/templates/base.html index 1a014af..2dac3b3 100644 --- a/templates/base.html +++ b/templates/base.html @@ -263,7 +263,7 @@